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

STM32串口直通

[复制链接]
anobodykey 发布时间:2017-9-8 22:06
所谓的串口直通是指MCU把从USART1接口收到的数据送往USART2接口处发送出去,由USART2->USART1情况类似。这个时候MCU只是当作一个调试模块,而不做任何操作,举个例子:比如蓝牙模块的接口是串口,我们想要使用MCU来对蓝牙模块进行读写控制,在调试时我们需要确定蓝牙模块是否良好,这个时候就可以使用串口直通模式来测试与蓝牙模块的通信是否良好,代码很简单只是开启了DMA即可,如下:
  1. #define USARTx                          USART1! N. |* j1 a7 G0 T
  2. #define USARTx_GPIO_PORT                GPIOA
    , Z: L5 t8 {2 C" O: Y8 H
  3. #define USARTx_TX_PIN                   GPIO_Pin_9
    9 _: q3 I2 A4 F0 h# G# z- a( D
  4. #define USARTx_TX_SOURCE                GPIO_PinSource9, u; [& W. E) P
  5. #define USARTx_TX_AF                    GPIO_AF_16 [5 N6 B9 H! T! L
  6. #define USARTx_RX_PIN                   GPIO_Pin_10. `8 |( R: y8 I( G6 {/ E
  7. #define USARTx_RX_SOURCE                GPIO_PinSource10! ]  {) s+ V- w) D
  8. #define USARTx_RX_AF                    GPIO_AF_1: f) X$ u$ _8 j. w, M6 o; ~* a3 i
  9. #define USARTx_IRQn                     USART1_IRQn
    : p8 N: ~0 f9 [& E5 O9 e; W* M
  10. #define USARTx_IRQHandler               USART1_IRQHandler
    4 k; ?$ B" v* A) a
  11. #define USARTx_CLK_ENABLE()             RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); J, N+ H! M" {
  12. #define USARTx_DMA_CLK_ENABLE()         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE)
    2 r/ W% J: y; C4 v% H% M
  13. #define USARTx_GPIO_CLK_ENABLE()        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE)3 e$ D9 j5 o! ]( x3 |

  14.   u" X9 Y1 V) [3 s* }. ]
  15. #define USARTx_RDR_ADDRESS              (uint32_t)&USARTx->RDR
    - M/ n' U! H1 M0 s
  16. #define USARTx_RX_DMA_CHANNEL           DMA1_Channel3
    ) V; z; i+ ^3 M5 F
  17. #define USARTx_TDR_ADDRESS              (uint32_t)&USARTx->TDR
    ' @) g* Z9 Q3 H
  18. #define USARTx_TX_DMA_CHANNEL           DMA1_Channel2
    1 k6 T! e* z" h: h" {. F( b: g
  19. : T9 P' q; u; x0 `* ]- j3 l# O

  20. ) T& y: ?" r: J) D
  21. #define ISP_USARTx                      USART2& Q" N+ E4 Q( t" C: @- p
  22. #define ISP_USARTx_GPIO_PORT            GPIOA
    8 _" U# E4 f0 n. W
  23. #define ISP_USARTx_GPIO_CLK             RCC_AHBPeriph_GPIOA
    9 k/ L. _- ]/ w% Y8 s* r$ _" y& M
  24. #define ISP_USARTx_TX_PIN               GPIO_Pin_2* c' I2 `& r) Q& p8 r* d. j. f, @! O
  25. #define ISP_USARTx_TX_SOURCE            GPIO_PinSource2
    $ @9 H$ p  w8 T9 s6 A
  26. #define ISP_USARTx_TX_AF                GPIO_AF_15 v$ W2 a, c8 l0 u& Y
  27. #define ISP_USARTx_RX_PIN               GPIO_Pin_3
    ! j- K# Z( n: c3 D3 w: Z
  28. #define ISP_USARTx_RX_SOURCE            GPIO_PinSource3
    4 r- S, P) @' A" g) `) x% I
  29. #define ISP_USARTx_RX_AF                GPIO_AF_18 c6 G) f2 U6 v7 ]0 z
  30. #define ISP_USARTx_IRQn                 USART2_IRQn! U  o2 ~0 l0 _
  31. #define ISP_USARTx_IRQHandler           USART2_IRQHandler* f! H- q; c, t
  32. #define ISP_USARTx_CLK_ENABLE()         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE)" o5 e& @. A" }2 E
  33. #define ISP_USARTx_DMA_CLK_ENABLE()     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE)
    $ G3 p5 D  E" k  i; `& Y1 r
  34. #define ISP_USARTx_GPIO_CLK_ENABLE()    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE)( \! ]  V& ?7 H8 [3 @1 z
  35. ; e' q5 o$ f6 y& w9 m
  36. #define ISP_USARTx_RDR_ADDRESS          (uint32_t)&ISP_USARTx->RDR
    2 Y0 t5 M# V# |% K  j
  37. #define ISP_USARTx_RX_DMA_CHANNEL       DMA1_Channel5
    % ?: I2 m8 H) A' _% n% D
  38. #define ISP_USARTx_TDR_ADDRESS          (uint32_t)&ISP_USARTx->TDR
    & }/ T9 p  ^; S* M( A/ R; w
  39. #define ISP_USARTx_TX_DMA_CHANNEL       DMA1_Channel4
    * l2 ]$ K. J# Y( p* |
  40. 5 J! k% Y; a& C
  41. void uart_init (uint8_t baud)2 h. ~9 B7 V7 S4 _/ e
  42. {; M( \9 L2 |- g; Z- U7 Z
  43.     USART_InitTypeDef USART_InitStructure;   & f- Q  x# e+ g6 Z: E5 P8 h
  44.     GPIO_InitTypeDef GPIO_InitStructure;     
    ' H& ?3 |4 \! T1 H) `
  45.     DMA_InitTypeDef DMA_InitStructure;+ q$ V% O9 D0 L  k. B8 ~4 B: I4 f& j+ R* ^
  46.      " q: w3 G5 F5 |
  47.     USARTx_GPIO_CLK_ENABLE();
    * C1 f. b( {5 p" {
  48.     USARTx_DMA_CLK_ENABLE();
    2 D* W0 \$ ?; x; a4 G' y
  49.     USARTx_CLK_ENABLE();
    & O, S8 O! v$ Y2 C* n
  50. + V1 x0 x) J' f4 `0 {- Q  W
  51.     GPIO_PinAFConfig(USARTx_GPIO_PORT, USARTx_TX_SOURCE, USARTx_TX_AF);
    $ `; ^# U5 b) G$ r9 p
  52.     GPIO_PinAFConfig(USARTx_GPIO_PORT, USARTx_RX_SOURCE, USARTx_RX_AF);
    7 E0 g' Y7 p& @4 }4 @
  53. 4 _. t; c1 ^4 b2 b6 c
  54.     GPIO_InitStructure.GPIO_Pin = USARTx_TX_PIN| USARTx_RX_PIN;                8 v/ f4 r# A& e9 j. {
  55.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;       % j8 k; T$ P- m1 |) B7 Y6 n' k
  56.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;   
    " e* ]: |* K; p" I( X8 q
  57.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;       + B! ]$ l, H3 F8 z+ P
  58.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;  7 k) y3 K: o* N
  59.     GPIO_Init(USARTx_GPIO_PORT, &GPIO_InitStructure);    X+ w- y: a! g) w9 G1 _) G2 G

  60. + P# y* V' k  C& w3 u5 G4 u1 w  q
  61.     USART_InitStructure.USART_BaudRate            = 115200;            
    ( X* j8 J  [2 E: K
  62.     USART_InitStructure.USART_WordLength          = USART_WordLength_8b;  
    $ E0 C/ ?( ?8 ?: r" s
  63.     USART_InitStructure.USART_StopBits            = USART_StopBits_1;     ; b& ~) _5 k4 z
  64.     USART_InitStructure.USART_Parity              = baud_type[baud&0x0F];     : z  i% ]; k. p0 L
  65.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  
    $ U$ }4 m0 ], ~1 z
  66.     USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;   
    2 f( c: W* ?- _0 i1 S
  67.     USART_Init(USARTx, &USART_InitStructure);       2 M$ P% J3 P# |
  68.      & O& j$ M, J! r. S  ~. f& p% a
  69.     DMA_InitStructure.DMA_PeripheralDataSize    = DMA_PeripheralDataSize_Byte;. s- e- H  w( _+ X% N  |. J0 u& W
  70.     DMA_InitStructure.DMA_PeripheralInc         = DMA_PeripheralInc_Disable;8 u$ L2 p; _, L& M( ?1 Q0 m- y' v
  71.     DMA_InitStructure.DMA_PeripheralBaseAddr    = USARTx_RDR_ADDRESS;! F; t: s% X5 R- V+ l& v6 E- w: h; ^
  72.     DMA_InitStructure.DMA_MemoryBaseAddr        = ISP_USARTx_TDR_ADDRESS;6 Q3 r! T+ J- ?6 G7 H
  73.     DMA_InitStructure.DMA_MemoryDataSize        = DMA_MemoryDataSize_Byte;
    # h; v& `4 }9 s+ y2 P1 M* H
  74.     DMA_InitStructure.DMA_MemoryInc             = DMA_MemoryInc_Disable;
    ' v. I3 Z0 K8 D5 v" T# ~( H
  75.     DMA_InitStructure.DMA_BufferSize            = 1;8 H6 b0 L: Q/ ]. G* G( b
  76.     DMA_InitStructure.DMA_DIR                   = DMA_DIR_PeripheralSRC;9 B" f5 ]! }9 M4 ?" d3 U
  77.     DMA_InitStructure.DMA_M2M                   = DMA_M2M_Disable;/ h# H9 r# H2 l& O& }3 _" C
  78.     DMA_InitStructure.DMA_Mode                  = DMA_Mode_Circular;) I+ R6 v& K. j& H" _
  79.     DMA_InitStructure.DMA_Priority              = DMA_Priority_High;6 P5 G0 G! p% j' a6 f
  80.     DMA_Init(USARTx_RX_DMA_CHANNEL, &DMA_InitStructure);  V1 ~) h) O- J7 r( V0 i% Q
  81. . Q7 x) R3 }9 f8 m5 f2 H8 Z. N
  82.     USART_DMACmd(USARTx, USART_DMAReq_Rx, ENABLE);
    + d3 P* }8 Z0 \8 o  u
  83.     DMA_Cmd(USARTx_RX_DMA_CHANNEL, ENABLE);
    ! q. g7 Q& W  V- H7 h5 q7 ~7 S
  84.     USART_Cmd(USARTx, ENABLE);  3 ?: D3 {# J$ l0 L  p, w! p
  85. / [! }2 V% y  p, [2 C+ F6 r
  86. }
    5 n% M( B7 g5 Y* I4 C" p2 @' _3 g5 J
  87. ( s6 ~- J5 d* t5 J. y  A
  88. & q7 S! M/ {4 n2 O
  89. void isp_init (void)
    . k8 ?3 k; T$ e3 Y
  90. {# |9 K& W9 v: t! b
  91.     USART_InitTypeDef USART_InitStructure;   
    8 X. h' q( b/ }; R. Q
  92.     GPIO_InitTypeDef GPIO_InitStructure;     2 J- L) C6 v) t! {" u
  93.     DMA_InitTypeDef DMA_InitStructure;% f3 O. V; f- W0 _* m
  94. 0 K1 r' j: P; R/ g5 r8 {
  95.     ISP_USARTx_GPIO_CLK_ENABLE();; |  Q/ {, `6 u+ o1 x  z2 l
  96.     ISP_USARTx_DMA_CLK_ENABLE();
    * P; _$ P  Y& i: t3 E1 W) s
  97.     ISP_USARTx_CLK_ENABLE();
    5 e( W+ Y8 [* H( i

  98. : W. t  I1 E) U! x" [/ h# p# A
  99.     GPIO_PinAFConfig(ISP_USARTx_GPIO_PORT, ISP_USARTx_TX_SOURCE, ISP_USARTx_TX_AF);
      o9 l% }, c+ e( _
  100.     GPIO_PinAFConfig(ISP_USARTx_GPIO_PORT, ISP_USARTx_RX_SOURCE, ISP_USARTx_RX_AF);) e# t1 A0 S9 c5 x% M1 D. ]) z

  101. 0 S! T. U/ ^; z! _! H1 b2 l
  102.     GPIO_InitStructure.GPIO_Pin = ISP_USARTx_TX_PIN| ISP_USARTx_RX_PIN;               
    1 f. B) I7 b9 W0 V; ~% U
  103.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;       * Z' z3 F9 o2 @  L
  104.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;     ; J  j1 A" a$ ]) N) }" P1 x
  105.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;       * L: n* n2 \) L: C: u4 |* d% v
  106.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;  
    7 X. G. P8 P9 y4 `
  107.     GPIO_Init(ISP_USARTx_GPIO_PORT, &GPIO_InitStructure);  
    1 h- w! ]& M7 l% p: x, Y

  108. ; [+ A; b5 U7 ~7 f0 E& R- j
  109.     USART_InitStructure.USART_BaudRate            = 115200;            
    % [* ]/ Y: x" y) }" z, O; [+ |
  110.     USART_InitStructure.USART_WordLength          = USART_WordLength_8b;    F0 j# y; }# |( [9 u
  111.     USART_InitStructure.USART_StopBits            = USART_StopBits_1;     ( U) \  R$ H* ~+ J& q
  112.     USART_InitStructure.USART_Parity              = USART_Parity_No;     
    0 X- X4 V' C' e, @  `- c0 ~# q& }
  113.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  ( A; `* g6 v/ K2 n6 I
  114.     USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;   * [9 M3 q5 s- S" X) f: M
  115.     USART_Init(ISP_USARTx, &USART_InitStructure);      
    5 E8 G- `# [' h8 x$ `4 j9 F: ?

  116. , r' S* H8 ?* D- O( _, B/ O/ ^* ^
  117.     DMA_InitStructure.DMA_PeripheralDataSize    = DMA_PeripheralDataSize_Byte;& V0 Y4 W1 l' s! w: J( u  {
  118.     DMA_InitStructure.DMA_PeripheralInc         = DMA_PeripheralInc_Disable;! L# _7 Y1 g9 ]( S2 L
  119.     DMA_InitStructure.DMA_PeripheralBaseAddr    = ISP_USARTx_RDR_ADDRESS;
    + K' Q# j& v9 T! v# D6 K2 j
  120.     DMA_InitStructure.DMA_MemoryBaseAddr        = USARTx_TDR_ADDRESS;
    4 r0 O  _# V; C( ^. n
  121.     DMA_InitStructure.DMA_MemoryDataSize        = DMA_MemoryDataSize_Byte;$ u! }3 e% h/ _, }0 w8 n
  122.     DMA_InitStructure.DMA_MemoryInc             = DMA_MemoryInc_Disable;
    # O8 q& c; T5 |( t% Z3 S1 L
  123.     DMA_InitStructure.DMA_BufferSize            = 1;
    . ~0 i, S5 a- r9 p# Q1 D
  124.     DMA_InitStructure.DMA_DIR                   = DMA_DIR_PeripheralSRC;+ U& b. \& Y+ f* S! t2 D- [
  125.     DMA_InitStructure.DMA_M2M                   = DMA_M2M_Disable;
    & W5 ?% ~9 N% F! ^! g0 p& {1 C" s
  126.     DMA_InitStructure.DMA_Mode                  = DMA_Mode_Circular;" }0 m4 v# \5 k6 k2 C! t0 ?
  127.     DMA_InitStructure.DMA_Priority              = DMA_Priority_High;0 u$ T' p  t: j0 P
  128.     DMA_Init(ISP_USARTx_RX_DMA_CHANNEL, &DMA_InitStructure);( `: A$ q$ j# j! h
  129. + `. C* E# S  c3 w, g, `  G$ }
  130.     USART_DMACmd(ISP_USARTx, USART_DMAReq_Rx, ENABLE);  
    " ]# n! o, P; D2 w
  131.     DMA_Cmd(ISP_USARTx_RX_DMA_CHANNEL, ENABLE);
    ; S+ T0 X, u9 {9 V" i7 F
  132.        Q3 w4 e) ^- A1 o! T
  133.     USART_Cmd(ISP_USARTx, ENABLE);
    ' O( C: O" h, o5 q$ H* O
  134. 2 f' K/ f% R# \9 N
  135.     return;
    % b- H, H) v  l$ T
  136. }
复制代码
分别初始化两个串口并使能DMA RX功能,且DAMA的模式为DMA_Mode_Circular,内存地址不再是SRAM而是另一个串口的TDR地址。如此这般,就可以把串口1的数据直接从串口2处输出,用户在串口1中输入控制指令就可以操作与串口2相连的蓝牙模块了。9 c0 q/ {9 O# k6 q" A$ R  V
PS:该代码只是在调试阶段方便调试使用。, U4 v8 P  @5 E0 a6 \4 f( s: }' H) J
赞 收藏 2 评论8 发布时间:2017-9-8 22:06

举报

8个回答
epochal 回答时间:2017-9-9 07:09:08
谢谢分享!
anny 回答时间:2017-9-9 10:15:50
多谢楼主,不错的分享
JiNian_04 回答时间:2018-3-22 18:26:56
楼主会出现一次发送多个字节丢数据的情况吗
andey 回答时间:2018-3-22 19:20:49
提示: 作者被禁止或删除 内容自动屏蔽
anobodykey 回答时间:2018-3-22 22:25:13
JiNian_04 发表于 2018-3-22 18:26
! V% F9 ?+ i& h1 h+ e5 ]楼主会出现一次发送多个字节丢数据的情况吗
7 Y$ j+ h9 a9 ]0 D& X
还没出现过
ldskendy 回答时间:2018-3-23 09:38:30
不错,谢谢分享,! \  I) Y  U% s0 C( g" [
之前我是在接收中断里,直接把数据给到另一个USART的TDR寄存器。
anobodykey 回答时间:2018-3-23 09:48:41
ldskendy 发表于 2018-3-23 09:388 |. `* i8 K: e$ `8 A/ D- x
不错,谢谢分享,
% C1 L" T( Z4 z  l) L# m1 ~之前我是在接收中断里,直接把数据给到另一个USART的TDR寄存器。 ...

! x+ u3 _8 \1 O$ H" U* C! m嗯,之前我也是在接收中断中发送数据到另一个USART的TDR寄存器中,后来就想省略中断用DMA,正好顺便测试下DMA的外设到外设的数据传输,这也是我想的一种DMA外设到外设的传输场景。
JiNian_04 回答时间:2018-3-23 09:59:45
anobodykey 发表于 2018-3-22 22:25
2 L; B$ U: I3 h* a/ l( r还没出现过

9 ?& w- E+ J7 N3 z3 m+ Q5 A( I我用的电脑虚拟的两对串口进行调试,连续发送一直丢数据,只能等实物出来再调试看看了,感谢楼主的分享与回复
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版