口天土立口 发表于 2025-10-15 19:17

APM32E030的定时器驱动(计时)

本帖最后由 口天土立口 于 2025-10-15 19:21 编辑



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

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

/* 定时器更新中断处理函数 */
static tim_update_deal_func_f tim_update_deal_func;/*
* @brief       定时器初始化
*
* @param       ms: 定时间隔
*
* @retval      None
*
*/
void bsp_tim_init(uint16_t ms)
{
    TMR_TimeBase_T timeBaseConfig;
   
    /* 寄存器AUTORLD为16bit */
    if ((ms >= 1) && (ms <= 6553)) {
      RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR6);
      TMR_Reset(TIM_INS);
      TMR_ConfigTimeBaseStruct(&timeBaseConfig);
      /* CK_CNT=fCK_PSC/(PSC+1) */
      timeBaseConfig.div = 7200 - 1;            /* 10KHz */
      timeBaseConfig.period = (ms * 10) - 1;
      timeBaseConfig.clockDivision = TMR_CKD_DIV1;
      timeBaseConfig.counterMode = TMR_COUNTER_MODE_UP;
      timeBaseConfig.repetitionCounter = 0;
      TMR_ConfigTimeBase(TIM_INS, &timeBaseConfig);
      /* 使能更新中断 */
      TMR_EnableInterrupt(TIM_INS, TMR_INT_UPDATE);
      /* 使能中断 */
      NVIC_SetPriority(TMR6_IRQn, 0);
      NVIC_EnableIRQ(TMR6_IRQn);   
      /* 使能定时器 */
      TMR_Enable(TIM_INS);
    }
}/*
* @brief       中断处理函数
*
* @param       None
*
* @retval      None
*
*/
void TMR6_IRQHandler(void)
{
    if (TMR_ReadIntFlag(TIM_INS,TMR_INT_FLAG_UPDATE) == SET) {
      TMR_ClearIntFlag(TIM_INS,TMR_INT_FLAG_UPDATE);
      (tim_update_deal_func != NULL) ? tim_update_deal_func() : NULL;
    }
}/*
* @brief       定时器更新处理函数注册
*
* @param       func: 定时器更新中断处理函数
*
* @retval      None
*
*/
void bsp_tim_update_deal_func_register(tim_update_deal_func_f func)
{
    tim_update_deal_func = func;
}

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

// 应用任务
void app_task(void)
{
}

详细代码,请查看附件!





永恒的一瞥 发表于 2025-10-17 11:04

这个小API写得还蛮有意思的。

jobszheng 发表于 2025-10-19 20:01

这个是周期性触发

发光的梦 发表于 2025-10-19 23:03

参考一下。
Timer也都是专用的,写成API也没有太大意义
页: [1]
查看完整版本: APM32E030的定时器驱动(计时)