STM32G031 HAL库进入睡眠模式,待机模式。

注意1:我在调试的时候关闭了看门狗,但是主循环里面有喂狗语句,导致了不能正常进入待机模式。不知道是不是我处理有问题。建议大家单独调试。避免入坑。

注意2:进入睡眠模式,待机模式,程序将烧录不了。所以我在上电2秒后进入该模式。程序如下。

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    Low_Power_IO_Config();   
    while(1)
    {
        static uint8_t init_flag = 0;	
        if(init_flag == 0)
        {
            if(get_sys_time_us() > 2000)
            {
                init_flag = 1;
                 PWR_Enter_Standby();
				//Enter_Low_Power_Mode();
            }
        }
    }
}


void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  /** Configure the main internal regulator output voltage 
  */
  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1;
  RCC_OscInitStruct.PLL.PLLN = 8;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the peripherals clocks 
  */
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C1|RCC_PERIPHCLK_I2S1
                              |RCC_PERIPHCLK_ADC;
  PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1;
  PeriphClkInit.I2s1ClockSelection = RCC_I2S1CLKSOURCE_SYSCLK;
  PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_SYSCLK;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}


//进入睡眠模式
void Enter_Low_Power_Mode(void)
{
    __HAL_RCC_PWR_CLK_ENABLE();   //使能PWR时钟

    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); //真正进入低功耗模式
    SystemClock_Config();//重新配置时钟,低功耗唤醒之后默认HSI 8M
}




// 系统进入待机模式
void PWR_Enter_Standby(void)
{
       __HAL_RCC_PWR_CLK_ENABLE();
      if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)
      {
        __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
        
        if (__HAL_PWR_GET_FLAG(PWR_FLAG_WUF2) != RESET)
        {
          __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WUF2);
        }

        if (__HAL_PWR_GET_FLAG(PWR_FLAG_WUF4) != RESET)
        {
          __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WUF4);
        }
      }
      HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN2_HIGH);
      HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN4_HIGH);
      HAL_PWR_EnterSTANDBYMode();
}

//进入低功耗之前需要先将外部中断唤醒配置好
void Low_Power_IO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  
  GPIO_InitStruct.Pin = KEY_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;  //上升沿触发
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(KEY_PRO, &GPIO_InitStruct);

  HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
}

 

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下为STM32G031 HAL库 ADC多通道DMA方式的示例代码: ```c /* 初始化 ADC */ ADC_HandleTypeDef hadc; hadc.Instance = ADC1; hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; hadc.Init.Resolution = ADC_RESOLUTION_12B; hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc.Init.ScanConvMode = ADC_SCAN_ENABLE; hadc.Init.EOCSelection = ADC_EOC_SEQ_CONV; hadc.Init.LowPowerAutoWait = DISABLE; hadc.Init.ContinuousConvMode = ENABLE; hadc.Init.NbrOfConversion = 2; hadc.Init.DiscontinuousConvMode = DISABLE; hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; if (HAL_ADC_Init(&hadc) != HAL_OK) { Error_Handler(); } /* 配置ADC通道 */ ADC_ChannelConfTypeDef sConfig; sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = ADC_RANK_CHANNEL_NUMBER; sConfig.SamplingTime = ADC_SAMPLETIME_640CYCLES_5; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { Error_Handler(); } sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = ADC_RANK_CHANNEL_NUMBER; sConfig.SamplingTime = ADC_SAMPLETIME_640CYCLES_5; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { Error_Handler(); } /* 初始化DMA */ DMA_HandleTypeDef hdma_adc; hdma_adc.Instance = DMA1_Channel1; hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE; hdma_adc.Init.MemInc = DMA_MINC_ENABLE; hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; hdma_adc.Init.Mode = DMA_CIRCULAR; hdma_adc.Init.Priority = DMA_PRIORITY_LOW; if (HAL_DMA_Init(&hdma_adc) != HAL_OK) { Error_Handler(); } /* 配置DMA通道 */ __HAL_LINKDMA(&hadc, DMA_Handle, hdma_adc); HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); /* 启动ADC */ HAL_ADC_Start_DMA(&hadc, (uint32_t *)adc_values, 2); ``` 其中,`ADC1`代表ADC模块的实例;`ADC_CHANNEL_0`和`ADC_CHANNEL_1`代表需要使用的ADC通道;`DMA1_Channel1`代表DMA通道的实例;`adc_values`是一个长度为2的数组,用于存储ADC转换结果。启动ADC转换时,使用`HAL_ADC_Start_DMA`函数,将DMA传输的目的地址设为`adc_values`数组的首地址。当ADC转换完成时,DMA会将转换结果存储到`adc_values`数组中。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值