使用STM32L4系列的LPUART串口的空闲中断完成整帧数据的传输
初衷
因为学习的需要,需要使用LPUART串口实现数据的整帧传输,所以在网上找了很多的教程,都没有解决我的问题,大家使用的基本上都是DMA传输加空闲中断的方式实现整帧的传输,我跟着很多帖子做了实验,但是均未成功,后来直接使用串口的空闲中断不使用DMA也完成了数据的整帧传输,记录下来,用以复习。
代码思路

STM32CubeMX中的设置
串口使用了UART1和LPUART1,时钟使用了高速外部时钟和低速外部时钟

串口设置
串口1设置

LPUART1设置(此串口与我的NB模块相连接,实现AT指令的发送和模块回传数据的接收)

使能两个串口的中断


时钟频率的设置(重点是LPUART的时钟频率是32.768KHZ)

之后生成MDK5工程
MDK5中的代码
stm32l4xx_it.c
声明变量
#ifndef MAX_RCV_LEN
#define MAX_RCV_LEN 1024
#endif
extern uint8_t LPUART1RECV[MAX_RCV_LEN];
extern void USART_IDLECallBack(void);
extern void LPUART_IDLECallBack(void);
在下面的代码中判断是否发生了空闲中断
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET)//判断此中断是否为空闲中断
{
USART_IDLECallBack();//进入空闲中断处理函数,此函数我定义在main.c中
}
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
void LPUART1_IRQHandler(void)
{
/* USER CODE BEGIN LPUART1_IRQn 0 */
if(__HAL_UART_GET_FLAG(&hlpuart1,UART_FLAG_IDLE)!=RESET)//判断此中断是否为空闲中断
{
LPUART_IDLECallBack();//进入空闲中断处理函数,此函数我定义在main.c中
}
/* USER CODE END LPUART1_IRQn 0 */
HAL_U

最低0.47元/天 解锁文章
881

被折叠的 条评论
为什么被折叠?



