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

【实测教程】STM32CubeMX研究串口通信(RS485)

[复制链接]
STMCU小助手 发布时间:2023-1-14 17:49
一、开发板平台简介:
6 R* r5 ]0 W7 y; ?6 l1、开发板资源简介

/ W9 s% Z/ E; U  @/ C( h(1)开发板主芯片型号:STM32L431RCT61 f& ]) B9 Q% E; M
(2)开发板主芯片封装:LQFP-64_10x10x05P5 H" ?  U; v7 X* G$ h: d
(3)开发板主芯片内核:ARM® Cortex®-M49 O" [3 y" N. @9 |+ x3 u1 Y
(4)开发板主芯片主频:80MHz6 O* P* {) p7 `' x, f% f
(5)开发板主芯片Flash大小:256KB. V5 b( M0 i) o" |; ^
(6)开发板主芯片RAM大小:64KB
. r+ D2 \, T" l3 e (7)其他外设:请参考芯片手册
; U3 d; t9 T0 t8 v* J* A5 Q% x2 V* }5 I# A, a
bb91345227434ee7a43a34bf3fe366e6.png 1 Y( v" \# ~3 W* E6 |' W9 j- @

, P8 j/ Y0 |: f+ ^2 X5 i 929c0cce04aa4115a8623703982bf3e1.png " P1 i( ^) N% F( @1 B
/ d( O) V+ l7 E3 `. k- J4 `
2、串口简介; b% M5 M7 \( I8 o  ~+ I6 ?6 s
         串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。
: a7 S; w" @/ L" g. ~4 X

) X/ O$ u* V6 r% |, o        (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也使用该串口1进行。
' R" S/ \9 k6 c+ ]
, [$ `8 Q  U5 e        (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。- D* [: @8 J/ P
: ]$ J* w2 h" \" Z  T
5 m* }# e! N# R) E! V* b# i
  二、新建工程
/ m% a0 K$ S" ^1、新建STM32CubeMX基础工程
) a$ \- |$ q* W' }
(1)打开STM32CubeMX,点击“File”-->"New Project"​
& ?( r) Y- a/ T; f  E# Z* D5 T* N+ f% d
2399170347904e959c855fefd5877f84.png
) X' d8 d" G4 k, n# z  N: Q7 e8 g! t3 R5 P1 b# e; k' S
(2)等待打开主芯片选项界面(大约1分钟时间)。: x* a( d/ Y; I, f
3 v# v& ]# t; ~7 L0 {, y
d74d2fdc60c9440483e2b7cf8d928e7f.png
7 E# Q! m) S! n6 [: ]
- q$ Z/ c& ]; K$ P; `(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处现在STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
; z, O% A1 Z) T/ Z' `: r
5 |: ?' V' L0 x* d( t
7b80345238d74bea82ce70e1a348f7b4.png
3 {0 L* Z) n) z# @- M, X7 `/ ^8 S) {) L
(4)选择时钟源。2 f! q( C% C4 o* l% n
(1)因为开发板上有8M外部时钟,此处选择外部高速时钟(HSE)。
" ^# U) U- a3 q9 y* d* C; F
6 }2 f( n4 R7 k% q# P1 p% ?& y: n6 M(2)因为我们没有用到外部低速时钟(LSE),此处不做处理。
1 Y, b4 e" F' F/ D5 H/ u: p5 I- n* N3 V1 R
72119b971f62410fa8344f7f9fb9f389.png ! b: `3 Z. v: A! u7 o. f
( g4 v! a! n  n8 j8 z1 q  i, G
2、配置GPIO控制LED2 r3 X  f( _/ d0 L& P- i
备注:LED灯用来指示系统是否正常工作。
# Y8 f+ {$ p- f# Z. M" z(1)查STM32L431RCT6开发板原理图得LED1控制引脚为PC0,则配置GPIO的引脚PC0。
" ?" r9 k% W7 [! Q0 q/ E鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。
4 c- {! _1 l; {. A" s& K, G0 D; r( P4 A4 {, ]
492907c1e71149819adbaee4516a2af4.png 9 |% c5 O  u& Z0 G5 t7 A

+ |4 A/ S: L2 D) _4 D& ^$ F(2)根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。​; t; T. l5 L/ Q, `) W
, v( _. V# H- L$ i9 ^' \
38ff4b80e1c5495ba3076a5158fd91fa.png % ?/ n* n. F: w- q5 B
: I. E1 }$ m0 O2 ?. o
3、设置串口1参数
" e& Z. J2 g( w9 T) Q! Z* F1、查原理图得知,串口2使用STM32L431RCT6引脚为PA2-USART2_TX,PA3-USART2_RX,引脚设置如下:
9 Z5 o7 K! J) Q& q7 Y3 s, ]3 c (1)序号1用来设置串口收发引脚的选择。, p5 n5 {2 y% e2 {
(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。2 v2 v5 P7 c! Z- R9 ^8 v
: V$ m! S! M- ?$ [' g8 U: d' y: G8 O
2、设置NVIC settings 使能接收中断
4 y: B8 n5 D$ d7 X1 Z) R3 E2 _! E! Q5 m
f9d7783b08304465815834f4d2095571.png
( p7 |( M; C2 i7 J0 D& c( X8 y$ G5 A
4、串口DMA设置

' u( N" s: ~, c8 h/ j  u2 |  a5 F' T* Q% \
6d26b13dd9d34039a2b426ca47680f8c.png # i6 ~5 Y, r! p5 u) x6 P) ?# h8 b
/ M7 u* R# a' e' _
(1)根据DMA1通道预览可以得出,我们用的串口1的TX、RX分别为通道4、通道5:+ k: n; e+ q" p, J0 ~( j8 z
点击DMASettings 点击 Add 添加通道# C; c3 X6 b: @9 s# _- {3 N
选择USART_RX USART_TX 传输速率设置为中速7 \$ _" |8 r4 G4 Y; v/ Z  B# h
DMA传输模式为正常模式,即发送一次就结束。, w1 j- m" \; q3 w! \& v- |
DMA内存地址自增,每次增加一个Byte(字节)
1 g7 Q5 n0 ^1 }- P, R8 R
; V, D2 d6 Q' [) Q  v 976712e0494a4482bf65c69fc09fcabd.png
: l2 m- o0 `* Q* u  K4 @
: f3 Q/ V% b5 O
(2)DMA相关参数解析
7 V# w( d2 N/ S; i9 q' B
# s# J' y  u6 d; s* V# |# h( L, ]Dirction : DMA传输方向有四类9 q- n, Q  V; a3 u& z. u! [
外设到内存 Peripheral To Memory
. q; q5 f2 c2 X内存到外设 Memory To Peripheral
8 J' _' M; k7 K+ G: t内存到内存 Memory To Memory
4 f1 q6 E& Z6 J, Q: C3 ?2 I外设到外设 Peripheral To Peripheral7 N" d2 c/ }# H' c
Priority: DMA通信传输速度有四类

- Z" i0 d+ C7 i6 Z4 O最高优先级 Very Hight
& E) h5 V0 M. O高优先级 Hight9 r9 m' ~1 O) j$ L4 I* J% g  ?
中等优先级 Medium
/ b. Q7 t2 H# m低优先级;Low
% a/ ]4 L, B# j7 D0 l$ V* H3 z" K. [. A1 W, X- v! `
Mode:DMA传输模式有两类

) H' f0 L6 P& r
4 E0 U( T; U) y
9021c11fed3e4c1885477e062b846258.png + p1 r! y7 Y4 i

* @3 c3 k- u3 n& k7 t" O' r4 hNormal正常模式:当一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次。
" e  w' Y  H: v/ k0 [: @9 n, _6 aCircle循环模式:传输完成后又重新开始继续传输,不断循环永不停止。0 j; f5 ?) a* B) i
2 B7 _4 ?' w" F
Increment Address-DMA指针递增设置:
  h7 W# Z( }: N" ?
2 S  o1 N( m& n. _' B) x
2b1a952d6514444e9dbb019a9ae88c42.png 0 ^# u3 z4 N! g1 }# B' k
$ T% s8 R% O" ^9 b% m
5、配置项目工程参数5 d  n0 z* J( O
(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。& a$ w7 x* k5 ~6 @- c0 a

2 _) v9 M  N4 F1 e/ _
2ce1933c10484d819234682f4abc0228.png & {2 |' i- b% e  w& j) K
, y6 A' c+ D/ ]; o# n1 |1 [" g2 M
(2)完成配置工程。
" J. c. b- M7 p6 m8 e- G
5 t( x9 q. @& ~+ C9 s备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)3 h% c( N0 H* _3 I, X& t6 d
7 H' W- \, D; q. Q$ `
efdb616174f54925b6eac31109f227b5.png : f* a7 p# {, T8 b

! T/ O0 R) w( l& C( p 41c3f2716e4e4eda8f62fa3a1d871322.png # I, D' s) E) V# }5 J8 S$ ~5 d3 i0 T

. B& A6 B5 j/ {, |9 C4 E(3)生成代码。
4 h8 }' m" {/ e/ K+ F+ Z% M+ O0 \2 ]& S. j
8eaa7d0babea40ee93f158481a6ee471.png 6 g3 L* g. b6 `" p2 u! C
7 {+ M6 m  Z0 e; n% c
三、在KEIL 5中编写代码6 ~1 W, o- r* ~! L4 r$ O
1、使用KEIL 5(MDK)打开项目工程文件
* W6 h: o; h( j. a- ~, v
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程。
; g8 b  h( [; D' y
$ q9 Y5 x; e! C! V  ~
9837b01954cc4d3ba3e25073f31b30b5.png $ a: u" A; m3 q; x! }5 W3 a& B( m

1 ^4 E: T3 D. o' ^9 Q2、添加LED指示灯作为系统提示0 m& N. g2 T! T' W5 r
添加每隔500ms,LED1闪烁一次的系统提示,用于提示程序运行正常。8 d( w/ D) [" x4 d& z2 M& J  G  O
) U! @$ N5 b3 J+ T; J; P& |4 f
6ab72ceaeb7a41af833842fe5ba6f34d.png ) k9 t1 ?4 R6 }
5 G2 I8 \2 L0 K
3、添加HAL库UART  DMA 发送函数代码
! ^. M) r( Y9 B5 T+ {/ [- T5 @4 O(1)STM32 HAL函数库的串口DMA相关函数如下:, z( Y; p% Z% I8 n
  1. HAL_UART_Transmit();串口发送数据,使用超时管理机制: v5 E+ G) N; J) e- A" c, O2 [8 b9 f
  2. HAL_UART_Receive();串口接收数据,使用超时管理机制: Q; N- Z+ y9 \8 t
  3. HAL_UART_Transmit_IT();串口中断模式发送
    " N7 O0 z8 D; ]# v$ K' E  n  @
  4. HAL_UART_Receive_IT();串口中断模式接收
    ) L3 X- Q) h: I
  5. HAL_UART_Transmit_DMA();串口DMA模式发送: Q+ b; T7 K# k
  6. HAL_UART_Transmit_DMA();串口DMA模式接收
    4 ]5 @9 @4 N; z6 {: @
  7. HAL_UART_DMAPause() 暂停串口DMA3 A, G' X( J/ b4 U1 h4 M% R7 N
  8. HAL_UART_DMAResume(); 恢复串口DMA
    ( \* Q& X4 W4 M' _0 G
  9. HAL_UART_DMAStop(); 结束串口DMA
复制代码
5 n3 ~" S0 }% K- S
(2)添加串口DMA发送log代码:
5 g: a! }8 l( ^: @$ \
  1. /* USER CODE BEGIN WHILE */3 A) |: J/ a( a) c6 p" h4 i% n
  2.   while (1)! i& c+ q9 S$ r
  3.   {. A: U, ?( J% f* H# `
  4.     /* USER CODE END WHILE */
    % n$ H6 k, }6 K# x7 F& s& i+ [
  5. ) O8 R% x8 o% y( Z0 K8 A
  6.     /* USER CODE BEGIN 3 */$ X% @( w' p) [$ |
  7.             HAL_Delay(500);2 X7 n" `0 s# k  m: s
  8.                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);//控制LED1闪烁8 j, G5 _5 N- U
  9.                 HAL_UART_Transmit_DMA(&huart1, (uint8_t *)"hello world,this is usart dma send and receive...\r\n", sizeof("hello world,this is usart dma send and receive...\r\n"));//发送提示  
    8 L4 _+ q3 M* Q5 X
  10.         }: V& Z# X+ F. D) n+ z% }0 q- \
  11.   /* USER CODE END 3 */
复制代码

8 X/ w6 x+ T" C9 Y4、添加HAL库UART  DMA 接收函数代码
' A4 X: \2 [& d/ X, s6 C: F(1)DMA接收设置前铺垫知识点:% D  C1 O* t9 ~: [$ `5 N
        STM32的IDLE的中断产生条件:在串口无数据接收的情况下,不会产生,当清除IDLE标志位后,必须有接收到第一个数据后,才开始触发,一但接收的数据断流,没有接收到数据,即产生IDLE中断停止。
# o7 I' `5 F6 v9 c( V9 m1 S/ z. w' P" f% J9 s
(2)初始化中断接收配置:# i+ I6 v* p# H. W0 R
uart.c添加代码如下:
5 T7 W9 y/ s# W# D

  1. ; Z: y% W2 Z. f7 V! f! [
  2. /* USER CODE BEGIN 0 */
    0 B, |0 @5 D3 S0 k, x

  3. , h0 x: n% m! \  q  K1 a
  4. volatile uint8_t rx_len=0;                        //接收一帧数据的长度
    3 P) _, h+ C& j
  5. volatile uint8_t recv_end_flag;            //接收一帧数据结束的标志位
    & C1 m) y0 n3 M+ a2 [0 j( W
  6. uint8_t rx_buffer[100]={0};                        //接收一帧数据的数组大小; Z" Z1 h4 t6 W# R  v
  7. /* USER CODE END 0 */
复制代码
  1. /* USART1 init function */! w9 M: ~% M% S
  2. 7 b7 l5 r+ n' v. L/ D3 ]9 [; @
  3. void MX_USART1_UART_Init(void)
    4 S) @! D0 s" t: d/ s' ?
  4. {
    ; m4 [) @( j7 s3 b5 M

  5. 7 `! L; H5 u" ?% Z, _  h/ c5 f
  6.   huart1.Instance = USART1;
    2 {8 E# m. V) q3 x
  7.   huart1.Init.BaudRate = 115200;% \2 Z1 E: _9 Z; l( f: d
  8.   huart1.Init.WordLength = UART_WORDLENGTH_8B;* O6 p! o9 C, L/ e
  9.   huart1.Init.StopBits = UART_STOPBITS_1;3 B1 L, P3 T% [
  10.   huart1.Init.Parity = UART_PARITY_NONE;
    4 }% ?8 J& Y' J, }# U
  11.   huart1.Init.Mode = UART_MODE_TX_RX;
    3 ]) j$ }0 L- x5 _1 M& W
  12.   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;. `1 D& e- T& x
  13.   huart1.Init.OverSampling = UART_OVERSAMPLING_16;5 B: ^$ s9 a# m' L
  14.   huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
    5 A4 L9 K2 Z9 J5 k$ Y& s1 ?
  15.   huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
    + s7 g+ t$ z9 K1 A! ~
  16.   if (HAL_UART_Init(&huart1) != HAL_OK)
    ) _" O) I( x  x$ y$ _+ G6 Q
  17.   {! ]" d! q9 g+ n5 i1 S8 n
  18.     Error_Handler();
    $ _* h  x, L9 V" ?  T! A
  19.   }, s9 h/ ^8 Z1 s. L
  20.         /* USER CODE BEGIN 2 */
    4 W6 T+ Y6 |# U( f! x" y
  21.           A6 x( H7 `# O
  22.                 __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);                     //使能IDLE中断
    * r" t% q) G: m7 T3 _" _
  23.                 HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);            //DMA接收函数6 D3 D5 i" b: X$ Z8 Y
  24. ) m- l; t8 @8 J0 `  x$ `% F
  25.         /* USER CODE END 2 */8 X1 k; c$ K# B" R- c
  26.        
    , L" n7 F( e7 S- p+ z8 F
  27. + M4 _' W7 \$ {# M. L6 _' R5 g
  28. }
复制代码

/ u7 `" b* }: Z% G

( P" O! F, {9 j, }3 j% vuart.h添加代码如下:
% K" z1 w* O0 C* S8 l: m
  1. /* USER CODE BEGIN Private defines */
    . p) W2 a+ V3 p2 i& R# G
  2. extern UART_HandleTypeDef huart1;* `4 l1 ?% ]! X- ]
  3. extern DMA_HandleTypeDef hdma_usart1_rx;+ p5 C3 ?) X9 ^# A. }" u* m# r! N* h" ^
  4. extern DMA_HandleTypeDef hdma_usart1_tx;
    0 m- y8 W2 j$ {5 Y# ^
  5. . u( h/ h; @- r" S
  6. #define BUFFER_SIZE  100  : \- L% H" N/ O; K0 y, j. Y
  7. extern  volatile uint8_t rx_len ;                                  //接收数据的长度3 N$ E+ S& `! L4 A5 `, N6 p, [
  8. extern volatile uint8_t recv_end_flag;                     //接收数据完成标志位7 O) f9 H' s  L, t$ T$ ]$ d& {
  9. extern uint8_t rx_buffer[100];                                  //接收数据存放数组
    2 [1 Q# I& k8 @8 ?' w! J

  10. 8 K0 f$ n/ B* J. F
  11. /* USER CODE END Private defines */
复制代码
, b1 c/ P, c# h2 X2 N- k. M
main.c添加代码接收函数如下:
/ Z2 u7 E& O1 `3 C9 _8 x! S7 D4 ]7 X  b# H; H
  1. /*******************************************
      c, [" T, c9 S
  2. * 函 数 名: DMA_Usart1_Read- V! p2 v9 d; s5 V
  3. * 功能说明: 串口接收功能函数& e1 A& u6 `/ G- d$ w9 o
  4. * 形  参: Data,len
    $ u) m6 C1 F% a* l0 Z+ Q
  5. * 返 回 值: 无
    ( K! H) j/ A8 `+ K- P" B& o1 k
  6. ********************************************/
    2 }+ s3 G3 k3 H2 [: r$ S  i2 A
  7. void DMA_Usart_Read(uint8_t *Data,uint8_t len)6 @4 H5 J2 `$ R# W
  8. {                               
      ?* r4 t8 S) _2 f2 R
  9.                 HAL_UART_Receive_DMA(&huart2,Data,len);                                 //重新打开DMA接收
    : e5 j' t- u3 F4 Q
  10. }
    & ~6 v7 \5 w9 e) W3 R4 l
  11. /* USER CODE END 0 */
复制代码
7 c1 T" ~& B! `) l; v
5、添加收发处理函数0 _4 c2 ^- T9 j% [
(1)main.c  while(1)循环中添加收发处理代码如下:
- n% A" ^8 q' |9 _2 d4 H- ]
$ K' _9 r: M: E7 d
  1. /* Infinite loop */& |' M" Y* p; v! e0 A
  2.   /* USER CODE BEGIN WHILE */
    4 v0 K: x3 g$ C- n( w
  3.   while (1)
    9 u8 l2 n9 G( r5 Q8 P1 W
  4.   {" v- v, K/ |. ]2 E/ ^2 H4 ~
  5.     /* USER CODE END WHILE */% t$ o4 o* n  _$ X

  6. ' M; K" ?9 P( q2 Z! I
  7.     /* USER CODE BEGIN 3 */+ h& x4 b1 n0 c0 b; W8 X" a
  8.                                 if(recv_end_flag == 1)                                                                                                                                            //接收完成标志,如果串口有数据接收,则执行该部分
    . [# v# L* Y7 i! @" _0 P# t/ B: r
  9.                           {' }9 s- e$ Q: @+ B  P) @
  10.                                          DMA_Usart_Send(rx_buffer, rx_len);
    * Q' D3 K; q8 d% }( a
  11.                                          DMA_Usart_Send((uint8_t *)"\r\n", sizeof((uint8_t *)"\r\n"));       
    2 P) A6 ?+ O" F+ P, V
  12.                                          rx_len = 0;                                                                                                                                                                     //清除计数
      Q( i+ W1 r; e8 ^
  13.                              recv_end_flag = 0;                                                                                                                                                         //清除接收结束标志
    & C# N4 `& y7 \; T7 B* E: h- m
  14.                                    memset(rx_buffer,0,rx_len);: J* v0 T5 ~! Z4 M  c# k% T
  15.                           }* z, K# ]$ i+ |  }. Y
  16.                                 else                                                                                                                                                                                                                                //如果外部没有数据,则执行该部分
    ! k1 f( c- Q9 |% t  ^$ W; U
  17.                                 {
    % m$ C0 J3 X* {/ O- N
  18.                                                 ; @  s% p' N) X8 U+ B0 _
  19.                                                 DMA_Usart_Send((uint8_t *)"hello world,this RS485 send...\r\n", sizeof("hello world,this RS485 send...\r\n"));* N+ E' B- W# @, o
  20.                                                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                                                                                //控制LED1闪烁
    / b4 q8 \5 J; l: z
  21.                                                 HAL_Delay(500);, f, e- w0 @; e
  22.                                 }" Y, q/ T, V2 f. u
  23.                           HAL_UART_Receive_DMA(&huart2,rx_buffer,BUFFER_SIZE);       //重新打开DMA接收                               
    3 |" D7 C# n+ e$ P. R$ u  q; t3 s
  24.         }8 l$ f0 N! M2 v
  25.   /* USER CODE END 3 */
复制代码

7 O/ V5 Z( l/ T4 T( ^# m(2)stm32f1xx_it.c中添加接收中断处理代码如下:% j# t+ D$ u$ K# H1 }
  1. /**
    1 B" J/ R2 U4 j0 w
  2.   * @brief This function handles USART2 global interrupt.
    1 O6 A" [' F! A( x5 i, z
  3.   */
      K' u9 Z6 j( ~, U! S5 v1 y6 w
  4. void USART2_IRQHandler(void)2 {; X5 T; Y* t
  5. {
    ; ]( T- w* }; u$ w
  6.   /* USER CODE BEGIN USART2_IRQn 0 */
    " h7 h4 c( M4 k) `& B
  7.         uint32_t tmp_flag = 0;% j* y' a5 A$ w2 {
  8.         uint32_t temp;
    ( ]. C& i/ \: Z1 @8 K$ B
  9.         tmp_flag =__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE); //获取IDLE标志位
    % T- L( P1 Q8 I
  10.         if((tmp_flag != RESET))                                //idle标志被置位/ C+ w+ _# ]  x
  11.         {
    * ]3 S, V! b1 X: Z) T( }" w' g' g
  12.                 __HAL_UART_CLEAR_IDLEFLAG(&huart2);                  //清除标志位, C3 g6 Q9 p. l; R
  13.                 HAL_UART_DMAStop(&huart2);     # N0 X/ N% J1 M9 S
  14.                 temp  =  __HAL_DMA_GET_COUNTER(&hdma_usart2_rx);     // 获取DMA中未传输的数据个数   ) ?, t3 Y& Q3 O3 ]
  15.                 rx_len =  BUFFER_SIZE - temp;                                             //总计数减去未传输的数据个数,得到已经接收的数据个数0 h. {( S; u& Y6 a" K
  16.                 recv_end_flag = 1;                                         // 接受完成标志位置1       
    8 F- `8 q: ~& B
  17.          }$ g* y& i8 G. f" v: v8 Z
  18.   /* USER CODE END USART2_IRQn 0 */
    7 l- H9 r# y) {9 B; h
  19.   HAL_UART_IRQHandler(&huart2);
    # W1 R+ C4 A8 ~2 w4 i
  20.   /* USER CODE BEGIN USART2_IRQn 1 */
    / S) U, g4 v' d

  21. 3 F- ^4 g; j' a' S; {/ K
  22.   /* USER CODE END USART2_IRQn 1 */
    & D. s# S. R" u! d* o
  23. }
复制代码
, b, _  r1 _- N! I7 Y; L. L
(3)至此,串口DMA收发数据需要添加的代码已经完成。* k7 o7 }7 W# H% X9 ?/ t) ~- h
' h1 |5 M7 @# o* W* I
5、设置编程仿真下载模式7 X3 \! F: W7 Z& D1 [( K
(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。
6 M9 P% [1 F5 R+ W, _9 b4 ~8 C( |( ~. }  [  @/ R: `0 h6 _9 {6 C7 C
edefb6b9a2a14be3b1221ad6d5c7a8a2.png 2 T) J7 W1 d8 \( |
( [% d+ Y9 ^2 q  W! A
(2)点击编译,完成后提示“0 error(s),0 warning(s)”。3 L! @) E2 }) D- k

/ k  {5 l4 I; p% U8 }5 e
f0ed816a3ed14487bf9e857c317fc99b.png
# k5 b3 E% @( j6 @
$ }) h( x! }- T; ~; S
(3)点击Download(或者快捷键F8),即可下载程序。4 f2 X/ ^3 g' f! b6 z8 J0 B+ O7 k

; c2 n- x7 n' p& ]
ba221842d5db40808aa129dd83c593d0.png 0 M* I0 X7 X) a5 h7 f5 q: L+ f% h4 E
0 ]3 y- @3 O+ H
(3) 如果下载程序后,没有看到LED1灯闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。
+ \; d$ X, h( c6 h& q8 u% D
. Y( Y% J! `; E; i
9f8aa1a4e8f04041bcf5cb183facd100.png & u- F2 c5 ~* H0 w, ^+ L' p

4 J: C7 h; S0 j/ r4、查看串口发送函数打印log效果, ?8 {6 x1 p4 t* x, Q+ o
(1)设置串口助手参数为:115200、NONE、8、 1(和代码中串口初始化参数一致)。; |" r3 E" v) q9 ]9 z5 q) n
(2)设置成功后,就可以看到串口打印的效果。如果串口助手没有发送给MCU的数据,则MCU每隔500ms闪烁LED1指示灯一次,且串口输出一个log。* {% X3 e( ?& }( a
(3)如果串口助手往MCU发送数据,MCU把接收到的数据发送到串口助手进行打印显示。
4 u) }5 j$ `# S
5 v$ ?# |3 T9 R1 | 8f65172eef06499987e27edddf5320f2.png   w0 Y& f  c8 A$ z
8 p1 M# ]% r5 G6 {9 i& ]
————————————————( m3 e6 E4 r5 s' _: {
版权声明:智能小屋ZYXC/ B; A. e# u/ U9 O, D( n
* E1 d0 z8 G0 w. r9 F; e: i1 a
6 R& X9 x) k( |1 Y- x  _2 Z! H
收藏 评论0 发布时间:2023-1-14 17:49

举报

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