打印
[Cortex-M0技术交流]

【第三期】三生石的M0学习笔记第2贴--TIMER

[复制链接]
3647|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 | 只看该作者
#include "NUC1XX.h"
#include "DrvSYS.h"
#include "DrvGPIO.h"
#include "DrvTIMER.h"
#include "DrvUART.h"
#include "stdio.h"
uint8_t  time=0;

void TMR_Callback(uint32_t age)
{
        time++;
        printf("In time0 call back\n");
        if(time>2)
        {
                DrvGPIO_ClrBit(E_GPA,2);
        }
        else
                DrvGPIO_SetBit(E_GPA,2);
        if(time>4)
                time=0;                       
}
void InitTIMERCountTime()
{
         DrvTIMER_Init();

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

    DrvTIMER_Open(E_TMR0, 10, E_PERIODIC_MODE);                        /* Using TIMER0 in PERIODIC_MODE, 2 ticks /sec */
               
    DrvTIMER_SetTimerEvent(E_TMR0, 1, (TIMER_CALLBACK)TMR_Callback, 1);
                 
    DrvTIMER_EnableInt(E_TMR0);                                                 /* Enable TIMER0 Intettupt */
           
    DrvTIMER_Start(E_TMR0);                                                             /* Start counting */
}
void InitUARTDebugPort(void)
{
    STR_UART_T param;

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

    param.u32BaudRate        = 115200;
    param.u8cDataBits        = DRVUART_DATABITS_8;
    param.u8cStopBits        = DRVUART_STOPBITS_1;
    param.u8cParity          = DRVUART_PARITY_NONE;
    param.u8cRxTriggerLevel  = DRVUART_FIFO_1BYTES;
    param.u8TimeOut          = 0;

    if (DEBUG_PORT == 1)
    {
        /* Set UART1 pins */
        DrvGPIO_InitFunction(E_FUNC_UART1);
        
        /* Set UART1 configuration */
        DrvUART_Open(UART_PORT1, ¶m);
    }else
    {
        /* Set UART0 pins */
        DrvGPIO_InitFunction(E_FUNC_UART0);
        
        /* Set UART0 configuration */
        DrvUART_Open(UART_PORT0, ¶m);
    }
}

int main (void)
{
    UNLOCKREG();     
   
    DrvSYS_SetOscCtrl(E_SYS_XTL12M, ENABLE);  /* Enable External 12M Xtal */

   
    DrvSYS_Delay(5000);                                                   /* Waiting for 12M Xtal stable */
                             
   
    DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0);          /* Select UART Clock Source From 12MHz */
   
   
    InitUARTDebugPort();                                      /* Initial UART debug message function */
                             
    DrvSYS_Open(50000000);

        InitTIMERCountTime();

        DrvGPIO_Open(E_GPA,2,E_IO_OUTPUT);
        DrvGPIO_ClrBit(E_GPA,2);
         
        while(1);
}
2L贴一个简单的代码

使用特权

评论回复
板凳
kyzb001|  楼主 | 2011-10-18 23:48 | 只看该作者
本帖最后由 kyzb001 于 2011-10-18 23:52 编辑

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

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

    DrvTIMER_Open(E_TMR0, 10000, E_PERIODIC_MODE);                        /* Using TIMER0 in PERIODIC_MODE, 2 ticks /sec */
               
    DrvTIMER_SetTimerEvent(E_TMR0, 1, (TIMER_CALLBACK)TMR_Callback, 1);
                 
    DrvTIMER_EnableInt(E_TMR0);                                                 /* Enable TIMER0 Intettupt */
           
    DrvTIMER_Start(E_TMR0);                                                             /* Start counting */}

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





w

使用特权

评论回复
地板
kyzb001|  楼主 | 2011-10-18 23:58 | 只看该作者
void TMR_Callback()
{
        if(_ms)
                _ms--;
}

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

延时函数可以写成
void Time0Delay(uint32_t time)
{
       _ms=time;
       while(_ms);
}


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

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

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

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




以上仅供参考和指正。 大家还有定时器的用法,别藏起来哦!!!

使用特权

评论回复
5
ljp98| | 2011-12-28 17:06 | 只看该作者
顶起!

使用特权

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

本版积分规则

个人签名:Is this my life

15

主题

623

帖子

1

粉丝