|
接上篇:STM32F0的LL库使用(四) 题外话:首先感谢社区的U盘,虽然还没有到货。这些贴子只是给各位了解LL库的渠道,我只不过是整理了资料。二月做了手术,没能把LL库再写三个。三月四月还要准备复试,不管怎么样,肯定还是会把这个片上的外设什么的都写完。 不能说这是教程,这几个帖子有点乱,那我们这次来搞低功耗模式 。 硬件:STM32F030F4P6核心板,STLINK-V2-1(即NUCLEO板载仿真器拆下来的) 软件:CubeMX(V2.4.0)+IAR(V8.20) LL库版本V1.9.0 既然是低功耗模式配置嘛,很简单:
不多说直接主程序: /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ LL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); LL_mDelay(100); } /* USER CODE END 3 */ 进入低功耗模式灯就不闪。 重点是中断服务函数: void LL_EXTI_LINE_5_CallBack(void) { uint8_t Entry=0; uint16_t Count=0; LL_mDelay(10); if(LL_GPIO_IsInputPinSet(GPIOA,LL_GPIO_PIN_5)==SET) { for(;Count<3000;Count++) { LL_mDelay(1); if( (LL_GPIO_IsInputPinSet(GPIOA,LL_GPIO_PIN_5)!=SET)) {Entry=0;Count=0;} } for(;Count<3000;Count++) { LL_mDelay(1); if( (LL_GPIO_IsInputPinSet(GPIOA,LL_GPIO_PIN_5)!=SET)) {Entry=1;Count=0;} else {Entry=3;Count=0;} } if(Entry==0) EnterStandbyMode(); if(Entry==1) EnterSTOP_LPREGUMode(); if(Entry==3) { for(;Count<5;Count++) { LL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); LL_mDelay(50); } } } } 可以参考我前面的那个GPIO中断。 然后是进入低功耗模式函数(节选自官方例程),HAL库更简单。其实我个人感觉这段完全可以用HAL库代替了。不知道各位大神对此有什么看法? void EnterStandbyMode(void); void EnterSTOP_LPREGUMode(void); void EnterStandbyMode(void) { /* Disable all used wakeup sources */ LL_PWR_DisableWakeUpPin(LL_PWR_WAKEUP_PIN1); /* Clear all wake up Flag */ LL_PWR_ClearFlag_WU(); /* Enable wakeup pin */ LL_PWR_EnableWakeUpPin(LL_PWR_WAKEUP_PIN1); /** Request to enter STANDBY mode * Following procedure describe in STM32F0xx Reference Manual * See PWR part, section Low-power modes, Standby mode */ /* Set STANDBY mode when CPU enters deepsleep */ LL_PWR_SetPowerMode(LL_PWR_MODE_STANDBY); /* Set SLEEPDEEP bit of Cortex System Control Register */ LL_LPM_EnableDeepSleep(); /* Request Wait For Interrupt */ __WFI(); } void EnterSTOP_LPREGUMode(void) { //所有的GPIO设置为analog模式,减小电流消耗 LL_GPIO_InitTypeDef gpio_initstruct = {LL_GPIO_PIN_ALL, LL_GPIO_MODE_ANALOG, LL_GPIO_SPEED_FREQ_HIGH, LL_GPIO_OUTPUT_PUSHPULL, LL_GPIO_PULL_NO, LL_GPIO_AF_0}; LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA |LL_AHB1_GRP1_PERIPH_GPIOB |LL_AHB1_GRP1_PERIPH_GPIOF); LL_GPIO_Init(GPIOA, &gpio_initstruct); LL_GPIO_Init(GPIOB, &gpio_initstruct); LL_GPIO_Init(GPIOF, &gpio_initstruct); LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOA |LL_AHB1_GRP1_PERIPH_GPIOB |LL_AHB1_GRP1_PERIPH_GPIOF); /** Request to enter STOP_LPREGU mode * Following procedure describe in STM32F0xx Reference Manual * See PWR part, section Low-power modes, STOP_LPREGU mode */ /* Set STOP_LPREGU mode when CPU enters deepsleep */ LL_PWR_SetPowerMode(LL_PWR_MODE_STOP_LPREGU); /* Set SLEEPDEEP bit of Cortex System Control Register */ LL_LPM_EnableDeepSleep(); /* Request Wait For Interrupt */ __WFI(); } 可以开始弄个按键接上去然后观察了,俩按键,一个接GPIO中断,一个SYS_WKUP。观察现象,有错就在仔细查查,我这边没问题。 |
微信公众号
手机版
U盘今天会寄的,记得用之前帖子中的方法查快递啊~
再次感谢啊
你们才是大佬啊
谢谢!
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
要准备复试了,下个月发SPI,I2C