1.图形化界面配置

1.1 时钟使能

并配置时钟为72MHZ
image.png
image.png

1.2 TIM2 定时器配置

这里我们只使用通用定时器的定时功能
配置如下
选择时钟源为内部时钟,配置计数方式,arr和psc以及是否重装载,并使能中断。
计算:
定时1s
时钟为72MHZ 分频7200 当前频率 10000 定时1s
1s * 10000 = 10000
注意配置的时候都要减去1
image.png
Clock Source:选择时钟源(Internal Source)
Prescaler:PSC定时器分频系数 (17999 )
Counter Mode:计数模式( UP:递增计数)
Counter Period:自动重装载值(4999)
auto-reload preload:是否开启重装载(Enable)
使能中断
image.png

1.3 输出

(1)设置输出的文件名称和IDE
image.png
设置显示所有文件

image.png

1.4 生成代码

image.png
下载好代码最好先编译一下

1.5 代码

代码

  1. tim.c
  2. 增加
  3. #include "tim.h"
  4. /* USER CODE BEGIN 0 */
  5. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  6. {
  7. if (htim == (&htim2))
  8. {
  9. HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_6);
  10. }
  11. }
  12. /* USER CODE END 0 */

main.c

  1. int main(void)
  2. {
  3. /* USER CODE BEGIN 1 */
  4. /* USER CODE END 1 */
  5. /* MCU Configuration--------------------------------------------------------*/
  6. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  7. HAL_Init();
  8. /* USER CODE BEGIN Init */
  9. /* USER CODE END Init */
  10. /* Configure the system clock */
  11. SystemClock_Config();
  12. /* USER CODE BEGIN SysInit */
  13. /* USER CODE END SysInit */
  14. /* Initialize all configured peripherals */
  15. MX_GPIO_Init();
  16. MX_TIM2_Init();
  17. /* USER CODE BEGIN 2 */
  18. /* USER CODE END 2 */
  19. //使能时钟中断
  20. HAL_TIM_Base_Start_IT(&htim2);
  21. /* Infinite loop */
  22. /* USER CODE BEGIN WHILE */
  23. while (1)
  24. {
  25. /* USER CODE END WHILE */
  26. /* USER CODE BEGIN 3 */
  27. }
  28. /* USER CODE END 3 */
  29. }

1.6 HAL库中处理中断的关键点

(1)在CubeMX中勾选相应的中断。效果就是自动生成了中断初始化代码。
(2)HAL库内部有一套已经完整的中断处理体系,会自动跳转执行相应的ISR
(3)在HAL中默认的处理各个中断的ISR中都预留了相应的回调函数(钩子函数),用户只需要去重载这个回调函数就可以实现自己的特色的中断处理了。
TIM2_IRQHandler(异常向量表)
HAL_TIM_IRQHandler(stm32f1xx_it.c)
HAL_TIM_PeriodElapsedCallback(stm32f1xx_hal_tim.c) 会自动清除中断

2.PWM输出

主要配置:
选择TIM3 CH3
该输出引脚为 PB0 -> LED
然后我们通过PWM设置 输出呼吸灯

模式1 和 模式2 电平互补
image.png

  1. * USER CODE BEGIN 0 */
  2. /* LED亮度等级 PWM表 */
  3. uint8_t indexWave[] = {1,1,2,2,3,4,6,8,10,14,19,25,33,44,59,80,107,143,191,255,
  4. 255,191,143,107,80,59,44,33,25,19,14,10,8,6,4,3,2,2,1,1};
  5. //中断程序
  6. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  7. {
  8. static uint8_t pwm_index = 0;
  9. static uint8_t period_cnt = 0;
  10. if(htim == (&htim3))
  11. {
  12. period_cnt++;
  13. /* 若输出的周期数大于20,输出下一种脉冲宽的PWM波 */
  14. if(period_cnt >= 10)
  15. {
  16. /* 根据PWM表修改定时器的比较寄存器值 */
  17. htim->Instance->CCR3 = indexWave[pwm_index];
  18. /* 标志PWM表的下一个元素 */
  19. pwm_index++;
  20. /* 若PWM脉冲表已经输出完成一遍,重置PWM查表标志 */
  21. if(pwm_index >= 40)
  22. {
  23. pwm_index = 0;
  24. }
  25. /* 重置周期计数标志 */
  26. period_cnt = 0;
  27. }
  28. }
  29. }
  30. /* USER CODE END 0 */