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();
	}
}

问题

间歇性出现 中断报错

相关推荐
cmpxr_3 小时前
【单片机】STM32的启动流程(Keil)
stm32·单片机·嵌入式硬件
广药门徒3 小时前
嵌入式常用通信协议速率对比及布线要点全解析
单片机·嵌入式硬件
cmpxr_5 小时前
【单片机】RAM和ROM
单片机·嵌入式硬件
信息安全专家6 小时前
sigmastar SSD222D编译问题总结2-dash问题
linux·嵌入式硬件·dash
yong99907 小时前
可自动调整的24V步进电机设计方案
单片机·嵌入式硬件
R6bandito_8 小时前
自实现FLASH读取函数中的隐式类型转换bug踩坑记录
c语言·开发语言·经验分享·stm32·单片机·mcu·bug
Bin Watson8 小时前
STM32 HRTIM 学习心得(3):SVPWM 输出
stm32·单片机·嵌入式硬件
perseverance529 小时前
MCU串口实现串行flash编程器功能
单片机·flash编程
421!9 小时前
C 语言学习笔记——11(函数指针与指针函数)
c语言·开发语言·笔记·单片机·学习
Redemption9 小时前
嵌软面试每日一阅----freeRTOS(三)
stm32·单片机·嵌入式硬件·mcu·物联网·面试·51单片机