目录
一、CubeMX配置外部中断
1.CubeMX配置外部中断
这里还是使用PA9和10引脚实现,9负责接受外部中断,10负责点亮LED:
详细配置(上拉):
具体GPIO Mode可以选择一下这些,下面是我用翻译软件翻译过来的了!
开启中断:
2.代码实现按键控制LED亮灭
//外部中断函数回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
status ^= 1;
if(status == 1) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_SET);
if(status == 0) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET);
}
这样每次进入回调函数,就会修改LED引脚的电平状态,从而控制LED亮灭!
3.外部中断函数常用函数
/* GPIO初始化 */
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);
/* 在函数初始化之后的引脚恢复成默认的转态 */
void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);
/* 读取引脚的电平转态 */
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
/* 引脚写1或0 */
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
/* 翻转引脚电平 */
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
/* 锁住GPIO的配置、读取、写入状态等操作 */
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
/* 外部中断回调函数,清除中断标志位 */
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
/* 中断回调函数,中断函数响应动作 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
二、Cube配置PWM
1.PWM介绍
PSC(预分频系数),ARR(自动重装系数),CCR(捕获/比较系数)
PWM的频率计算公式为:Freq=时钟频率(72MHZ)/ (PSC + 1) / (ARR + 1);
PWM的工作模式:
PWM模式1(向上计数) :计数器从0计数加到自动重装载值(TIMx_ARR),然后重新从0开始计数,并且产生一个计数器溢出事件
PWM模式2(向下计数) :计数器从自动重装载值(TIMx_ARR)减到0,然后重新从重装载值(TIMx_ARR)开始递减,并且产生一个计数器溢出事件
PWM的输出模式(mode):
模式1:CNT<CCR 输出有效电平
模式2:CNT>CCR 输出有效电平
输出比较极性(有效电平):
Hight:高为有效电平
Low: 低为有效电平
PWMCubeMX配置:
2.PWM呼吸灯
这里选择小灯泡正极接引脚,所以有效电平为高,这里选择模式1(CNT<CCR 输出有效电平)
CubeMX配置PWM:
代码实现:
int main(void)
{
/* USER CODE BEGIN 1 */
int status = 0;
int temp = 0;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM1_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2); //开启定时器PWM输出
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(status == 0)
{
temp ++;
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_2, temp);
HAL_Delay(1);
if(temp == 500) status = 1;
}
else if(status == 1)
{
temp --;
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_2, temp);
HAL_Delay(1);
if(temp == 0) status = 0;
}
}
/* USER CODE END 3 */
}
常用函数:
__HAL_TIM_SET_PRESCALER(&htim2,72-1);//10000HZ//设置预分频
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 83);//83%设置占空比
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2); //开启定时器PWM输出
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_2, temp);//设置占空比