[STM32CubeMX]学习笔记3:PWM呼吸灯

  • 使用标准库实现本次功能的源代码已上传:
  • https://github.com/yzmj0986/STM32_Std.lib_PWM.git

 

Tips:预分频系数和自动重装值的理解(二.2中)

 

MCU:STM32F103ZET6

IDE:  MDK-ARM V5 +STM32CubeMX5.0.0

 

功能描述:将定时器TIM3全映射到外部端口PC6和PC7,设置输出模式为PWM输出,通过改变占空比的值实现LED7/LED8的呼吸灯效果。

需要配置的有:PC6设置为TIM3_CH1,PC7设置为TIM3_CH2,设置预分频系数与自动重载值,设置PWM的输出极性。

一. 在 Pinout&Configuration---System Core中:

  • 1. 首先设置时钟RCC的HSE(外部高速时钟)为晶振模式:Crystal/ceramic Resonator

[STM32CubeMX]学习笔记3:PWM呼吸灯_第1张图片

  • 2. 设置系统SYS的Debug为Serial Wire:

[STM32CubeMX]学习笔记3:PWM呼吸灯_第2张图片

  • 3. 设置外部端口PC6与PC7的模式:

[STM32CubeMX]学习笔记3:PWM呼吸灯_第3张图片

二. 在 Pinout&Configuration---Timers中:

  • 1. 打开TIM3,在TIM3 Mode and Configuration中设置CH1与CH2的模式为PWM输出模式:

[STM32CubeMX]学习笔记3:PWM呼吸灯_第4张图片

  • 2. 在Configuration中设置预分频系数为72-1,自动重装值为500-1,则PWM的输出频率为72000000/72/500=2000Hz。且根据原理图可知LED是低电平有效,所以将PWM有效极性设置为Low:

Tips:预分频系数和自动重装值的理解

        时钟频率为72MHz,即控制器每秒会计数72M次,预分频系数的作用是将频率分割;若设置为72-1,则频率分割为1MHz,即控制器每秒会计数1M次,意味着每1us计数1次。若要定时1ms,由于1ms=1us*1000,那么预装载值就是1000-1。要将两个值均减一的原因是控制器计数均从0开始。

 

[STM32CubeMX]学习笔记3:PWM呼吸灯_第5张图片

三.在 Clock Configuration中:

配置时钟为72 Mhz。

[STM32CubeMX]学习笔记3:PWM呼吸灯_第6张图片

四.在 Project Manager---Project中:

  • 1.设置项目的名称以及保存的位置,选择Toolchain/IDE为MDK-ARM V5,

Tips:最好把Linker Settings中的Minimum Heap Size设置为0x600。

[STM32CubeMX]学习笔记3:PWM呼吸灯_第7张图片

  • 2.在Code Generator选项中如下勾选:

[STM32CubeMX]学习笔记3:PWM呼吸灯_第8张图片

最后点Generate Code生成代码,并选择“Open Project”:

五.代码分析与改写:

  • 1. 在主程序main.c中首先定义16位的变量dutycycle用于存储占空比的值:
  /* USER CODE BEGIN 1 */
	uint16_t dutycycle=0;
  /* USER CODE END 1 */
  • 2. 开启定时器3通道1和通道2输出PWM波:
  /* USER CODE BEGIN 2 */
	HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
	HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
  /* USER CODE END 2 */
  • 3.在While(1)中,修改定时器3通道1和通道2的比较寄存器的值(占空比):
 /* USER CODE BEGIN 3 */
		while(dutycycle<500)
		{
			dutycycle++;
			__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,dutycycle);
			__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,dutycycle);
			HAL_Delay(1);
		}
		while(dutycycle)
		{
			dutycycle--;
			__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,dutycycle);
			__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,dutycycle);
			HAL_Delay(1);
		}
		HAL_Delay(200);
  }
  /* USER CODE END 3 */

至此,编译后无错并下载到开发板中,就完成了通过STM32CubeMX调用HAL库实现PWM呼吸灯的效果程序。

你可能感兴趣的:(STM32单片机)