[菜农助学交流] 第五批小彬的M0学习之路6--学习使用定时器

[复制链接]
3567|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)开始定时计数.
下面贴出我的主函数

  1. /*------------------------------------------------------------------------- */
  2. /* 实现目标:利用定时器的计时功能对LED1进行控制        */
  3. /* 作者:小彬                */
  4. /*  时间:2011年12月17日              */

  5. #include <stdio.h>
  6. #include "NUC1xx.h"
  7. #include "DrvGPIO.h"
  8. #include "DrvSYS.h"
  9. #include "DrvTIMER.h"
  10. /*延时子程序----------------------------------------------------------------*/
  11. /*延时时间:k mS(在12M的晶振频率下)--------------------------------------------*/
  12. void delay_ms(uint32_t k)
  13. {
  14.     uint32_t i,j;
  15. for(i=k;i>0;i--)
  16.     for(j=2395;j>0;j--);
  17. }
  18. /*定时处理事件,每隔0.2S对LED1进行控制*/
  19. void Timer0_Callback (void)
  20. {
  21.     if (DrvGPIO_GetBit(E_GPA,2))
  22.   DrvGPIO_ClrBit(E_GPA,2);
  23. else
  24.   DrvGPIO_SetBit(E_GPA,2);
  25. }

  26. /*---------------------------------------------------------------------------*/
  27. /* 主程序                                                                    */
  28. /*---------------------------------------------------------------------------*/   
  29. int main (void)
  30. {

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

  36. /*对GPIO端口的设置*/

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

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

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

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

  45. while(1)
  46. {
  47. }
  48. }


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
consif 发表于 2011-12-18 13:37 | 显示全部楼层
学习了
weshiluwei6 发表于 2011-12-18 14:03 | 显示全部楼层
学习学习 支持支持啊
weshiluwei6 发表于 2011-12-18 14:04 | 显示全部楼层
学习学习 支持支持啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

80

主题

660

帖子

3

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