stm32L0进入stop模式的程序配置
下面是一个简单的示例程序,演示如何在STM32L0中配置和进入Stop模式。
- 配置系统时钟
首先需要配置系统时钟。以下代码将系统时钟配置为HSI16(内部16MHz RC振荡器):
RCC->CR |= RCC_CR_HSION; // 开启内部RC振荡器
while((RCC->CR & RCC_CR_HSIRDY) == 0); // 等待内部RC振荡器稳定
RCC->CFGR |= RCC_CFGR_SW_HSI; // 选择内部RC振荡器作为系统时钟源
while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI); // 等待系统时钟源切换完成
- 配置GPIO
下一步是配置GPIO引脚。以下代码将PB0引脚配置为输出,用于指示是否进入Stop模式:
RCC->IOPENR |= RCC_IOPENR_GPIOBEN; // 开启GPIOB时钟
GPIOB->MODER |= GPIO_MODER_MODE0_0; // 将PB0引脚配置为输出
- 配置RTC
为了使STM32L0能够从Stop模式中唤醒,需要配置RTC(实时时钟)模块。以下代码将RTC配置为使用LSI(低速外部晶体振荡器)作为时钟源,并将RTC中断使能:
RCC->CSR |= RCC_CSR_LSION; // 开启LSI
while((RCC->CSR & RCC_CSR_LSIRDY) == 0); // 等待LSI稳定
RCC->APB1ENR |= RCC_APB1ENR_PWREN; // 开启PWR时钟
PWR->CR |= PWR_CR_DBP; // 解锁RTC寄存器
RCC->CSR |= RCC_CSR_RTCSEL_LSI; // 选择LSI作为RTC时钟源
RCC->CSR |= RCC_CSR_RTCEN; // 开启RTC时钟
RTC->WPR = 0xCA; // 解锁RTC寄存器
RTC->WPR = 0x53;
RTC->ISR |= RTC_ISR_INIT; // 进入RTC初始化模式
while((RTC->ISR & RTC_ISR_INITF) == 0); // 等待RTC初始化完成
RTC->PRER = (127 << 16) | 255; // 配置RTC分频器,使RTC时钟为1Hz
RTC->CR &= ~RTC_CR_WUTE; // 关闭RTC唤醒定时器
RTC->CR |= RTC_CR_WUTIE; // 使能RTC唤醒定时器中断
RTC->WUTR = 3000; // 设置RTC唤醒定时器计数值,约为3秒
RTC->CR |= RTC_CR_WUTE; // 开启RTC唤醒定时器
RTC->ISR &= ~RTC_ISR_INIT; // 退出RTC初始化模式
RTC->WPR = 0xFF; // 上锁RTC寄存器
NVIC_EnableIRQ(RTC_IRQn); // 使能RTC中断
- 进入Stop模式
最后,以下代码将STM32L0进入Stop模式:
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; // 进入深度睡眠模式
PWR->CR |= PWR_CR_PDDS; // 选择Stop模式
PWR->CR |= PWR_CR_CWUF; // 清除唤醒标志位
PWR->CR |= PWR_CR_LPDS; // 低功耗模式下禁止FLASH访问
__WFI(); // 进入睡眠模式
在Stop模式下,STM32L0的CPU和大多数外设都将停止工作,只有一些低功耗模块(如RTC)仍然在工作。当RTC唤醒定时器计数到达预设值时,将产生中断,唤醒STM32L0。此时可以通过检查唤醒标志位来确定是否从Stop模式中唤醒。如果唤醒标志位被设置,则说明STM32L0已经成功地进入和退出了Stop模式。
原文地址: https://www.cveoy.top/t/topic/b4FP 著作权归作者所有。请勿转载和采集!