[学习笔记] 【AutoChips MCU评测报告】四、TIMER

[复制链接]
1025|4
 楼主| lisingch 发表于 2020-6-13 12:59 | 显示全部楼层 |阅读模式
      AutoChips的AC781X系列微控制器片上资源丰富,有些外设还独具特色,比如周期性中断定时器——TIMER,相邻通道之间可以相互勾搭能够产生更长的延时。本次实验即使用了其中的两个通道TIMER2与TIMER3,由TIMER2产生1ms计时脉冲并同时链接至TIMER3,当TIMER3累计收到10个脉冲后产生中断。为便于观察,在PA0、PA1端口连接了逻辑分析仪。工程依然使用了“AutoGen Studio”创建。下面是实验过程:

一、实验资源
1、AC7811-MINI开发板;
2、AutoGen Studio 1.2.0;
3、KEIL 5.28.0.0;
4、USB转串口工具;
5、逻辑分析仪

二、资源简介
       AutoChips的AC781X周期性中断定时器(TIMER)最多支持8个通道,其中的TIMER0、TIMER1是32位计数器,其余TIMER2~TIMER7均为16位计数器,从数据资料上了解到应该是向下的减计数器,可生成中断并具有链(chain)模式。
2020-06-13_112545.png
2020-06-13_112611.png
2020-06-13_112641.png

用到定时器资源首先要了解一下时钟系统。 AutoChips的AC781X系列微控制器时钟系统描述如下:
2020-06-13_113628.png
2020-06-13_113028.png
2020-06-13_113455.png
2020-06-13_113512.png

2020-06-13_113133.png
2020-06-13_113304.png
2020-06-13_113323.png
      后面的三张局部截图是与TIMER相关的时钟路线,实验中使用“AutoGen Studio”也是进行了相应的时钟配置,采用外部晶振(8MHz)作为系统时钟源,经PLL倍频、各级分频等一系列折腾后生成SYS_CLK(96MHz),再经APB_DIV分频后产生PCLK(48MHz)时钟,TIMER计数脉冲亦来自于此时钟(48MHz)。在此基础上计算了TIMER最大计时时基32位定时器:(2^32-1) * 1/48000000=89.4784853125s;16位定时器:(2^16-1) * 1/48000000=0.0013653125s。下面是“AutoGen Studio”时钟配置界面:
2020-06-13_124840.png

三、代码实现
      代码参考了DEMO,工程中配置了两个通道TIMER2和TIMER3,由TIMER2产生1ms计时中断,为便于观察设置了中断产生后PA0端口输出翻转;TIMER3被配置为“链接”至TIMER2,每当TIMER2产生一个1ms计时中断后TIMER3便会发生一次向下计数,当TIMER3计数期结束即会产生中断,使得PA1端口输出翻转便于观察。下面是文档中关于“chain”的描述:
2020-06-13_123851.png

主要代码如下:
  1. /* TIMER2 init function */
  2. void ATC_TIMER2_Init(void)
  3. {
  4.     TIMER_ConfigType timConfig;

  5.     TIMER_SetCallback(TIMER2, TIMER2_IRQHandler_Callback);
  6.     MSP_TIMER_Init(TIMER2);
  7.     timConfig.timerEn = 1;
  8.     timConfig.interruptEn = 1;
  9.     timConfig.linkMode = 0;
  10.     timConfig.loadValue = (48000-1);
  11.     TIMER_Init(TIMER2, &timConfig);
  12.                 TIMER_SetCallback(TIMER2, TIMER_CallBack);
  13. }
  14. /* TIMER3 init function */
  15. void ATC_TIMER3_Init(void)
  16. {
  17.     TIMER_ConfigType timConfig;

  18.     TIMER_SetCallback(TIMER3, TIMER3_IRQHandler_Callback);
  19.     MSP_TIMER_Init(TIMER3);
  20.     timConfig.timerEn = 1;
  21.     timConfig.interruptEn = 1;
  22.     timConfig.linkMode = 1;
  23.     timConfig.loadValue = (10-1);
  24.     TIMER_Init(TIMER3, &timConfig);
  25.                 TIMER_SetCallback(TIMER3, TIMER_CallBack);
  26. }
上面的代码是由“AutoGen Studio”创建生成的,不过最后的“TIMER_SetCallback(TIMER2(3), TIMER_CallBack)”是要自己写上的,当然由他呼叫的那个TIMER_CallBack”也得自己比划。下面就是:
  1. /* USER CODE BEGIN 1 */
  2. void TIMER_CallBack(uint8_t TIMERX)
  3. {
  4.                 if(TIMER_GetIntFlag(TIMER2))
  5.     {
  6.         TIMER_ClrIntFlag(TIMER2);
  7.                                 TIMER2_OUT = !TIMER2_OUT;
  8.     }
  9.                
  10.                 if(TIMER_GetIntFlag(TIMER3))
  11.     {
  12.         TIMER_ClrIntFlag(TIMER3);
  13.                                 TIMER3_OUT = !TIMER3_OUT;
  14.     }
  15. }

  16. /* USER CODE END 1 */


四、实验结果
2020-06-13_004413.png
2020-06-13_004350.png

五、实验总结
      通过本次实验对TIMER资源有了进一步的了解和认识,尤其是“链”功能比较有特点,多级链接可以形成超长延时。另外文中有些描述可能存在错误,还请朋友们指教。

六、附件
TIMER.rar (973.85 KB, 下载次数: 4)

zeshoufx 发表于 2020-6-15 08:37 | 显示全部楼层
谢谢分享,,,,,,,,,,
 楼主| lisingch 发表于 2020-6-18 21:35 | 显示全部楼层
zeshoufx 发表于 2020-6-15 08:37
谢谢分享,,,,,,,,,,

谢谢捧场!多多交流、相互学习。
JasonLee27 发表于 2020-6-19 16:10 | 显示全部楼层
哈,你可以用链模式直接做一个时钟
 楼主| lisingch 发表于 2020-6-19 16:21 | 显示全部楼层
JasonLee27 发表于 2020-6-19 16:10
哈,你可以用链模式直接做一个时钟

好主意!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

15007

帖子

19

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