本帖最后由 口天土立口 于 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)
- {
- }
详细代码,请查看附件!
Timer.zip
(2.11 MB, 下载次数: 0)
|