完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
各位高手,请教个问题,我想在STM8L151主电掉电的情况下使起进入Active-halt模式(只启用RTC)使用电池供电,主电恢复后由上电复位电路复位进入正常工作
下面是部分程序,因第一次用该芯片,不知道怎么进入Active-halt模式,下面是部分程序,实测电流超过3mA,请高手们帮我看看那里出问题了 void power_init(void)//电源管理 { PWR_DeInit(); PWR_PVDLevelConfig(PWR_PVDLevel_3V05);//阀值电压3.05 PWR_PVDCmd(ENABLE); PWR_FastWakeUpCmd(ENABLE); PWR_PVDITConfig(ENABLE); } void lowpower_config(void) { GPIO_DeInit(GPIOA); GPIO_DeInit(GPIOB); GPIO_DeInit(GPIOC); GPIO_DeInit(GPIOD); GPIO_DeInit(GPIOE); GPIO_DeInit(GPIOF); ADC_DeInit(ADC1); TIM2_DeInit(); TIM1_DeInit(); USART_DeInit(USART1); CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, DISABLE); CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, DISABLE); GPIO_Init(GPIOA, GPIO_Pin_4, GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOA, GPIO_Pin_5, GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOA, GPIO_Pin_6, GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOD, GPIO_Pin_1, GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOD, GPIO_Pin_2, GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOD, GPIO_Pin_3, GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOB, GPIO_Pin_0, GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOB, GPIO_Pin_1, GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOF, GPIO_Pin_0, GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOB, GPIO_Pin_2, GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOB, GPIO_Pin_3, GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOB, GPIO_Pin_4, GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOE, GPIO_Pin_6, GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOC, GPIO_Pin_1, GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOC, GPIO_Pin_0, GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOD, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOD,GPIO_Pin_5,GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOD,GPIO_Pin_4,GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOB,GPIO_Pin_6,GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOA,GPIO_Pin_7,GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOE,GPIO_Pin_0,GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOE,GPIO_Pin_1,GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOE,GPIO_Pin_2,GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOE,GPIO_Pin_3,GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOE,GPIO_Pin_4,GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOE,GPIO_Pin_5,GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOD,GPIO_Pin_0,GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOD,GPIO_Pin_6,GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOE,GPIO_Pin_7,GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOC, GPIO_Pin_2, GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOC, GPIO_Pin_3, GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOC, GPIO_Pin_4, GPIO_Mode_In_PU_No_IT); CLK_PeripheralClockConfig(CLK_Peripheral_USART1, DISABLE); CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, DISABLE); CLK_PeripheralClockConfig(CLK_Peripheral_TIM1, DISABLE); PWR_UltraLowPowerCmd(ENABLE); CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1); CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_LSE); CLK_SYSCLKSourceSwitchCmd(ENABLE); while (CLK_GetSYSCLKSource() != CLK_SYSCLKSource_LSE){}; CLK_HSEConfig(CLK_HSE_OFF); CLK_HaltConfig(CLK_Halt_FastWakeup,ENABLE);//快速唤醒 halt(); } INTERRUPT_HANDLER(EXTIE_F_PVD_IRQHandler, 5) { lowpower_config(); PWR_PVDITConfig(DISABLE); } } |
|
相关推荐
1个回答
|
|
要在STM8L151主电掉电的情况下进入Active-halt模式(只启用RTC)使用电池供电,您需要按照以下步骤操作:
1. 配置电源管理器:首先,您需要配置电源管理器以允许进入低功耗模式。您已经提供了部分电源管理初始化代码,但还需要配置一些其他参数。 ```c void power_init(void) { PWR_DeInit(); // 重置电源管理器 PWR_PVDLevelConfig(PWR_PVDLevel_3V05); // 设置电源电压检测阈值 PWR_PVDCmd(ENABLE); // 启用电源电压检测 PWR_FastWakeUpCmd(ENABLE); // 启用快速唤醒功能 PWR_PVDITConfig(ENABLE); // 启用PVD中断 } ``` 2. 配置时钟:为了在Active-halt模式下使用RTC,您需要配置时钟系统以使用LSE(低速度外部时钟)或LSI(低速度内部时钟)作为RTC时钟源。 ```c void clock_init(void) { CLK_DeInit(); // 重置时钟系统 CLK_HSECmd(DISABLE); // 禁用外部高速时钟 CLK_LSEConfig(CLK_LSE_ON); // 启用低速度外部时钟 while (CLK_GetFlagStatus(CLK_FLAG_LSEReady) == RESET); // 等待LSE稳定 CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE); // 启用RTC时钟 RTC_ITConfig(RTC_IT_ALR, ENABLE); // 启用RTC闹钟中断 } ``` 3. 配置RTC:在进入Active-halt模式之前,您需要配置RTC以使用LSE或LSI作为时钟源,并设置闹钟以唤醒MCU。 ```c void rtc_init(void) { RTC_DeInit(); // 重置RTC RTC_WaitForSynchro(); // 等待RTC同步 RTC_LSEConfig(RTC_LSE_ON); // 设置RTC时钟源为LSE RTC_ITConfig(RTC_IT_ALR, ENABLE); // 启用RTC闹钟中断 RTC_AlarmStructInit(RTC_AlarmStruct); // 初始化RTC闹钟结构 RTC_SetAlarm(RTC_Format_BIN, RTC_AlarmStruct); // 设置RTC闹钟 RTC_AlarmCmd(ENABLE); // 启用RTC闹钟 } ``` 4. 进入Active-halt模式:在配置好电源管理器、时钟和RTC之后,您可以通过以下代码进入Active-halt模式。 ```c void enter_active_halt_mode(void) { PWR_ActiveHaltModeCmd(ENABLE); // 进入Active-halt模式 while (1) { if (RTC_GetITStatus(RTC_IT_ALR) != RESET) { // 检查RTC闹钟中断 RTC_ClearITPendingBit(RTC_IT_ALR); // 清除RTC闹钟中断标志 // 在此处添加您的正常工作代码 break; // 退出Active-halt模式 } } } ``` 5. 唤醒MCU:当RTC闹钟触发时,MCU将被唤醒并执行您在`enter_active_halt_mode`函数中的正常工作代码。完成正常工作后,您可以再次进入Active-halt模式以节省能量。 请注意,您需要根据您的具体需求调整上述代码。例如,您可能需要调整RTC闹钟设置以适应您的应用场景。此外,确保在主电恢复后使用上电复位电路复位MCU,以便重新进入正常工作模式。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1786 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1622 浏览 1 评论
1089 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
730 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1680 浏览 2 评论
1942浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
739浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
576浏览 3评论
598浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
560浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 13:22 , Processed in 0.859232 second(s), Total 81, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号