完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
如果对时间上有限制, 比如,主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; //禁止发送,使能接收 |
|
|
|
赞一个,如果我用485通讯,不想用DMA中断判断DMA是否发送完成,而在main函数查询DMA的, DMA_GetFlagStatus发送中断标志位可以吗?
|
|
|
|
只有小组成员才能发言,加入小组>>
9577 浏览 0 评论
8943 浏览 0 评论
13330 浏览 0 评论
4392 浏览 0 评论
4643 浏览 0 评论
355浏览 1评论
490浏览 1评论
IPC-6012E CN 2020中文 CN 刚性印制板的鉴定及性能规范
586浏览 1评论
386浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 00:58 , Processed in 1.429545 second(s), Total 80, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号