STM32 CubeMX 实现 DMA 串口空闲中断

STM32 CubeMX 实现 DMA 串口空闲中断

一 前言

二 参考资料

三 实现过程

cubeMX 配置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在 usart.h 中添加

#define U1_RXBUF_SIZE 1024
typedef struct{
	u8 buffer[U1_RXBUF_SIZE];
	u16 receivedLen;	//@ 接收完成的数据长度
	u8 recevicedFlag;	//@ 接收完成标志位
}UsartReceiver_Stru;

在 usart.c 中定义 UsartReceiver_Stru

UsartReceiver_Stru u1Receiver;

在 xxx_it.c 中修改 USART1_IRQHandler()

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
	u32 tmp_flag = 0;
	u32 temp;
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
	tmp_flag = __HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE);
	if ((tmp_flag != RESET))
	{
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);

		/* 读取串口状态寄存器(芯片型号不同,寄存器名称可能需要修改) */
		temp = huart1.Instance->SR;
		/* 读取串口数据寄存器(芯片型号不同,寄存器名称可能需要修改) */
		temp = huart1.Instance->DR;
		HAL_UART_DMAStop(&huart1);
		/* 读取DMA剩余传输数量(芯片型号不同,寄存器名称可能需要修改) */
		temp = hdma_usart1_rx.Instance->CNDTR;
		u1Receiver.receivedLen = U1_RXBUF_SIZE - temp;
		u1Receiver.recevicedFlag = 1;
	}
  /* USER CODE END USART1_IRQn 1 */
}

在 main.c 初始化部分添加

	//@ 开启空闲中断
	__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
	//@ 开启串口 DMA 接收
	HAL_UART_Receive_DMA(&huart1, u1Receiver.buffer,U1_RXBUF_SIZE);

在 main.c 中添加

while (1)
{
	if(u1Receiver.recevicedFlag)
	{
		printf("%s\r\n",u1Receiver.buffer);
		memset(u1Receiver.buffer,0,sizeof(u1Receiver.buffer));
		CH_Delay(1000);
		
		u1Receiver.recevicedFlag = 0;
		HAL_UART_Receive_DMA(&huart1, u1Receiver.buffer,U1_RXBUF_SIZE);
	}
}

四 相关资料

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值