[单片机芯片] 【CH32V317W-R0】玩转定时器篇

[复制链接]
188|0
abner_ma 发表于 2025-10-28 22:46 | 显示全部楼层 |阅读模式
, , , , TI,
本帖最后由 abner_ma 于 2025-10-29 16:47 编辑

  CH32V317 的定时器强大,种类齐全,从简单的 SysTick 到复杂的 TIM1,覆盖了所有常见的定时/计数应用场景。功能强大:高级定时器支持死区控制和刹车,通用定时器支持编码器模式,这对于工业控制至关重要。 可靠性高:提供了 IWDG 和 WWDG 两种看门狗,增强了系统在恶劣环境下的稳定性。低功耗设计:独立的 RTC 模块保证了超低功耗下的持续计时。CH32V317 的定时器可以分为以下几大类,与 STM32 的定时器分类类似:
1. 高级控制定时器
   型号: TIM1
   位数: 16位
   主要特点:
       具备所有通用定时器的功能。
       支持互补输出的死区时间控制,这是驱动三相无刷电机等应用的关键。
       支持刹车功能,用于在紧急情况下快速关闭输出。
       可以产生高频率的 PWM 信号。
   典型应用: 电机控制、数字电源(PFC、LLC)、逆变器。
2. 通用定时器
   型号: TIM2, TIM3, TIM4
   位数: 16位(TIM2 是 32位)
   主要特点:
       支持向上、向下、向上/下自动重装载计数模式。
       拥有独立的 4 个通道,可用于:
           输入捕获(测量脉冲宽度、频率)
           输出比较(产生特定波形、驱动 DAC)
           PWM 生成
       支持编码器接口,可以直接连接正交编码器。
       可以与其他定时器级联。
   典型应用: 测量传感器信号周期、生成多路 PWM、编码器读数、通用延时。
3. 基本定时器
   型号: TIM6, TIM7
   位数: 16位
   主要特点:
       功能最简单,主要用于时基生成。
       只有计时功能,没有外部输入/输出通道。
       通常用于为 DAC 提供触发信号,或者作为操作系统的滴答定时器。
   典型应用: 操作系统心跳时钟、DAC 触发、提供精确的基准时间间隔。
4. 独立看门狗定时器
   型号: IWDG
   特点:
       由独立的低速内部时钟驱动,即使主时钟失效也能工作。
       用于检测和解决由软件错误或外界干扰引起的程序“跑飞”问题。
       需要软件在溢出前“喂狗”,否则将产生系统复位。
   应用: 提高系统可靠性,抗干扰。
5. 窗口看门狗定时器
   型号: WWDG
   特点:
       时钟来自系统主时钟。
       要求在一个精确的时间窗口内“喂狗”,过早或过晚都会导致复位。
       更适合监测那些要求代码必须在规定时间内执行的应用程序。
   应用: 监测关键任务的执行是否超时或提前结束。
6. 系统时基定时器
   型号: SysTick
   特点:
       这是一个 24 位的递减计数器,是 RISC-V 内核的一部分。
       专用于为实时操作系统提供规律的定时中断,即“心跳”。
       即使没有操作系统,也常用于实现精准的微秒或毫秒级延时函数。
   应用: 操作系统任务调度、`HAL_Delay()` 等延时函数的基础。
7. 实时时钟
   型号: RTC
   特点:
       由一个外部的 32.768kHz 晶振驱动,功耗极低。
       即使在主电源断开、仅由备份电池供电的情况下也能持续运行。
       提供日历时钟(年、月、日、时、分、秒)和闹钟功能。
       具有秒中断功能。
   应用: 电子钟、数据记录仪、需要记录时间的设备。



  1. #include "./BSP/LED/led.h"
  2. #include "./BSP/TIMER/btim.h"


  3. void BTIM_TIMX_INT_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

  4. /**
  5. * [url=/u/brief]@brief[/url]       基本定时器TIMX中断服务函数
  6. * @param       无
  7. * @retval      无
  8. */
  9. void BTIM_TIMX_INT_IRQHandler(void)
  10. {
  11.     if (TIM_GetITStatus(BTIM_TIMX_INT, TIM_IT_Update) != RESET)  /* 检查TIMx更新中断是否发生 */
  12.     {
  13.         TIM_ClearITPendingBit(BTIM_TIMX_INT, TIM_IT_Update  );   /* 清除TIMx更新中断标志 */
  14.         LED1_TOGGLE();                                           /* LED1翻转 */
  15.     }
  16. }

  17. /**
  18. * @brief       基本定时器TIMX定时中断初始化函数
  19. * @note
  20. *              基本定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候
  21. *              基本定时器的时钟为APB1时钟的2倍, 而APB1为72M, 所以定时器时钟 = 144Mhz
  22. *              定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.
  23. *              Ft=定时器工作频率,单位:Mhz
  24. *
  25. * @param       arr: 自动重装值。
  26. * @param       psc: 时钟预分频数
  27. * @retval      无
  28. */
  29. void btim_timx_int_init(uint16_t arr, uint16_t psc)
  30. {
  31.     TIM_TimeBaseInitTypeDef  tim_init_struct;
  32.     NVIC_InitTypeDef nvic_init_struct;

  33.     BTIM_TIMX_INT_CLK_ENABLE();                             /* 使能TIMx时钟 */

  34.     tim_init_struct.TIM_Period = arr;                       /* 设置自动重装载值 */
  35.     tim_init_struct.TIM_Prescaler =psc;                     /* 设置预分频系数 */
  36.     tim_init_struct.TIM_CounterMode = TIM_CounterMode_Up;   /* 向上计数模式 */
  37.     TIM_TimeBaseInit(BTIM_TIMX_INT, &tim_init_struct);      /* 定时器初始化 */

  38.     nvic_init_struct.NVIC_IRQChannel = BTIM_TIMX_INT_IRQn;  /* TIMx中断 */
  39.     nvic_init_struct.NVIC_IRQChannelPreemptionPriority = 0; /* 抢占优先级0 */
  40.     nvic_init_struct.NVIC_IRQChannelSubPriority = 3;        /* 响应优先级3 */
  41.     nvic_init_struct.NVIC_IRQChannelCmd = ENABLE;           /* IRQ通道使能 */
  42.     NVIC_Init(&nvic_init_struct);                           /* 初始化NVIC */

  43.     TIM_ITConfig(BTIM_TIMX_INT,TIM_IT_Update,ENABLE );      /* 使能指定的TIMx中断,允许更新中断 */
  44.     TIM_Cmd(BTIM_TIMX_INT, ENABLE);                         /* 使能TIMx */
  45. }




   下面用普通定时器做程序设计
无需main函数,定时器中断实现开关灯
U8.png

您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:项目经理
简介:资深嵌入式开发工程师

106

主题

194

帖子

3

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