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设置
定时器2对应的时序图如下
定时器时许
3,TIM3设置,采用内部时钟,PWM模式1,CH极性为1。这里频率为
72000000/(35999+1)/(3999+1)=0.5Hz,占空比为(249+1)/(3999+1)=6.25%
定时器3设置
4,GPIO设置,其中Button设置为中断模式。
GPIO配置

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)的仿真波形如下,时间不太对,但是没关系,不深究,硬件实现的时间是对的。
PC1和PC6的波形

3.2 实物运行结果

实验结果与预期相符
在这里插入图片描述

发布了12 篇原创文章 · 获赞 3 · 访问量 3040

猜你喜欢

转载自blog.csdn.net/weixin_46623350/article/details/105446505