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

【经验分享】STM32F103使用串口DMA接收发送数据源码分享

[复制链接]
STMCU小助手 发布时间:2022-4-24 17:00
  1. u8 gprsTxBuf[100];
    , }/ m: s, b" Q5 t2 G% p" U! J
  2. u8 gprsRxBuf[1500];
    8 ~4 Y6 m* w4 G+ y  d) p! H
  3. //接收DMA初始化
    7 p" ~1 c6 z! U( Z+ k0 D
  4. void tx_dma_init(void)6 @, ~+ c7 f. h, R
  5. {
    9 Y! f# F1 k  I' O
  6.         DMA_InitTypeDef         DMA_InitStructure;# J: n* ?) O! \6 k
  7.         * J+ ^1 k- K) z" \
  8.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);/ F/ p9 a" O( k- }
  9.         " u5 J  `% ?7 J, x) [* X' a2 a/ L
  10.         DMA_Cmd(DMA1_Channel7, DISABLE);  ! B/ y5 K/ g0 U! M4 r3 r4 r! i
  11.         DMA_DeInit(DMA1_Channel7);
    0 w0 n, I+ D+ _+ }- {: _
  12.         DMA_InitStructure.DMA_BufferSize=sizeof(gprsTxBuf);                                //ÏÈÉèÖÃΪ1K´óС
    * L" U' u2 J3 q; u
  13.         DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;" Y2 U. r2 W7 Y7 D% ^* u
  14.         DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;                0 g" j% h5 h9 _& n( j
  15.         DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)gprsTxBuf;
    # Z7 @1 z, Z: _) c
  16.         DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
    & h+ o2 k% G$ f! n; A
  17.         DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;. b- I- F# P9 [) e+ u2 i
  18.         DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;# w# M- A. p4 ^* W& [6 i
  19.         DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&USART2->DR;4 M6 X. k3 g% z( \3 F
  20.         DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;1 g. j5 n- x" [, q8 u
  21.         DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;9 U2 L( E3 W! j  Q9 ^. w: X
  22.         DMA_InitStructure.DMA_Priority=DMA_Priority_High;
    ! A/ D: u4 w$ ?6 }6 U
  23.         DMA_Init(DMA1_Channel7,&DMA_InitStructure);                //³õʼ»¯TXµÄDMA
    # o& W, _- B  R2 x
  24. }
    + e! K5 R. _6 B7 s* p
  25. //发送DMA初始化
    - A* |/ g; s5 L: V
  26. void rx_dma_init(void)8 J' k. E1 e' x8 U, g1 v
  27. {2 n9 X4 Y' w1 c  a% l$ V4 X
  28.         DMA_InitTypeDef DMA_InitStructure;9 C6 `( p, g* i' ~- }
  29. ( V+ m( x# S" N" o0 r- r8 D: y
  30.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);2 j6 m& ^+ i2 v2 m2 }: I% s8 Q
  31.         DMA_InitStructure.DMA_PeripheralBaseAddr = USART_DR_ADDRESS;
    + G( j! ~2 u; p6 i9 a+ k( ^+ U, d
  32.         DMA_InitStructure.DMA_MemoryBaseAddr = (u32)gprsRxBuf;
    * E# {7 t" u; A1 J/ K' f
  33.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    5 v3 G; N- ]9 N( A% y
  34.         DMA_InitStructure.DMA_BufferSize = sizeof(gprsRxBuf);
    : R2 z$ y6 H! @4 @- a9 c
  35.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;# U; m5 m! G& _. ~6 k
  36.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;1 o; W. Z6 \6 ^+ ]3 ?( i
  37.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    3 k' B$ \# R, H3 B8 g
  38.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;         
    ; z6 M7 v$ W7 T. m* O- x
  39.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;  s5 A* D3 g. g: ?5 t- f4 p- R! [3 F# x
  40.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;) Q+ K3 g8 j. Z! e( x6 s
  41.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;           ( |5 I. J3 D" v2 C# J3 X
  42.         DMA_Init(DMA1_Channel6, &DMA_InitStructure);
    - x+ T4 E* K: g) w& p* p# m/ D( r& U6 N
  43.         DMA_Cmd (DMA1_Channel6,ENABLE);
    . N+ v9 a* q( |
  44. }8 M. ]5 ~  [5 X( |5 t3 F$ I. x

  45. : ~* U+ `  \  i9 q9 [

  46. & {3 g' M$ z$ O* a6 f  [
  47. //串口初始化
    5 z. F' `0 r( A' ~
  48. void uart_init(void)
    / |1 W# V* r) {0 N' ^
  49. {) y" o( a' ?/ V" Q1 M6 T0 l9 S
  50.         GPIO_InitTypeDef   GPIO_InitStructure;   
    / ]7 i9 M2 S2 J9 Y4 `
  51.         USART_InitTypeDef  USART_InitStructure;         ) F1 ~9 v. t% a$ F3 A, g
  52.         NVIC_InitTypeDef   NVIC_InitStructure;       
    0 O( ?# s, A1 x1 A* y1 K. I' t% k: H
  53.        
    + U) X! d  a. A) }$ R
  54.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA        , ENABLE);' i2 Y* S9 X+ C6 b
  55.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);+ [* R& K/ T: j' A9 }! O" s$ z+ t
  56.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
    . o- S/ n8 G" l2 A  A
  57.        
    " r9 H9 y$ V( {0 n$ I
  58.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;! S0 R" p+ [6 G! e7 ?, W
  59.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    ) f* Z0 ?/ y- y5 v& B, n
  60.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    * [& z+ V/ b, v3 p
  61.         GPIO_Init(GPIOA, &GPIO_InitStructure);
    ! \: o) l8 s1 N  k" p* E) q
  62.        
    0 {' ]$ k. Q* N. k
  63.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    9 T9 M; m8 r4 h# k. S9 Y$ B$ ~5 x
  64.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;4 y, n5 f6 P" v/ W" G
  65.         GPIO_Init(GPIOA, &GPIO_InitStructure);* M0 l* Q/ ^8 {: `/ Q- s# X
  66.         & ]% D% Q3 o' H
  67.         NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn;
    & r7 L2 X: R9 p; K
  68.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;( k& j3 i* M2 f  P. g8 `4 F
  69.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;- V" e4 k: ]4 e1 A8 z6 W! o
  70.         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;" s# ]; e/ ^5 M& N$ T
  71.         NVIC_Init(&NVIC_InitStructure);3 y1 _# b7 ]5 p+ j
  72.        
    + [0 |; c! D; l0 |/ x
  73.         USART_InitStructure.USART_BaudRate = 115200;; U, y/ w6 d5 a: p. d9 {/ I
  74.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;       
    6 T9 L; N& t, ]; R1 H
  75.         USART_InitStructure.USART_StopBits = USART_StopBits_1;& S9 f( A" y1 {
  76.         USART_InitStructure.USART_Parity = USART_Parity_No;
    # \# T- b, }9 j7 s6 r5 }8 M, z8 [/ [
  77.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    # V! \2 _& n+ T8 B7 A7 a, R
  78.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    ! ^  N6 H% m9 I0 w$ B5 [! D% G
  79.         USART_Init(USART2, &USART_InitStructure);  k; C! h1 @% N+ P/ k8 ^( I
  80.        
    ' ?1 p* A" Y) j8 J0 X! B
  81.         USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE);
    9 W6 u9 @& `2 |% ?' G
  82.         USART_DMACmd(USART2,USART_DMAReq_Rx,ENABLE);/ N* ]+ ]7 `1 U- o2 z1 P
  83.         7 K7 v8 I2 O; g4 @
  84.         USART_ClearFlag(USART2,USART_FLAG_RXNE);" r1 Q& k6 R) F
  85.         USART_ClearFlag(USART2, USART_FLAG_TC);* J1 ^: ?" z/ B$ I
  86.         USART_ITConfig(USART2,USART_IT_IDLE,ENABLE);( j8 J  }* B9 V, h; H
  87.        
    ; l( }8 N& b5 K- I; S( |7 y
  88.         USART_Cmd(USART2, ENABLE);+ s* S" @. Z. u2 {* |
  89. }
    , W- U3 g  v; W, P( g. s
  90. //DMA发送数据
    6 {) ?! F3 Z; o# z
  91. void send_commend(u8 *buf,u16 size)  F5 K4 n3 P2 i; o
  92. {. |; q& P. R& y! N$ n
  93.         memset(gprsTxBuf,0,100);
    : c9 F- e1 A: W" Z
  94.         memcpy(gprsTxBuf,buf,size);
    + j/ Z8 o+ t- M7 S1 _; ~1 }3 m
  95.        
    9 ^" l' G0 b& l. }
  96.         DMA_Cmd(DMA1_Channel7,DISABLE);: Z! C- P% Y$ C+ S/ k
  97.         DMA_SetCurrDataCounter(DMA1_Channel7,size);  j9 |) _6 N* b( E
  98.         DMA_Cmd(DMA1_Channel7,ENABLE);+ ~( e5 p  |' ]
  99. }+ E" `# \6 q1 z/ p- ]

  100. 8 V2 t: @( Q0 i1 j, I
  101. void gprs_dma_reset()
    , w: T) _+ g* }1 C" h. U3 @0 L
  102. {
    6 {. K$ F7 ~' ~, K/ b4 ~
  103.     DMA_Cmd(DMA1_Channel6, DISABLE );
    4 m9 q0 `# ^: b  L
  104.     DMA_SetCurrDataCounter(DMA1_Channel6, sizeof(gprsRxBuf));
    3 q" Q+ {( z& l3 k* V7 Y
  105.     DMA_Cmd(DMA1_Channel6, ENABLE);  
    6 ?1 g: @1 S- m- v! R
  106. }
    % U3 j4 F0 b! U! {+ |7 |( w8 ^
  107. ( W. A5 w3 H* i" x
  108. extern u8 gprsRecOverFlag;" ?0 n0 `8 v8 }, T6 _+ d
  109. extern u16 gprsRecCnt;
    & {0 Z; B: E$ o+ f
  110. void USART2_IRQHandler(void)            $ u0 u- D- I5 X5 R' ]8 L" ?$ L/ t* j" v
  111. {
    ( L1 [  N& {( C' w

  112. , C2 D7 P  d8 q) o  K9 O
  113.         u16 uartRecCnt=0;/ L! F, I0 q" ~6 M2 ]
  114. " X* J( e# Z5 A1 j7 [, y
  115.         if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)
    * K# Y  y7 V% ^1 w
  116.         {+ n7 v3 a( j6 R' q: Z& B
  117.                 USART_ReceiveData(USART2);0 \' `6 i: z7 g! B* @  t! |. [/ Y
  118.                 uartRecCnt = sizeof(gprsRxBuf) - DMA_GetCurrDataCounter(DMA1_Channel6);
    & G' l8 g; N# f; k# R
  119.                 //**********************//- u: R# K# x: `% p3 n9 Z  X
  120.                 gprsRecOverFlag=1;
    ) J6 U. g$ {% P- }; j3 h; Q
  121.                 gprsRecCnt=uartRecCnt;
    ; M  J8 r7 N8 ^0 L! S
  122.                 //*************************************//
    # G3 k3 F& r2 z2 O
  123.                 gprs_dma_reset();              
    8 @  V  U+ C/ p/ O! i2 |0 H) W
  124.                 USART_ClearITPendingBit(USART2,USART_IT_IDLE);    - o1 ]; b/ q- H6 p# F
  125.         }2 [( W) U2 p$ z1 O# f* C
  126. }6 N& Q2 ^% [9 X7 p0 J' k) e0 `, @
  127. ( k  u' m) l5 @9 _4 Q- R

  128. 5 Q' m6 D9 ~1 y5 h9 v0 e! G
  129. * I, v% j) P, y  u7 |) k+ d% I! B! l$ m
复制代码

$ M7 w* A6 R6 I3 h
收藏 评论0 发布时间:2022-4-24 17:00

举报

0个回答

所属标签

相似分享

官网相关资源

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