完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32串口通信接收与发送(DMA方式)
刚接触到DMA的时候,一头雾水,只知道方便、快捷,但不知道该怎么使用,后来弄明白原理之后就轻松了很多,但理解的还不是很透,所以希望把自己的理解写出来,和大家分享一下! 形象的说,DMA就像一个快递中转站,负责把数据从始发地搬到目的地,只要他负责的仓库有货,他就开始搬运,没货就等着,除非你把它关了。就像机器人搬东西一样,首先要告诉它从哪搬,搬到哪?东西有多大?需要搬几趟?需要搬运的东西是不是都在一起?搬完后是不是扔在那就行了,还是要放好? 到芯片里,数据就是货物,把数据从一个地方移到另一个地方。你只要告诉它怎么移到就行了,就像控制一个机器人一样。并不是多有的外设都能有机会使用DMA通道,而且,一条通道上被外设使用后,通道上的其他外设就不能使用了。那么,哪些外设可以使用DMA呢? 比方说:现在我需要使用串口发送,那么只能选择通道4,如果接收就使用通道5。 (这里只拿DMA1举例,DMA2原理相同) 在知道大概的原理之后,我们来看一下DMA的一些寄存器。 1):中断状态寄存器 2):中断标志清除寄存器 3):通道配置寄存器 注:当通道配置为非循环模式时,传输结束后(即传输计数变为0)将不再产生DMA操作。要开始新的 DMA传输,需要在关闭DMA通道的情况下,在DMACNDTRx寄存器中重新写入传输数目 4):接下来的几个寄存器配置传输数据的次数、数据源地址,数据存放地址。 /**********中断函数**************/ /*这里只提供通道4发送完成中断 */ void DMA1_Channel4_IRQHandler(void){ if(DMA_GetITStatus(DMA1_FLAG_TC4)==SET) { DMA_ClearFlag(DMA1_FLAG_TC4); DMA_Cmd(DMA1_Channel4, DISABLE); //在非循环模式下,若 想再次填写传输次数,必须先关闭通道 DMA1_Channel->CNDTR = 10; DMA_Cmd(DMA1_Channel4, ENABLE); } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1804 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1629 浏览 1 评论
1097 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
736 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1686 浏览 2 评论
1944浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
748浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
582浏览 3评论
604浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
565浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 19:57 , Processed in 0.866709 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号