STM32 HAL DMA 中断碰到的问题

流程

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

配置

dma中断全部去掉

串口中断开启

freertos中断全部去掉

时钟配置

代码

开启中断

c 复制代码
// 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);
}
c 复制代码
// 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;//标志中断
			
        }
		
    
}

处理中断

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

中断错误

c 复制代码
// 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();
	}
}

问题

间歇性出现 中断报错

相关推荐
余生皆假期-4 分钟前
永磁同步电机下桥三电阻采样方式的电机电流重构方法
单片机·嵌入式硬件·嵌入式
蓬荜生灰1 小时前
STM32(12)-- GPIO输入,按键检测
stm32·单片机·嵌入式硬件
DLGXY1 小时前
STM32——ADC、多通道转换(十三)
stm32·单片机·嵌入式硬件
日更嵌入式的打工仔1 小时前
嵌入式MPU、MCU与SoC的本质区别
单片机·嵌入式硬件
__万波__2 小时前
STM32L475看门狗
stm32·单片机·嵌入式硬件
wanglong37132 小时前
51单片机STC8G1K08输出PWM
单片机·嵌入式硬件·51单片机
传感器与混合集成电路13 小时前
210℃与175℃高温存储器选型研究:LHM256MB与LDMF4GA-H架构与可靠性对比(上)
嵌入式硬件·能源
时光找茬13 小时前
【瑞萨AI挑战赛-FPB-RA6E2】+ 从零开始:FPB-RA6E2 开箱测评与 e2 studio 环境配置
c++·单片机·边缘计算
17(无规则自律)14 小时前
【CSAPP 读书笔记】第二章:信息的表示和处理
linux·嵌入式硬件·考研·高考
@good_good_study14 小时前
FreeRTOS内存管理
单片机