论坛元老
 
- 积分
- 3354
- 金钱
- 3354
- 注册时间
- 2013-4-10
- 在线时间
- 333 小时
|
发表于 2016-3-26 18:44:30
|
显示全部楼层
本帖最后由 likunxue 于 2016-3-26 21:28 编辑
如果对时间上有限制, 比如,主CPU除了处理串口外,还需要处理其它的事情, 但串口发送的数据又多, 因为CPU直接写串口,需要主CPU等在哪里一个字节一个字节的发送出去, 由于串口传输的速度限制, 当数据很多时, CPU要等在哪里很长时间做不了别的事情, 这时, 用DMA,就帮上大忙了, 将需要发数的数据写入发送缓存区,使能DMA传输,余下的发送工作就是DMA的事了, CPU就可以做别的事情,如果需要发送完成处理一些情情,只需要使能DMA传输完成中断然后在DMA传输完成发生中断后,再回来处理一下就行了.
当然, 如果你一次只发一两个字节,我到是觉得直接用CPU发送要快得多因为, 如果只发送一个字节以内, 只需果判断 串口发送寄存器是不是空的, 如果需要等一下, 不是空的,把数据写入发送寄存器就结束, 这种情况还需要用 DMA 就有点多余了.因为不管串口多慢, 当前重新调用串口发送函数,前面串口的发送工作基本已搞完,一般很少从前一次发送再到你第二次发送数据之前,串口还没有发送前面数据的情况所以
while((USART2->SR & 0x80)==0); //等待发送区空
USART2->DR = K; //发送数据
前面哪句基本是不会等在哪里!!!!!!!!!!!!!
另外,用DMA传输完成中断,在中断里需要注意一下, 串口是否真的传完, 因为,一般情况,DMA将最后一个字节写入串口发送寄存器后,就会发生中断,这时真正的最后一个字节还在串口的移位寄存器中没有全部移完,
如果你使用485总线来发送与接收数据, 我之前的做法是在DMA发送完成中断里拉低发送控制口, 如果不查询串口是否发送结束,往往会使最后一个字节发送出不去.
所以 在DMA中断里需加如下语句.
BIT_ADM(DMA1->IFCR,25) = 1; //清除中断完成标志
while((USART2->SR & 0x40)==0); //等待发送结束
SR485_FASONGSHINENG = 0; //禁止发送,使能接收
|
|