[APM32E0] APM32E030的定时器驱动(计时)

[复制链接]
50|1
口天土立口 发表于 2025-10-15 19:17 | 显示全部楼层 |阅读模式
本帖最后由 口天土立口 于 2025-10-15 19:21 编辑

9779768ef81e8f2081.png

APM32E030的定时器有三类,不同定时器支持的功能互有差异,都能实现基本的计时功能;

驱动代码如下:
  1. #define TIM_INS     (TMR6)

  2. /* 定时器更新中断处理函数 */
  3. static tim_update_deal_func_f tim_update_deal_func;
  1. /*
  2. * @brief       定时器初始化
  3. *
  4. * @param       ms: 定时间隔
  5. *
  6. * @retval      None
  7. *
  8. */
  9. void bsp_tim_init(uint16_t ms)
  10. {
  11.     TMR_TimeBase_T timeBaseConfig;
  12.    
  13.     /* 寄存器AUTORLD为16bit */
  14.     if ((ms >= 1) && (ms <= 6553)) {
  15.         RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR6);
  16.         TMR_Reset(TIM_INS);
  17.         TMR_ConfigTimeBaseStruct(&timeBaseConfig);
  18.         /* CK_CNT=fCK_PSC/(PSC+1) */
  19.         timeBaseConfig.div = 7200 - 1;              /* 10KHz */
  20.         timeBaseConfig.period = (ms * 10) - 1;
  21.         timeBaseConfig.clockDivision = TMR_CKD_DIV1;
  22.         timeBaseConfig.counterMode = TMR_COUNTER_MODE_UP;
  23.         timeBaseConfig.repetitionCounter = 0;
  24.         TMR_ConfigTimeBase(TIM_INS, &timeBaseConfig);
  25.         /* 使能更新中断 */
  26.         TMR_EnableInterrupt(TIM_INS, TMR_INT_UPDATE);
  27.         /* 使能中断 */
  28.         NVIC_SetPriority(TMR6_IRQn, 0);
  29.         NVIC_EnableIRQ(TMR6_IRQn);   
  30.         /* 使能定时器 */
  31.         TMR_Enable(TIM_INS);
  32.     }
  33. }
  1. /*
  2. * @brief       中断处理函数
  3. *
  4. * @param       None
  5. *
  6. * @retval      None
  7. *
  8. */
  9. void TMR6_IRQHandler(void)
  10. {
  11.     if (TMR_ReadIntFlag(TIM_INS,  TMR_INT_FLAG_UPDATE) == SET) {
  12.         TMR_ClearIntFlag(TIM_INS,  TMR_INT_FLAG_UPDATE);
  13.         (tim_update_deal_func != NULL) ? tim_update_deal_func() : NULL;
  14.     }
  15. }
  1. /*
  2. * @brief       定时器更新处理函数注册
  3. *
  4. * @param       func: 定时器更新中断处理函数
  5. *
  6. * @retval      None
  7. *
  8. */
  9. void bsp_tim_update_deal_func_register(tim_update_deal_func_f func)
  10. {
  11.     tim_update_deal_func = func;
  12. }


测试代码如下:
  1. void test_gpio_init(void)
  2. {
  3.     GPIO_Config_T gpioConfig;
  4.     RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA);
  5.     GPIO_ConfigStructInit(&gpioConfig);
  6.     gpioConfig.pin     = GPIO_PIN_5;
  7.     gpioConfig.mode    = GPIO_MODE_OUT;
  8.     gpioConfig.outtype = GPIO_OUT_TYPE_PP;
  9.     gpioConfig.speed   = GPIO_SPEED_50MHz;
  10.     gpioConfig.pupd    = GPIO_PUPD_NO;
  11.     GPIO_Config(GPIOA, &gpioConfig);
  12. }
  1. void test_gpio_toggle(void)
  2. {
  3.     (GPIO_ReadOutputBit(GPIOA, GPIO_PIN_5) == BIT_SET) ? \
  4.         GPIO_ClearBit(GPIOA, GPIO_PIN_5) : \
  5.         GPIO_SetBit(GPIOA, GPIO_PIN_5);
  6. }
  1. // 应用初始化
  2. void app_init(void)
  3. {
  4.     test_gpio_init();
  5.     bsp_tim_update_deal_func_register(test_gpio_toggle);
  6.     bsp_tim_init(10);
  7. }

  8. // 应用任务
  9. void app_task(void)
  10. {
  11. }
3877568ef83b95c67a.png

详细代码,请查看附件!
Timer.zip (2.11 MB, 下载次数: 0)




7527168ef83081ab4a.png
永恒的一瞥 发表于 2025-10-17 11:04 | 显示全部楼层
这个小API写得还蛮有意思的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

54

帖子

0

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