1. 为什么选择stop模式?
. 停止模式唤醒是从进入睡眠的那个地方开始的,或直接进入中断,SRAM和寄存器内容被保留
standby 待机模式 ,唤醒后会复位,相当于重新上电
2. stm32 的gpio复位后是什么状态?
stm32单片机是一个低功耗的处理器,当复位以后,gpio默认是高阻状态,也就是浮空输入
参考链接: https://blog.csdn.net/nyp_1988/article/details/100523701 stop低功耗模式
stm32单片机的3种模式 https://www.sohu.com/a/338305750_467791
mcu io 配置参考 https://blog.csdn.net/jiangjunjie_2005/article/details/50628279
https://blog.csdn.net/u013184273/article/details/80051263 这个文章 只参考了 当有下拉电阻的时候,改为输出下拉低电平
MCU输入:输入,浮动 | Input floating, no external interrupt | |
| MCU输出:输入,上拉 | Input pull-up, no external interrupt |
| 3.3V引脚:输出,上拉,高电平 | Output push-pull, high level, 2MHz |
| 未接引脚:输出,上拉,低电平 | Output push-pull, low level,2MHz |
| MCU电源与地引脚 | / |
void SystemPower_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
/* Enable Power Control clock */
__HAL_RCC_PWR_CLK_ENABLE();
/* Enable Ultra low power mode */
HAL_PWREx_EnableUltraLowPower();
/* Enable the fast wake up from Ultra low power mode */
HAL_PWREx_EnableFastWakeUp();
#if 1
//spi
HAL_SPI_DeInit(&SpiHandle); 必须这样 先deinit设备
__HAL_RCC_SPI1_CLK_DISABLE();
//uart
HAL_UART_DeInit(&UartHandle);
__HAL_RCC_USART2_CLK_DISABLE() ;
//dma1
HAL_DMA_DeInit(&hdma_adc);
__HAL_RCC_DMA1_CLK_DISABLE();
//adc
HAL_ADC_DeInit(&hadc);
__HAL_RCC_ADC1_CLK_DISABLE();
#endif
//pb -----------
GPIO_InitStructure.Pin = GPIO_PIN_0; //floating 浮空
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);
GPIO_InitStructure.Pin = GPIO_PIN_1 |GPIO_PIN_9; // has pulldown resistance
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; //GPIO_MODE_ANALOG;
GPIO_InitStructure.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);
GPIO_InitStructure.Pin = GPIO_PIN_3 |GPIO_PIN_5 ; //mcu output
GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
GPIO_InitStructure.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_4 |GPIO_PIN_6 |GPIO_PIN_7; //mcu input
GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
GPIO_InitStructure.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
//pc -------------
GPIO_InitStructure.Pin = GPIO_PIN_All;
GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
GPIO_InitStructure.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
/* Disable GPIOs clock */
__HAL_RCC_GPIOA_CLK_DISABLE();
__HAL_RCC_GPIOB_CLK_DISABLE();
__HAL_RCC_GPIOC_CLK_DISABLE();
}
rtc 时钟
https://bbs.21ic.com/icview-2825108-1-8.html rtc 时钟设置
37k的来历
在进行低功耗设计时,使用外部中断唤醒CPU是一个非常有用而且有效的方法,但是在某些特定的应用中,我们还希望
CPU能够自己醒来去完成一些特定的操作,这就需要用到RTC模块,因为RTC模块在CPU进入低功耗状态后,是还可以工
作的。使用RTC,也需要得到一个最小时间间隔,一般我们将其设置为1秒,本文介绍如何设置RTC的这个最小时间间
隔。
先来看一下时钟图,RTC可以采用两个时钟模块,1个是外部的低频晶振,一般我们选择32.768KHz,这个比较精
准;另一个则是内部的RC振荡器,是37KHz。
STM32L0的预分频器被分成两个预分频器。一个7位的异步预分频器(AsynchPrediv),一个13位同步预分频器
(SynchPrediv)。
RTC频率的计算公式:RTCclk=(LSE或LSI)/[(AsynchPrediv+1)*(SynchPrediv+1)]。
给出2组经典值: LSE RTCclk = 32768/(127+1)*(255+1)=1Hz AsynchPrediv = 127
SynchPrediv = 255
LSI RTCclk = 37000/(124+1)*(295+1)=1Hz AsynchPrediv = 124
SynchPrediv = 295