• CC2541蓝牙学习——定时器1自由运行模式


    学习目标:定时器1的自由运行模式
     
    CC2541有4个定时器,分别实现不同的功能,定时器1是一个独立的16位定时器,支持典型的定时/计数功能,比如输入捕获,输出比较和PWM功能。定时器1有5个独立的捕获/比较通道,每个通道定时器使用一个I/O引脚。
    定时器1的功能如下:
    • 五个捕获/比较通道
    • 上升沿、下降沿或任何的边沿输入捕获
    • 设置、清除或切换输出比较
    • 自由运行、模或正技术/倒技术操作
    • 可被1、8、32、128整除的时钟分频器
    • 在每个捕获/比较和最终计数上生成中断请求
    • DMA触发功能 
    定时器包括一个16位计数器:在每个活动的时钟边沿递增或递减活动时钟边沿周期由寄存器位CLKCON.TICKSPD 定义,他设置全球系统时钟的划分,提供了从0.25到32MHz的不同的时钟标签频率,这个在定时器1中由TICTL.DIV设置的分频器值进一步划分。这个分频器值可以从1、8、32、128,因此当32MHz晶振用作系统时钟源时,定时器可以使用的最低时钟频率为32MHz/128/128=1953.125Hz。总之:定时器的定时时钟频率由CLKCON.TICKSPD 和TICTL.DIV决定。
     
    定时器1有三种操作模式:自由运行模式、模计数模式、正计数/倒计数模式,由TICTL寄存器MODE[1:0]选择。
     
     
    自由运行模式】:
     
    在自由运行操作模式下,计数器从0x0000开始,每个活动时钟边沿增加1。当计数器达到0xFFFF(溢出)后,计数器重新载入0x0000,继续递增它的值,如下图所示。当达到最终计数值0xFFFF,设置标志IRCON.T1IFT1STAT.OVFIF。如果设置了相应的中断屏蔽位TIMIF.OVFIM以及IEN1.T1EN和总中断IEN0.EA,计数器溢出将产生一个中断请求。自由运行模式可以用于产生独立的时间间隔,输出信号频率。


    定时器1状态寄存器

    技术分享

    中断标志4寄存器

    技术分享

    定时器1在自由运行模式,查询方式下的初始化子函数

     1  1 /***************************************************
     2  2 *函 数  名:InitT1
     3  3 *功      能:定时器1初始化,系统不配置时钟默认2分频,即16M
     4  4 *入口参数:无
     5  5 *出口参数:无
     6  6 ***************************************************/
     7  7 void InitT1(void)
     8  8 {
     9  9   T1CTL  = 0x0d;      //定时器1设置为128分频,自由运行模式
    10 10   T1STAT = 0X21;      //这一句在裸机程序中可有可无,在协议栈中有用
    11 11                      //通道0,中断有效
    12 12 }

    主程序:查询方式,判断定时器1中断标志位

     1  1 /******************************************************************************
     2  2 *程序入口函数
     3  3 ******************************************************************************/
     4  4 int main(void)
     5  5 {
     6  6   InitClock();
     7  7   InitLED(1);                //LED初始化,熄灭LED1
     8  8   InitT1();                  //定时器1初始化
     9  9    
    10 10   while(1)
    11 11   {
    12 12     if(IRCON & (1<<1))       //检测定时器1是否溢出
    13 13     {
    14 14       IRCON &= ~(1<<1);      //清溢出标志
    15 15       LED1 = !LED1;          //LED闪烁
    16 16     }
    17 17   }
    18 18 }

    查询方式下,我们判断IRCON.T1IF(定时器1中断标志)是否为1来确定定时器是否计数溢出,刚才说过T1STAT.OVFIF(定时器1计数器溢出中断标志)在定时器计数溢出时也会置1,那么能不能改为查询T1STAT.OVFIF呢?经过试验,答案是肯定的,程序可以改为:

     1  1 /******************************************************************************
     2  2 *程序入口函数
     3  3 ******************************************************************************/
     4  4 int main(void)
     5  5 {
     6  6   InitClock();
     7  7   InitLED(1);                //LED初始化,熄灭LED1
     8  8   InitT1();                  //定时器1初始化
     9  9    
    10 10   while(1)
    11 11   {
    12 12     if(T1STAT & (1<<5))       //检测定时器1是否溢出
    13 13     {
    14 14       T1STAT &= ~(1<<5);      //清溢出标志
    15 15       LED1 = !LED1;          //LED闪烁
    16 16     }
    17 17   }
    18 18 }

     定时器1自由运行模式中断程序,初始化程序

    • 定时器1分频器设置、运行模式设置:配置寄存器T1CTL
    • 定时器1中断使能:配置寄存器IEN1
    • 定时器1溢出中断使能:TIMIF
    • 开总中断

    中断初始化程序:

     1 /******************************************************************************
     2 *函 数 名:InitT1
     3 *功    能:定时器1初始化,系统不配置时钟默认2分频,即16M
     4 *入口参数:无
     5 *出口参数:无
     6 ******************************************************************************/
     7 void InitT1(void)
     8 {
     9   T1CTL  = 0x0d;     //定时器1设置为128分频,自由运行模式
    10   T1STAT = 0X21;     //通道0,中断有效。这一句在裸机程序中可有可无
    11   TIMIF |= (1<<6);   //定时器1溢出中断使能
    12   IEN1  |= (1<<1);   //定时器1中断使能
    13   EA = 1;            //开总中断
    14 }

    中断服务程序中要清除定时器1中断标志和定时器1溢出标志:

     1 /******************************************************************************
     2 *函 数 名:Timer1_ISR
     3 *功    能:定时器1中断服务程序
     4 *入口参数:无
     5 *出口参数:无
     6 ******************************************************************************/
     7 #pragma vector = T1_VECTOR 
     8 __interrupt void Timer1_ISR(void) 
     9 { 
    10   LED1 = !LED1;
    11   IRCON &= ~0x02;
    12   T1STAT &= ~0x20; 
    13 }
  • 相关阅读:
    [转] 礼物的含义
    刘邦与项羽的关系
    inner join...on和join...on用法
    Oracl常用到问题
    [转] 河南、的女孩好…
    人的痛苦往往在于追求的不是“幸福”,而是“比别人幸福”!
    oracle 基础学习
    WORD文档中的回车符和空格键符如何去掉?
    采用FireFox浏览器进行页面级开发
    Windows Socket Programming 网络编程系列 简单客户端与服务器
  • 原文地址:https://www.cnblogs.com/chenzhao207/p/4497856.html
Copyright © 2020-2023  润新知