打印
[学习笔记]

【AutoChips MCU评测报告】四、TIMER

[复制链接]
759|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
      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)模式。




用到定时器资源首先要了解一下时钟系统。 AutoChips的AC781X系列微控制器时钟系统描述如下:








      后面的三张局部截图是与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”时钟配置界面:


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


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

    TIMER_SetCallback(TIMER2, TIMER2_IRQHandler_Callback);
    MSP_TIMER_Init(TIMER2);
    timConfig.timerEn = 1;
    timConfig.interruptEn = 1;
    timConfig.linkMode = 0;
    timConfig.loadValue = (48000-1);
    TIMER_Init(TIMER2, &timConfig);
                TIMER_SetCallback(TIMER2, TIMER_CallBack);
}
/* TIMER3 init function */
void ATC_TIMER3_Init(void)
{
    TIMER_ConfigType timConfig;

    TIMER_SetCallback(TIMER3, TIMER3_IRQHandler_Callback);
    MSP_TIMER_Init(TIMER3);
    timConfig.timerEn = 1;
    timConfig.interruptEn = 1;
    timConfig.linkMode = 1;
    timConfig.loadValue = (10-1);
    TIMER_Init(TIMER3, &timConfig);
                TIMER_SetCallback(TIMER3, TIMER_CallBack);
}
上面的代码是由“AutoGen Studio”创建生成的,不过最后的“TIMER_SetCallback(TIMER2(3), TIMER_CallBack)”是要自己写上的,当然由他呼叫的那个TIMER_CallBack”也得自己比划。下面就是:
/* USER CODE BEGIN 1 */
void TIMER_CallBack(uint8_t TIMERX)
{
                if(TIMER_GetIntFlag(TIMER2))
    {
        TIMER_ClrIntFlag(TIMER2);
                                TIMER2_OUT = !TIMER2_OUT;
    }
               
                if(TIMER_GetIntFlag(TIMER3))
    {
        TIMER_ClrIntFlag(TIMER3);
                                TIMER3_OUT = !TIMER3_OUT;
    }
}

/* USER CODE END 1 */


四、实验结果



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

六、附件
TIMER.rar (973.85 KB)

使用特权

评论回复

相关帖子

沙发
zeshoufx| | 2020-6-15 08:37 | 只看该作者
谢谢分享,,,,,,,,,,

使用特权

评论回复
板凳
lisingch|  楼主 | 2020-6-18 21:35 | 只看该作者
zeshoufx 发表于 2020-6-15 08:37
谢谢分享,,,,,,,,,,

谢谢捧场!多多交流、相互学习。

使用特权

评论回复
地板
JasonLee27| | 2020-6-19 16:10 | 只看该作者
哈,你可以用链模式直接做一个时钟

使用特权

评论回复
5
lisingch|  楼主 | 2020-6-19 16:21 | 只看该作者
JasonLee27 发表于 2020-6-19 16:10
哈,你可以用链模式直接做一个时钟

好主意!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

14984

帖子

17

粉丝