发个帖子记录一下雅特力AT32F437的定时器中断实验。 我们需要在Keil基础工程里面添加at32f435_437_misc.c/.h与at32f435_437_tmr.c/.h驱动库文件,以方便我们编写Timer的外设配置代码。 我们以通用定时器Timer10为例,使其产生溢出中断,并在中断处理中产生100ms周期的信号量。在主函数main()中,通过信号量的触发翻转LED0灯,观察其快闪效果。 Timer10仅为通用定时器,其仅可使用内部时钟做为计数时钟,其支持溢出事件等简单应用。相较选择高级定时器,我们更希望MCU中稀少的硬件资源可以物尽其用。 Timer的配置流程包含三大部分:NVIC配置,定时器配置和定时器中断服务函数。 NVIC配置包含了中断分组配置,中断通道选择,中断优先级设置,以及中断使能。首先,我们根据项目整体需求配置中断优先级组。我这里的需求是3bit抢占优先级,1bit亚优先级。所以,我的中断优先级组配置为NVIC_PRIORITY_GROUP_3。然后,再配置NVIC中断参数,并打开Timer10中断使能。 Timer10的定时器溢出中断的配置流程相对简单,流程图如下所示: 代码实现如下: - static void timer10_base_init(void)
- {
- crm_periph_clock_enable(CRM_TMR10_PERIPH_CLOCK, TRUE);
- tmr_base_init(TMR10, 999, (28800 - 1));
- tmr_cnt_dir_set(TMR10, TMR_COUNT_UP);
- tmr_flag_clear(TMR10, TMR_OVF_FLAG);
- tmr_interrupt_enable(TMR10, TMR_OVF_INT, TRUE);
- nvic_irq_enable(TMR1_OVF_TMR10_IRQn, 3, 1);
- tmr_counter_enable(TMR10, TRUE);
- }
中断倒是难度不高,检查中断标志位,然后清除即可。代码如下: - void TMR1_OVF_TMR10_IRQHandler(void)
- {
- if (tmr_interrupt_flag_get(TMR10, TMR_OVF_FLAG) == SET)
- {
- tmr_flag_clear(TMR10, TMR_OVF_FLAG);
- sem_led++;
- }
- }
总体来说,实现比较简单。Timer10以100ms触发,并周期的发送信号量,主程序main()中检查到sem_led发出后,对LED0灯进行翻转。实验效果如下:
|