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

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

[复制链接]
flyingstar 发布时间:2025-10-14 18:09
本节详细说明如何在本项目中新增串口通信,将超声波距离 dist_cm 通过 USART1 发送到电脑串口。
4 Q' X" R# K: Z4 C% }' B2 t/ p, ]" G7 Y# V) @3 \6 }. y& i

$ g5 h! d/ M8 D4 P3 G1. 目标与环境
: t( i4 P) e8 B6 A5 T$ @* UMCU: STM32F103C8T6
$ u- A% N. V9 ~1 i6 G7 w串口: USART1 (PA9 TX, PA10 RX)
/ T6 T& H  P6 F2 a& S: y8 N波特率: 115200 8N1(无校验,无流控)8 m& D# W7 {# T( ?+ e
工具链: Keil MDK / ARMCC 5.06! S6 S2 x- X" H; u1 |' K7 B
2. 新增文件
1 w) |- R* ?, q  s头文件与实现放在 Hardware/ 目录:
1 R. e/ D, O% z) ~6 d0 F; e- D#ifndef __USART_H
! x. x0 J: y! L& c#define __USART_H
$ p. L( Z; J# T) d9 \
, A3 m" \# `6 G5 {  w( q2 P' j#include "stm32f10x.h"
  p- N% T  _) ?( E& [#include <stdint.h>
, D4 l8 U( j0 b+ i/ M
- s' w! b! |7 u; b/ m/ o2 gvoid USART1_Init(uint32_t baudrate);% j8 o+ D! ]1 R: N  D; K+ V9 K
void USART1_SendChar(char c);
0 B/ k/ `0 j7 e4 b  Rvoid USART1_SendString(const char *s);
/ p- G; L' K7 r/ nvoid USART1_SendNumber(uint32_t num);
9 a# w. C7 ~9 \0 N. n$ \5 J0 o2 g" ^
#endif
0 H% X- r+ q2 Y* n
1 w% s4 A6 D. o3 V! `/ f3 z0 j( \# M" g! M; N4 g/ E. _/ d5 |

% ~! O) j. V/ M/ {5 I* d# w# ~#include "USART.h"( ?: G1 k$ O2 z; m' o# o+ _/ e

+ k; b% H0 u; d5 bvoid USART1_Init(uint32_t baudrate)
! k* V# m9 O9 o{: O3 q+ B  K( O
        GPIO_InitTypeDef GPIO_InitStructure;
9 s6 y, ^" ~2 D$ ?( w        USART_InitTypeDef USART_InitStructure;+ x2 ]* N; g, G7 y' R! q
" L) g  H+ h  P* S. f5 ?
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);7 i/ U6 |; E% I& d  c$ m1 B
, ]3 }, }, e% y- E; m  p6 ?" ^
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;              // PA9 TX
1 Y5 _$ {1 {# K6 X/ O, F: H& N' c- ]        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;& z- z# F. \) a+ D
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;9 b1 ^# s3 @6 T
        GPIO_Init(GPIOA, &GPIO_InitStructure);: G+ k* \3 p& @" V9 A

3 N5 T  z% z1 m        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;             // PA10 RX2 Q% ~) l8 _. T
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;5 ?' p$ s# i6 _7 o
        GPIO_Init(GPIOA, &GPIO_InitStructure);3 j  [0 i+ s% T3 ?! }& A, q6 S
2 t9 A: Z6 m2 \
        USART_InitStructure.USART_BaudRate = baudrate;
4 [* o% l& m! s! ]( [        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
# w7 C4 X5 s  i' _- F4 F        USART_InitStructure.USART_StopBits = USART_StopBits_1;+ Y4 e% g. h6 D8 b; R* T
        USART_InitStructure.USART_Parity = USART_Parity_No;& H+ j5 o) C- A% r( p- T7 m
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;6 K. W7 c- L  T
        USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
+ r! X6 I: c; u6 l1 _        USART_Init(USART1, &USART_InitStructure);6 {& e5 {6 h# \0 w2 T; X" P

' B- t2 L: E9 A, Y$ ~8 Y        USART_Cmd(USART1, ENABLE);
6 s0 ]. A+ y8 n# C}
) b+ Q0 s% W5 G- w3 s/ U: c' C. f! `% S" f0 _& {* a  ?# [
void USART1_SendChar(char c)
( O, R! z( b7 z{6 E7 `, g6 m2 |! S& ~
        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);9 _/ X9 j/ G2 ?0 u1 g
        USART_SendData(USART1, (uint16_t)c);
9 `2 w5 P2 f7 h9 S* I+ [8 A}
5 J8 f7 [+ s$ H/ a- V1 ^  ]/ c3 C  }; N
void USART1_SendString(const char *s)
- M  h+ b/ b! F% H6 u' u{6 ^8 X- \, j7 `1 v6 M$ n: E+ I% @8 l
        while (*s)  R0 t7 V/ o  r9 M. B- j) ?" J
        {
8 s/ J. K: I# N3 J. Z7 c% A                USART1_SendChar(*s++);
& k. y, U2 ~: v, O" I        }  O, D1 J" t5 u3 g- w
}5 Q) n9 R2 R5 t9 ^" M, C

1 g# ]( p* R1 B' o/ g  g$ ?# u4 Uvoid USART1_SendNumber(uint32_t num)  ]; s! Y- t6 _% k  q- p% V9 C/ I
{
, q2 g8 g  S, d0 B        char buf[12];) L5 x0 Z# h8 T0 t8 o6 V$ c
        int i = 0, j = 0;
/ n1 V; S2 X! z2 e+ }        char tmp;& p2 c( E' B$ u4 j  G! T) r
        if (num == 0)* B- H0 M7 k& I# e* E& R
        {
5 T/ Q7 j' G, n: ?* J  M* Z                USART1_SendChar('0');
6 p) L. |, u& ~0 p% F6 }/ R' o                return;* C; {  F% ^* J
        }
: ]: w5 n4 j$ N- M2 O        while (num > 0 && i < (int)(sizeof(buf))): d7 X/ _* p- v  {* ^" W
        {, |' }" h/ y7 V8 }& K
                buf[i++] = (char)('0' + (num % 10));4 Z( |0 J; V2 q8 N
                num /= 10;
' P, }' c9 P* W" i0 Q. J) {2 s        }
9 M, k1 P  b& X% O        for (j = 0; j < i / 2; j++); m. I% ]) I3 s: R; ~3 D. D
        {4 o  W# G5 A# `+ M! f
                tmp = buf[j];
8 ^8 |- ]7 C9 d1 C4 Q/ |1 E                buf[j] = buf[i - 1 - j];
- }9 Z0 L* I3 s5 H                buf[i - 1 - j] = tmp;$ e0 c+ f% q' e( Q+ Q# k8 }/ N9 ?8 {
        }
& B4 j6 e$ z4 T  N* K  g        for (j = 0; j < i; j++)
7 u5 S$ b" q, S1 O/ g: w( q8 `        {
% u0 a, ]' ?4 S" j& D- @$ o                USART1_SendChar(buf[j]);7 u# X3 O8 z5 |; Z# D  R; g
        }
+ h8 G; p8 I% {}
$ a5 `7 A# w- K! A' ?0 \
9 x3 {$ L1 U. n. K
" }! G: S, m0 o2 X1 e" ]将上述两个文件添加进 Keil 工程:Project.uvprojx → Hardware 组已加入 USART.c/.h(如未加入,请在工程里右键组名 → Add Existing Files…)。
8 g; J  t' p. R+ ^# b1 m  j' `1 _+ b0 f" L
3. 硬件连接9 Y2 }- G  }3 R! O- T8 d
PA9 → USB 转串口模块 RX(注意是对接到对方的 RX)- n/ C' I; ~% s& e
PA10 ← USB 转串口模块 TX(如仅发送可不接)0 x, g/ d( O  f) r9 V5 \' @6 D: ?& H& L1 W
GND ↔ GND 共地
1 U3 ]+ }2 @* Z2 r, c串口工具设置:波特率 115200,8-N-1,无流控。9 U; q8 O5 G' V' m4 j

( d2 j; l. D1 z4 @; P+ r' J$ f* O4. 在 main 中初始化与发送* X8 K1 I3 E& T8 E9 i. R4 i  y
在 User/main.c 中包含头文件并初始化串口,同时将距离通过串口发送到 PC。& A8 E- Y+ u$ V- \% y

/ V- T, U2 J6 b#include "stm32f10x.h"                  // Device header
9 d4 R8 z" a& H" r#include "Delay.h"
+ K) V  m6 T) Q5 B  |$ U% n$ a* }$ x0 c#include "OLED.h"
7 O# M* B* `6 P# V9 D9 J#include "ultrasonic.h"
$ O  K! c6 e# ~" M' T/ P% M0 c) p) j#include "USART.h"
) x. H4 O: m* a
6 n; L3 W, D& l4 |4 fint main(void)% L: T+ g+ J. g0 a- V1 X8 O
{
6 `$ K) F' c0 k        /*模块初始化*/
4 C& m; d; H  [+ W5 {8 L4 y        OLED_Init();                //OLED初始化5 ^! u& {& l9 q1 _4 W1 f) _6 X! Z& N
        Ultrasonic_Init();        //超声波初始化
) |6 X  ~, H: j. R. K        USART1_Init(115200);        //串口初始化(115200 8N1)* a% V6 M3 g, H' u8 X  h  O/ R
      
6 W- P2 {" D( `9 G! L1 @/ q% `" L3 O        /*OLED显示*/
8 p  o, a: r4 S+ e% m/ Z7 O  B        OLED_Clear();
+ n( {# c( h+ G9 I        OLED_ShowString(1, 1, "Ultrasonic:");2 q2 n# s! j" m  M9 q' l0 K) H: [3 I
      
/ @3 _' x- k! _7 E( H/ I        while (1)+ I1 b- U9 F) Y
        {/ W6 k: q8 u3 t9 d
                float dist_cm = UltrasonicGetLength();
3 Q1 p# g5 W: n! `! f0 }1 o                OLED_ShowString(2, 1, "Dist(cm):     ");5 i7 W% f" Z0 u; t# ~
                {
0 H! j0 `- S; ]' r                        uint32_t d10 = (uint32_t)(dist_cm * 10.0f + 0.5f); // 四舍五入到一位小数; N% O5 |9 S2 U4 z1 X! U1 G( b6 v( E3 q
                        uint32_t intPart = d10 / 10;; ?! D+ e6 c) s* A
                        uint32_t fracPart = d10 % 10;
- w( D% m# \; D- s, S- X2 z% {, P                        OLED_ShowNum(2, 11, intPart, 4);* r' c! o3 P: s0 O
                        OLED_ShowChar(2, 15, '.');7 L9 k; x4 Z2 P& C, R
                        OLED_ShowNum(2, 16, fracPart, 1);
2 T8 E( b5 G8 Q. [& I" R  K4 o) G                        // 串口输出:如 123.4cm\r\n
9 L. G' f" K' V6 ~) S                        USART1_SendString("dist=");
1 v8 b, C+ `2 G) G/ v  I; P1 x% a                        USART1_SendNumber(intPart);- t; l2 w  N% q; d' P, Y: W' B
                        USART1_SendChar('.');: n6 _- Z7 W8 W) ~
                        USART1_SendNumber(fracPart);  A1 a& P9 |  h. w
                        USART1_SendString("cm\r\n");: B0 i: I: U% r( j3 m% \
                }. y# W% y3 K  H1 f
                Delay_ms(200);# T$ w) x; w! |6 P2 o
        }
5 o1 S: A. E' ^- ?, Z( r9 s}0 S& i  A$ s$ S% ?
7 l# Y9 k3 i% m) @- [2 k

3 J! k' A( b0 j% m1 r6 y; ^/ l: P+ H  M" M+ @) C
5. 常见问题与排错
2 v" [9 @' ~: E2 H/ M+ u无法编译,提示 stm32f10x.h 找不到:- \! M( S) Q) |( Q
确认 Keil 工程 C/C++ Include Path 包含 ./Start; ./Library; ./User; ./System; ./Hardware。4 u& \- h6 g4 c5 l
USART1_Init 等函数隐式声明:) F* ~! C9 a4 h/ a/ w0 L! ~! C
确认 User/main.c 已包含 #include "USART.h"。
$ {* F; m1 S: u4 ]- p2 u& M电脑无数据:9 o6 b1 s' [" n6 _: k% W
检查波特率设置一致;检查 TX 线连接是否正确,GND 是否共地。4 a3 \' C# k3 h" {2 P% \# b
若只接 TX/GND,PC 只能接收;如需从 PC 发回 MCU,再接 RX。0 q7 d% Z6 k2 ^# K, L  H
波特率更改:
. {, i, t) Q& l4 F9 H* R将 USART1_Init(115200) 替换为所需值(如 9600),PC 工具一并修改。
# d# u& @( O0 o' Z0 T" ~" `7 B5 y' T6. 可选增强
4 G) b- @6 h0 S) |! m$ w+ a增加 printf 重定向到 USART,便于调试。6 N' {) X  k" |$ u" R% W* ^
加环形缓冲区与中断接收,支持命令解析与上位机交互。
. \3 P. B: j' k) N/ Z1 E采用 DMA 发送以降低占用。
3 q- y5 ]) J6 U- y6 Q% v
赞 收藏 评论0 发布时间:2025-10-14 18:09

举报

0个回答

所属标签

相似技术帖

官网相关资源

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