7.18
2025 7 18 巨大延时
问题
在昨天晚上进行舵机云台描边的实验时,发现串口接收总是有问题,和视觉的通信经常出现bug,但是偶尔又可以正常运行,非常奇怪。
起初以为是发送太快导致接收丢包,于是把空闲中断换掉了(空闲中断的入口检测函数实在MainLoop内的)。现在看来,是因为MainLoop内的延迟巨大导致的。经过测试,这种延时主要是由于OLED带来的。(因为C8T6的驱动无延时,在H7的高主频下用不了,所以人为的给I2C添加了延时)。但是可能是由于延时太大了,导致在函数内使用很多OLED时,延时会大幅的升高。因此空闲中断几乎无法进入。
还有一个非常奇怪的问题。就是在我现在如此高延迟下,按键处理函数Key_Handle()内配置按按键,串口发送(中断发送)时,又会明显的引入一个延时。注意,我仅仅是在代码里添加了这部分,我并没有按按键来调用这个函数来发送!

但是,当我把这些中断发送改成阻塞发送后,这个延时(由IT发送引起的)就消失了。虽然IT发送引起的这些延时很小,但是我根本没有调用IT啊!非常奇怪。
启发
不在循环中无限更新OLED,可以定义一个OLED更新函数;发送时使用阻塞发送。
dma+空闲中断串口接收,空闲中断不起作用
看了keysking的视频学习了串口dma配合空闲中断进行数据接收,然后试用了一下,发现空闲中断完全没有用,那个中断回调函数完全就是只在接收缓存区满时调用。后来看评论区,说要开启usart的global中断,然后就解决了。但是想不通为什么。这个不应该是完全由DMA控制的中断吗?
不用关闭dma半传输中断
还有一个,可以不用extern DMA的句柄,那就是在中断回调函数里面添加判断if(huart->Instance == USART3 && huart->RxEventType != HAL_UART_RXEVENT_HT)即可
7.18
https://mingzaitown.github.io/2026/04/09/电赛/电赛报错日志/7.18/