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

【经验分享】STM32Cube HAL USART发送/接收

[复制链接]
STMCU小助手 发布时间:2022-4-7 17:31
实验内容:通过上位机发送数据,MCU接收到以后,发送数据到上位机。( E/ W* P' V/ H* K
4 N& L0 f* T; M( [' W9 L
一、原理图
0 Q) o( i6 t" K- K/ [/ I3 x, s" P4 J+ e) ^4 ^( J  s; H
SS)B)`]V[AW2MLFVK~HH7.png - ]) U3 x/ W! f: l: w

* L+ u6 k+ B' x! K9 v 二、 CubeMX配置# o8 n6 i0 O% P9 J

- @$ Q8 H' I/ |4 Q, o4 s' LStep1. 打开 STM32CubeMX ,点击“ New Project ”,选择芯片型号, STM32F103VETx 。$ P7 m8 M9 f  R" d3 T% E
& q: ?# {: w. c
GV}7QFW(4G_)_JA]}Q[{%0M.png
$ }! v' B) b! I+ S+ Y
; i$ J' i8 L) y$ p& C Step2.选择时钟源,并配置时钟树。选择Crystal/Ceramic Resonator,并配置系统时钟为72M。
' ^6 }; A, {3 Y' N) Y+ Q
. S, K7 T$ f* ], S2 _ 8D3TFW(W$OQV0]2N7E76BH5.png 1 @8 S/ F/ `$ s- A5 Z4 t$ E+ z0 j
%TJ0{8]X0CL6RHE@JM(CO.png
2 Z  b2 F) ~6 V( ~+ ]; ?
) H3 }9 d! Q: NStep3.配置SYS,我们这里选择的是Serial Wire。(正常情况配置不配置不影响,debug可以使用。但是你不可以把这两个引脚用于其他复用功能,如果用于其他复用功能,debug就不起作用了。)
1 R" ]9 f5 |) [/ Q9 b% I2 n' ]! e0 t/ D" w
3{J(_9@)}J@@}989~3`6.png ; r6 I. B3 I& x2 n

3 Z( d+ l, I2 O7 ~" f) wStep4.配置串口通讯参数" `* K% r5 g: U
: U7 \) t& C& L# p3 j; L
基本参数设置6 v3 B2 p3 h) v& i7 K: H2 K

2 u) J6 K* e- Z: D/ B' R4 f [7YHF0JBS@PYJ`)LW6$M~TF.png
7 ^- `4 `8 D# P0 F/ R) }" Z
: d: w2 |: v4 l8 {2 O3 J7 i串口中断配置(我们这里需要用到接收中断)5 }( Z, N0 f5 d& h- Y8 z0 c
, m; U/ `! y: `2 o8 X  a
9_ULGBE(8RAP6A}D0@~GUE4.png
, c- D: g- Q& f' l: @* g
4 {. [+ N4 p) h* Y! j* l# z IO口配置(要确认IO口是否与我们实际电路一致,如果不一致需要手动通过搜索栏修改IO口): u2 F8 n- \) k% e* q1 N

$ t, H, _& F& O' p: m- I9 M UAJH@~R@`@PLFM}A(H]$(FI.png
( n/ P6 U' \+ Z5 w+ P0 F5 j! Z* O" D# {0 ^7 e' R
因为我们这边没有使用到DMA所以不需要去配置。
( k7 _5 e" Q. i; m5 Q" K0 u+ d. E
& r" m/ \/ R7 _4 b5 |- z: A  q6 V1 h到这里关于串口参数配置基本已经完成,只需要根据之前文章《STM32Cube HAL:GPIO输入/输出(一)》Step4-Step8,设置相关工程参数和生成代码。
! u6 q2 F4 ^5 |0 _$ n' O9 k7 y5 ], n' J
三、添加功能代码
( a4 W8 I( i8 B( {  X; ?
# G/ ]) w/ c/ J9 q; {8 G5 a% H; y. u定义全局变量用来存储接收到的数据:
! r# m  g9 y- ^. `% }( ]9 O4 L# E: x3 J. p. F9 e
  1. uint8_t rx_data;
复制代码

* Y$ P* s. f8 D3 [+ C: j 在主函数中使能接收中断函数:
# T. v* x/ Q* @5 Z4 i5 I6 D
- E. D& e. g7 |: |& G/ L" p
  1. HAL_UART_Receive_IT(&huart1,&rx_data,1); //使能接收中断,每接收1个字
    $ N: q* e( c  S6 u. A$ E0 {
  2.                                              //节会进入一次回调函数
复制代码
9 k, ?; s8 Y  N7 X
在main.c文件中添加回调函数:
7 b1 e: G/ D1 C2 n+ W3 k# O1 g6 L7 `! N8 }& f$ @
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)/ Y/ N  E7 s0 z
  2. {4 v% m7 T* `4 _# h
  3.         HAL_UART_Transmit(&huart1,&rx_data,1,1000);
    6 z- C3 |% [3 `  t
  4.         HAL_UART_Receive_IT(&huart1,&rx_data,1);//回调函数中需要重新使能中断
    : P1 A7 `, H8 s4 S2 |0 a, [7 s
  5. }                                         //否则下次无法进入回调函数
复制代码

% {) k* ^% h; ^: d9 U0 |1 i5 S$ M( {至此,就可以实现上位机给MCU发送一个字节数据,MCU接收到数据又返回给上位机的实验效果。
% ?) |% `( ^# V( W+ e- G* f, Q! s/ k. E+ w  |' D
本文主要注意的是中断服务函数和回调函数区别。中断服务函数是在接收到数据都会进去一次,而进入回调函数的条件则取决于HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) 中的Size,当Size=1时,接受到一个字节数据就进入中断函数,然后再进入到回调函数中。
% N3 ~$ f- `. a3 K$ `( i" e, Q0 Z0 h! h( f1 P9 R$ s6 C
' o% u5 R; b1 r' f" r5 t

) |! U# D8 n+ t9 H% l6 Q
赞 收藏 评论0 发布时间:2022-4-7 17:31

举报

0个回答

所属标签

相似技术帖

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