STM32开发,HAL函数实现按键中断/定时器/PWM功能
STM32开发,HAL函数实现按键中断/定时器/PWM功能
1 概述
1.1 资源概述
开发板:正点原子STM32F103 Nano开发板
CUBEMX版本:1.3.0
MDK版本:5.23
主控芯片型号:STM32F103RBT6
1.2 实现功能
1,LED0通过Button按键实现翻转,Button按键采用中断方式输入;
2,LED1采用定时器方式实现翻转,当计数达到时,状态进行翻转;
3,LED3采用while函数和Hal_delay函数实现,固定时长;
4,LED6采用PWM进行驱动,PWM设置一个固定的周期和占空比。
1.3 PWM边沿对齐和中心对齐
1.3.1 边沿对齐模式
下图为边沿对齐模式,其中ARR通过cubemx的counter period设置,决定PWM的周期,CCR通过pulse设置,决定占空比。PWM模式1和PWM模式2,为互补的波形,PWM模式1+极性低等效于PWM模式2+极性高。
PWM模式1- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
PWM模式2- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。
1.3.2 *对齐模式
*对齐模式如下图,对于高级定时器产生互补带死区的双路输出时非常有用,很方便设置死区时间。
2 软件开发
2.1 CUBEMX配置
1,中断分组设置,抢占优先级设为0,子优先级设为1,2,3。
2,TIM2设置,设置为向上计数,一个计数的时间为
1/72000000*(35999+1)*(999+1)=0.5S
定时器2对应的时序图如下
3,TIM3设置,采用内部时钟,PWM模式1,CH极性为1。这里频率为
72000000/(35999+1)/(3999+1)=0.5Hz,占空比为(249+1)/(3999+1)=6.25%
4,GPIO设置,其中Button设置为中断模式。
2.2 软件代码
使用CUBEMX生成代码后,会自动对GPIO口以及定时器等进行初始化
我们需要在Main函数中开始定时器和PWM
HAL_TIM_Base_Start_IT(&htim2);//timer2 on 开启定时器2
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);// timer3 on PWM ON开始PWM
在While(1)增加LED3灯的操作
HAL_Delay(4000);
HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin);//使用HAL函数进行LED灯的等时间亮灭
在main函数外边设置按键中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//按键中断,当检测到按键被按下时,翻转LED0的状态
{
if(GPIO_Pin==Button_Pin)//检测按键
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
}
增加计数器回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//Timer2的定时器中断,当计时结束后翻转灯LED1的状态
{
if(htim->Instance==htim2.Instance)//检测定时器2
{
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
}
}
程序编写结束
3,实验结果
3.1 仿真结果
LED1(采用定时器)和LED6(采用PWM)的仿真波形如下,时间不太对,但是没关系,不深究,硬件实现的时间是对的。
3.2 实物运行结果
实验结果与预期相符
上一篇: STM32 定时器 跟新中断
下一篇: STM32 定时器中断的使用