今年7月底首次接触的STM32系列,搭环境,调试串口输出"Hello World",遇到了好些个问题,都一一解决了。
期间出差了一周,回来把目前在做的NB项目串口部分调试完成了,接下来开始做低功耗了。
看了许多前人留下的经验,结合自己的工程;
- /* Initialize all configured peripherals */
- MX_GPIO_Init();
- MX_LPUART1_UART_Init();
- MX_TIM2_Init();
- MX_TIM21_Init();
- MX_TIM22_Init();
- /* USER CODE BEGIN 2 */
- __HAL_UART_ENABLE_IT(&hlpuart1,UART_IT_RXNE);
- __HAL_TIM_ENABLE_IT(&htim2,TIM_IT_UPDATE);
- // __TS2115M_NB_Init_(); //NB模块初始化入网
-
- /* USER CODE END 2 */
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- if(Menci_Exti){
- Menci_Exti = 0;
- HAL_UART_MspInit(&hlpuart1);
- HAL_UART_Transmit_IT(&hlpuart1,"Wake Up From StopMode",21);
- HAL_Delay(20);
- Clear_Mcu_Rec();
- HAL_Delay(5000);
- HAL_UART_Transmit_IT(&hlpuart1,"Enter StopMode",14);
- HAL_Delay(20);
- /**************************进入停机模式***************************/
- HAL_UART_MspDeInit(&hlpuart1); //关闭串口时钟,复位串口引脚
- HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_SLEEPENTRY_WFI);
- }
- if(lpuart_time_over){
- if((lpuart_buf[0] == 'A')&&(lpuart_buf[1] == 'B')){
- HAL_UART_Transmit_IT(&hlpuart1,"Enter StopMode",15);
- HAL_Delay(20);
- HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);
- }
- else{
- HAL_UART_Transmit_IT(&hlpuart1,lpuart_buf,lpuart_buf_len);
- HAL_Delay(20);
- }
- Clear_Mcu_Rec();
- }
- }
- /* USER CODE END 3 */
复制代码- static void MX_GPIO_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- /* GPIO Ports Clock Enable */
- __HAL_RCC_GPIOB_CLK_ENABLE();
- /*Configure GPIO pin : PB14 */
- GPIO_InitStruct.Pin = GPIO_PIN_14;
- GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
- /* EXTI interrupt init*/
- HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);
- HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
- }
复制代码 以上是CubeMx生成代码,我以GPIOB_14作为外部中断引脚进行Stop模式的唤醒,程序能顺利进入Stop模式及成功唤醒。但是Stop模式下的电流高达22uA,与预期不大相符。看了网上许多帖子及自己的实践,发现问题出在好多人都讲到的IO端口设置上面,改动如下- static void MX_GPIO_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- /* GPIO Ports Clock Enable */
- __HAL_RCC_GPIOA_CLK_ENABLE();
- __HAL_RCC_GPIOB_CLK_ENABLE();
- __HAL_RCC_GPIOC_CLK_ENABLE();
- __HAL_RCC_GPIOH_CLK_ENABLE();
- GPIOA->MODER = 0xFFFFFFFF;
- GPIOC->MODER = 0xFFFFFFFF;
- GPIOH->MODER = 0xFFFFFFFF;
-
- /*Configure GPIO pin : PB14 */
- GPIO_InitStruct.Pin = GPIO_PIN_14;
- GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
-
- __HAL_RCC_GPIOA_CLK_DISABLE();
- __HAL_RCC_GPIOC_CLK_DISABLE();
- __HAL_RCC_GPIOH_CLK_DISABLE();
-
- /* EXTI interrupt init*/
- HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);
- HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
- }
复制代码 改动完成之后,电流顺利的下降到了,Stop模式下2.2uA,虽然离手册上的1uA还有距离,但是已接近预期的功耗了。下面附图:测试Stop模式电流时,为去除不必要的因素,我只焊接了Mcu进行调试的。
|
谢谢分享。。。
我是在初始化的时候,把不用的io时钟都关闭了,io管脚设置成AIN。唤醒后,没有重新配置时钟,发现也能正常走程序,所以也没有重新配置
IO配置代码,上面有。下面是中断代码
我就设置了一个PB14的io上升沿中断,进入stop前 除了这个GPIOB 的 时钟没关闭外,其他外设都关闭,正常进入Stop模式后,给PB14一个高电平,Mcu就唤醒了