打印
[菜农助学交流]

第五批小彬的M0学习之路6--学习使用定时器

[复制链接]
2651|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zjsyjbb|  楼主 | 2011-12-17 22:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天学习了下M0的定时器,M0的定时器跟51的定时器相比较有几个相似的地方,但是复杂程度要高了许多.
使用51的定时器主要思路是:
(1)确定工作方式.(2)确定定时的初值.(3)对EA,ET0,ET1,IP进行操作.
(4)启动定时器.(5)定时时间到,开始中断服务.
使用M0的定时器的主要思路是:
(1)定时器初始化.(2)设置定时器的时钟源.这个要注意,有时候要根据程序确定需要的时钟源.学习51时俺经常无视这个.(3)工作模式设定,启动定时器并引入定时器通道..(4)引入定时处理事件,设置回调函数.类似于51的中断服务.callback 这个回调函数给我耳目一新的感觉,这个callback在matlab的GUI设计中经常用到,而且作用很大,这学期刚好在学习matlab这门课,matlab中的意思是当你引入触发时,执行回调函数. 所以当我回过头来看看,我们可以看到异曲同工之妙的效果.(5)中断使能,即允许中断,类似于51中的EA.(6)开始定时计数.
下面贴出我的主函数
 
/*------------------------------------------------------------------------- */
/* 实现目标:利用定时器的计时功能对LED1进行控制        */
/* 作者:小彬                */
/*  时间:2011年12月17日              */

#include <stdio.h>
#include "NUC1xx.h"
#include "DrvGPIO.h"
#include "DrvSYS.h"
#include "DrvTIMER.h"
/*延时子程序----------------------------------------------------------------*/
/*延时时间:k mS(在12M的晶振频率下)--------------------------------------------*/
void delay_ms(uint32_t k)
{
    uint32_t i,j;
for(i=k;i>0;i--)
    for(j=2395;j>0;j--);
}
/*定时处理事件,每隔0.2S对LED1进行控制*/
void Timer0_Callback (void)
{
    if (DrvGPIO_GetBit(E_GPA,2))
  DrvGPIO_ClrBit(E_GPA,2);
else
  DrvGPIO_SetBit(E_GPA,2);
}

/*---------------------------------------------------------------------------*/
/* 主程序                                                                    */
/*---------------------------------------------------------------------------*/   
int main (void)
{

/*系统时钟设置*/
UNLOCKREG();
    SYSCLK->PWRCON.XTL12M_EN = 1;
delay_ms(100);   
LOCKREG();

/*对GPIO端口的设置*/

DrvGPIO_Open(E_GPA,2, E_IO_OUTPUT);  //LED1端口设置为输出

/*对定时器进行设置*/

DrvTIMER_Init();              //初始化定时器
DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC,0);      //设定TIMER0的时钟源为外部12MHZ
DrvTIMER_Open(E_TMR0,500,E_PERIODIC_MODE);        //设定定时器timer0的tick周期,并且启动定时器:定时器通道 TMR0  每秒500次  周期模式

DrvTIMER_SetTimerEvent(E_TMR0,100,(TIMER_CALLBACK) Timer0_Callback,0); //安装一个定时处理事件到 timer0通道
DrvTIMER_EnableInt(E_TMR0);            //使能定时器中断  //TIMER0->TCSR.IE = 1
DrvTIMER_Start(E_TMR0);             //定时器timer0开始计数 //TIMER0->TCSR.CEN = 1;

while(1)
{
}
}


个人小结:通过这次学习,感受到了M0定时器的复杂性和强大,尤其是库函数,水很深.当然我们主要是对寄存器进行操作,于是开发上简化了操作.关于定时器的应用有好多,今天只学了一种方式的应用,仍然要努力深入学习...
最后附上压缩包

定时器的应用.rar (885.92 KB)

相关帖子

沙发
consif| | 2011-12-18 13:37 | 只看该作者
学习了

使用特权

评论回复
板凳
weshiluwei6| | 2011-12-18 14:03 | 只看该作者
学习学习 支持支持啊

使用特权

评论回复
地板
weshiluwei6| | 2011-12-18 14:04 | 只看该作者
学习学习 支持支持啊

使用特权

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

本版积分规则

个人签名:一步一个脚印,踏踏实实练好技术..

80

主题

646

帖子

2

粉丝