BLE芯片CC254x 系统资源(1)
来源:互联网 发布:解放军报网络图片赵阳 编辑:程序博客网 时间:2024/04/23 18:07
1.CC254x 内核
1.1.内核介绍
CC254x内部采用的是增强型8051内核,指令执行速度较标准的8051要快,主要基于:
l 增强型8051的单周期指令是1个时钟周期,而标准8051需要12个时钟周期;
l 没有了浪费的总线状态(wastedbus states);
由于一个指令周期能与存储中指令预取保持同步,使得大多数单周期指令能在一个时钟周期内完成,此外,增强型8051内核也包含一个“second data pointer”和一个扩展的18个中断单元。
1.1.存储空间
8051有分离的程序存储空间和数据存储空间,可细分成4中不同的存储空间:
l CODE:只读程序存储,寻址空间64KB;
l DATA:可读写数据存储空间,可被直接或间接寻址,256 bytes,低128 byte 可被直接或间接寻址,高128 bytes只能间接寻址(SFR除外,SFR为直接寻址)
l XDATA:片外数据存储,寻址空间64K,
l SFR:寄存器区域,直接寻址;
2. 时钟系统
CC254x内部时钟系统分两部分,系统时钟(system clock)和睡眠看门狗时钟。
2.1.系统时钟
· CPU运行主频,分频之后也为Timer1、Timer3、Timer4计数时钟;
· 支持2种时钟源,内部16MHz RC晶振或外部的32MHz晶振;
· 上电默认是IRC 16MHz;
· IRC 16MHz 启动时间比32MHz时间短,功耗低,但是精度差,不能用于射频相关的数据传输,射频相关操作必须要等32MHz时钟稳定之后才能进行;
2.2.睡眠看门狗时钟
· 为睡眠定时器和看门狗运行提供时钟;
· 支持2种时钟源,内部32KHz RC晶振或外部的32.768KHz晶振;
· 上电默认是内部32KHz;
· IRC 32KHz 启动时间比外部32.768KHz时间短,功耗低,但是精度差;
· 当开启IRC 32KHz校准功能(使用外部的32MHz分频,SLEEPCMD.OSC32K_CALDIS = 1;CLKCONCMD. OSC32K = 1),IRC 32KHz能以32.753KHz工作;
2.3.时钟初始化代码分析
摘自TI-BLE-v1.2.1 HAL source code:
……
// start 16MHz RCOSC & 32MHz XOSC waitfor stable 32MHz XOSC
START_HSOSC_XOSC();
// switch to the 16MHz HSOSC and wait until it isstable
SET_OSC_TO_HSOSC();
// set 32kHz OSC and wait until it is stable
SET_32KHZ_OSC();
// switch to the 32MHz XOSC and wait until it isstable
SET_OSC_TO_XOSC();
//stop 16MHz RCOSC
STOP_HSOSC();
……
这段代码有对IRC 16MHz进行开关控制(SLEEPCMD.Bit2),实际根据手册,SLEEPCMD.Bit2始终为1,无需配置,个人猜测最初的CC254x或者CC253x可以对IRC16MHz进行开关控制,后来取消了这部分,改为上电默认IRC16MHz 打开,且可以默认它已经运行稳定(CLKCONCMD.OSC = 1; CLKCONSTA.OSC = 1; ),所以实际时钟初始化可以只是:
……
// set 32kHz OSC and wait until it is stable
SET_32KHZ_OSC();
// switch to the 32MHz XOSC and wait until it isstable
SET_OSC_TO_XOSC();
……
3.电源管理
CC254x包含5种电源模式:Active ,idle,powermode1/2/3(PM1-PM3), 其中的PM1-PM3也称为睡眠模式。
3.1.电源模式
CC254x的5种电源模式涉及晶振和片内1.8Vvoltage regulator digital部分的开关控制,高频率晶振包括X-OSC (32 MHz) 和IRC-OSC (16 MHz) ,低频率晶振包括X-OSC (32.768 KHz) 和IRC-OSC (32 KHz) 。
· Active 模式:为正常工作的全功能模式,片内1.8V 电压转换芯片、高频晶振(32MHz或16MHz)、低频晶振(32.768KHz或32KHz)都处于正常工作状态;
· IDLE模式:除了CPU内核处于“IDLE”外,其它等同于Active模式;
· PM1模式:适应于能快速唤醒,睡眠时间不超过3ms的应用场合;
· PM2模式:睡眠时间超过3ms,一般使用Sleeptimer定时唤醒;
· PM3模式:最低功耗状态,睡眠时间超过3ms,一般使用外部IO中断方式唤醒。
Power mode
High-Frequency OSC
Low-Frequency OSC
voltage regulator
Active
X-OSC or IRC-OSC
X -OSC or IRC-OSC
ON
IDLE
X-OSC or IRC-OSC
X -OSC or IRC-OSC
ON
PM1
None
X-OSC or IRC-OSC
ON
PM2
None
X -OSC or IRC-OSC
OFF
PM3
None
None
OFF
CC254x睡眠模式和IDLE模式切换到Active 模式方法:
Power mode
Wakeup to Active mode
Active
/
IDLE
POR,
BOD,
External reset,
External interrupt ,
Sleep timer expires
PM1
POR,
BOD,
External reset,
External interrupt ,
Sleep timer expires
PM2
POR,
External reset,
CRC reset (CC2541 only),
External interrupt ,
Sleep timer expires
PM3
POR,
External reset,
CRC reset (CC2541 only),
External interrupt,
3.2.电源管理控制
CC254x使用寄存器PCON.IDLE和SLEEP.MODE来控制,进入睡眠模式一般先设置要进入哪种非Active模式(IDLE、PM1-PM3):
SLEEP.MODE [1:0]
Mode
00
Active/Idle
01
PM1
10
PM2
11
PM3
设置完成睡眠模式之后,使PCON.IDLE= 1,将立即使CC254x进入相应的非Active模式,在user’sguide里面特别有说明,在进入非Active模式,需要PCON.IDLE = 1指令必须4字节对齐地址,且之后的第一条指令必须是非4字节对齐存放。
对于PM3,由于其BOD已经不起作用,对于CC2541可以利用SRCRC.RESULT来判断电压是否Brownout。
3.3.电源管理代码分析
设定SLEEP.MODE [1:0]之后,调用halSetSleepMode进入非Active模式,唤醒之后从PCON.IDLE= 1之后的指令开始执行,halSetSleepMode函数定义如下。
#pragma location ="SLEEP_CODE"
voidhalSetSleepMode(void);
……
void halSetSleepMode(void)
{
PCON =PCON_IDLE;
HAL_DISABLE_INTERRUPTS();
}
汇编之后:
halSetSleepMode:
CODE
MOV 0x87, #0x1
CLR 0xa8.7
这里面需要注意的是“PCON.IDLE =1”指令必须是4字节对齐地址,而接下来的指令(唤醒之后执行的第一条指令不能是4字节对齐地址)
打开xcl文件:
……
-D_CODE_START=0x0000
-D_CODE_END=0x7FFF // Last address for ROOT bank.
……
-D_SLEEP_CODE_SPACE_START=(_CODE_END-7)
-D_SLEEP_CODE_SPACE_END=(_CODE_END)
-Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP_CODE_SPACE_END
……
可以看出halSetSleepMode放置在0x7FF8的地址,满足4字节对齐要求,同时
“PCON = PCON_IDLE”占3个字节,即HAL_DISABLE_INTERRUPTS()地址在0x7FFB,不是4字节对齐,也满足要求。
- BLE芯片CC254x 系统资源(1)
- CC254x--BLE
- TI CC254X函数库说明(BLE hci.h)
- TI BLE-CC254x-1.3.2 SimpleBLEPeripheral MINI Keyfob 编译错误
- TI CC254X函数库说明续(BLE L2CAP.h)
- TI CC254X函数库说明续(BLE GATT.h)
- TI CC254X函数库说明续(BLE ATT.h)
- TI CC254X函数库说明续(BLE GAT.H)
- BLE开发(TI CC254x)之协议栈分析
- BLE开发(TI CC254x)之串口收发
- CC254X BLE PWM灯控闪烁问题解决办法
- 【TI BLE】CC254x系统运行跑飞问题
- 主流蓝牙BLE控制芯片详解(1):TI CC2540
- BLE开发(TI CC254x)之一主多从方案(蓝牙项目纪实)
- 【cc2541开发环境】BLE-CC254x-1.4.0协议栈的安装
- <转>主流蓝牙BLE控制芯片详解(1):TI CC2540
- 系统资源
- 系统资源
- 127.0.0.1
- poj2976
- 趁着年轻多干点事吧!!!
- java 对象存储 享元模式
- CERC2012 D - Non-boring sequences 暴力
- BLE芯片CC254x 系统资源(1)
- memcached安装
- poj 1656 Counting Black
- linux启动流程图+mysql协议图
- Apache CXF Spring SOAP MTOM example
- 动态规划入门——Piggy-Bank
- Java对MySQL数据库进行连接、查询和修改
- memcache文章汇总
- 链接推荐整理