ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
* 导师视频讲解:[**去听课**](https://www.bilibili.com/video/BV1k34y1D7Vz?p=15) >[success] **技术支持说明:** >**1**.一般以自主学习为主 > **2**.可到官方问答社区中提问:[**去提问**](https://bbs.csdn.net/forums/zigbee) > **3**.工程师**会尽快**解答社区问题,但他们是一线开发,【**难以保证**】解答时效,解答辛苦,感谢理解! <br/> ## **理论基础** * **休眠及唤醒**:CC2530内部有很多模块,例如定时器模块、收发器模块和51内核等等,这些数字模块不工作时就不耗电,我们把模块这种状态称为“**休眠**”。这些模块由“休眠”状态进入工作状态时,这个过程称为“**唤醒**”。 ### * **低功耗**:低功耗是指芯片耗电量非常少。一般地,耗电量的大小取决于芯片内部有多少模块处于休眠状态,有多少模块处于工作状态。我们也可以给低功耗分等级:芯片内部的越多模块处于休眠状态,其功耗就越低。 ### * **低功耗定时器**:也称为休眠定时器,可以定时一段时间,在这段时间内会让相关模块进入休眠状态,时间到了再将其唤醒。 CC2530中的休眠定时器是一个24 位的定时器,其时钟频率为:32768kHz <br/> ## **电源管理模式** CC2530有以下集中电源管理模式: * **全功能模式**:高频晶振(16M或者32M)和低频晶振(32.768K RCOSC/XOSC)全部工作,数字处理器模块正常工作 ### * **空闲模式**:除了CPU内核停止运行之外,其他和全功能模式一样 ### * **PM1**:高频晶振关闭,低频晶振正常工作,数字核心模块正常工作 ### * **PM2**:低频晶振工作,数字核心模块关闭,系统通过RESET,外部中断或者休眠计数器溢出唤醒 ### * **PM3**:晶振全部关闭,数字处理器核心模块关闭,系统只能通过RESET或者外部中断唤醒,此模式功耗最低 <br/> ## **相关寄存器** ![](https://img.kancloud.cn/0a/82/0a82c060fc9609e0fa8df5ecc37098c6_982x1076.png =500x) <br/> ## **寄存器配置** 休眠定时器初始化配置: ### ``` 1.ST2 = 0;  ST1 = 0;  ST0 = 0;  // 清零休眠定时器计数器   2.STIE = 1;  // 开启休眠定时器中断   3.STIF = 0;  // 清零休眠定时器中断标志   4.EA  = 1;   // 打开中断总开关 ``` ### 配置休眠时间: 1. 由于休眠定时器工作的时钟频率是32768HZ,也就是计数32768次为1秒! ### 2. 配置休眠时间时,只需要把当前的计数器数值读出来,加上我们需要定时的时间计数值再重新设置到寄存器中即可: 读取当前休眠定时器的计数值: ### ``` 1.uint32_t sleepTimer = 0;   2.sleepTimer  = (uint32_t)ST0;   3.sleepTimer |= (uint32_t)ST1 << 8;   4.sleepTimer |= (uint32_t)ST2 << 16; ``` ### 加上我们需要定时的时间对应的计数次数,因为计数32768次为1秒,假设我们需要定时sec秒,那就是计数 sec \* 32768次: ### ``` 1.// 更新睡眠时间   2.sleepTimer += (uint32_t)sec * 32768;   把计数值重新配置到寄存器中 1.ST2 = (uint8_t)(sleepTimer >> 16);   2.ST1 = (uint8_t)(sleepTimer >> 8);   3.ST0 = (uint8_t)(sleepTimer); ``` ### 配置休眠模式: ``` 1.SLEEPCMD |= mode;   // 设置该定时器Bit[1:0],mode: 0~3           2.PCON = 0x01;        // 进入睡眠模式 ``` 退出休眠模式: ``` 1.// 退出休眠   2.PCON = 0x00; ``` <br/> ## **源码分析** ### 主函数: ``` void main() { initLed(); initSleepTimer(); while(1) { uint8_t i; for (i = 0; i < 6; i++) { LED = (LED == LED_ON)?LED_OFF : LED_ON; delayMs(SYSCLK_32MHZ ,250); } DEBUG_LOG("Sleeping...\r\n"); setSleepPeriod(5); setPowerMode(POWER_MODE_PM2); } } ``` &emsp;&emsp;主函数初始化后做了两件事情,闪烁3次LED灯,然后设置休眠定时器的定时时间为5秒,接着设置电源管理模式为PM2,然后就开始启动进入休眠状态了(CPU不工作)。 ### &emsp;&emsp;睡眠定时器中断服务函数(休眠定时器到时间后会中断,在中断处理程序中,CPU重新工作起来): ``` /* * Sleep timer ISR */ #pragma vector = ST_VECTOR __interrupt void SleepTimer_ISR(void) { STIF = 0; // Clear interrupt flag setPowerMode(POWER_MODE_ACTIVE); // Entry active power mode DEBUG_LOG("Activing...\r\n"); } ``` ### 初始化休眠定时器函数: ``` static void initSleepTimer(void) { ST2 = 0; ST1 = 0; ST0 = 0; STIE = 1; STIF = 0; EA = 1; } ``` 设置休眠定时器定时时间,即读出当前计数值、加入新的数值、重新设置计数器: ``` static void setSleepPeriod(uint8_t nS) { uint32_t sleepTimer = 0; sleepTimer = (uint32_t)ST0; sleepTimer |= (uint32_t)ST1 << 8; sleepTimer |= (uint32_t)ST2 << 16; sleepTimer += (uint32_t)nS * 32768; ST2 = (uint8_t)(sleepTimer >> 16); ST1 = (uint8_t)(sleepTimer >> 8); ST0 = (uint8_t)(sleepTimer); } ``` 设置电源模式(低功耗模式): ``` static void setPowerMode(PowerMode_t mode) { if (mode > _POWER_MODE_MAX) { DEBUG_LOG("Power mode not found: %d\r\n", (int)mode); return; } if (mode == POWER_MODE_ACTIVE) { PCON = 0x00; return; // Don't sleep } SLEEPCMD |= mode; // Set power mode PCON = 0x01; // Entering sleep mode } ``` 休眠定时器有4种电源模式,我们把这几种模式定义为类型PowerMode\_t: ``` /* * Power modes: Active mode, PM1, PM2, PM3 */ typedef enum { POWER_MODE_IDLE = 0, POWER_MODE_PM1 = 1, POWER_MODE_PM2 = 2, POWER_MODE_PM3 = 3, POWER_MODE_ACTIVE = 4, _POWER_MODE_MAX = POWER_MODE_ACTIVE, }PowerMode_t; ``` <br/> ## **调试仿真** >[danger] 在学习本节课前,需要先掌握基本的程序下载及仿真操作,参考:[程序下载及仿真](2482302) 编译完成后,通过仿真器连接开发板和电脑,进入仿真模式: ![](https://img.kancloud.cn/96/e9/96e92a299fc68c70bdf883d73423d163_444x504.png =300x) &emsp;&emsp;可以看到,开发板在LED闪烁3次后就打印Sleep...,这个时候CC2530进入了休眠状态。休眠定时器在定时时间到了后会触发中断,中断服务函数中会让芯片重新进入正常工作状态。 <br/> <br/> ## **项目定制** * 如需项目定制开发,可扫码添加项目经理好友(注明“**项目定制**”) * 定制范围:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等IoT技术方案 * 善学坊官网:[www.sxf-iot.com](https://www.sxf-iot.com/) ![](https://img.kancloud.cn/ca/73/ca739f92cab220a3059378642e3bd502_430x430.png =200x) * 非项目定制**勿扰**,此处**非**技术支持