网上看到不少人问串口使用DMA方式接收,DMA传输结束产生中断,然后从接收buffer里取数,如果串口接收的数量没有达到DMA设定的数量,那就不产生中断,buffer里的数就取不出来,然后就考虑加入一些超时中断之类的。我觉得要从接收buffer里取数,不一定要用DMA中断啊,DMA_CNDTR记录着DMA剩余的传输数量,如果DMA设定为循环模式,DMA传输数量设定为buffersize的大小,那么(buffersize - DMA_CNDTR)就可以作为buffer的头指针,自己再设定一个尾指针,把接收buffer构建成一个循环队列,采用查询方式,头尾指针不相等就取数,这样接收buffer里不管有多少数据都能取出来。因为循环模式下DMA_CNDTR会自动重装载,(buffersize - DMA_CNDTR)这个头指针就会自动完成循环,自己只要设定尾指针循环就行了。我最近在做SPI的DMA,采用了这种方法,串口应该也能用的。大家觉得这种方法怎么样,给点意见 |