你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

小白求助STM32L476 将端口设为模拟输入后无法进入stop2模式

[复制链接]
lowpowerstudy 提问时间:2020-10-21 17:22 /
参考了STM32L476官方例程 在进入stop2模式前 将所有端口设置为模拟输入
  1. GPIO_InitTypeDef GPIO_InitStruct;
  2.     __HAL_RCC_GPIOA_CLK_ENABLE();
  3.     __HAL_RCC_GPIOB_CLK_ENABLE();
  4.     __HAL_RCC_GPIOC_CLK_ENABLE();  
  5.     __HAL_RCC_GPIOD_CLK_ENABLE();
  6.     __HAL_RCC_GPIOE_CLK_ENABLE();
  7.     __HAL_RCC_GPIOF_CLK_ENABLE();
  8.     __HAL_RCC_GPIOG_CLK_ENABLE();
  9.     __HAL_RCC_GPIOH_CLK_ENABLE();   

  10.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  11.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  12.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  13.     GPIO_InitStruct.Pin = GPIO_PIN_All;

  14.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  15.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  16.     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);  
  17.     HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  18.     HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
  19.     HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
  20.     HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
  21.     HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);  

  22.     __HAL_RCC_GPIOA_CLK_DISABLE();
  23.     __HAL_RCC_GPIOB_CLK_DISABLE();
  24.     __HAL_RCC_GPIOC_CLK_DISABLE();
  25.     __HAL_RCC_GPIOD_CLK_DISABLE();
  26.     __HAL_RCC_GPIOE_CLK_DISABLE();
  27.     __HAL_RCC_GPIOF_CLK_DISABLE();
  28.     __HAL_RCC_GPIOG_CLK_DISABLE();
  29.     __HAL_RCC_GPIOH_CLK_DISABLE();
复制代码

发现单片机无法进入stop2,将这段程序删除在cubemx将空闲引脚设为低功耗模式,可以正常进入低功耗和唤醒,但是待机时的电流很大有400多微安,求各位大佬帮帮忙,看一下是那个地方出了问题。

收藏 评论13 发布时间:2020-10-21 17:22

举报

13个回答
lowpowerstudy 回答时间:2020-10-21 17:27:38
  1. int main(void)
  2. {

  3.   HAL_Init();
  4.   SystemClock_Config();
  5.   MX_RTC_Init();

  6.   while (1)
  7.   {
  8.   if(WakeUpState==1){
  9.     HAL_StatusTypeDef HAL_ADCEx_EnterADCDeepPowerDownMode(ADC_HandleTypeDef *hadc);// adc进入deeppowerdown模式
  10.     HAL_StatusTypeDef HAL_ADCEx_DisableVoltageRegulator(ADC_HandleTypeDef *hadc);
  11.                 NRF24L01_LowPower_Mode(); //nrf24l01进入standby1
  12.                 HAL_TIM_Base_Stop_IT(&htim2);//关闭定时器
  13.                 HAL_TIM_Base_Stop_IT(&htim8);
  14.                 HAL_TIM_Base_Stop_IT(&htim2);
  15.                 HAL_TIM_Base_Stop_IT(&htim8);
  16.                 WakeUpState=0;
  17.     }

  18.          HAL_RTCEx_DeactivateWakeUpTimer(&RTCHandle);//清除RTC计时器
  19.         __HAL_RCC_GPIOA_CLK_ENABLE();//端口设为模拟输入
  20.     __HAL_RCC_GPIOB_CLK_ENABLE();
  21.     __HAL_RCC_GPIOC_CLK_ENABLE();  
  22.     __HAL_RCC_GPIOD_CLK_ENABLE();
  23.     __HAL_RCC_GPIOE_CLK_ENABLE();
  24.     __HAL_RCC_GPIOF_CLK_ENABLE();
  25.     __HAL_RCC_GPIOG_CLK_ENABLE();
  26.     __HAL_RCC_GPIOH_CLK_ENABLE();   

  27.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  28.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  29.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  30.     GPIO_InitStruct.Pin = GPIO_PIN_All;

  31.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  32.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  33.     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);  
  34.     HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  35.     HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
  36.     HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
  37.     HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
  38.     HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);  

  39.     __HAL_RCC_GPIOA_CLK_DISABLE();
  40.     __HAL_RCC_GPIOB_CLK_DISABLE();
  41.     __HAL_RCC_GPIOC_CLK_DISABLE();
  42.     __HAL_RCC_GPIOD_CLK_DISABLE();
  43.     __HAL_RCC_GPIOE_CLK_DISABLE();
  44.     __HAL_RCC_GPIOF_CLK_DISABLE();
  45.     __HAL_RCC_GPIOG_CLK_DISABLE();
  46.     __HAL_RCC_GPIOH_CLK_DISABLE();
  47.          HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 10000, RTC_WAKEUPCLOCK_RTCCLK_DIV16);//中断
  48.          HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);//进入休眠
  49.    SystemClock_Config();//唤醒后
  50.          MX_GPIO_Init();//初始化
  51.          MX_DMA_Init();
  52.          MX_ADC1_Init();
  53.          MX_ADC2_Init();
  54.          MX_SPI2_Init();
  55.          MX_TIM2_Init();
  56.          MX_TIM8_Init();
  57.         adc_complete = 0;
  58.    while(NRF24L01_Check());
  59.          HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4);     // 产生脉冲波
  60.          HAL_ADC_Start(&hadc2); //启动定时器2
  61.          HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);  // 对ADC进行校准,如果没有进行校准采集到的数据会有偏差
  62.    HAL_ADCEx_Calibration_Start(&hadc2, ADC_SINGLE_ENDED);        
  63.          HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t*)&ADC_Value,2048);  //ADC同步采样
  64.          HAL_ADCEx_MultiModeStart_DMA(&hadc2, (uint32_t*)&ADC_Value, 2048);         
  65.          while(adc_complete == 0){HAL_Delay(5);}
  66.          HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);  // 对ADC进行校准,如果没有进行校准采集到的数据会有偏差
  67.    HAL_ADCEx_Calibration_Start(&hadc2, ADC_SINGLE_ENDED);        
  68.   }
  69. }
复制代码



lowpowerstudy 回答时间:2020-10-21 17:29:20
主函数已经上传
lowpowerstudy 回答时间:2020-10-21 19:12:10
有没有大佬帮帮忙
lowpowerstudy 回答时间:2020-10-21 19:17:27
另外各位能否告诉我如何关闭DMA和ADC
lowpowerstudy 回答时间:2020-10-21 20:22:38
有人吗
小歆-2051663 回答时间:2020-10-23 10:33:24
你不要关闭GPIO时钟试一下
小歆-2051663 回答时间:2020-10-23 10:42:47
lowpowerstudy 发表于 2020-10-21 19:17
另外各位能否告诉我如何关闭DMA和ADC

HAL库有专门停止ADC和DMA采样的函数:

  1. HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc)
复制代码


以及关闭ADC外设的函数:

  1. HAL_StatusTypeDef HAL_ADC_DeInit(ADC_HandleTypeDef* hadc)
复制代码


lowpowerstudy 回答时间:2020-10-25 14:19:26
小歆-2051663 发表于 2020-10-23 10:42
HAL库有专门停止ADC和DMA采样的函数:

谢谢大佬 我试了一下关闭adc和dma的函数 电流从400微安降低到了100微安随后又变成了2微安,但是我初始化adc的方式可能不对导致 adc测得的数值存在问题 请问重新开启adc应该用哪个函数

复制代码
小歆-2051663 回答时间:2020-10-26 09:29:21
lowpowerstudy 发表于 2020-10-25 14:19
谢谢大佬 我试了一下关闭adc和dma的函数 电流从400微安降低到了100微安随后又变成了2微安,但是我初始化ad ...

重新开启ADC相当于你再次初始化你的ADC,如果你是用CubeMX生成的代码,应该在main函数中有一个MX_ADC_Init调用的,再次调用MX_ADC_Init即可重启你的ADC。
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版