STM32H7的LPUART基础与唤醒功能示例详解

STM32H7的LPUART基础知识

  • 硬件框图
  • 低功耗的高级特性
  • 低功耗串口的时钟以及波特率
  • 低功耗串口发送时序
  • 低功耗串口支持的唤醒方式
  • LPUART 的全称是
    Low power universal synchronous asynchronous receiver transmitter,中文意思是低功耗通用异步收发器,简称
    LPUART

    硬件框图


    IRQ Interface 中断接口
    用于实现中断方式的串口唤醒 lpusart_wkup 和串口的相关中断 lpusart_it。
    DMA Interface DMA 接口
    实现串口发送 lpuart_tx_dma 和接收 lpuart_rx_dma 的 DMA 方式。
    COM Contronller 串口控制器
    串口相关的寄存器基本都在这部分。
    TxFIFO 和 RxFIFO
    串口的发送和接收都支持了硬件 FIFO 功能。
    TX 和 RX 引脚的互换功能
    发送偏移寄存器(TX Shift Reg)和接收偏移寄存器(RX Shift Reg)与 TX 引脚,RX 引脚之间弄了个交叉连接,这里的意思是支持了引脚互换功能,这样大家在设计 PCB 的时候就可以比较随性了,接反了也没有关系。
    发送过程经过的寄存器
    依次是 LPUART_TDR -> TxFIFO ->Tx Shift Reg 偏移寄存器 –> TX 或者 RX 引脚。
    接收经过的寄存器
    依次是 TX 或者 RX 引脚-> Rx Shift Reg 偏移寄存器->RxFIFO –>LPUART_RDR。
    两个时钟 lpuart_pclk 和 lpuart_ker_ck
    这两个时钟是独立的,作用如下:
    lpuart_pclk
    用于为外设总线提供时钟。
    lpuart_ker_ck
    串口外设的时钟源。

    低功耗的高级特性

    数据逻辑电平翻转。
    低功耗特性。
    RX 和 TX 引脚交换。
    MSB 位先发送。
    外接 485 的 PHY 芯片时,硬件支持收发切换,无需用户手动控制 DE 引脚。

    低功耗串口的时钟以及波特率


    这里我们重点关注 PCLK3(D3PCLK1),HSI 和 LSE。
    LPUART 时钟选择 LSE(32768Hz)
    最高速度是 10922bps,最低 8bps(计算方法 3x < 32768 < 4096x,x 表示波特率)。
    LPUART 时钟选择 HSI(64MHz)
    最高值是 21MHz,最小值 15625bps(计算方法 3x < 64MHz < 4096x,x 表示波特率)。
    LPUART 时钟选择 D3PCLK1(100MHz)
    最大值 33Mbps,最小值 24414bps(计算方法 3x < 100MHz < 4096x,x 表示波特率)。

    低功耗串口发送时序

    低功耗串口支持的唤醒方式

    检测到起始位唤醒。

    /* 使能 LPUART 的停机唤醒 */
    HAL_UARTEx_EnableStopMode(&UartHandle); 
    /* 确保 LPUART 没有在通信中 */
    while(__HAL_UART_GET_FLAG(&UartHandle, USART_ISR_BUSY) == SET){}
    while(__HAL_UART_GET_FLAG(&UartHandle, USART_ISR_REACK) == RESET){}
    /* 接收起始位唤醒 */
    WakeUpSelection.WakeUpEvent = UART_WAKEUP_ON_STARTBIT;
    
    if (HAL_UARTEx_StopModeWakeUpSourceConfig(&UartHandle, WakeUpSelection)!= HAL_OK)
    {
     Error_Handler(__FILE__, __LINE__);
    }
    /* 进入停机模式 */
    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
    /* 退出停机模式要重新配置 HSE 和 PLL*/
    SystemClock_Config();
    /* 关闭 LPUART 的停机唤醒 */
    HAL_UARTEx_DisableStopMode(&UartHandle);
    

    检测到 RXNE 标志唤醒,即接收到数据。

    /* 使能 LPUART 的停机唤醒 */
    HAL_UARTEx_EnableStopMode(&UartHandle); 
    /* 确保 LPUART 没有在通信中 */
    while(__HAL_UART_GET_FLAG(&UartHandle, USART_ISR_BUSY) == SET){}
    while(__HAL_UART_GET_FLAG(&UartHandle, USART_ISR_REACK) == RESET){}
    /* 接收到数据唤醒,即 RXNE 标志置位 */
    WakeUpSelection.WakeUpEvent = UART_WAKEUP_ON_READDATA_NONEMPTY;
    if (HAL_UARTEx_StopModeWakeUpSourceConfig(&UartHandle, WakeUpSelection)!= HAL_OK)
    {
     Error_Handler(__FILE__, __LINE__);
    }
    /* 进入停机模式 */
    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
    /* 退出停机模式要重新配置 HSE 和 PLL*/
    SystemClock_Config();
    /* 关闭 LPUART 的停机唤醒 */
    HAL_UARTEx_DisableStopMode(&UartHandle);
    

    检测到匹配地址时唤醒。
    匹配地址支持 7bit 和 4bit 匹配两种方式,比如我们采用 7bit 匹配,设置地址是 0x19,那么用户唤
    醒的时候要将最高 bit 设置为 1,即发送地址 0x99(0b1001 1001)才可以唤醒。

    /* 使能 LPUART 的停机唤醒 */
    HAL_UARTEx_EnableStopMode(&UartHandle); 
    /* 确保 LPUART 没有在通信中 */
    while(__HAL_UART_GET_FLAG(&UartHandle, USART_ISR_BUSY) == SET){}
    while(__HAL_UART_GET_FLAG(&UartHandle, USART_ISR_REACK) == RESET){}
    /* 接收地址 0x99(发送的数据 MSB 位要为 1),可以唤醒 */
    WakeUpSelection.WakeUpEvent = UART_WAKEUP_ON_ADDRESS;
    WakeUpSelection.AddressLength = UART_ADDRESS_DETECT_7B;
    WakeUpSelection.Address = 0x19;
    if (HAL_UARTEx_StopModeWakeUpSourceConfig(&UartHandle, WakeUpSelection)!= HAL_OK)
    {
     Error_Handler(__FILE__, __LINE__);
    }
    CLEAR_BIT(LPUART1->CR1, USART_CR1_RXNEIE); /* 关闭串口接收中断 */
    /* 进入停机模式 */
    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
    /* 退出停机模式要重新配置 HSE 和 PLL*/
    SystemClock_Config();
    SET_BIT(LPUART1->CR1, USART_CR1_RXNEIE); /* 使能串口接收中断 */
    /* 关闭 LPUART 的停机唤醒 */
    HAL_UARTEx_DisableStopMode(&UartHandle);
    

    程序启动之后,调用下面两个函数:

    __HAL_RCC_LPUART1_CLKAM_ENABLE(); /* 激活 LPUART 的自主模式,即停机状态下可以继续接收消息 */
    __HAL_UART_ENABLE_IT(&UartHandle, UART_IT_WUF);/* 使能唤醒中断 */
    

    作者:爱煲汤的夏二

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32H7的LPUART基础与唤醒功能示例详解

    发表回复