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

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

[复制链接]
祥福 提问时间: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个回答
祥福 回答时间: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. }
复制代码



祥福 回答时间:2020-10-21 17:29:20
主函数已经上传
祥福 回答时间:2020-10-21 19:12:10
有没有大佬帮帮忙
祥福 回答时间:2020-10-21 19:17:27
另外各位能否告诉我如何关闭DMA和ADC
祥福 回答时间: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)
复制代码


祥福 回答时间: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。
祥福 回答时间:2020-10-26 11:02:59
小歆-2051663 发表于 2020-10-26 09:29
重新开启ADC相当于你再次初始化你的ADC,如果你是用CubeMX生成的代码,应该在main函数中有一个MX_ADC_Ini ...

谢谢大佬 我发现是台式万用表接入单片机后 导致单片机ADC示数不准 ,现在已经调整了,但是发现待机时候的电流从400微安降到280微安,我是否还应该关闭 SPI 和定时器 继续降低功耗
祥福 回答时间:2020-10-26 11:22:40
小歆-2051663 发表于 2020-10-26 09:29
重新开启ADC相当于你再次初始化你的ADC,如果你是用CubeMX生成的代码,应该在main函数中有一个MX_ADC_Ini ...

进入stop2前的函数如下
  1. if(WakeUpState==1)
  2.                 {
  3.                 NRF24L01_LowPower_Mode();
  4.                 HAL_TIM_Base_Stop_IT(&htim2);
  5.                 HAL_TIM_Base_Stop_IT(&htim8);
  6.                 HAL_TIM_Base_Stop_IT(&htim2);
  7.                 HAL_TIM_Base_Stop_IT(&htim8);
  8.                 WakeUpState=0;
  9.                 HAL_StatusTypeDef HAL_ADC_DeInit(ADC_HandleTypeDef* hadc);
  10.                 HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc);
  11.     __HAL_SPI_DISABLE_IT(&hspi2, SPI_IT_RXNE);       
  12. }
复制代码

然后唤醒后初始化的函数如下
  1. SystemClock_Config();
  2.   MX_GPIO_Init();
  3.   MX_DMA_Init();
  4.   MX_ADC1_Init();
  5.   MX_ADC2_Init();
  6.   MX_SPI2_Init();
  7.   MX_TIM2_Init();
  8.   MX_TIM8_Init();
复制代码

gpio我没有关断,因为在cubemx里面已经设置了空闲引脚为模拟输入 想问一下还有哪个部分可以继续降低功耗 谢谢大佬
小歆-2051663 回答时间:2020-10-26 11:33:26
lowpowerstudy 发表于 2020-10-26 11:02
谢谢大佬 我发现是台式万用表接入单片机后 导致单片机ADC示数不准 ,现在已经调整了,但是发现待机时候的 ...

这个要根据你的项目情况,关闭不需要外设。
祥福 回答时间:2020-10-26 16:20:22
小歆-2051663 发表于 2020-10-26 11:33
这个要根据你的项目情况,关闭不需要外设。

大佬您好 我按照您说的将所有的GPIO端口关闭了,功耗的确降下来了
  1. GPIO_InitTypeDef GPIO_InitStruct;
  2.   __HAL_RCC_GPIOA_CLK_ENABLE();
  3.     __HAL_RCC_GPIOB_CLK_DISABLE();
  4.     __HAL_RCC_GPIOC_CLK_DISABLE();  
  5.     __HAL_RCC_GPIOD_CLK_DISABLE();
  6.     __HAL_RCC_GPIOE_CLK_DISABLE();
  7.     __HAL_RCC_GPIOF_CLK_DISABLE();
  8.     __HAL_RCC_GPIOG_CLK_DISABLE();
  9.     __HAL_RCC_GPIOH_CLK_DISABLE();   

  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();
复制代码

但是发现ADC测量不准了 这个应该如何调整唤醒后的操作为
  1. HAL_RTCEx_DeactivateWakeUpTimer(&RTCHandle);//清除RTC计时器
  2.         HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 10000, RTC_WAKEUPCLOCK_RTCCLK_DIV16);
  3.         HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
  4.   SystemClock_Config();
  5.         MX_GPIO_Init();
  6.   MX_DMA_Init();
  7.   MX_ADC1_Init();
  8.   MX_ADC2_Init();
  9.   MX_SPI2_Init();
  10.   MX_TIM2_Init();
  11.         MX_TIM8_Init();
复制代码
也按照cubemx的初始化了GPIO

所属标签

相似问题

官网相关资源

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