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

【经验分享】STM32F7学习笔记(二)-串口

[复制链接]
STMCU小助手 发布时间:2021-12-10 11:09
一,打开cubemx,配置时钟等参数,具体操作方法和上一节一样
! v" o- Y( g4 V  B1 T  A二,配置串口1
8 q: ]5 r/ P6 }在cubemx上打开串口1,并设置波特率,其他参数保持默认,配置完成如下图所示:
* @. Z5 R) r' {& i
$ F( ]9 x% `2 O  g* t
20190409203849508.png

7 L% \# ^( N# U0 W% n
9 Q6 p( S: F, }# N$ O5 S三,打开串口中断3 m/ \" ^5 O8 O( `& q/ D
点击NVIC SETTING,勾选相应选项如下图
6 }0 x: _/ n* n6 L3 I+ _, y0 e2 @8 ^& F; @) R  G  x! C
20190409204018292.png
4 N# b( x3 d; ^* K

- g, R: Z# b; W% W% c; f% a四、生成代码,具体方法与上节一样
( C3 L+ I2 x, `. w6 K0 ~1、在usart.c中添加如下代码:
6 I8 h& b# p* w$ x5 O
# ^2 m% ~) G$ r! R! u2 R
  1.     uint8_t aRecBuff[1];* \' @, ^& \2 O* N1 p
  2.     uint8_t Uart1Buff[REC_LEN];; t5 w4 P8 M5 u. g. c
  3.     uint16_t USART_RX_STA=0;      
    / }0 k- A! E7 a9 ~' x
  4.     int fputc(int ch, FILE *f)//printf的重映射
    7 `( Q- T8 v8 F7 e7 T) @% I( ]% l/ C
  5.     {3 |3 x! f$ C! {7 g; t, D
  6.             HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    ( h) K2 ]9 s" H  k& J6 v& W$ U
  7.             return ch;
    . @7 s6 [- ]+ j* @! e* l* X" ^; R
  8.     }
复制代码
: ~/ Q7 M' K( S: Y2 T( i
2、 添加中断回调函数(参考正点原子函数接收方法): L- ?4 w  s! v/ v. L4 P
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    " t; z9 n" G+ U9 x% i
  2.     {
    1 \6 N- V8 w  n7 I# I+ s- m( _
  3.             if(huart->Instance == USART1)+ L* Z. d) b8 F2 d1 s1 Z
  4.             {+ y4 I* \& p! E- E* X- B( w
  5.                     if((USART_RX_STA&0x8000)==0)//接收未完成4 Q* u! \( Q$ @' w2 o* Y
  6.                     {
    , T5 K6 H. M$ j2 W
  7.                             if(USART_RX_STA&0x4000)//接收到了0x0d
    5 F( U2 i" t3 \& K1 `4 k8 }
  8.                             {4 U! A- t# h2 p6 X5 l( l1 {: B) t
  9.                                     if(aRecBuff[0]!=0x0a)USART_RX_STA=0;//接收错误,重新开始; A& m$ t& R7 ]- N
  10.                                     else USART_RX_STA|=0x8000;        //接收完成了
    * w* E( e  f' T+ T& E/ b4 r5 S
  11.                             }
    4 d$ t0 ~) c9 P* N7 n  O
  12.                             else //还没收到0X0D
    # V% M0 R; c! Y& L
  13.                             {        ! o, [( b3 ~/ C, S1 Y" N
  14.                                     if(aRecBuff[0]==0x0d)USART_RX_STA|=0x4000;/ D! y; A, Q# H
  15.                                     else; x0 E1 ]9 x3 M' m9 m: I
  16.                                     {9 r* l0 A% j$ [' h# l
  17.                                             Uart1Buff[USART_RX_STA&0X3FFF]=aRecBuff[0] ;" {1 k* r/ ~, R. }% L0 R
  18.                                             USART_RX_STA++;
    5 m7 k# u! q8 s. g+ S; Q
  19.                                             if(USART_RX_STA>(REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收          0 m2 e* p. b7 t4 ]1 b7 A0 O. n
  20.                                     }                 : R$ Z1 Z  D! h/ h' U* b- G9 ?( F- x
  21.                             }1 w( S+ _; K2 D4 a4 g
  22.                     }
    6 @5 ^( d) ?, J" U0 }
  23.             }
    1 i7 J2 ?* @9 @5 F6 W7 J
  24.     }
复制代码

, v7 h  ~1 @+ s, }6 R' K0 ?. @* F- n! U
3、在stm32f7xx_it.c文件中的void USART1_IRQHandler(void)函数中添加如下代码,以保证进入串口中断后再次开启接收中断,添加完成的代码如下:( |- [9 c) C7 w/ a

* W5 `" @/ a4 y7 G* k
  1. void USART1_IRQHandler(void)+ ]) r$ L+ {. g) B; x( B
  2. {
    * k: f9 l  J7 i, J
  3.   /* USER CODE BEGIN USART1_IRQn 0 */
    8 s* C) E1 ]9 h  o" [
  4. 6 i' {: J  O4 \
  5.   /* USER CODE END USART1_IRQn 0 */7 j( M. |( t# Y8 a
  6.   HAL_UART_IRQHandler(&huart1);5 T8 e6 y9 F* T0 [' c, q9 `
  7.   /* USER CODE BEGIN USART1_IRQn 1 */7 C/ G! r2 O$ O2 O
  8.         HAL_UART_Receive_IT(&huart1,aRecBuff,1);
    + |' ^3 R2 ]! ?3 }2 M, t# J8 k) M1 n
  9.   /* USER CODE END USART1_IRQn 1 */& g( g2 q6 V4 S+ A) y! k1 \3 B
  10. }
复制代码
+ v- d: M! m- o3 l( v. x3 C+ G

+ Z5 S4 ?9 |: f8 y4、在主函数中添加代码开启串口接收中断
6 p& s# O% l4 ?# c' ?

  1. 4 _* K7 p- @: t2 C( N( U/ Z
  2. HAL_UART_Receive_IT(&huart1,aRecBuff,1);
复制代码

1 @4 R3 J& |4 \2 G6 q6 |5、在主循环添加代码,串口接收完成后,打印接收的内容(注;串口发送的内容需以换行符结尾),更改完成的主函数如下所示:
2 k5 U# x* P; Z. E# D
  1. - Y' N. `! z% c' h" n8 N% c4 \
  2. int main(void)
    4 s: @8 E4 F+ _8 d. \
  3. {* [8 k  X. R5 n- h
  4.   /* USER CODE BEGIN 1 */" b3 v& e0 ^! z2 p+ L# r  E

  5. 9 t# v3 Q9 U1 Y& c
  6.   /* USER CODE END 1 */" ^7 f  A& k0 }/ W1 A0 e

  7. % d% z8 M/ |3 Z" w2 g. z1 _( ?
  8.   /* Enable I-Cache---------------------------------------------------------*/
    " i3 m/ J3 h* F( U4 y6 w2 |
  9.   SCB_EnableICache();% r0 h( b7 M$ h; C+ U, H+ \' ^

  10. - \5 i5 l. \: o; g. S' w
  11.   /* Enable D-Cache---------------------------------------------------------*/: l3 j( b' ^5 \4 i6 f# ^5 A
  12.   SCB_EnableDCache();. m6 I9 b/ y' Z) x1 a6 f

  13. + a9 k( u/ D' b7 E! I+ G
  14.   /* MCU Configuration--------------------------------------------------------*/' L+ O9 i' o8 ^& ~5 n0 M. H

  15. / Y7 r* W. |( U$ J
  16.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */3 Q9 U" J; J6 k- p
  17.   HAL_Init();/ [! x6 W8 M7 j0 m

  18. 3 e! F7 G- \, T6 O; g+ T7 Z" j# R2 t
  19.   /* USER CODE BEGIN Init */1 w2 N+ W; C2 e0 x

  20. * ?9 {! q) x# o" p3 A
  21.   /* USER CODE END Init */
    - h& ^, W5 W7 n" e9 p% P& ?

  22. " w, t. |0 E' }! U, o8 s5 L! {
  23.   /* Configure the system clock */# c/ s4 e" o, s4 x0 R$ F
  24.   SystemClock_Config();- W, O# @9 I5 z6 L) R, j& x9 {' q

  25. ( O3 T8 Y. C$ w, X
  26.   /* USER CODE BEGIN SysInit */) F. U+ B4 X3 f6 A4 n% N

  27. ( ]" m: u8 q& g4 l6 m" W
  28.   /* USER CODE END SysInit */
    / M3 r8 c, {. E7 X

  29. 5 c) R# ~5 |+ x" S( |
  30.   /* Initialize all configured peripherals */+ ~' D* w6 r& T
  31.   MX_GPIO_Init();# N5 @6 k1 k) h, M6 y+ z3 W4 }" \. D  }
  32.   MX_USART1_UART_Init();( A0 _/ O1 _6 W
  33.   /* USER CODE BEGIN 2 */
    / \. d$ j6 Y# ^
  34.         HAL_UART_Receive_IT(&huart1,aRecBuff,1);  p: b, B9 e! D, O+ [  `( u
  35.         printf("uart test is run!!!\r\n");' F: d, L0 Q5 K7 v
  36.   /* USER CODE END 2 */( H" [7 e8 \4 V3 z- q1 s

  37. 9 S: V/ n% s9 ?4 s
  38.   /* Infinite loop */
    * q6 o! O# d/ h6 G4 n) I+ ]3 n
  39.   /* USER CODE BEGIN WHILE */
    + p1 v' }! J" \- ~, L9 Y
  40.   while (1)
    * k% S; r& {7 Z+ u- S; ^5 ~8 F
  41.   {
    % a9 |$ l/ p9 B3 `5 N7 B3 d
  42.     /* USER CODE END WHILE */% @* h" f1 K1 B

  43. - I9 _! ]' b- n, j3 G
  44.     /* USER CODE BEGIN 3 */  t) T+ n8 |% Y) v
  45.           if(USART_RX_STA&0x8000)* M9 J* T3 r; o5 H* [. ?5 y
  46.           {2 k+ `# m$ {  b' f' ^+ I
  47.           printf("recdata is :%s\r\n",Uart1Buff);
    : h- d2 [: C1 N2 C  ^
  48.           USART_RX_STA=0;
    3 n' C- ^- P3 E
  49.           memset(Uart1Buff,0,REC_LEN);; N' A3 o2 y; e+ ~& W) ]( S$ T
  50.           }) w; \* {! T$ a
  51.   }
    9 A- e  ^) I6 C6 R" `! z) @
  52.   /* USER CODE END 3 */
    7 h; F+ V1 k1 h, B8 N
  53. }
复制代码

- o, i( }4 E0 _% ]5 L如果编译memset出错,则添加string.h头文件即可。$ e. ]. a7 p- M) L% z! \: I

3 W0 S+ P  Z2 e% G五,编译下载,打开串口调试助手观察现象
* {8 i; O7 e: V# P% ~4 `开机系统打印uart test is run!!!,向串口发送“这是一个串口实验”,则在串口就会显示“recdata is :这是一个串口实验"注:发送新行需要勾选)
( H/ U9 B' ^, z) i; j! r' j  u
20190409205255176.png

3 ~" |; \2 d  T+ P! s- S1 k+ E. H3 S- Q" k4 l3 q, _

3 }/ Y; Z7 F0 H8 I- b7 q7 V8 J: W6 f- l) M$ c$ x
收藏 评论0 发布时间:2021-12-10 11:09

举报

0个回答

所属标签

相似技术帖

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