本帖最后由 电子烂人 于 2024-4-28 20:37 编辑
1.引言
LPUART(Low power universal asynchronous receiver transmitter),即低功耗通用异步收发器,是STM32超低功耗单片机中的一个串行通信接口。LPUART能够在有限的功耗下实现双向UART通信,并支持多种功能和特性。作为STM32超低功耗单片机的利器,能够在低功耗模式下运行,同时保留了大多数传统UART的功能。
值得注意的是,LPUART支持硬件FIFO和DMA。
废话不多说,实战见分晓。
2.环境配置
环境为STM32cuebIDE,版本1.15.0;
在IOC中使能LPUART1,配置为异步模式,不使能RS232和RS485。波特率就用最基本的115200,数据位8BIT(1头+7数据)
相比UART,LPUART还有一个特殊的地方在于它的时钟,是单独配置的
LP的时钟树在时钟部分的右下角,不容易察觉到,这一个小细节也是在看LP相关资料时候偶尔看到的。
LP时钟树
可以由SYSCLK\PCLK\LSE等时钟配置LPUART和lptime,这一点还是蛮不错的,不过UI所在的位置比较偏,可能大多数时候都不容易看到吧。
配置完成后,生成代码
3.修改代码部分
配置好代码后先检查LPUART部分代码的配置:
static void MX_LPUART1_UART_Init(void)
{
hlpuart1.Instance = LPUART1;
hlpuart1.Init.BaudRate = 115200;
hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
hlpuart1.Init.StopBits = UART_STOPBITS_1;
hlpuart1.Init.Parity = UART_PARITY_NONE;
hlpuart1.Init.Mode = UART_MODE_TX_RX;
hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
hlpuart1.FifoMode = UART_FIFOMODE_DISABLE;
if (HAL_UART_Init(&hlpuart1) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_DisableFifoMode(&hlpuart1) != HAL_OK)
{
Error_Handler();
}
}
编辑一段要发送的文字:
/* USER CODE BEGIN PV */
uint8_t RxBuffer[5];
/* USER CODE END PV */
在主函数中使能LPUART(若配置好代码会有)。
LPUART 的HAL 语法与uart相同,可以直接套用UART的代码。
int main(void)
{
SystemClock_Config();
MX_GPIO_Init();
MX_LPUART1_UART_Init();
while (1)
{
if(HAL_UART_receive(&hlpuart1, (uint8_t*)RxBuffer,5,100 )
HAL_UART_Transmit(&hlpuart1, (uint8_t*)RxBuffer,5,100 );
}
}//为保证简介
删去了官方的注释区域
4.观察现象
WeChat_20240428203755
补充内容 (2024-5-2 13:25):
主函数循环那里改动了一下,源代码有误:
while (1)
{
if(HAL_UART_Receive(&hlpuart1,(uint8_t*)RxBuffer,5,100 )==HAL_OK)
HAL_UART_Transmit(&hlpuart1, (uint8_t*)RxBuffer,5,100 );
}