【经验】芯源CW32系列单片机低功耗模式介绍及UART深度休眠模式示例
在嵌入式系统的设计中,低功耗设计(Low-Power Design)是许多设计人员必须面对的问题,其原因在于嵌入式系统被广泛应用于便携式和移动性较强的产品中去,而这些产品不是一直都有充足的电源供应,往往是靠电池来供电,所以设计人员从每一个细节来考虑降低功率消耗,从而尽可能地延长电池使用时间。因此,大部分芯片都会有低功耗模式,以芯源半导体CW32L083为例,它就是一个32位低功耗微控制器。
一、芯片模式介绍
1.CW32L083工作模式
CW32L083 支持三种工作模式,由内嵌的电源管理模块自动完成电源的统一管理。三种工作模式是:
• 运行模式(Active mode)
• 休眠模式(Sleep mode)
• 深度休眠模式(DeepSleep mode)
电源上电后,系统自动进入运行模式。用户可通过软件程序,进入休眠或深度休眠两种低功耗运行状态;在低功耗运行状态时,可通过硬件中断触发唤醒机制,使系统返回到运行模式。
2.进入休眠模式或深度休眠模式
使用 M0+ 内核的 ARM 等待中断专用指令,WFI(Wait for Interrupt),配合 M0+ 内核的系统控制寄存器(SCR, System Control Register)的 SLEEPONEXIT 和 SLEEPDEEP 位域,可实现立即进入或退出(中断服务程序)时进 入休眠模式或深度休眠模式。
• 立即进入
执行 WFI 指令,MCU 将立即进入休眠模式(SLEEPDEEP 为 0 时)或深度休眠模式(SLEEPDEEP 为 1 时)
• 退出时进入
将 SLEEPONEXIT 位置 1,当退出最低优先级的中断服务程序后,MCU 会进入休眠模式(SLEEPDEEP 为 0 时) 或深度休眠模式(SLEEPDEEP 为 1 时),而不需执行 WFI 指令 。
在深度休眠模式下,系统将自动关闭高速时钟。如用户需要在深度休眠模式下使部分外设仍保持运行,则须在进入深度休眠模式前,启动相应的低速时钟并将该外设时钟设置为此低速时钟。
3.退出休眠模式或深度休眠模式
在休眠模式或深度休眠模式下,均可通过中断来唤醒 CPU,返回到运行模式。但是,值得注意的是,如果用户在中断服务程序中执行 WFI 命令进入休眠(包括深度休眠),则需要比此中断更高优先级的中断才能唤醒 CPU,因此,我们强烈建议用户在准备进入休眠前,应先处理完所有中断服务程序,并且清除所有中断请求和中断标志。
使用中断退出休眠模式,用户必须在进入休眠(包括深度休眠)前使能此中断的允许位。
中断唤醒退出深度休眠模式时,CPU 运行状态与退出休眠模式相同。
4.UART控制深度休眠模式
UART控制器工作在双时钟域下,支持在深度休眠模式下进行正常的数据收发,并通过接收完成中断唤醒 MCU回到运行模式。
如果设置了传输时钟 UCLK来源为低速时钟,当系统进入深度休眠模式后,高速时钟将停止,低速时钟保持运行,UART仍可以进行正常的数据收发(波特率仅支持 2400 bps、4800 bps 和 9600 bps)。要实现深度休眠模式下使用 UART 唤醒功能,需在进入深度休眠模式之前使能 UART 接收完成中断(即设置 UARTx_IER.RC 为 1),数据接收完成时,接收完成中断将唤醒MCU恢复到运行模式。
如果设置了传输时钟 UCLK 来源为高速时钟,当系统进入深度休眠模式后,高速时钟会停止运行,UAR不会接收数据。此时,仍可通过GPIO中断唤醒 MCU,实现在深度休眠模式下接收数据,参考配置步骤如下:
步骤 1:使能 UARTx_RXD 对应引脚的 GPIO 下降沿中断;
步骤 2:设置 UARTx_CR1.START 为 1,选择 RXD 信号起始位判定方式为低电平;
步骤 3:使能 UART 接收(即设置 UARTx_CR1.RXEN 为 1);
步骤 4:进入深度休眠模式;
步骤 5:等待主机发送数据,产生 GPIO 下降沿中断,唤醒 MCU;
步骤 6:关闭 RXD 对应引脚的 GPIO 中断功能,等待 RXD 接收完成。
二、实例演示:UART深度休眠模式示例(传输时钟为LSI)
程序运行一段时间后进入深度休眠模式,PC发送数据可唤醒MCU,唤醒后UART轮询接收数据,并存储到TxRxBuffer缓冲区,UART接收到'\n'后不再接收数据,然后将TxRxBuffer缓冲区中的数据回传至PC。传输结束后,LED1闪烁5s,并再次进入深度休眠模式。
1.外设时钟使能
void RCC_Configuration(void)
{
InitTick(8000000); //复位后延时
SysTickDelay(1000);
RCC_HSI_Enable(RCC_HSIOSC_DIV6); //SYSCLK = HSI = 8MHz = HCLK = PCLK
RCC_LSI_Enable();
RCC_AHBPeriphClk_Enable(DEBUG_UART_GPIO_CLK | RCC_AHB_PERIPH_GPIOC, ENABLE);
DEBUG_UART_APBClkENx(DEBUG_UART_CLK, ENABLE); //外设时钟使能
}
2.配置GPIO
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
DEBUG_UART_AFTX; //UART TX RX 复用
DEBUG_UART_AFRX;
GPIO_InitStructure.Pins = DEBUG_UART_TX_GPIO_PIN;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Init(DEBUG_UART_TX_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pins = DEBUG_UART_RX_GPIO_PIN;
GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP;
GPIO_Init(DEBUG_UART_RX_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pins = GPIO_PIN_3; //PC3 LED1
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Init(CW_GPIOC, &GPIO_InitStructure);
PC03_SETLOW();
}
3.配置UART
void UART_Configuration(void)
{
UART_InitTypeDef UART_InitStructure = {0};
UART_InitStructure.UART_BaudRate = UARTyz_BaudRate; // 波特率
UART_InitStructure.UART_Over = UART_Over_sp; // 专用采样
UART_InitStructure.UART_Source = UART_Source_LSI; // 传输时钟源LSI
UART_InitStructure.UART_UclkFreq = UARTyz_UclkFreq; // 传输时钟UCLK频率
UART_InitStructure.UART_StartBit = UART_StartBit_FE; // 起始位判定方式
UART_InitStructure.UART_StopBits = UART_StopBits_1; // 停止位长度
UART_InitStructure.UART_Parity = UART_Parity_No ; // 校验方式
UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;
UART_InitStructure.UART_Mode = UART_Mode_Rx | UART_Mode_Tx; // 发送/接收使能
UART_Init(DEBUG_UARTx, &UART_InitStructure);
}
4.配置低功耗模式
void PWR_Configuration(void)
{
PWR_InitTypeDef PWR_InitStructure = {0};//低功耗模式配置结构体指针
PWR_InitStructure.PWR_Sevonpend = PWR_Sevonpend_Disable;
PWR_InitStructure.PWR_SleepDeep = PWR_SleepDeep_Enable; //Deep Sleep使能
PWR_InitStructure.PWR_SleepOnExit = PWR_SleepOnExit_Disable;
PWR_Config(&PWR_InitStructure);// 低功耗模式配置
}
void PWR_GotoLpmMode(void)//进入睡眠模式
{
__WFI();
}
5.配置NVIC中断
void NVIC_Configuration(void)
{
NVIC_SetPriority(DEBUG_UART_IRQ, 0); //优先级,无优先级分组
NVIC_EnableIRQ(DEBUG_UART_IRQ); //UARTx中断使能
}
void UART2_UART5_IRQHandler(void)
{
if(UART_GetITStatus(CW_UART5, UART_IT_RC) != RESET)
{
UART_ClearITPendingBit(CW_UART5, UART_IT_RC);
}
}
6.发送8位数组
void UART_SendBuf_Polling(UART_TypeDef* UARTx, uint8_t *TxBuf, uint8_t TxCnt)
{
while(TxCnt)
{
UART_SendData_8bit(UARTx, *TxBuf);
while(UART_GetFlagStatus(UARTx, UART_FLAG_TXE) == RESET);
TxBuf++;
TxCnt--;
}
while(UART_GetFlagStatus(UARTx, UART_FLAG_TXBUSY) == SET);
}
7.接收8位数组
uint8_t UART_RecvBuf_Polling(UART_TypeDef* UARTx, uint8_t *RxBuf)
{
uint8_t RxCnt = 0;
RxBuf[RxCnt] = UART_ReceiveData_8bit(UARTx);
RxCnt++;
do
{
while(UART_GetFlagStatus(UARTx, UART_FLAG_RC) == RESET); //等待RC
UART_ClearFlag(UARTx, UART_FLAG_RC); //清RC
if(UART_GetFlagStatus(UARTx, UART_FLAG_PE|UART_FLAG_FE)) //ERROR: PE or FE
{
UART_ClearFlag(UARTx, UART_FLAG_PE|UART_FLAG_FE);
RxCnt = 0x00;
}
else
{
RxBuf[RxCnt] = UART_ReceiveData_8bit(UARTx);
RxCnt++;
}
}
while(RxBuf[RxCnt-1] != '\n');
return RxCnt;
}
8.主程序
int32_t main(void)
{
RCC_Configuration();//配置RCC
GPIO_Configuration();//配置GPIO
UART_Configuration();//配置UART
PWR_Configuration();//配置低功耗模式
NVIC_Configuration();//配置NVIC
InitTick(HCLKFREQ); //初始化SysTick
RCC_WAKEUPCLK_Config(RCC_SYSCTRL_WAKEUPCLKDIS); //DeepSleep唤醒时,保持原系统时钟来源
UART_SendString(DEBUG_UARTx, "\r\nCW32L083 UART DeepSleep mode LSE/LSI\r\n");
while(1)
{
//进入深度休眠模式
UART_SendString(DEBUG_UARTx, "\r\nEnter DeepSleep mode\r\n");
UART_SendString(DEBUG_UARTx, "\r\nPC send data to wake up MCU\r\n");
UART_ITConfig(DEBUG_UARTx, UART_IT_RC, ENABLE); //使能UARTx RC中断
PWR_GotoLpmMode();
UART_ITConfig(CW_UART5, UART_IT_RC, DISABLE); //失能UARTx RC中断
//唤醒后轮询收发
TxRxBufferSize = UART_RecvBuf_Polling(DEBUG_UARTx, TxRxBuffer);
UART_SendBuf_Polling(DEBUG_UARTx, TxRxBuffer, TxRxBufferSize);
for(int i = 0; i<10; i++) //闪灯
{
PC03_TOG();
SysTickDelay(500);
}
}
}
9.测试结果
结果显示,通过PC发送123456后唤醒MCU, 唤醒后UART轮询接收数据,并存储到TxRxBuffer缓冲区,UART接收到'\n'后不再接收数据,然后将TxRxBuffer缓冲区中的数据回传至PC收到123456。传输结束后,LED1闪烁5s,并再次进入深度休眠模式。
- |
- +1 赞 0
- 收藏
- 评论 0
本文由ll转载自武汉芯源半导体公众号,原文标题为:CW32单片机UART低功耗模式介绍,本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
相关研发服务和供应服务
相关推荐
【经验】武汉芯源CW32系列MCU PWM输出功能指南
脉冲宽度调制(PWM),是在数字电路中达到模拟输出效果的一种手段,常见应用电机调速,照明灯调光等。在MCU中,主要通过定时器单元来时实现PWM输出,以CW32L083VxTx为例,LPTIM,GTIM,ATIM都可以输出PWM信号。
设计经验 发布时间 : 2023-02-23
武汉芯源CW32系列单片机数字电压电流表产品硬件设计指南
本文基于武汉芯源CW32系列单片机,介绍数字电压电流表产品硬件设计指南,希望对各位工程师有所帮助。
设计经验 发布时间 : 2024-06-20
【经验】芯源CW32系列MCU电容式触摸按键设计指南
芯源半导体的CW32系列MCU电容式触摸按键设计指南向客户提供利用CW32内部资源结合软件编程实现电容式触摸按键有效触摸检测的方法。本指南内容重点在于工作原理、软件检测过程以及调试指引。通过本文可了解到如何利用内置电压比较器和内置定时器及软件配合,实现灵活方便的按键检测。在介绍标准演示板和演示软件的性能参数同时,还会给出详细的调试建议以及设计参数选择倾向分析,帮助客户快速自信地完成设计并实施调试。
设计经验 发布时间 : 2023-07-27
武汉芯源半导体邀您相约CITE2024中国电子信息博览会
CITE2024第十二届中国电子信息博览会将于2024年4月9-11日在深圳福田会展中心隆重开展,武汉芯源半导体将为电子行业参观者展示智能指纹锁、麦克风、燃气表、LED调光板、可燃气体报警器、筋膜枪、角磨机、血氧仪、温控器、BLDC无刷电机、永磁同步电机无感FOC控制方案等多款CW32单片机典型应用方案,诚邀您莅临9B122武汉芯源半导体展位参观交流!
原厂动态 发布时间 : 2024-04-05
Application of CW32L083 Series MCU in Air Purifiers, Supported by Built in Independent Calibration RTC
The air purifier introduced in this article adopts the CW32L083 series microcontroller as the control core of the air purifier, and combines important components such as sensors, displays, drivers, and wireless transceivers to complete the required functions of the controller system.
应用方案 发布时间 : 2024-11-05
【技术】武汉芯源CW32单片机UART基本数据收发功能介绍
通用异步收发器是一种通用串行数据总线,常用于系统内各子模块间的数据交换。本文将以武汉芯源推出的CW32系列单片机的CW32L083为例,介绍UART基本数据收发功能。
技术探讨 发布时间 : 2023-04-25
M0+产品行业新标杆诞生,武汉芯源CW32L010安全低功耗MCU集合多项技术性能优势
2024年9月26日,武汉芯源半导体带着最新产品CW32L010安全低功耗MCU作客电巢直播间,举行了一场璀璨的XR技术新品发布会,此次直播,武汉芯源半导体技术总监 张亚凡、北中国区销售总监 孙秀艳与大家分享了武汉芯源半导体的发展历程和重要时刻,全面介绍和讲解了新品CW32L010实现的技术优势。
原厂动态 发布时间 : 2024-11-05
如何使用CW32单片机通过ESP8266连接OneNET物联网平台,发送温湿度数据到平台,并接受平台的云控制?
本实验使用到了CW32-48F大学计划开发板、DHT11温湿度传感器模块、ESP8266WIFI模块及Keil5开发环境。
设计经验 发布时间 : 2023-12-06
基于武汉芯源CW32L010低功耗MCU的低成本电动工具方案,空载转速达25000RPM
采用武汉芯源的CW32L010F8P6作为主控实现低成本电动工具方案,通过PWM方波控制算法进行电机转速控制,内部高精度AD转换实现电机电压、反电动势、电流等信号的采样,并实时进行故障停机保护等功能。
产品 发布时间 : 2024-11-05
【产品】武汉芯源CW32L083系列MCU中断系统介绍
本文针对武汉芯源CW32L083系列MCU,同系列产品亦可参考。ARM® Cortex®-M0+内核的嵌套向量中断控制器(NVIC),用于管理中断和异常。NVIC和处理器内核紧密相连,可以实现低延迟的异常和中断处理。
产品 发布时间 : 2022-12-02
【技术】一文介绍使用CW32系列MCU实现电池备份(VBAT)功能
本文档介绍了如何基于CW32系列MCU,通过增加简单的外部电路配合软件实现VBAT功能,在系统电源掉电后仍能保持RTC时钟正常计时,以及如何降低系统功耗,从而延长后备电池的使用寿命。
技术探讨 发布时间 : 2023-09-14
【IC】武汉芯源CW32L010安全低功耗MCU,树立M0+产品行业新标杆!
近日,武汉芯源半导体CW32L010系列产品正式官方发布。这款产品以其卓越的产品性能,迅速在业界引起了广泛关注,并成功树立M0+产品行业的新标杆。产品是基于eFlash的单芯片低功耗微控制器,集成了主频高达48MHz的ARM®Cortex®-M0+内核、高速嵌入式存储器(多至64K字节FLASH和多至4K字节SRAM)以及一系列全面的增强型外设和I/O口。
产品 发布时间 : 2024-10-10
武汉芯源半导体有限公司
型号- CW24XX,CW32L052R8,CW32L,CW32L031,CW32L052,CW32L SERIES,CW32系列,CW32F,CW32,CW32F030,CW32L031C8,CW24XX系列,CW32F030C8,CW32F003F4,CW32L052C8,CW32R031C8,CW32R031,CW32F003,CW32L031K8,CW32L031系列,CW32F030K8,CW32L052系列,CW32L032K6,CW32L032E6,CW32L083RB,CW32L083RC,CW32 SERIES,CW32A030C8,CW32F系列,CW32L083系列,CW32L083VC,CW32L083RX,CW32L083,CW32W031R8,CW32F030FX,CW32F030F8,CW32F003E4,CW32L083MC,CW32F SERIES,CW32W031,CW32F030F6,CW32F030 SERIES,CW32L系列,CW32L032F6,CW32L031F8
CW32L083: ARM® Cortex®-M0+ 32 位低功耗微控制器256K 字节 FLASH,24K 字节 RAM 数据手册 版本号:Rev 1.1
型号- CW32L083XB,CW32L083VCT6,CW32L083XC,CW32L083VC,CW32L083,CW32L083RBT6,CW32L083VCT6X,CW32L083RB
电子商城
现货市场
服务
可定制板装式压力传感器支持产品量程从5inch水柱到100 psi气压;数字输出压力传感器压力范围0.5~60inH2O,温度补偿范围-20~85ºС;模拟和数字低压传感器可以直接与微控制器通信,具备多种小型SIP和DIP封装可选择。
提交需求>
可定制显示屏的尺寸0.96”~15.6”,分辨率80*160~3840*2160,TN/IPS视角,支持RGB、MCU、SPI、MIPI、LVDS、HDMI接口,配套定制玻璃、背光、FPCA/PCBA。
最小起订量: 1000 提交需求>
登录 | 立即注册
提交评论