流程
串口收数据—>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();
}
}
问题
间歇性出现 中断报错