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)
{
}
详细代码,请查看附件!
这个小API写得还蛮有意思的。 这个是周期性触发 参考一下。
Timer也都是专用的,写成API也没有太大意义
页:
[1]