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);/* 使能唤醒中断 */