[STM32C0] 【STM32C092RC 测评】+06 使用定时器2闪烁LED

[复制链接]
2191|1
 楼主| 聪聪哥哥 发表于 2025-5-19 19:49 | 显示全部楼层 |阅读模式
STM32c092包括一个高级控制定时器、六个通用定时器、两个看门狗定时器和一个SysTick定时器。表7比较了高级控制定时器和通用定时器的功能。
1.png
一:高级控制定时器(TIM1)
先进的控制定时器可以看作是在6个通道上多路复用的三相PWM单元。它具有具有可编程插入死区的互补PWM输出。它也可以看作是一个完整的一般用途定时器。四个独立的通道可用于:
输入捕捉
输出比较
PWM输出(边缘或中心对齐模式),具有全调制能力(0-100%)单脉冲模式输出。
除此之外,还有两个内部通道可供使用。
在调试模式下,高级控制定时器计数器可以被冻结,PWM输出被禁用,从而可以关闭由这些输出驱动的电源开关。
许多特性与通用TIMx定时器(在3.15.2节中描述)共享,使用相同的架构因此高级控制定时器可以通过Timer Link功能与TIMx定时器一起工作,以实现同步或事件链。

二:其他定时说明
通用定时器(TIM2、3、14、15、16、17)设备中嵌入了六个可同步的一般用途定时器(参见表7进行比较)。每个一般用途定时器都可以用于生成PWM输出或作为简单的定时器。
TIM2, TIM3
这些是功能齐全的一般计时器:
-TIM2具有32位自动重载上/下计数器和16位预分频器-TIM3 具有 16 位自动上/下计数器和 16 位预分频器它们有四个独立的通道用于输入捕获/输出比较、PWM或单脉冲模式输出。它们可以与其他通用定时器通过定时器链接功能进行组合操作,以实现同步或事件链。它们可以生成独立的DMA请求并支持正交编码器。它们的计数器可以在调试模式下冻结。
TIM14
这个定时器基于16位自动重载计数器和16位预分频器。它有一个通道用于输入捕获/输出比较、PWM输出或单脉冲模式输出。它的计数器可以在调试模式下冻结。
TIM15.TIM16.TIM17
这些是通用计时器,具有以下功能:
16位自动重新加载计数器和16位预分频器2个通道和1个用于TIM15的辅助通道
-1个通道和1个互补通道用于TIM16和TIM17
所有通道都可以用于输入捕获/输出比较、PWM或单脉冲模式输出。定时器可以通过定时器链接功能一起操作以实现同步或事件链。它们可以生成独立的DMA请求。它们的计数器可以在调试模式下冻结。

三:STM32cube MX 配置如下:
3.1 配置定时器2的基本参数,预分频系数和分频系数,重装值等等。
2.png
3.2 配置定时器的中断部分
3.png
四:软件编写:
1:使能定时器时钟。
2:初始化定时器,配置ARR,PSC。
3:开启定时器中断,配置NVIC。
4:使能定时器中断,配置优先级。
5: 编写定时器回调函数。

定时器初始化部分
  1. void MX_TIM2_Init(void)
  2. {

  3.   /* USER CODE BEGIN TIM2_Init 0 */

  4.   /* USER CODE END TIM2_Init 0 */

  5.   TIM_SlaveConfigTypeDef sSlaveConfig = {0};
  6.   TIM_MasterConfigTypeDef sMasterConfig = {0};

  7.   /* USER CODE BEGIN TIM2_Init 1 */

  8.   /* USER CODE END TIM2_Init 1 */
  9.   htim2.Instance = TIM2;
  10.   htim2.Init.Prescaler = 47;
  11.   htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  12.   htim2.Init.Period = 999;
  13.   htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  14.   htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  15.   if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  16.   {
  17.     Error_Handler();
  18.   }
  19.   sSlaveConfig.SlaveMode = TIM_SLAVEMODE_DISABLE;
  20.   sSlaveConfig.InputTrigger = TIM_TS_ITR0;
  21.   if (HAL_TIM_SlaveConfigSynchro(&htim2, &sSlaveConfig) != HAL_OK)
  22.   {
  23.     Error_Handler();
  24.   }
  25.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  26.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  27.   if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  28.   {
  29.     Error_Handler();
  30.   }
  31.   /* USER CODE BEGIN TIM2_Init 2 */
  32.                 HAL_TIM_Base_Start_IT(&htim2);
  33.   /* USER CODE END TIM2_Init 2 */

  34. }
回调函数的编写:
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  2. {
  3.   /* USER CODE BEGIN Callback 0 */

  4.   /* USER CODE END Callback 0 */

  5.   /* USER CODE BEGIN Callback 1 */
  6.   if (htim->Instance == TIM2) {
  7.   Time2point++;
  8.     if(Time2point >=1000)
  9.     {
  10.         Time2point = 0 ;
  11.          HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
  12.           //HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9);
  13.      }
  14.   }
  15. }
试验现象:LED灯以1S的时间间隔闪烁。
地瓜patch 发表于 2025-5-26 16:43 来自手机 | 显示全部楼层
建议做过呼吸灯替代LED闪烁,那显得高大上
您需要登录后才可以回帖 登录 | 注册

本版积分规则

108

主题

307

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部