当前位置: 首页 > article >正文

STM32 HAL DMA 中断碰到的问题

流程

串口收数据—>dma搬运到变量—>空闲中断----->接收完成

配置

dma中断全部去掉
在这里插入图片描述

串口中断开启
freertos中断全部去掉
在这里插入图片描述

时钟配置

在这里插入图片描述

代码

开启中断

// DMA 空闲检查
void receives_uaru_7(void)
{
	RXU7 = 0;//清除中断标志
	HAL_UARTEx_ReceiveToIdle_DMA(&huart7, Buff_U7, sizeof_U7);//储存接收数据
	//HAL_UARTEx_ReceiveToIdle_IT(&huart7, Buff_U7, sizeof_U7);
}


// dma中断回调
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
    if (huart->Instance == UART7)
    {
        if (Size <= sizeof_U7)
        {
			//停止dma中断
            HAL_UART_DMAStop(huart);
            //将数据传到cmd处理
			Buff_LEN_U7 = Size;//获取接收的数据长度
			RXU7 = 1;//标志中断
			
        }
		
    
}

处理中断

	for (;;)
	{
		if(RXU7 == 1){//检测到中断
			U7();
			receives_uaru_7();//启动中断 和清除标志
		}
		osDelay(1);
	}

中断错误

// dma 错误回调
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
	if (huart->Instance == UART7)
	{
        printf("串口7 dma 发生错误 可能是 缓冲区溢出 波特率错误\n");
		receives_uaru_7();
	}else if (huart->Instance == USART1){
		printf("串口1 dma 发生错误 可能是 缓冲区溢出 波特率错误\n");
		receives_uaru_1();
	}else if (huart->Instance == USART6){
		printf("串口6 dma 发生错误 可能是 缓冲区溢出 波特率错误\n");
		receives_uaru_6();
	}else if (huart->Instance == UART4){
		printf("串口4 dma 发生错误 可能是 缓冲区溢出 波特率错误\n");
		receives_uaru_4();
	}else if (huart->Instance == UART5){
		printf("串口5 dma 发生错误 可能是 缓冲区溢出 波特率错误\n");
		receives_uaru_5();
	}
}

问题

间歇性出现 中断报错
在这里插入图片描述


http://www.kler.cn/a/297880.html

相关文章:

  • OpenGL Texture C++ 预览Camera视频
  • HTML生日蛋糕
  • 数据分析-17-时间序列分析的平稳性检验
  • .NET 一款免安装运行Python的渗透工具
  • UE驻网失败问题(三)
  • 设计模式 20 状态模式
  • pytest压力测试:不断发送数据,直到发现数据丢失
  • Linux脚本实现自动化运维:系统自动备份、资源监控
  • C++_17_友元
  • Docker 部署 Seata (图文并茂超详细)
  • (postman)接口测试进阶实战
  • 理想汽车嵌入式面试及参考答案
  • 服务器断电,Centos7启动报错
  • 认识 Python
  • 线性因子模型 - 慢特征分析(SFA)篇
  • 客户端绑定本地端口与服务器建立连接的详细实现
  • 程序员日志之DNF编年史
  • vscode侧边工具栏不见了找回方法
  • 云计算之云原生(上)
  • 深度学习基础案例4--运用动态学习率构建CNN卷积神经网络实现的运动鞋识别(测试集的准确率84%)