你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103的GPIO与DMA的终极(没啥用)玩法

[复制链接]
STMCU小助手 发布时间:2021-8-16 14:05
最近在玩STM32的DMA,各种玩法都想试试。突发奇想,DMA能否连接GPIO与内存?也就是说通过DMA直接把一个数组的值快速发送到GPIO,或者通过DMA读取GPIO的状态,更新到一个数组里。查了下资料,发现部分型号是支持的,例如STM32F303、STM32F407等,但是其它型号资料很少。
  r0 Q. t5 ]( p* X$ O
所以我通过STM32CUBEMX生成代码,做了下测试,型号是STM32F103C8T6。模式是MEMTOMEM,为啥是这个模式?因为我受到了一篇帖子的引到:
1.png
$ Q8 T6 R. Y( }6 X5 V; u/ E9 k. ]
配置如下:
2.png
4 J/ c2 ]; _9 p+ V# g$ N; u5 f" h
方框1表示传输方向,MEMTOMEM,不解释。
/ v* W2 h( ]3 P8 C
方框2表示模式,单次,还是循环。但是,在MEMTOMEM方向的时候,只能选择单次(不信你试试~)。你可以在程序里改,但是这里不行。

0 B& D9 K" [) b
方框3(注意这里),目的地和源,哪一方的地址是增加的,用过的都懂。
9 h' ^5 ^, |: p
结果嘛,自然是失败了。但也不是没收获,我发现了STM32CUBEMX的一个“小bug”。方框3那里,我设置的源地址增加,目的地址不增加;但生成的代码那里,两者的配置完全反了过来。我用的是6.1版本,够新了吧,如图:
3.png

2 I8 f0 p2 z+ S, L( z
那么,手动改过来,会不会就好了?
没效果!

: }" h4 l" g. w  t: J5 P
再检查,发现我的GPIO端口的地址写错了。改完,依然没效果(注意这个顺序)!从此我开始了漫长的排查过程~~~
一顿搜索,发现官方早期提供过一个文档-AN2548,里面提供了SPI-DMA、GPIO-DMA的例程,只不过代码是用标准外设库写的。呵呵,本以为我在HAL库的道路上已经一去不复返,没想到被DMA给拽了回来,老夫认了!
4.png

5 a& w4 n* r4 k. ?3 g
这个例程是通过定时器,周期触发DMA,读取GPIO的状态到内部数组里,方向是MEMTOPER。移植到STM32F103C8T6上,没有问题,可以用。
3 S. X! T6 e+ K; J4 Z  h2 Q
按照这个例程,定时器周期触发的方式,重新配置,生成代码,还是不行。逐行对比关键位置,发现是少了一个使能DMA触发源的函数。但一个是标准外设库写的,另一个是HAL库,我咋知道你长什么样!!!

- h) c1 }6 ~8 W  O$ ?
于是我又翻出去,在英文论坛上找了个STM32F407的例程,它是用STM32CUBEMX配置生成的,实现了类似AN2548里面例程的功能。打开,终于看到了这行代码:
5.png

! E+ s1 O& |: y8 O# \' e7 s  H
复制、粘贴、修改参数,编译下载,终于见到了期待已久的波形:
6.png

8 M# `) D5 B. F0 j
通过循环输出一个数组的元素,GPIO翻转的速度,最高能达到3.6MHZ。
那么,定时器触发的方式可以了。不用定时器呢?这就又回到了最开始的那个问题,直接MEMTOMEM,行不行?我之所以执着于这种方式,是因为看到有人实现过:
7.png

4 [+ J1 j% e" Z3 Q' o
他使用的型号是STM32F303,我没用过,不过我感觉F103应该也可以。

. k& D, q9 `2 Z
所以,我再次研究起来。尝试各种修改无果之后,我忽然意识到,我最开始发现的那个“小bug”,似乎有些…..于是我尝试不去修改它,直接编译,结果么,你们应该猜到了,呵呵:
8.png

) L0 Y0 H! m% Y0 e4 V
跟定时器触发的效果类似,最高翻转频率也是3.6MHZ左右,我已无力吐槽官方的这种神配置!!!
如果最开始,我先修改的是“GPIO端口的地址”的错误,就不会有后续这么多事了,算你狠!
你看,调程序有时候跟人生很像!我们兜兜转转追寻了很久,可能最后又回到了原点,或者离原点很近的地方。
那么,这种玩法有什么用途?
# S# f$ R3 @% s0 y" \7 B
先说数组到GPIO,能实现GPIO状态的快速更新,,,,定时器的PWM就能满足各种需求了吧。
快速串转并?特定需求才会用到吧。

/ E( ]: U9 z% h" a, c
再说GPIO到数组,这个我倒是有点想法。我一直想用32做个示波器,但这类东西基本满大街都是了,没什么新鲜的玩法。103系列自带的ADC最高采样率1MHZ,剩下就是算法加显示了。
如果能有个并行AD接在32外面,通过DMA快速读取,说不定能突破目前1MHZ的上限。不过目前测试效果并不算太惊艳,顶多突破到3MHZ,还要考虑数据同步的问题,另外就是并行AD价格也不便宜。总结下,没什么搞头。
3 R; Z0 L! b( _( X  }) e9 j5 e
不过,能把DMA和GPIO这部分搞通,也算是有收获了。
4 R! i) w# R# b$ K5 w9 f: i0 Y4 Z$ F( R
收藏 评论0 发布时间:2021-8-16 14:05

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版