遇到这样的现象: 遇到个现象: USART+DMA+IDLE中断
如果DMA的数据长度为5,你发了6个数据(01, 02, 03, 04, 05, 06), 此时会进入IDLE中断中。
那么5个数据会保存到DMA设置的内存中就是(01, 02,03,04, 05)
再继续发送3个数据(07, 08, 09),此时调试查看DMA设置的内存数据为(06, 07, 08, 09, 05)
DMA中断里什么都没做。
问题是: 第一次超出的一个字节数据被保存在什么地方?
正确答案是:在USART_DR寄存器里
保存在内存里,
第一次发送 6个数据,大于 dma 长度,发一次发 5 个 再发 1 个,发两次,发完 6 个算发送完成。发完 5 个数据,uart 中不认为这次发送完了,还会继续把剩下的 1 个发送出去。然后 uart 才认为发送完。
发送时候,是把 6 个数据的指针当作参数传递给 uart , 中间没有数据拷贝,所以你的原始数据在哪里,现在还是哪里,一般是内存。发送完成之前把数据改了,发送时候就发送修改过的数据。
这些是可以测试的。
这种要看你的DMA运行在何种模式之下,普通模式下最后一个会直接丢掉,循环模式下,最后一个会被保存在下一次最开始的哪个地方
靠dmaInitStruct.DMA_Mode = XXX 实现配置