CC2541时钟初始化
一 简介
CC2541用了很久,现在初始化时钟时还要翻看数据手册,这里记录下,以防忘记
二 实验平台
协议栈版本:BLE-CC254x-1.4.0
编译软件:IAR 8.20.2
三 框架介绍
CC2541有四个时钟源 XCOSC(外部晶振)RCOSC(内部晶振)
32MHz外部晶振
16MHz内部RC振荡器
32kHz外部晶振
32kHz内部RC振荡器
文档参考链接:http://www.ti.com/lit/ug/swru191f/swru191f.pdf 65页
晶振作用
32MHz的外部晶振有两个作用:为内部时钟提供时钟源和用于RF收发器
32kHz晶振:主要使用在Sleep Timer 和Watchdog Timer上,其中内部的32kHz振荡器功耗小,但是精度低
我第一次设置外部32k晶振的时候没有配置成功,仔细看完手册后才发现要先设置为内部16M的晶振才能配置32k的晶振
下面是设置晶振的代码
/******************************************************************************
* @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
有错误之处还望各位多多指正
收到消息后我会第一时间处理