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

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

[复制链接]
STMCU小助手 发布时间:2022-4-24 17:00
  1. u8 gprsTxBuf[100];; e! Q/ [* y- ^* H1 C2 O0 \" N
  2. u8 gprsRxBuf[1500];# O( Q1 I! p# G# w) _
  3. //接收DMA初始化2 {  ~$ L( n! c* F) y* l" D; A/ ?
  4. void tx_dma_init(void)1 }% k5 j" y2 Q) x# d3 l  F
  5. {  ^$ V- }+ }3 ?) E
  6.         DMA_InitTypeDef         DMA_InitStructure;
      `0 t$ K* w) ^+ G1 l
  7.        
    4 @$ z& r' w- u) Q% a
  8.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    ; m- J2 V6 H5 W, `2 g
  9.         / U6 o- A3 E# h3 _5 d. F. P
  10.         DMA_Cmd(DMA1_Channel7, DISABLE);  # g& N% D$ S; N
  11.         DMA_DeInit(DMA1_Channel7);
    + b# S4 {. w$ P. i; j  Z' w
  12.         DMA_InitStructure.DMA_BufferSize=sizeof(gprsTxBuf);                                //ÏÈÉèÖÃΪ1K´óС9 z" b$ ^: _0 m
  13.         DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;9 F; E" R$ w9 m% R$ p9 V; y
  14.         DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;               
    5 M% |9 p- H. N
  15.         DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)gprsTxBuf;0 Y& _: c- c1 V4 S
  16.         DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;/ _- A6 ^& i  V+ c! x
  17.         DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
    3 n% d8 N4 Q: H
  18.         DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;8 |' d# A/ V( B$ N9 r; P; G( v* m
  19.         DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&USART2->DR;
    0 ]7 s8 Z9 L& y1 D8 A9 \  I' y
  20.         DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
    7 @( g8 h; z4 k! [( n9 @4 _
  21.         DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
    2 r/ o: ^3 @' h7 q" T& V
  22.         DMA_InitStructure.DMA_Priority=DMA_Priority_High;7 ^9 U: T3 X8 e1 B* u# m1 X
  23.         DMA_Init(DMA1_Channel7,&DMA_InitStructure);                //³õʼ»¯TXµÄDMA" q9 y0 G( y5 [) S) L# H
  24. }
    ! b+ \, e1 q/ |# c) S6 n6 Q
  25. //发送DMA初始化# O& d! D& l5 p9 T' l& N  k
  26. void rx_dma_init(void)
    # W' u% G5 p4 d& s3 d" @9 P% p( Y
  27. {* `7 T/ f% s" u9 @+ F7 {4 a9 _0 i
  28.         DMA_InitTypeDef DMA_InitStructure;/ X+ D1 k" j* m4 K5 ]" X7 O
  29. 0 l1 ~7 E0 T% v& n3 c1 G0 u
  30.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    1 j; ], T3 y- ?: [
  31.         DMA_InitStructure.DMA_PeripheralBaseAddr = USART_DR_ADDRESS;
    7 c% D9 s4 V2 N) N6 A7 j
  32.         DMA_InitStructure.DMA_MemoryBaseAddr = (u32)gprsRxBuf;# J7 S& h$ ?2 d9 }
  33.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    7 k+ i1 G* i. z0 j1 X) s) ?% L) P  U
  34.         DMA_InitStructure.DMA_BufferSize = sizeof(gprsRxBuf);6 ?3 Q" c, F8 f
  35.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;, o$ t9 W- h: u
  36.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;" R4 ]" N+ K$ M2 ]" \
  37.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;# e5 ]8 d* o5 l0 T4 h
  38.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;         
    # s" ]. g6 H8 q& E3 g# R  @, P( |3 V
  39.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
    9 Y* g- \) m+ `7 ?* v4 v/ S
  40.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    5 V" \  L* e2 C9 z' j
  41.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;           # N8 v2 k4 x; o
  42.         DMA_Init(DMA1_Channel6, &DMA_InitStructure);+ M) Y8 K9 n5 M/ Q9 u9 t
  43.         DMA_Cmd (DMA1_Channel6,ENABLE);
    , [0 Y$ j1 L; F! |5 r% c# [
  44. }
    ( G) I3 c  U. n0 `0 R

  45. : {! }2 l  t' g/ c

  46.   q6 y1 Y; t# P) C, k
  47. //串口初始化: h6 A" i& c" p
  48. void uart_init(void)
    + p1 ?; G; s% N+ u  ]: p2 N4 g
  49. {5 R- o/ i9 y' p3 l2 N: f* [
  50.         GPIO_InitTypeDef   GPIO_InitStructure;   
    7 u6 @3 E, f; S/ u
  51.         USART_InitTypeDef  USART_InitStructure;         1 R5 `6 o- G+ |: Z
  52.         NVIC_InitTypeDef   NVIC_InitStructure;       
    5 E  k: g) X0 V) C* g2 [% \
  53.        
    2 b2 Z# Z# _( F, ~9 Q' u9 e1 L
  54.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA        , ENABLE);- f; D( e9 H5 _+ \
  55.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    0 i' l. c) A, k' @) @& V
  56.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
    8 u. y% `- z- i( r8 o; L
  57.        
    * \4 U# l* @& w! P% d2 J* r2 L9 i
  58.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;9 e  D8 Q4 v: s, t2 b
  59.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    - l* q, A! \/ A6 k( n2 B7 ?
  60.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;7 P# k& J) t2 I! {
  61.         GPIO_Init(GPIOA, &GPIO_InitStructure);
    - D$ J7 g/ y8 o& K: ~9 y0 U! A! \* q
  62.         5 v, ^- P) A  X- Z) T
  63.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    3 H4 t- w1 J7 x
  64.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    8 [/ C) d3 w' N% V7 U; w$ V" X" v
  65.         GPIO_Init(GPIOA, &GPIO_InitStructure);' [' ~7 A6 {  H5 t' g( M3 B
  66.         ( r" [0 }$ x; g& v# I
  67.         NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn;9 w& Z7 N* r, N0 E
  68.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;+ z# a  a1 L( z  p4 V- `4 v
  69.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;  p2 ?: H* U# s; H
  70.         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;+ f2 s$ p- O2 p( N1 h1 `* |) C
  71.         NVIC_Init(&NVIC_InitStructure);* R+ F. @1 C1 m; w
  72.         " N& [# M0 J+ a0 l
  73.         USART_InitStructure.USART_BaudRate = 115200;
    9 C/ s  J2 G: T8 D0 K$ Y
  74.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;       
      ?0 h# W* Y. o7 {! o
  75.         USART_InitStructure.USART_StopBits = USART_StopBits_1;) k9 O/ [5 u- ~5 }
  76.         USART_InitStructure.USART_Parity = USART_Parity_No;
    " _: f+ l$ a4 P0 f0 \
  77.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;3 x; ]# R! j* C8 j  S- g( h
  78.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  A' f2 {, a: `! x
  79.         USART_Init(USART2, &USART_InitStructure);! I* w3 ^: p: e6 \3 S
  80.         # }2 w/ C6 j) K4 y
  81.         USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE);
    : x% y6 V* d/ U& |. \0 b" Q: |" t
  82.         USART_DMACmd(USART2,USART_DMAReq_Rx,ENABLE);' i# j' ?! i, K: I: y. @. t) u
  83.        
    4 `  ?) e3 l( x: L+ E) S+ T
  84.         USART_ClearFlag(USART2,USART_FLAG_RXNE);& m1 W0 @; W& V) X8 A* `. {( m
  85.         USART_ClearFlag(USART2, USART_FLAG_TC);9 @% X/ r3 W/ }( e8 P8 z
  86.         USART_ITConfig(USART2,USART_IT_IDLE,ENABLE);
      i+ a9 p7 F: v6 z
  87.        
    9 t8 |% P! c1 C+ g
  88.         USART_Cmd(USART2, ENABLE);
    " E1 W' u$ a" \' d4 C
  89. }+ ~8 V- d$ z$ i% D+ _
  90. //DMA发送数据
    - u- J' d; E  G! F$ @
  91. void send_commend(u8 *buf,u16 size)
    : `& h/ ]1 y. D! [, ^0 _4 |' v7 y
  92. {. s" E: u2 |5 F
  93.         memset(gprsTxBuf,0,100);
    ) O- W2 l0 @' z* G/ V# W% h6 c
  94.         memcpy(gprsTxBuf,buf,size);0 y8 `0 q. J* |! I3 R% D8 u
  95.        
    ' J& L/ A  A! W" J
  96.         DMA_Cmd(DMA1_Channel7,DISABLE);: {9 C7 g) C" w3 T- S$ @+ ?2 ]& M: w
  97.         DMA_SetCurrDataCounter(DMA1_Channel7,size);8 K% M4 H5 ]1 u+ J# A
  98.         DMA_Cmd(DMA1_Channel7,ENABLE);# D+ ^* {. v9 G* @8 t+ Z# a
  99. }- Y$ q8 A( }1 _* [

  100. # m; n2 m. L# R
  101. void gprs_dma_reset()
    0 ]" v' X& A' \3 }* o8 Z
  102. {
    0 c& d9 J, o5 {8 G8 m1 q
  103.     DMA_Cmd(DMA1_Channel6, DISABLE ); 0 R+ W; m- T5 t' x( _! r" M7 o* c
  104.     DMA_SetCurrDataCounter(DMA1_Channel6, sizeof(gprsRxBuf));# w: b7 o/ F% e  N2 D2 g# Q9 }
  105.     DMA_Cmd(DMA1_Channel6, ENABLE);  * Q7 ~' ?: }* J2 }
  106. }
    ( w! U; Q# [5 y

  107. " n/ _5 t% m/ ~2 ]5 K3 A9 G& [
  108. extern u8 gprsRecOverFlag;
    $ r2 E0 }. J& Z: O5 E
  109. extern u16 gprsRecCnt;
    7 f) i, m$ f# Z5 r+ G* K+ W, k
  110. void USART2_IRQHandler(void)            
    , a/ n8 p( j1 G3 I4 A/ q* H& {
  111. {8 k, q! F. B' Y# E5 k: _5 E
  112. 6 u2 n* l6 }; s; H9 U$ P! {
  113.         u16 uartRecCnt=0;9 c0 _2 G, s1 V) a
  114. - L6 w8 R- L0 ^9 L
  115.         if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)/ o) g: B  y  T0 d$ |
  116.         {
    3 x' o1 i# Y9 H2 e& b
  117.                 USART_ReceiveData(USART2);
    : I# d7 P" c+ L
  118.                 uartRecCnt = sizeof(gprsRxBuf) - DMA_GetCurrDataCounter(DMA1_Channel6); & }" \0 R" U. H3 U
  119.                 //**********************//
    5 q: e" L4 s4 k# Y$ q$ m
  120.                 gprsRecOverFlag=1;
    ' ~0 @- X+ n: a" F; N9 z
  121.                 gprsRecCnt=uartRecCnt;8 a! W  S! e3 E) A( I! N, b
  122.                 //*************************************//
    4 o, f$ \! r9 n* A! q; s$ S
  123.                 gprs_dma_reset();              ( X4 n9 j( i" v" Z
  124.                 USART_ClearITPendingBit(USART2,USART_IT_IDLE);    9 N0 ?) e. L+ J3 B) K; D* ^0 H5 M
  125.         }% \/ A- }7 Q, Z
  126. }0 k. v3 Y0 G# Z' v3 z3 V

  127. 8 X+ O4 |+ R8 k+ }- k% ~$ E

  128. " o8 G5 Q( L+ M

  129. 7 j1 v) L. `$ `) F, A/ ]% r% [3 s
复制代码
) k; F. D& o4 y" X+ a! t' Y
赞 收藏 评论0 发布时间:2022-4-24 17:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版