前言
关于dma(direct memory access)的功能,前面关注我微信的人应该知道,其实我已经在f1芯片上简单讲了一下。有网友要求在f0讲解一下使用dma收发串口数据。今天就应网友要求总结一下在f0芯片上,使用dma方式传输(收发)usart数据的功能。
在多种芯片上(f0、f1、f2、f3、f4)了解过dma模块功能的朋友可能会发现一个特点,就是dma的功能有很多相似的地方,甚至是一样。其实,每一个模块在不同系列芯片(甚至不同厂商)基本上是大同小异,这就是所谓的触类旁通。对于软件开发也是一样的,当你学会某一项语言的开发,接触其他语言的开发就很容易了。这里我想说,其实我对st大部分芯片(全系列芯片stm8、stm32)都了解过,很多都是相似,只要有时间,后期还会总结一下stm8开发的的文章。当然,更多精彩内容也会出现(如:ucos操作系统等)。
dma的功能和用途这里就不在讲述了,今天重点以查询方式总结stm32f0xx使用dma收发usart数据配置详细过程 。另外提供一种以中断方式使用dma收发usart数据的软件工程,感兴趣的朋友请自行下载软件工程源代码进行研究。
下载
st标准外设库和参考手册、数据手册等都可以在st官网下载,你也可以到我的360云盘下载。关于f0系列芯片的参考手册有多个版本(针对f0不同芯片),但有一个通用版本,就是“stm32f0x128参考手册v8(英文)2015-07”建议参考该手册,以后如果你换用一种型号芯片也方便了解。
今天的软件工程下载地址(360云盘):
查询方式:
https://yunpan.cn/csbcta9ijncy2访问密码 152a
中断方式:
https://yunpan.cn/csbc7t4cxqwah访问密码 7e7f
stm32f0xx的资料可以在我360云盘下载:
https://yunpan.cn/cs2pvuhn6x2bj访问密码 8c37
准备工作
在昨天的软件工程基础上,新建源程序文件(dma.c 和 dma.h),在工程中添加新建的源程序文件dma.c和使用到标准外设库stm32f0xx_dma.c。如何在工程中添加源文件请看以前的文章“stm32f0_新建软件工程详细过程”,添加完成如下图:
注意:
文件所在位置最好对应目录,方便管理。比如:dma.c放在bsp文件下,添加在工程中bsp组下面。
数据传输原理
dma是介于内存(如:一个数组)和外设(如:usart、adc等)之间进行数据交换的一个模块控制器。从dma的系统框图(下图)中也能大概看得出整个模块数据传输的原理。关于dma模块在f0芯片中有几点需要注意,请看最后重点。
配置过程详情
①rcc时钟
该函数位于bsp.c文件下面;
我个人习惯第一步配置时钟,st官方提供的例程也是把配置时钟放在前面。关于rcc时钟的配置比较重要,有好几次我就是由于没有配置相应rcc时钟,让我找了很久的问题,最后才发现是rcc时钟没有配置。
注意:
外设时钟不要随便添加,比如:rcc_apb1外设不要配置在rcc_apb2时钟里面【如:rcc_apb2periphclockcmd(rcc_ahbperiph_dma1, enable);这样能编译过,但是错误的】
我每次都提醒rcc时钟,是因为很多人就是因为时钟而导致软件运行有问题,所以,提醒更多人要注意配置rcc.
②dma传输(内存->外设)的配置
该函数位于dma.c文件下面;
重点注意:
1、传输方向:这里是内存(数组) -> 外设(串口);
2、通道:使用mda1通道2(串口发送)。
③dma传输(外设->内存)的配置
该函数位于dma.c文件下面;
和上面注意的地方一样,也是这两个函数接口之间的差异。
④dma传输串口的效果
该函数位于main.c文件下面;
这是实际运行的效果函数。
1、上电发送数据“dma_start...”;
2、等待接收10字节数据(dma方式接收10字节数据);
3、dma方式发送该10字节数据,等待发送完成。
4、依次循环下去。
今天的重点
a、通道的选择
由于f0芯片有些芯片只有dma1,没有dma2,有些dma1有5个通道,有些dma1有7个通道,这些需要根据手册针对型号进行配置,这里不能选择错误,否则不能使用dma功能。
b、传输的长度
由于最大只能传输数量为65536,在实际项目开发中,可能有更大的数据需要传输,这时就需要分开传输才行。
c、传输数据宽度
数据的宽度如果传输两者之间一样的话,其实没什么需要注意的。但是,如果数据宽度不同的话,这里就需要注意了,具体见手册,这里只是提出来是重点,感兴趣的朋友请自行研究啊。
说明
stm32f0的芯片软件兼容性很好,可以适用于f0其他很多型号的芯片(具体请看手册、或者亲自测试)。
今天的工程是基于工程“stm32f0xx_tim基本延时配置详细过程”修改而来,以上实例总结仅供参考,若有不对之处,敬请谅解。
关于采用20-380VDC电源模块的宽电压直流/直流变换解决方案介绍
陀螺(经纬仪)定向
led灯控制器线路图
基于XBee进行ZigBee组网——XBee介绍
电力防外破电子化智能警示牌,实力阻止触电风险
STM32F0xx_ DMA收发USART数据配置详细过程
华为麦芒8发布_2400万超广角三摄售价1899元
Arduino引脚监视器护罩的说明
AD转换设计中的基本问题整理
采用CPU通信功能同步AGV和车体传送带的控制,三大解决方案介绍
ADC0809 的逻辑结构及引脚定义
联想在智能制造领域有哪些优质实力
详解串行总线中的SATA协议
摩托罗拉推出了一款新的5G模块---将其插入到“Z3,“Z3”即为5G手机
广和通积极布局车载通信模块,推出领先的LTECat.1X等无线通信模组
FRAM在便携式医疗刺激系统的应用
同芯同意创未来——赛意力量& SNP ·南京半导体高科专场
AI加持推动云端数据中心的发展 ASIC芯片需求攀高峰
海信LED高端产业布局赢得市场胜势
太阳能路灯与景观灯有什么区别呢