硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2430|回复: 9
收起左侧

[UART] STM32H7低功耗串口的数据接收唤醒,起始位唤醒和地址匹配唤醒都已经实现,注意事项较多

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2020-2-12 01:08:36 | 显示全部楼层 |阅读模式

注意事项:

1、HAL库自己的中断复位程序处理容易出现用户发送一次数据,STM32H7无法唤醒,需要再发一次数据才能正常唤醒。

根本原因:


QQ截图20200212010702.png



2、地址匹配方式唤醒,一定要关闭接收中断,不关闭,无法正常使用,非常非常重要:


1.png
回复

使用道具 举报

3

主题

1227

回帖

1236

积分

至尊会员

积分
1236
发表于 2020-2-12 08:28:53 | 显示全部楼层
回复

使用道具 举报

2

主题

38

回帖

44

积分

新手上路

积分
44
发表于 2020-2-13 15:00:35 | 显示全部楼层
eric2013,你好!

按照你的代码调试了一下,发现
while(__HAL_UART_GET_FLAG(&hlpuart1,USART_ISR_REACK)==SET){}这里跳不出来.
如果去掉这一段是可以进到STOP模式,但进入到stop模式后0X19是无法唤醒的,
请教是什么原因呢?
谢谢!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
 楼主| 发表于 2020-2-13 15:16:22 | 显示全部楼层
willsonxie 发表于 2020-2-13 15:00
eric2013,你好!

按照你的代码调试了一下,发现

我用的是最新的1.7.0版HAL库,你试试看。
回复

使用道具 举报

2

主题

38

回帖

44

积分

新手上路

积分
44
发表于 2020-2-13 15:22:34 | 显示全部楼层
版本没有关系,
回复

使用道具 举报

2

主题

38

回帖

44

积分

新手上路

积分
44
发表于 2020-2-13 15:23:57 | 显示全部楼层
void StartDefaultTask(void *argument)
{
  /* USER CODE BEGIN 5 */
  /* Infinite loop */
  for(;;)
  {
    osDelay(5000);
        LUART1_SendString("hlpuart1 go to stop mode!\r\n");  
       
        //使能LPUART的停机唤醒
        HAL_UARTEx_EnableStopMode(&hlpuart1);
        while(__HAL_UART_GET_FLAG(&hlpuart1,USART_ISR_BUSY)==SET){}
    //while(__HAL_UART_GET_FLAG(&hlpuart1,USART_ISR_REACK)==SET){}

                //接收地址0x99(发送数据MSB位要为1),可以唤醒
    WakeUpSelection.WakeUpEvent = UART_WAKEUP_ON_READDATA_NONEMPTY;
    WakeUpSelection.AddressLength = UART_ADDRESS_DETECT_7B;
        //WakeUpSelection.Address = 0x99;
    if(HAL_UARTEx_StopModeWakeUpSourceConfig(&hlpuart1,        WakeUpSelection)!=        HAL_OK)
        {
           ;
        }
        CLEAR_BIT(LPUART1->CR1,USART_CR1_RXNEIE);//关闭串口接收中断
        HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI);//进入停机模式
               
        SystemClock_Config();//退出停机模式要重新配置HSE和pll

        SET_BIT(LPUART1->CR1,USART_CR1_RXNEIE);//使能串口中断
        HAL_UARTEx_DisableStopMode(&hlpuart1);
       
  }
  /* USER CODE END 5 */
}
回复

使用道具 举报

2

主题

38

回帖

44

积分

新手上路

积分
44
发表于 2020-2-13 15:24:37 | 显示全部楼层
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_CSI|RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  //RCC_OscInitStruct.CSICalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 6;
  RCC_OscInitStruct.PLL.PLLN = 200;
  RCC_OscInitStruct.PLL.PLLP = 2;
  RCC_OscInitStruct.PLL.PLLQ = 2;
  RCC_OscInitStruct.PLL.PLLR = 2;
  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
  RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
  RCC_OscInitStruct.PLL.PLLFRACN = 0;
  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_CLOCKTYPE_PCLK2
                              |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
  RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPUART1;
  PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_HSI;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
回复

使用道具 举报

2

主题

38

回帖

44

积分

新手上路

积分
44
发表于 2020-2-13 15:25:44 | 显示全部楼层
我写的代码是这样的,改了时钟部分,HSE和hsi都用,lpuart用的HSI
回复

使用道具 举报

2

主题

38

回帖

44

积分

新手上路

积分
44
发表于 2020-2-13 15:29:59 | 显示全部楼层
我改成了WakeUpSelection.WakeUpEvent = UART_WAKEUP_ON_READDATA_NONEMPTY;
也无法唤醒,郁闷!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
 楼主| 发表于 2020-2-13 15:30:11 | 显示全部楼层

先换了再说,防止不必要的麻烦。

这个唤醒0x19,你要发送0x99去唤醒,别的没有要注意的了。

我这里使用我们V7板子,运行完美。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-13 07:13 , Processed in 0.253514 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表