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

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

[复制链接]
flyingstar 发布时间:2025-10-14 18:09
本节详细说明如何在本项目中新增串口通信,将超声波距离 dist_cm 通过 USART1 发送到电脑串口。+ U% B% E& ]% ]+ W. ?: ~# I

' e& ~3 ^- b/ |: I* p
! K  E. G( r: n5 Y$ W7 t8 U0 m1. 目标与环境
( x. H; x1 N- s. UMCU: STM32F103C8T6
) l/ N1 G5 x* \: _  J3 E, i7 x: x串口: USART1 (PA9 TX, PA10 RX)
6 t9 n1 m; Z& j6 D! t波特率: 115200 8N1(无校验,无流控)
# V, N0 j. m4 ?; L) k工具链: Keil MDK / ARMCC 5.06$ X/ {6 C0 r, o. r  p5 g& t
2. 新增文件
0 q/ X" X1 @: p9 k: w) G头文件与实现放在 Hardware/ 目录:' Q. j9 _" U( O; i' b7 D* S
#ifndef __USART_H- Q+ m8 o0 c- D6 \% e" A
#define __USART_H8 G. L5 r9 l6 k  a1 @7 ~6 ^( W  H. B

+ N8 }: t: {" B7 `  t#include "stm32f10x.h"
3 i% p( ?- C9 d0 x6 _; D$ n#include <stdint.h>2 A( Y: t# T6 A3 H# z# _" v
1 W) D: C1 B: r7 Y
void USART1_Init(uint32_t baudrate);- X( B& T1 F4 O4 \/ M6 R
void USART1_SendChar(char c);! g4 ~! }& e8 M
void USART1_SendString(const char *s);: i1 C% P/ ?3 `+ I) t
void USART1_SendNumber(uint32_t num);9 Z$ w2 n. ~0 b2 H' d* L" M5 p) C
2 u! E+ R' a2 S$ @/ U& p) l
#endif% j# p" S, \: ~0 h

! o7 ]* ~! ]" [  D5 X8 z% U8 ?6 @
9 ]# B8 M# v7 t0 V5 X& ?/ R
! [' m$ b4 o/ l4 K#include "USART.h"
) c/ M- t. f& x' G' s9 h4 T, q8 w; M9 F% z% \/ f6 J2 m
void USART1_Init(uint32_t baudrate)
4 b7 {: p0 w5 U& u{
' [: h# o% H& N: ~3 X! Y* i        GPIO_InitTypeDef GPIO_InitStructure;
2 W2 H' S: j3 }7 A( {& e% e- w- n        USART_InitTypeDef USART_InitStructure;3 ?' ?" q# U/ h
$ t; G1 ^/ V3 v2 c8 P$ n. L
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);5 |/ w- X4 l2 ?
% Q. s  S- I9 M3 j3 d4 q
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;              // PA9 TX0 M8 S8 H) b% j! |  K
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
2 D1 y2 n$ ]! m4 k0 @! j( s+ _        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;2 E" E' K) K- S
        GPIO_Init(GPIOA, &GPIO_InitStructure);; b9 d5 E$ g4 t2 v; O$ Y. R, w
9 V; ]8 e/ x( ~" o) i; F/ e
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;             // PA10 RX; g! o" O. c/ W$ _( t, }) m
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;' L0 v% g5 u' B
        GPIO_Init(GPIOA, &GPIO_InitStructure);
  Y" i* D& T+ K0 a4 ~- v' G+ N$ R, J# M6 t: n4 u) N$ u, k% c* P
        USART_InitStructure.USART_BaudRate = baudrate;3 M" w6 u2 B( `* v! n/ P0 H
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;) T, w& c2 M+ b3 H  K% X- d. W
        USART_InitStructure.USART_StopBits = USART_StopBits_1;3 h# C$ {! ^# d+ A/ G- r
        USART_InitStructure.USART_Parity = USART_Parity_No;
8 x9 _3 t3 a' \1 F* ?        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
/ j/ M: B" Z7 K0 O* g. v        USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
* _" x! d! A: L( U1 J        USART_Init(USART1, &USART_InitStructure);
1 O( m+ j" j# @7 }  u. p/ R, J: a% g  l- ^9 R) h
        USART_Cmd(USART1, ENABLE);
9 h7 v" o4 Y4 M0 }5 |- j7 n/ _% U}
; a& ^! I! C( j+ B9 b1 F! T, e! V& e) z& f6 o3 w1 ~# [2 {" ^. g5 _
void USART1_SendChar(char c)% M, H" Z3 L1 I% O! P0 N4 w# H' m
{
9 Z* X7 I6 g: Z        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);) B9 |/ t4 G" E5 z: E: O# m
        USART_SendData(USART1, (uint16_t)c);
% c7 k) o% P3 K5 v1 r7 K}8 U) n% r2 s- q2 z
2 S" {% e% ^/ s9 @& o6 r* q
void USART1_SendString(const char *s)
8 c/ K2 X+ A4 U' k  C" K7 r{
/ P- _* a7 j& x9 k! d( n4 p        while (*s)
! t+ m7 b/ \, O& M        {
- ]: V; C; k+ Q) s+ N# G                USART1_SendChar(*s++);6 K5 }! P+ k& u# Q) ?5 @
        }" g2 S1 m* H3 x9 V& T" [
}
) [! C# Y. z/ \& I( p1 u1 C6 [; @. o/ f- g& ~7 o' e- ?
void USART1_SendNumber(uint32_t num)
0 N* b5 w9 R1 y2 p" `0 ^{
. T4 n0 |2 N4 S        char buf[12];
& C' W" m6 W  S6 @4 X7 P- W( I        int i = 0, j = 0;
6 W* ~8 |: u; t+ J# e9 g% Q        char tmp;" `5 D3 D( x1 F0 W2 i, a# A
        if (num == 0)
3 f# |  o$ G6 p; N7 B        {9 l5 M' a$ F5 p7 f
                USART1_SendChar('0');  l4 X0 s& \# \4 ^$ w
                return;
5 Q/ r6 r. a3 R% ~/ z2 N4 C        }$ g2 Y* N% S* E" `3 q0 k9 Z
        while (num > 0 && i < (int)(sizeof(buf)))# x2 P! A' y6 ]  ?
        {
! x6 x7 S" z7 h$ z2 }' H                buf[i++] = (char)('0' + (num % 10));
3 J1 o7 F! R' i5 y                num /= 10;$ T- n" a* [6 K' {. A4 k
        }
/ X/ K3 ~) U3 H        for (j = 0; j < i / 2; j++)% l/ g4 j* k& a- m+ s- u' S
        {
$ X  B/ H1 c. x/ F4 F+ `                tmp = buf[j];
4 C9 R# y, y7 z) K                buf[j] = buf[i - 1 - j];
( d1 [2 ^5 k) u                buf[i - 1 - j] = tmp;) F& A: ^/ m+ N% w
        }
7 X8 t3 R: s2 g# x. `7 s* _        for (j = 0; j < i; j++)
/ U" L+ ]) _( Z# {; a+ J        {  @3 j% R/ @# P( }, f: V- e
                USART1_SendChar(buf[j]);9 S* G! Z% n7 m% [& X
        }( q4 [% i  d' `* K; j* q
}* N* X. e$ h: A" m' n/ V$ N1 W0 F
' j% o5 E0 |- ]. G5 ^
* W+ A7 @# N0 Q
将上述两个文件添加进 Keil 工程:Project.uvprojx → Hardware 组已加入 USART.c/.h(如未加入,请在工程里右键组名 → Add Existing Files…)。& K1 O/ W. ~6 F  e+ ?
! P0 t. W2 c0 V; z
3. 硬件连接
; \: [  U# H; z5 @PA9 → USB 转串口模块 RX(注意是对接到对方的 RX)
5 E+ D" ^7 l" Q1 F+ [" t" bPA10 ← USB 转串口模块 TX(如仅发送可不接)
; O' x2 o( X6 ?( A6 z4 p# n6 L" YGND ↔ GND 共地
: x1 A5 C: m9 g8 u! B串口工具设置:波特率 115200,8-N-1,无流控。
$ z1 D/ X) T7 u
8 s1 z5 z! v) u: o* o- i4. 在 main 中初始化与发送  b- n! C' @; h2 E, o6 m
在 User/main.c 中包含头文件并初始化串口,同时将距离通过串口发送到 PC。' x$ f) ~6 V2 z" L9 Z  F% T

4 ^- {4 O! X8 v+ g#include "stm32f10x.h"                  // Device header
% G3 w" f/ i! [2 O4 B' W1 [+ R# P#include "Delay.h"
' l8 G7 k! V. l1 D) l, N: W% ~#include "OLED.h"
1 j" r! `5 v/ |3 u, S5 @#include "ultrasonic.h") C  P9 X! n! \, r( J: G# d
#include "USART.h"4 p) `! I$ |2 j* C

+ r% M) J: p# G% r0 }int main(void). o( K. I' |2 [1 H6 p
{4 I9 H3 j- b) |) Q+ b' B) `
        /*模块初始化*/
' B4 D4 ^5 N  D9 z# b        OLED_Init();                //OLED初始化0 B% b# z; H( V0 _% ^; V' o# o6 y% c
        Ultrasonic_Init();        //超声波初始化7 Q3 N7 w& m$ H( r! T2 _
        USART1_Init(115200);        //串口初始化(115200 8N1)
" r% B7 D5 N+ L6 w$ Y% j+ T+ E      
7 i" o6 s/ i- \        /*OLED显示*/( i) k# F* X( L. O0 A& [
        OLED_Clear();( O$ _; W9 ~; a& w9 g
        OLED_ShowString(1, 1, "Ultrasonic:");
- s+ i2 t: v8 g* P       6 r4 I. S+ G2 {4 H
        while (1)# X2 w) p/ R3 f+ v& X4 G7 h) ]$ `
        {0 t$ m" U% }- j4 I  H5 a
                float dist_cm = UltrasonicGetLength();% W8 x/ [5 i$ ~4 x
                OLED_ShowString(2, 1, "Dist(cm):     ");; `8 Z3 _" L, _! x
                {
) n$ I0 m% Y9 s7 C9 r- K+ Y: x                        uint32_t d10 = (uint32_t)(dist_cm * 10.0f + 0.5f); // 四舍五入到一位小数8 t2 i! t( n/ K" ]! P
                        uint32_t intPart = d10 / 10;
/ L9 z# ^5 k5 r/ W                        uint32_t fracPart = d10 % 10;
6 u' M( z6 t9 d# M8 }                        OLED_ShowNum(2, 11, intPart, 4);3 _: y8 E* j/ C. N, ^; n
                        OLED_ShowChar(2, 15, '.');
% x# ^/ y  i6 j# U0 i( ^; ~3 a6 v                        OLED_ShowNum(2, 16, fracPart, 1);
$ n0 i$ A% \* o# U                        // 串口输出:如 123.4cm\r\n" Q: Q% a1 E$ m1 E
                        USART1_SendString("dist=");
7 g9 b; \6 I& q& W$ h$ I. `                        USART1_SendNumber(intPart);$ x8 a5 i$ K- t$ |# Z* U% d7 k: t# ?
                        USART1_SendChar('.');  C: N- p' q7 A0 o8 |. E+ g
                        USART1_SendNumber(fracPart);
6 H% r3 s$ V2 s( T8 X                        USART1_SendString("cm\r\n");
% H( U. i  X$ D* I+ u! a                }
% f; [# V2 f2 Z) T                Delay_ms(200);
! M- `0 W* e$ Y! Z        }, ?% X! j8 U! N( Y7 F% ?3 G
}
! }. ]- C# J* Q$ m) n% n4 g
% u4 B# n& j2 S) B2 w
5 C: d5 h  n. b3 x/ R5 s3 R* g% S) ^" y$ n6 R0 g
5. 常见问题与排错
. r# M# W! p" \( Q无法编译,提示 stm32f10x.h 找不到:
6 ]9 X" w' a* M3 U& f; b, p  c3 ~确认 Keil 工程 C/C++ Include Path 包含 ./Start; ./Library; ./User; ./System; ./Hardware。
* w& V+ X% E: L8 _: F: a3 cUSART1_Init 等函数隐式声明:( O9 Y) k  I% \: h
确认 User/main.c 已包含 #include "USART.h"。# V) N; ]) Q' m7 v# q& e" ?/ d2 h
电脑无数据:
. E8 [: H. }* C! H$ U0 h; M检查波特率设置一致;检查 TX 线连接是否正确,GND 是否共地。
7 e' J6 L! o, N7 R' Z若只接 TX/GND,PC 只能接收;如需从 PC 发回 MCU,再接 RX。
, d3 G$ ~2 F3 S- M波特率更改:
  I; Z2 r; e- a, h+ _$ k将 USART1_Init(115200) 替换为所需值(如 9600),PC 工具一并修改。
- C# N: }- L! n4 U+ x6 {6. 可选增强  W4 T( S4 V4 l8 v
增加 printf 重定向到 USART,便于调试。) w  s# ]: _- _
加环形缓冲区与中断接收,支持命令解析与上位机交互。
1 w# l) r  ^1 O: G. Y采用 DMA 发送以降低占用。% c/ J; P8 }9 n  o
赞 收藏 评论0 发布时间:2025-10-14 18:09

举报

0个回答

所属标签

相似技术帖

官网相关资源

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