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

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

[复制链接]
STMCU小助手 发布时间:2022-4-24 17:00
  1. u8 gprsTxBuf[100];
    0 u: j3 l- I: q0 [" V
  2. u8 gprsRxBuf[1500];
    9 {8 ]9 [4 J: {5 M5 `) x. r
  3. //接收DMA初始化. V; S- h$ T" y, C
  4. void tx_dma_init(void)
    ' B" B! G, V0 Z* D. O9 ?) E
  5. {
    , k, R7 n+ w9 J6 O7 O& m
  6.         DMA_InitTypeDef         DMA_InitStructure;
    6 @6 ~3 N$ a2 {; b3 y* s
  7.        
    ' ^) D1 i  y* H4 K  T; e" `' G
  8.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);8 h' [( D8 @, O! b4 V
  9.        
    + h; b3 y. }6 o: A, N: A
  10.         DMA_Cmd(DMA1_Channel7, DISABLE);  / u  z4 t) a( k3 y7 S
  11.         DMA_DeInit(DMA1_Channel7);
    ) n, \" L, Y, n- k# D
  12.         DMA_InitStructure.DMA_BufferSize=sizeof(gprsTxBuf);                                //ÏÈÉèÖÃΪ1K´óС; D! o/ T) F" p1 z" B' M% t  y
  13.         DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;
    7 B% B% f/ {: ~+ B- }, ^
  14.         DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;                4 X8 V9 _% @% d( \
  15.         DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)gprsTxBuf;
    / r( I  @- k4 @; T' }& o4 L/ U
  16.         DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
    * w# {2 w9 m% L
  17.         DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
    ( Z" Q+ y: l- ~6 H
  18.         DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;
    * C' b" S; m8 t' J  {. T. Z
  19.         DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&USART2->DR;
    $ B+ l; [1 [# E- s' |
  20.         DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;: J# s  \* D& ^5 T5 r
  21.         DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;; m" C0 d# S5 o& t* ]& S. E3 ^) y9 b
  22.         DMA_InitStructure.DMA_Priority=DMA_Priority_High;  Y! H3 e/ t- S! W
  23.         DMA_Init(DMA1_Channel7,&DMA_InitStructure);                //³õʼ»¯TXµÄDMA; x) i3 O( u  Q6 l6 ^1 }' h
  24. }
    $ M2 O% u6 Y% a6 p) l0 W1 m
  25. //发送DMA初始化
    " c1 `3 [! B0 a! u- y. r) C( n
  26. void rx_dma_init(void)6 L# a1 q% e5 t8 ^( x
  27. {( H. {; h; ~% y. V) P- H# M! c
  28.         DMA_InitTypeDef DMA_InitStructure;/ d) f1 ?3 B, ^7 K7 h
  29. 8 ?) \+ a# U' e1 y* S7 s/ b
  30.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);8 b% `4 T1 u" O8 z, W
  31.         DMA_InitStructure.DMA_PeripheralBaseAddr = USART_DR_ADDRESS;
    # I: P4 c' N# y; o5 Q. c( t
  32.         DMA_InitStructure.DMA_MemoryBaseAddr = (u32)gprsRxBuf;
    6 b7 \3 x4 g  r: z/ }
  33.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;: s; a( L( \' s; i& W
  34.         DMA_InitStructure.DMA_BufferSize = sizeof(gprsRxBuf);2 G7 W- c# O! \# N! Y
  35.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    7 S/ X8 e4 a- E. a$ n
  36.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    8 Z9 P: L2 s9 [4 A# V( O
  37.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;+ v# T. {: h8 k
  38.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;         
      e  N2 h2 O  m$ l
  39.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;* `% ^3 R% Z# v8 R& s
  40.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;+ Z! y. e8 O5 @+ n; Y
  41.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;          
    # g7 L- O; y+ G+ P1 a
  42.         DMA_Init(DMA1_Channel6, &DMA_InitStructure);
    ' n% A, q0 Q( g+ k  j
  43.         DMA_Cmd (DMA1_Channel6,ENABLE);
    ! b( c* W% f6 f5 C% N! d; c
  44. }
    . ]( |/ A& K$ ?, W
  45. , m4 S/ l/ s- F6 K# g9 q

  46. - g- \2 ]* w# N. p9 O: d; g
  47. //串口初始化" o9 V  ?) S$ k2 Y. K$ ]% Q. T* }& A
  48. void uart_init(void)5 W4 Q5 v. e. _; M! i# A
  49. {
    9 n) H$ Q# f/ \+ o- {  ^5 v
  50.         GPIO_InitTypeDef   GPIO_InitStructure;   * A; B2 Y) H) s$ f4 a3 v4 Q: e
  51.         USART_InitTypeDef  USART_InitStructure;         
    $ C6 X  L6 w+ u
  52.         NVIC_InitTypeDef   NVIC_InitStructure;        * P5 v/ F( B/ M* p6 {9 U
  53.        
    6 G, b) ^  U4 @- r/ b% G, r, E
  54.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA        , ENABLE);
    ; {  {: V5 P4 _8 v4 G% U
  55.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    0 H# L  o' Y% m9 U1 v$ m, {
  56.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
    1 r5 l& V9 d2 M% a+ y; b
  57.         ) G$ l' X/ r/ }% G5 k/ W+ c3 d6 V
  58.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    7 Q3 T3 K5 u! @$ Q7 O, ~
  59.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    ; d- ?5 |) f4 L! ]/ N' `2 n7 _! |
  60.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;$ a5 u. _" T3 l) B. a* u* c
  61.         GPIO_Init(GPIOA, &GPIO_InitStructure);
    # v' U7 g8 D9 K+ z0 p* Y
  62.         , y/ j& p+ B1 _2 i1 Q! @/ b
  63.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    9 ^6 S( K$ H' `5 V! b6 E/ L
  64.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;" ^! |4 @2 u0 e2 s! T( z: k2 x
  65.         GPIO_Init(GPIOA, &GPIO_InitStructure);) r' O% B$ s* h+ u/ k
  66.        
    8 X5 W* E& W( r+ `9 G: f! F
  67.         NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn;; D$ w6 Q% f: f
  68.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
    , w1 e& a9 b+ z8 h8 z8 \
  69.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;( J$ }3 ^8 l+ @. H6 [5 k
  70.         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    + o, @3 F5 u4 Z
  71.         NVIC_Init(&NVIC_InitStructure);
    6 b" B) @4 Q4 p+ I
  72.         * m& V8 ^) Y" u  e) `0 u
  73.         USART_InitStructure.USART_BaudRate = 115200;1 K) M. h9 ~: H: O  w# }1 i
  74.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;        , T, Z7 i% t! _/ ~# H
  75.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
    " ^" j  b2 ^. g1 c) e. K& t
  76.         USART_InitStructure.USART_Parity = USART_Parity_No;# F& `5 B1 H1 T- ]
  77.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;& D6 _. H  w, v8 g( ?% r" n% ]
  78.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;; S9 q: b9 m1 r4 Z  |" j" h9 t
  79.         USART_Init(USART2, &USART_InitStructure);# [4 ^7 C8 ?3 n& Q9 l
  80.        
    # {5 l0 s( c' \" X0 ^
  81.         USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE);
    # C) l9 ]( t+ ]5 D0 D6 Z5 C2 K
  82.         USART_DMACmd(USART2,USART_DMAReq_Rx,ENABLE);
    8 i2 E; U3 [% n. [$ d
  83.         & R/ J( i$ T  m8 u2 l2 }% E2 _
  84.         USART_ClearFlag(USART2,USART_FLAG_RXNE);
    * r4 p& j. A# R# ]2 p
  85.         USART_ClearFlag(USART2, USART_FLAG_TC);8 Z+ E% d7 E; F2 C
  86.         USART_ITConfig(USART2,USART_IT_IDLE,ENABLE);' I3 I/ v* B  x3 P5 V% e$ U
  87.        
    6 T* g+ Q8 M% Z. I
  88.         USART_Cmd(USART2, ENABLE);
    $ W6 G: c, }) k0 g. m+ t9 s
  89. }
    - e2 U7 [" s5 X+ D- J% Z8 q* K
  90. //DMA发送数据
    2 Y0 W7 M8 n* k" E4 c" `) R
  91. void send_commend(u8 *buf,u16 size)
    % a6 M# b# u  j& L9 Y# M
  92. {. k+ |/ s. N6 p& G5 E# w/ }
  93.         memset(gprsTxBuf,0,100);1 z. |  J; \' Z, i8 U
  94.         memcpy(gprsTxBuf,buf,size);
    $ X: G4 }- [8 \8 f% C: [
  95.         : a2 O/ L- I( M# t8 Q3 C% u$ M
  96.         DMA_Cmd(DMA1_Channel7,DISABLE);
    2 Y" G: h) l- i) f) f0 O9 K7 E! |
  97.         DMA_SetCurrDataCounter(DMA1_Channel7,size);
    1 L# Y( s" F* p7 I9 W; B6 R
  98.         DMA_Cmd(DMA1_Channel7,ENABLE);0 Y) d% k! u+ Z+ D, P
  99. }8 B2 i4 c9 T  R0 s

  100. * r. x0 g3 g, T" r/ j
  101. void gprs_dma_reset()+ l1 S0 j7 j/ F5 r' L
  102. {
    4 r/ @& J3 L. r. P) |' \: P
  103.     DMA_Cmd(DMA1_Channel6, DISABLE ); " T9 M: n' c7 i8 ~
  104.     DMA_SetCurrDataCounter(DMA1_Channel6, sizeof(gprsRxBuf));+ o' {* w$ |/ n: A/ t& O
  105.     DMA_Cmd(DMA1_Channel6, ENABLE);  $ ?$ G8 M5 G# K% F% k
  106. }# N3 H% e* o' f

  107. - n  k* N2 Z- G, L8 p& Q
  108. extern u8 gprsRecOverFlag;$ k' }0 X( U/ o% P1 k) T) s
  109. extern u16 gprsRecCnt;: d3 Q' a; |9 X+ ^
  110. void USART2_IRQHandler(void)            
    9 h4 ~. L2 _7 ]$ X/ [) ]3 @
  111. {& G" ^2 v& y, [& n
  112. 3 z, y5 N" o, L$ J3 U
  113.         u16 uartRecCnt=0;$ l. i  c3 S  D2 b) U; L6 `
  114. 4 ^  x8 I6 J$ C$ H
  115.         if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)9 @! G$ B) k% A3 N( o: l+ B3 l
  116.         {
    / O& ~2 N# L  a) A) N" r
  117.                 USART_ReceiveData(USART2);
    4 i! X0 b3 ?8 t5 ]
  118.                 uartRecCnt = sizeof(gprsRxBuf) - DMA_GetCurrDataCounter(DMA1_Channel6); 1 \. ?, i9 Y. @1 m
  119.                 //**********************//! f. f7 M0 ?1 n! y' h
  120.                 gprsRecOverFlag=1;0 j/ p) T5 y# p3 D# G
  121.                 gprsRecCnt=uartRecCnt;) ]3 [9 X1 p# o0 A
  122.                 //*************************************//
    / C5 j( B, m, ?9 u/ q3 `. J" S, O
  123.                 gprs_dma_reset();              
    9 E. p6 M; P& |
  124.                 USART_ClearITPendingBit(USART2,USART_IT_IDLE);   
    2 V7 h! Y7 J; q* Z8 a# D. S
  125.         }
      u* i0 t% W2 y
  126. }
    4 r7 n, P2 ^( o; E* T
  127. ; E; H" N1 E) a7 `; y- a; F

  128. 6 K9 A0 ~, g; l
  129. + }$ ?4 V) L+ S9 v( `
复制代码

5 \6 z# J( w4 r) a& a
收藏 评论0 发布时间:2022-4-24 17:00

举报

0个回答

所属标签

相似分享

官网相关资源

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