查看: 1711|回复: 0

【ADI EVAL-ADuCM360QSPZ开发套件】使用教程(四)---定时器学习

[复制链接]
  • TA的每日心情
    奋斗
    2020-5-27 15:41
  • 签到天数: 868 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-3-29 16:37:46 | 显示全部楼层 |阅读模式
    分享到:
    你一定对定时器不陌生把,定时闹钟,定时开、关机,等等。在需要控制时间的场合,一定少不了定时器的身影。
    定时器多种多样,种类繁多,这里我要学习的是ADuCM360芯片的内部定时器。
    ADuCM360 内部有两个完全一样的、通用目的、16位向上/向下计数器 Timer0 and Timer1。由4个可选的不同的、可向下预分频(1、16、256、32768)的时钟源驱动.,能工作在自由运行模式和周期模式。

    每个定时器可捕获15个不同的事件。

    定时器包括 16位装载值寄存器TxLD、16位计数值TxVAL、控制寄存器TxCON、清除中断寄存器TxCLRI、捕获寄存器TxCAP、状态寄存器TxSTA。

    MINI开发板外部资源只有PTD电阻和一个LED,遗憾的是所有的引出端没有排针。需要你自己焊接。
    使用板上的32.768KHz晶振 ,让定时器产生0.5s定时,驱动LED每秒闪烁1次。
    定时器初始化函数
    void  Time0_INIT (void){      GptLd(pADI_TM0, 1023);   //32.768k 时钟16分频后除以2-1==0.5s 向下计数到0产生中断   GptCfg(pADI_TM0, TCON_CLK_LFXTAL, TCON_PRE_DIV16, TCON_MOD_PERIODIC|TCON_UP_DIS|TCON_RLD_EN|TCON_ENABLE);//外部晶振32.768k   }结果LED怎么也不正常,这个时候仿真器在调试时才显得强大,DEBUG单步执行观察T0定时器的控制寄存器和状态寄存器,明明各项参数都设置的不错,就是中断状态不 改变,也就是说进不了中断。看了好几遍手册,查看了程序函数参数,也没有找到错误,考虑到定时器有4个时钟驱动源,好吧,换成系统时钟试试
    void  Time0_INIT (void){      GptLd(pADI_TM0, 31249);   //16M时钟256分频后除以2-1==0.5S   向下计数到0产生中断   GptCfg(pADI_TM0, TCON_CLK_UCLK, TCON_PRE_DIV256, TCON_MOD_PERIODIC|TCON_UP_DIS|TCON_RLD_EN|TCON_ENABLE); //UCLK为16M   }          编译调试运行,期待的每秒闪烁一次的LED开始闪烁了。这个圆柱形的外部晶振真不给力啊,不起振,坏的?

    源代码如下:
    #include <stdio.h>#include <string.h>#include <aducm360.h>#include <ClkLib.h>#include <WdtLib.h>#include <GptLib.h>#include <IntLib.h>#include <DioLib.h>void Time0_INIT(void ); int main (void){   DioOen(pADI_GP1,0x8);    //设置P1.3输出    WdtCfg(T3CON_PRE_DIV1,T3CON_IRQ_EN,T3CON_PD_DIS); // 使能看门狗   //使能不使用的外设时钟     ClkDis(CLKDIS_DISSPI0CLK| CLKDIS_DISSPI1CLK| CLKDIS_DISI2CCLK| CLKDIS_DISUARTCLK| CLKDIS_DISPWMCLK| CLKDIS_DIST1CLK| CLKDIS_DISDACCLK| CLKDIS_DISDMACLK| CLKDIS_DISADCCLK);   ClkCfg(CLK_CD0,CLK_HF,CLKSYSDIV_DIV2EN_DIS,CLK_UCLKCG);     // Select CD0 for CPU clock        Time0_INIT();                         // 定时器初始化   NVIC_EnableIRQ(TIMER0_IRQn);          //中断使能     while (1)   {             }}void  Time0_INIT (void){      GptLd(pADI_TM0, 31249);    //预装载计数初值   GptCfg(pADI_TM0, TCON_CLK_UCLK, TCON_PRE_DIV256, TCON_MOD_PERIODIC|TCON_UP_DIS|TCON_RLD_EN|TCON_ENABLE);    //配置定时器时钟源为系统时钟、256分频、周期计数、向下计数、重载计数值、定时器使能}void GP_Tmr0_Int_Handler (){   GptClrInt(pADI_TM0,TSTA_TMOUT);  //清除定时器溢出中断标志   DioTgl(pADI_GP1,0x8);} 通过简单的中断,实现了led闪烁。了解了定时器工作原理。和其它单片机比,由于ADu360专为采集数据而生,定时器简单易用。
    回复

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-12-19 06:51 , Processed in 0.119128 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.