[AT32F437] AT32F437定时器Timer10溢出中断实验

[复制链接]
588|0
雾里闲逛 发表于 2025-9-25 10:37 | 显示全部楼层 |阅读模式
, , AT32F437, ,
发个帖子记录一下雅特力AT32F437的定时器中断实验。
我们需要在Keil基础工程里面添加at32f435_437_misc.c/.h与at32f435_437_tmr.c/.h驱动库文件,以方便我们编写Timer的外设配置代码。
我们以通用定时器Timer10为例,使其产生溢出中断,并在中断处理中产生100ms周期的信号量。在主函数main()中,通过信号量的触发翻转LED0灯,观察其快闪效果。
Timer10仅为通用定时器,其仅可使用内部时钟做为计数时钟,其支持溢出事件等简单应用。相较选择高级定时器,我们更希望MCU中稀少的硬件资源可以物尽其用。
Timer的配置流程包含三大部分:NVIC配置,定时器配置和定时器中断服务函数。
  • NVIC配置

NVIC配置包含了中断分组配置,中断通道选择,中断优先级设置,以及中断使能。首先,我们根据项目整体需求配置中断优先级组。我这里的需求是3bit抢占优先级,1bit亚优先级。所以,我的中断优先级组配置为NVIC_PRIORITY_GROUP_3。然后,再配置NVIC中断参数,并打开Timer10中断使能。
  • 定时器配置

Timer10的定时器溢出中断的配置流程相对简单,流程图如下所示:
系统结构图.jpg
代码实现如下:
  1. static void timer10_base_init(void)
  2. {
  3.   crm_periph_clock_enable(CRM_TMR10_PERIPH_CLOCK, TRUE);
  4.   tmr_base_init(TMR10, 999, (28800 - 1));
  5.   tmr_cnt_dir_set(TMR10, TMR_COUNT_UP);
  6.   tmr_flag_clear(TMR10, TMR_OVF_FLAG);
  7.   tmr_interrupt_enable(TMR10, TMR_OVF_INT, TRUE);
  8.   nvic_irq_enable(TMR1_OVF_TMR10_IRQn, 3, 1);
  9.   tmr_counter_enable(TMR10, TRUE);
  10. }

  • 定时器中断服务函数

中断倒是难度不高,检查中断标志位,然后清除即可。代码如下:
  1. void TMR1_OVF_TMR10_IRQHandler(void)
  2. {
  3.   if (tmr_interrupt_flag_get(TMR10, TMR_OVF_FLAG) == SET)
  4.   {
  5.     tmr_flag_clear(TMR10, TMR_OVF_FLAG);
  6.     sem_led++;
  7.   }
  8. }
总体来说,实现比较简单。Timer10以100ms触发,并周期的发送信号量,主程序main()中检查到sem_led发出后,对LED0灯进行翻转。实验效果如下:
Timer10_blinky.gif







您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

47

帖子

0

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