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

stm32在原有工程中添加串口模块的详细说明

[复制链接]
flyingstar 发布时间:2025-10-14 18:09
本节详细说明如何在本项目中新增串口通信,将超声波距离 dist_cm 通过 USART1 发送到电脑串口。1 s( ~1 _$ D" i/ f* k0 u
) G0 s" b1 }& Q( ~- D

( {; }: r! Q- Y6 f1 {1. 目标与环境
- Y9 R6 d2 T  i/ y+ }+ HMCU: STM32F103C8T6
7 `  N0 ]8 j% {. U) v串口: USART1 (PA9 TX, PA10 RX): d2 _8 v. O2 x
波特率: 115200 8N1(无校验,无流控)
/ p* b3 g, V: t: U4 i9 F' z/ F工具链: Keil MDK / ARMCC 5.060 k% |5 L' j' Y7 B0 r( d& E
2. 新增文件
/ x! E, J; [* ?9 p头文件与实现放在 Hardware/ 目录:5 w. r5 `. u, }
#ifndef __USART_H: |5 b2 h$ I* `% J7 L2 q4 A
#define __USART_H# O* ?1 t2 j3 F1 k( L

2 y9 x! B$ S2 o3 }#include "stm32f10x.h"4 [& P$ |& H, [2 D, h( k3 p
#include <stdint.h>: ]: k( [+ }. K! C  }" O) V

% t" Z# R3 Q) \$ R- P( X$ pvoid USART1_Init(uint32_t baudrate);
5 s2 U% F6 [: B% C: ], L6 Fvoid USART1_SendChar(char c);7 t" T. E& @! s
void USART1_SendString(const char *s);
4 \, O( U9 I; A- V  a5 ^! P9 S9 yvoid USART1_SendNumber(uint32_t num);
# C5 e( J0 N* _  f  s- \0 n- G! o* X/ ?$ Q+ p/ g
#endif+ j  d- S- ?7 L# }

  M$ S8 v3 N2 i9 z2 E. D) J  P6 K' S* ^/ m2 G
: X/ r0 |6 s9 a% A, p" ~
#include "USART.h"- u6 u# W7 \# P
) [( g6 v5 P9 R: b+ F! D
void USART1_Init(uint32_t baudrate)
1 u# A% U6 l$ q3 W& _& P/ O{
$ e/ m: k/ c; k0 y. P& w! G3 C        GPIO_InitTypeDef GPIO_InitStructure;
& u- }& [' P4 w: t! G/ L( K5 a        USART_InitTypeDef USART_InitStructure;+ Z2 u5 ~6 ]; t  Y" X
8 M2 @0 ~& k) c. m7 I
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);
% [  W" [; S4 H2 w# C, I5 k
8 q% P) C- C- q  l( ?        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;              // PA9 TX# Q0 k# \3 c& L0 Q5 o7 K8 ^
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
9 S; m% n) \( }3 w2 C5 \- J        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;0 W+ Z6 u* y8 R2 p6 q. j
        GPIO_Init(GPIOA, &GPIO_InitStructure);. ^4 T/ o' k, E) u3 R
6 g5 m; m1 q1 [, H. I$ M5 Z
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;             // PA10 RX
' N; T5 k( V& u9 r" \        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;' F; Q; |7 c- o! j0 }0 y
        GPIO_Init(GPIOA, &GPIO_InitStructure);
9 ]5 a/ R9 y4 M+ n0 s9 B8 \# D8 U5 J: ]' z% [. l4 D' [
        USART_InitStructure.USART_BaudRate = baudrate;
8 m+ N0 X7 Y& B8 ~' ]  a7 Y        USART_InitStructure.USART_WordLength = USART_WordLength_8b;7 A2 S+ r  b5 T. I1 G; ~2 G: r* T
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
! F* G! K. T2 k8 \, F3 P        USART_InitStructure.USART_Parity = USART_Parity_No;- W* ~# j/ B' r- K9 V4 N% p& t
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;, x9 H2 j) Y  X" M
        USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
9 }* J0 h1 x( c9 t) h5 t- E5 c        USART_Init(USART1, &USART_InitStructure);" A) P  e1 B6 z6 P

2 c( m( F: e% ^" K' o" S- _. p, j5 m        USART_Cmd(USART1, ENABLE);9 _- A, N( z$ i( ^2 h
}
3 T% T* n/ B. f* ^$ M1 `
4 F7 V) D0 ~" Q% r# f& ?( g! ?void USART1_SendChar(char c)- J/ p2 ^, [; f* m) b
{0 O2 K9 S7 k  e# _" h5 m" h
        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
" ]6 W+ R0 g: n. H- w        USART_SendData(USART1, (uint16_t)c);1 w8 A  ^" M; z/ h
}7 L9 @. {& E9 y/ {' v  G& D  d
+ t3 d6 ?* G( V" Q3 R
void USART1_SendString(const char *s)
1 \) W* y: P' q3 e) p6 h0 G{7 d) k1 n1 `5 ~0 y6 P
        while (*s)8 N2 s) v# V. _7 B4 N+ Z
        {7 Q. a5 w0 u' e, A' g" c
                USART1_SendChar(*s++);
9 h# M, x0 m  F; H+ T( ]- x        }/ F4 U  e  u+ A: e% I* Q
}" G9 g5 @4 B& P6 L/ E
" W- W) j: j0 }; [6 C
void USART1_SendNumber(uint32_t num)$ Z/ j$ E; E) V' I
{
$ D5 l1 `9 N; \  g; s        char buf[12];
- b8 U, ]6 K- c' i( O        int i = 0, j = 0;
) n( F/ J0 u- s; n8 l( K; }1 V        char tmp;- K$ U% S, \2 a+ B) e: j
        if (num == 0)
' q: a9 H( u# ?3 U5 Q6 l        {
9 n+ }6 H$ f# Y2 o  _5 \& O                USART1_SendChar('0');
5 a: B% [% n) I: Q                return;! P, T9 W1 i8 s3 l  D' v# X
        }
% h6 i: F  s$ \/ }        while (num > 0 && i < (int)(sizeof(buf)))
! h2 \6 v& r& ]% q1 M$ Z        {2 i0 h( J6 _+ j. G# J
                buf[i++] = (char)('0' + (num % 10));
2 _- b7 x6 z  h# B                num /= 10;; H; z# E6 e$ n% I2 R" t
        }
. K- d! N  t" ?% {' m4 [9 h+ [        for (j = 0; j < i / 2; j++)3 r: Z. x, C6 a& N2 R
        {& v* N& |7 O3 h
                tmp = buf[j];
+ `) t+ M& A/ r% j& o7 S                buf[j] = buf[i - 1 - j];$ }  b. I9 f* z. U: i: ~
                buf[i - 1 - j] = tmp;
8 O+ l( t6 V# t        }
  |& e- F+ x' }0 U" p        for (j = 0; j < i; j++)
0 G1 G  D5 R1 E5 C        {
$ g( W5 Y! o' J3 s9 l9 r3 @0 U6 M                USART1_SendChar(buf[j]);/ I; @4 z8 K: z0 y) c0 Q& _4 ^1 ]
        }
: R) L6 [9 b% ?% _}
% M+ q0 y" P+ p: p- ?* E: K' \6 I: A9 m( J9 e2 R8 y$ N: p
3 p+ [; Y' W$ L4 g, h* \
将上述两个文件添加进 Keil 工程:Project.uvprojx → Hardware 组已加入 USART.c/.h(如未加入,请在工程里右键组名 → Add Existing Files…)。( k( o* h( Q! Q; J: A( c. W* \2 B& x

. j1 m1 |$ z2 T) T2 j# A+ ^* G3. 硬件连接8 i1 o, J2 [$ p7 I9 U: g
PA9 → USB 转串口模块 RX(注意是对接到对方的 RX)1 ~0 w. B6 J1 c' F% `3 `
PA10 ← USB 转串口模块 TX(如仅发送可不接)
* v& u; l+ E' c6 _2 {& y. E: P; b6 PGND ↔ GND 共地7 t+ p, K, v0 J1 l9 J' f7 W3 v. ]
串口工具设置:波特率 115200,8-N-1,无流控。) H; l2 @+ m( m; Y
4 W' {& I, b7 Q) f+ }$ P1 [
4. 在 main 中初始化与发送
' g% R) f1 U! U# G在 User/main.c 中包含头文件并初始化串口,同时将距离通过串口发送到 PC。
9 \+ U. i6 }' c! w$ Q3 ~
: `0 @( r5 a% n. e#include "stm32f10x.h"                  // Device header
# ]8 R, V) X2 ?6 B0 K* U#include "Delay.h"
) b! C& f9 m& U0 d#include "OLED.h"" L  B8 f' n$ H2 e* {
#include "ultrasonic.h"' x: r' I: k, K: U' m! h( _
#include "USART.h") i7 R, X2 e9 C, k; d  I; {

9 c) {  z9 n  C" F% e. P6 @+ tint main(void)8 S2 X' l3 q. ?% V6 N/ F4 r# X
{$ h* I0 F5 \3 }# g
        /*模块初始化*/
* b: B4 s) G+ z% s' Q- O/ e        OLED_Init();                //OLED初始化
; p2 j; X; ^5 \) F/ N        Ultrasonic_Init();        //超声波初始化
$ M# h9 W, ?2 Q; x1 r        USART1_Init(115200);        //串口初始化(115200 8N1)
5 ^' X' X$ z5 D1 n. |) z       * F  c* G- u$ R: C: u0 G4 E$ O  B
        /*OLED显示*/' V0 g5 P# I) b: x, s$ M
        OLED_Clear();! j4 y/ x# D# F- z
        OLED_ShowString(1, 1, "Ultrasonic:");
. y' u5 f3 J. j& D6 D" k      
1 C  }8 h( `4 D0 u& m: _        while (1)0 _, z; t3 F$ @+ @2 e% j
        {6 y( d4 U' p3 }+ G; x7 k( z
                float dist_cm = UltrasonicGetLength();/ j3 e# w1 S2 @, y4 ]
                OLED_ShowString(2, 1, "Dist(cm):     ");% t  A. Y( }- n* _
                {
3 G% A3 W" R9 `                        uint32_t d10 = (uint32_t)(dist_cm * 10.0f + 0.5f); // 四舍五入到一位小数
0 f3 X- y4 t; q/ H; {6 B                        uint32_t intPart = d10 / 10;$ U' w3 n8 D2 |) Q
                        uint32_t fracPart = d10 % 10;
" A8 q, @4 I7 ?& M                        OLED_ShowNum(2, 11, intPart, 4);
; ]$ |( e- M: s0 w# A                        OLED_ShowChar(2, 15, '.');
* H# t3 k3 F% n! b. c# C0 O                        OLED_ShowNum(2, 16, fracPart, 1);
6 Q% E# e7 F1 |9 G9 T                        // 串口输出:如 123.4cm\r\n
: m  ^, v0 l7 N; c                        USART1_SendString("dist=");6 `( k) G  k5 }
                        USART1_SendNumber(intPart);3 I- @& ?2 h: ?
                        USART1_SendChar('.');0 A) d9 X7 I( Y* _+ I, {1 `
                        USART1_SendNumber(fracPart);
5 l. Y" g! w$ T                        USART1_SendString("cm\r\n");5 V. `$ w6 L9 n9 `* t' k
                }( G) J$ L, {' s  i% m
                Delay_ms(200);
3 z& F" m% Z, X& u3 t        }
" [4 J' h2 t2 ~}
, Y; k( G/ m. F! B" t, f+ h7 @6 E% f4 c; p, s% w
6 N3 @- D+ Q  u$ ~! I  l! t
: t; a5 u1 B; b
5. 常见问题与排错0 j& ^4 C$ k4 b' j8 }3 c3 m
无法编译,提示 stm32f10x.h 找不到:$ h4 Y8 }; W1 q6 O- w
确认 Keil 工程 C/C++ Include Path 包含 ./Start; ./Library; ./User; ./System; ./Hardware。
2 A8 B) M# s/ z2 m; G7 PUSART1_Init 等函数隐式声明:/ M* @/ }$ Y3 J
确认 User/main.c 已包含 #include "USART.h"。
4 f; L/ a' Z5 I: Q电脑无数据:
! b4 R/ K' C; l( S. K检查波特率设置一致;检查 TX 线连接是否正确,GND 是否共地。9 b) ?5 d; f6 K# m1 Y3 o+ w
若只接 TX/GND,PC 只能接收;如需从 PC 发回 MCU,再接 RX。7 b( D1 V' c; R0 v% G
波特率更改:
7 A) ~, c+ n- t3 I6 e3 h将 USART1_Init(115200) 替换为所需值(如 9600),PC 工具一并修改。
8 V+ o+ D( Z/ m( H* W# K- w6. 可选增强# p' X2 a* }* Q" D5 e5 d
增加 printf 重定向到 USART,便于调试。
3 ~# S1 U* I) ~# x3 `加环形缓冲区与中断接收,支持命令解析与上位机交互。
) S6 ]7 [7 {( `, y; T, g采用 DMA 发送以降低占用。
4 Q( V! y! M1 I# \( G2 x
赞 收藏 评论0 发布时间:2025-10-14 18:09

举报

0个回答

所属标签

相似技术帖

官网相关资源

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