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

【经验分享】基于STM32G473的底层串口驱动开发——DMA外设方式

[复制链接]
STMCU小助手 发布时间:2021-11-14 22:04
一、如何理解DMA
6 y/ k9 }$ t, M& i$ A6 a0 I" ]- I2 o+ m什么是DMA —- Directional Memory Access, 直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。打个比方: 角色预设: 淘宝店主 —- STM32 MCU ;快递员 —- 外设(如UART,SPI);发货室 —- DMA & Q- Y+ C0 j7 [' M7 i
1、首先你是一个淘宝店主,如果每次发货收货都要跟快递沟通交涉会很浪费时间和精力。
& V1 [; d4 l6 d! f2、然后你就自己建了一个发货室,发货室里有好多个货柜箱子,每个箱子上都写着快递名字(如果申通快递,顺丰快递等)。
7 t& |( @) e: }  ?3、每次发什么快递,你就找到对应的货柜箱子,把货物放进去即可,然后跟快递通知一声。 1 d% a/ |# @7 x* x7 I" Y
4、快递取走快件。 ; U% G! z( c$ R3 P8 o5 Z
5、如果是收货,快递直接把快件放到对应的柜子,然后通知你一下。 ( L, U, Q, q; [+ |  _2 B* L: K
6、你过来提取货物。
. @# Q0 R  n5 I2 M9 v' O. G8 o# z! x4 S
通过上面的方式,你可以不需要直接跟快递打交道,就可以轻松发货成功,DMA处理方式跟上面例子是一样的。 如下图: 7 [, a8 [/ W/ T; J2 u8 }& B2 c

2 n0 V; w) D# M/ ]$ C  n3 h
20160330195757431.png
0 V8 j' M$ L/ K

+ w1 D. R! b8 a9 u9 V7 b# V6 X二、STM32 DMA 配置 . x# y5 m: h; K/ v' e
DMA配置参数包括:通道地址、优先级、数据传输方向、存储器/外设数据宽度、存储器/外设地址是否增量、循环模式、数据传输量。
% x  T2 _  G& S7 L, X3 r1 X
9 T! \1 c' ~  c) ?三、Cubemx配置
1 R! S* h* Z6 U基本配置就不说了,主要配置! [7 l0 o8 c! g' z' i: [8 b; \# B* l; _
. C3 l9 w7 N  }  m4 l( c
1.System Core:# Y! Q8 T4 J, [
5 s1 e6 {$ U* `$ C5 I! I
        RCC——HSE设置为Crystal4 t0 B8 ^  d6 b4 b& q% Z7 t" z
9 r( s& n/ O: f* M! E
        SYS——Debug设置为Serial Wire4 E$ `$ Q# n; S9 D/ _  H9 h

% N! S" ^( F3 [: d  U" B7 L2.Connectivity:
7 k; R2 w7 L5 z  k8 u( w: Z5 T5 p7 `8 H
        USART3——PB10对应TX、PB11对应RX
) q# q8 \7 y2 S( D) n4 Z& p. D& N6 u. a6 L4 Z6 u
                      ——NVIC Settings勾选串口中断
0 o6 z; m* \6 F8 N, {1 t7 M7 s3 g$ p
                      ——Parameter设置9600波特率、8bit数据位、2bit停止位
/ y, Y8 H% I- @
! L/ L  `. \7 v7 E: }$ e% i4 O2 s* Q                      ——DMA Settings  设置USART3_RX----DMA1 Channel 1----Peripheral To Memory; q  k7 Y- |8 S2 q. y5 X4 g' L

* x" A- q% Z/ l                                                            USART3_TX----DMA1 Channel 1----MemoryTo Peripheral% m9 {: H/ d9 W* G, g

6 t9 V8 _% \8 d4.Clock Configuration:0 ]0 A% W6 ]! b/ M' K5 x' m- M

7 z0 e/ K: e+ D4 X+ x1 m. h      Input frequency:10-----HSE----PLLM=2---68---2——PLLCLK——APB1 Prescaler/4-----APB2 Prescaler/2
! T! b* ^8 k' K' w( r( D8 d# j% Y4 P& o1 r% c5 Q1 K
5.Porject Manager:
- c& T, U% |4 @* G+ D! P/ H: O
: |& P6 `  w# Y! J& p3 i" Z$ e      Toolchain/IDE 选择MDK-ARM V5。然后点击GENERATE CODE即可5 J1 q  J6 O. r! t. j$ }
' ?! P2 _) l/ _# Y& z5 W
四、编程
0 r1 z$ o# H, f6 o- |4 L在进入主函数之前定义数组,并在主函数while循环语句插入循环发送代码
+ f- [7 n) s- |; J3 V1 y8 N3 P! ~3 l7 u6 I8 n
  1. uint8_t Senbuff[] = "\r\n**** Serial Output Message by DMA ***\r\n   UART DMA Test \r\n   Zxiaoxuan";
复制代码
  1. int main(void)
    7 k& n6 q  o3 }4 p! `
  2. {$ b& D- D  X# s3 r# ]5 q
  3.   HAL_Init();
    $ a0 h: y8 B" K$ p$ a) Y
  4.   SystemClock_Config();
    " y3 b) Q6 i1 A" z8 S4 x; \
  5.   MX_GPIO_Init();
    ; ~6 v0 k: ]! ^# I- I7 g0 L/ I, r
  6.   MX_DMA_Init();
    , _' z0 Z- e! ~3 J6 G
  7.   MX_USART3_UART_Init();
    ; D+ T& _4 W) `( R( o
  8.   while (1)
    # |" q0 |5 a0 s9 U$ O
  9.   {
    ! g0 B6 ]$ Z! T
  10.         HAL_UART_Transmit_DMA(&huart3, (uint8_t *)Senbuff, sizeof(Senbuff));) ?  P4 ]+ v8 \6 `( ^
  11.         HAL_Delay(1000);
    . a9 i8 C% O: D& j5 J& ]
  12.   }
    1 `/ E, ~3 }. q* U6 n
  13. }
复制代码

- p0 f+ `0 G/ O& q: F& W四、测试结果9 V) d2 d$ W; P6 h7 q- _
; W; G3 W/ t( \
20200908114912990.png
: H  y; o# ^/ f
% M# T. s$ z2 {" a0 q
请关注下一节,通过DMA的方式接收多字节指令,并发送批量数据!!!
0 ?% a5 |1 d# R, P  ]/ X9 G! N3 s% v5 s2 k: |  h. ^

: C" x% t' Q4 S
收藏 评论0 发布时间:2021-11-14 22:04

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版