• CC2541蓝牙学习——时钟设置


    CC2541有四个振荡器,分别是:

    • 32MHz外部晶振
    • 16MHz内部RC振荡器
    • 32kHz外部晶振
    • 32kHz内部RC振荡器
    由此可以看出,CC2541内部自带了振荡器,也就是说即使外部电路不接振荡器,CC2541也可以工作,答案是肯定的,但是作为无线RF收发,只能使用外部32MHz晶振,除非准备将CC2541当做一个普通的增强型51单片机来用,否者32MHz外部晶振是必不可少的,那么这4个晶振有什么区别和用途呢?
    32MHz的外部晶振有两个作用:为内部时钟提供时钟源和用于RF收发器
    16MHz的RC内部振荡器的作用:为内部时钟提供时钟源,注意它不可以用于RF收发器操作
    16MHz的RC内部振荡器功耗小但是精度差,这也是它不能用于RF收发器的原因。
    32kHz外部晶振运行在32.768KHz上,32kHz内部RC振荡器运行在32.753kHz,这两个时钟主要使用在Sleep Timer 和Watchdog Timer上,其中内部的32kHz振荡器功耗小,但是精度低,这两个随意选择一个,但不能同时使用,言外之意就是如果要求精度不高的时候电路中可以不接外部32kHz晶振。
     
    注意:系统上电,默认的是使用内部16Mhz时钟和内部32kHz振荡器
     
    怎么选择这四个振荡器呢? 由CLKONCMD时钟控制命令寄存器选择,CLKONCMD寄存器定义如下:

    解释下CLKONCMD这个寄存器
    OSC32K:32kHz选择位
    OSC:主时钟选择位
    TICKSPD:对主时钟进行分频,控制定时器1、定时器3 和定时器4 的全局时钟划分。分频器值的设置可以从0.25 MHz 到32 MHz 。注意如果CLKCONCMD.TICKSPD 表示频率高于系统时钟,CLKCONSTA.TICKSPD 中指明的实际分频器值和系统时钟相同。简言之:定时器1、3、4的时钟。
    CLKSPD:对主时钟进行分频,分频后的频率作为主时钟,类似于PLL,一般这个值设为000,即主时钟为32Mhz
     
    当选择32MHz晶振作为主时钟源时(CLKONCMD.OSC = 0),内部时钟并不是一下子变为32Mhz,内部首先选择16MHz RC振荡器使系统运行起来,当32MHz晶振稳定以后才使用32MHz晶振作为主时钟。判断是否稳定的依据是看“CLKONSTA时钟控制状态寄存器”,定义如下
     

    CLKONSTA.OSC == 1时才能说明32Mhz时钟已经稳定。所以在程序里,要加一个等待的语句,防止时钟未稳定的程序执行错误。
     
    时钟初始化代码如下。
     
     
     1 /****************************************************************
     2 *函 数 名:InitClock
     3 *功    能:系统时钟初始化
     4 *入口参数:无
     5 *出口参数:无
     6 *****************************************************************/
     7 void InitClock(void)
     8 {
     9 CLKCONCMD &= ~0x40; // 设置系统时钟源为 32MHZ晶振
    10 while(CLKCONSTA & 0x40); // 等待晶振稳定 
    11 CLKCONCMD &= ~0x47; // 设置系统主时钟频率为 32MHZ
    12 }

    但是实际调试时,调用该函数,总是得不到32MHz的时钟,16MHz的工作时钟始终不变,找了很久,不知道为什么,调试的时候程序一直停在第10行代码那。后来用馒头科技的时钟程

    序,调试成功,系统工作时钟变为32MHz,以后就用这个程序了,程序代码如下:

     1 /****************************************************************
     2 *函 数 名:SysStartXOSC
     3 *功    能:系统时钟初始化
     4 *入口参数:无
     5 *出口参数:无
     6 *****************************************************************/
     7 void SysStartXOSC(void)
     8 {
     9     SLEEPCMD &= ~0x04;                      // 启动所有晶振
    10     while (!(SLEEPSTA & 0x40));             // 等待晶振稳定
    11 
    12     CLKCONCMD = (CLKCONCMD & 0x80) | 0x49;  // 使用16M晶振作为主时钟
    13     while ((CLKCONSTA & ~0x80) != 0x49 );   // 等待主时钟切换到16M晶振
    14 
    15     CLKCONCMD = (CLKCONCMD & ~0x80) ;       // 使用外部32K晶振作为休眠时钟
    16     while ( (CLKCONSTA & 0x80) != 0 );      // 等待睡眠时钟切换到外部32K晶振
    17 
    18     CLKCONCMD = (CLKCONCMD & 0x80) ;        // 使用32M晶振作为主时钟
    19     while ( (CLKCONSTA & ~0x80) != 0 );     // 等待主时钟切换到32M晶振
    20 
    21     SLEEPCMD |= 0x04;                       // 关闭未使用的晶振
    22 }
     
     
     
     
  • 相关阅读:
    iOS开发UI—Button基础
    iOS开发UI—UIWindow介绍
    第43月第27天 nginx keeplike高可用
    第43月第23天 商品秒杀 乐观锁
    第43月第22天 github 工程 svn checkout ipa瘦身
    第43月第21天 h264文件格式
    第43月第17天 iOS 子线程开启、关闭runloop performSelector
    第43月第15天 nginx负载均衡 redis
    第43月第11天 kCVPixelFormatType_420YpCbCr8BiPlanarFullRange转rgb
    第43月第10天 uiimage写文件
  • 原文地址:https://www.cnblogs.com/chenzhao207/p/4506764.html
Copyright © 2020-2023  润新知