CC2541时钟初始化

一  简介

CC2541用了很久,现在初始化时钟时还要翻看数据手册,这里记录下,以防忘记

二    实验平台

协议栈版本:BLE-CC254x-1.4.0

编译软件:IAR 8.20.2

三  框架介绍

CC2541有四个时钟源 XCOSC(外部晶振)RCOSC(内部晶振)

32MHz外部晶振

16MHz内部RC振荡器

32kHz外部晶振

32kHz内部RC振荡器

CC2541时钟初始化

CC2541时钟初始化

文档参考链接:http://www.ti.com/lit/ug/swru191f/swru191f.pdf    65页

晶振作用

32MHz的外部晶振有两个作用:为内部时钟提供时钟源和用于RF收发器

32kHz晶振:主要使用在Sleep Timer 和Watchdog Timer上,其中内部的32kHz振荡器功耗小,但是精度低

我第一次设置外部32k晶振的时候没有配置成功,仔细看完手册后才发现要先设置为内部16M的晶振才能配置32k的晶振

CC2541时钟初始化

下面是设置晶振的代码

/******************************************************************************
* @fn  Init_Sys_Clock
*
* @brief  Crystal selection
*         OSC32K register(attention)
*         32-kHz clock-source select. Setting this bit initiates a clock-source change only.
*         CLKCONSTA.OSC32K reflects the current setting. The 16-MHz RCOSC must be
*         selected as system clock when this bit is to be changed. This bit does not give an
*         indication of the stability of the 32-kHz XOSC.
*
* @param  cs.high_clock_ex = 1 use external 32MHz clock 
*                                                0 use internal 16MHz clock
*                 cs.low_clock_ex  = 1 use external 32kHz clock 
*                                                0 use internal 32kHz clock
*
* @return NULL
*
******************************************************************************/
void Init_sys_Clock (CLOCK_SOURCE cs )
{
    //RC 16MHz
    CLKCONCMD = (CLKCONCMD & 0x80) | 0x49; 
    while ((CLKCONSTA & ~0x80) != 0x49 );
    if(cs.low_clock_ex == 1)
    {
        //XOSC 32kHz 
        CLKCONCMD = (CLKCONCMD & ~0x80) ;
        while ( (CLKCONSTA & 0x80) != 0 ); 
    }
    else
    {
        //RCOSC 32kHz 
        CLKCONCMD |= 0x80 ;
        while ( (CLKCONSTA & 0x80) == 0 ); 
    }
    if(cs.high_clock_ex == 1)
    {
        //XOSC 32MHz 
        CLKCONCMD = (CLKCONCMD & 0x80) ;    
        while ( (CLKCONSTA & ~0x80) != 0 ); 
    }
}

源码地址:https://github.com/xinglongzhu/2541_Project_setup

有错误之处还望各位多多指正

邮箱:[email protected]

收到消息后我会第一时间处理