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

 

 

本文地址:https://blog.csdn.net/weixin_29898767/article/details/109643995