[Cortex-M0技术交流] 【第三期】三生石的M0学习笔记第2贴--TIMER

[复制链接]
 楼主| kyzb001 发表于 2011-10-18 23:38 | 显示全部楼层 |阅读模式
本帖最后由 kyzb001 于 2011-10-18 23:46 编辑

笔记----TIMER
晚上回来比较晚,吃完饭9点半...晕死!
本来想弄一个定时器PWM,然后做一个LED灯 渐灭,渐亮的小东西。
定时器初始化,因为之前些好了就直接弄过来了,先做了个LED等闪烁测试,但发现定时器怎么都触发不了中断,受不鸟,翻资料,库文件手册,数据手册。发现配置没错! 但就是进不去。  最后最后,发现原来我些的太急了,程序没写死循环while(1)或者for(;;);
蛋蛋疼啊!  特此提醒广大淫民们, 千万注意  单片机要有主循环。

先简单介绍一下定时器,明天下班在回来补充


现在简单些下 流程.

第一    DrvTIMER_Init();  这个函数,不管是初始化那个定时器  都要调用

        /* Set all the default TIMER clock sources are from 12MHz */
第二     DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC, 0);设置时钟

        /* Using TIMER0 in PERIODIC_MODE, 2 ticks /sec */
第三     DrvTIMER_Open(E_TMR0, 10, E_PERIODIC_MODE);打开定时器并且设置触发时间和模式
时间方法是   第二个变量。   我假设第二个变量是x  那么定时器将在1/x的时候产生一次中断。  例如x=1,那么定时器过1s就会产生一次中断。x=1000,定时器就过1ms产生一次中断。
模式:
/*---------------------------------------------------------------------------------------------------------*/
/* Define TIMER OPREATION MODE                                                                             */
/*---------------------------------------------------------------------------------------------------------*/
typedef enum{                  
    E_ONESHOT_MODE
= 0,
    E_PERIODIC_MODE   
= 1,
    E_TOGGLE_MODE     
= 2,
    E_CONTINUOUS_MODE
= 3     
} E_TIMER_OPMODE ;

这个是在DrvTIMER.h中定义的结构体 ,表示了定时器的4中模式,大家可以直接翻译出意思
第一个 one shot  只有一次, 也就是这个模式,定时器就触发一次中断
第二个 PERIODIC 周期的,循环的。  也就是说定时器会循环触发中断,只要不清楚定时器,定时器都会这设定的时间到的时候触发一次中断
第三个 TOGGLE  输出比较触发模式    (翻转。当计数值与比较/捕获寄存器值相同时,翻转输出引脚的电平)
第四个 CONTINUOUS  连续捕获模式

一般使用E_PERIODIC_MODE这个模式

第四步  
DrvTIMER_SetTimerEvent(E_TMR0, 1, (TIMER_CALLBACK)TMR_Callback, 1);
设置回调函数
第二个参数为 引发几次中断才进入中断回调函数

第五步DrvTIMER_EnableInt(E_TMR0);  使能中断

第六步 DrvTIMER_Start(E_TMR0);    开启定时器

OVER 定时器配置结束




我好像放错地方了 。 应该放在新手园地的。

定时器配置差不多了。
下面说下 定时器的几个小应用。
除了系统SysTick时钟外的精确定时。
在3L吧   编辑模式 传不了代码
 楼主| kyzb001 发表于 2011-10-18 23:40 | 显示全部楼层
  1. #include "NUC1XX.h"
  2. #include "DrvSYS.h"
  3. #include "DrvGPIO.h"
  4. #include "DrvTIMER.h"
  5. #include "DrvUART.h"
  6. #include "stdio.h"
  7. uint8_t  time=0;

  8. void TMR_Callback(uint32_t age)
  9. {
  10.         time++;
  11.         printf("In time0 call back\n");
  12.         if(time>2)
  13.         {
  14.                 DrvGPIO_ClrBit(E_GPA,2);
  15.         }
  16.         else
  17.                 DrvGPIO_SetBit(E_GPA,2);
  18.         if(time>4)
  19.                 time=0;                       
  20. }
  21. void InitTIMERCountTime()
  22. {
  23.          DrvTIMER_Init();

  24.     DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC, 0); /* Set all the default TIMER clock sources are from 12MHz */

  25.     DrvTIMER_Open(E_TMR0, 10, E_PERIODIC_MODE);                        /* Using TIMER0 in PERIODIC_MODE, 2 ticks /sec */
  26.                
  27.     DrvTIMER_SetTimerEvent(E_TMR0, 1, (TIMER_CALLBACK)TMR_Callback, 1);
  28.                  
  29.     DrvTIMER_EnableInt(E_TMR0);                                                 /* Enable TIMER0 Intettupt */
  30.            
  31.     DrvTIMER_Start(E_TMR0);                                                             /* Start counting */
  32. }
  33. void InitUARTDebugPort(void)
  34. {
  35.     STR_UART_T param;

  36.     /* Select UART Clock Source From 12MHz */
  37.     DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0);

  38.     param.u32BaudRate        = 115200;
  39.     param.u8cDataBits        = DRVUART_DATABITS_8;
  40.     param.u8cStopBits        = DRVUART_STOPBITS_1;
  41.     param.u8cParity          = DRVUART_PARITY_NONE;
  42.     param.u8cRxTriggerLevel  = DRVUART_FIFO_1BYTES;
  43.     param.u8TimeOut          = 0;

  44.     if (DEBUG_PORT == 1)
  45.     {
  46.         /* Set UART1 pins */
  47.         DrvGPIO_InitFunction(E_FUNC_UART1);
  48.         
  49.         /* Set UART1 configuration */
  50.         DrvUART_Open(UART_PORT1, ¶m);
  51.     }else
  52.     {
  53.         /* Set UART0 pins */
  54.         DrvGPIO_InitFunction(E_FUNC_UART0);
  55.         
  56.         /* Set UART0 configuration */
  57.         DrvUART_Open(UART_PORT0, ¶m);
  58.     }
  59. }

  60. int main (void)
  61. {
  62.     UNLOCKREG();     
  63.    
  64.     DrvSYS_SetOscCtrl(E_SYS_XTL12M, ENABLE);  /* Enable External 12M Xtal */

  65.    
  66.     DrvSYS_Delay(5000);                                                   /* Waiting for 12M Xtal stable */
  67.                              
  68.    
  69.     DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0);          /* Select UART Clock Source From 12MHz */
  70.    
  71.    
  72.     InitUARTDebugPort();                                      /* Initial UART debug message function */
  73.                              
  74.     DrvSYS_Open(50000000);

  75.         InitTIMERCountTime();

  76.         DrvGPIO_Open(E_GPA,2,E_IO_OUTPUT);
  77.         DrvGPIO_ClrBit(E_GPA,2);
  78.          
  79.         while(1);
  80. }
2L贴一个简单的代码
 楼主| kyzb001 发表于 2011-10-18 23:48 | 显示全部楼层
本帖最后由 kyzb001 于 2011-10-18 23:52 编辑

定时器的几个简单应用
  1. void InitTIMERCountTime()
  2. {
  3.          DrvTIMER_Init();

  4.     DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC, 0); /* Set all the default TIMER clock sources are from 12MHz */

  5.     DrvTIMER_Open(E_TMR0, 10000, E_PERIODIC_MODE);                        /* Using TIMER0 in PERIODIC_MODE, 2 ticks /sec */
  6.                
  7.     DrvTIMER_SetTimerEvent(E_TMR0, 1, (TIMER_CALLBACK)TMR_Callback, 1);
  8.                  
  9.     DrvTIMER_EnableInt(E_TMR0);                                                 /* Enable TIMER0 Intettupt */
  10.            
  11.     DrvTIMER_Start(E_TMR0);                                                             /* Start counting */}

这里我们定义好了 1ms进入一次中断
我们这样些中断处理函数
我去,死机了。我重启了浏览器。 又不能发代码了 继续4l





w
 楼主| kyzb001 发表于 2011-10-18 23:58 | 显示全部楼层
  1. void TMR_Callback()
  2. {
  3.         if(_ms)
  4.                 _ms--;
  5. }

这样定以后以后,我们声明一个全局变量_ms

延时函数可以写成
  1. void Time0Delay(uint32_t time)
  2. {
  3.        _ms=time;
  4.        while(_ms);
  5. }


简单的定时器延时,方便快捷,简单!
还有种
代码如下
  1. void InitTime0(uint8_t u8delayns)
  2. {
  3.         DrvTIMER_Init();   //打开定时器之前需初始化

  4.         DrvTIMER_Open(E_TMR0 , u8delayns, E_PERIODIC_MODE); //打开定时器0,并设置滴答定时器

  5.         DrvTIMER_EnableInt(E_TMR0);         //定时器0中断使能

  6.         TIMER0->TCSR.CEN = 1;          //开始启动定时器
  7. }
  8. 我们先初始化定时器,时间设置用参数传递过来,先不绑定回调函数和不启动定时器。
  9. 接着延时函数这么些
  10. void WateGSMInit(uint32_t u32timedelay)                //延时设置函数.参数为延时时间, 根据滴答定时器设置的为最小延时单位
  11. {       
  12.         InitTime0(1);
  13.         DrvTIMER_SetTimerEvent(E_TMR0,u32timedelay,(TIMER_CALLBACK)Time0CallBack,1); //定时器0捆绑回调函数
  14.         while(!TimerFlage);           //等待延时结束。  此延时只用于 进入系统时候的延时。
  15. }
  16. 回调函数
  17. void  Time0CallBack(uint8_t age)                //定时器0中断回调函数
  18. {
  19.         TimerFlage=1;                                //延时标志变量
  20.        
  21.         TIMER0->TCSR.CEN = 0;                //关闭定时器
  22. }
  23. 在回调函数中关闭定时器
  24. 这样就是打开一次定时器延时一定的时间。




以上仅供参考和指正。 大家还有定时器的用法,别藏起来哦!!!
ljp98 发表于 2011-12-28 17:06 | 显示全部楼层
顶起!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:Is this my life

15

主题

624

帖子

1

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