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

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

[复制链接]
flyingstar 发布时间:2025-10-14 18:09
本节详细说明如何在本项目中新增串口通信,将超声波距离 dist_cm 通过 USART1 发送到电脑串口。# H( ~3 y6 n! K+ \2 z

& l0 e* G: }( F% {; d+ o# ]; {
& g! q8 n, o6 u! \+ m1. 目标与环境
/ |+ }* G, W. k7 @' VMCU: STM32F103C8T6
% [- t$ V' B3 o) H  i( T串口: USART1 (PA9 TX, PA10 RX)
: p" h! ]! K7 a0 h! \8 ~波特率: 115200 8N1(无校验,无流控)
, n  X$ @$ k, f; E工具链: Keil MDK / ARMCC 5.06* k$ {9 E1 u+ N' k4 U4 a1 _7 R& Q
2. 新增文件
) j8 u. o% o; V% [; A8 l$ n4 ]/ r1 h头文件与实现放在 Hardware/ 目录:. d. P  s" N: Z& j4 |
#ifndef __USART_H, Z' q) U6 l' s+ Y2 j
#define __USART_H
# Q3 T0 @6 d( {  S& j
; U: o8 P  C( [! F#include "stm32f10x.h"
8 f; y  [  Z! {6 @#include <stdint.h>
, I  r4 B1 K6 s- W0 I0 q. H# `4 U
void USART1_Init(uint32_t baudrate);: k9 B+ X8 e* [, G8 b! t2 T. ~
void USART1_SendChar(char c);: V! V! U: ?4 `
void USART1_SendString(const char *s);; j% C. \! U. Z! E. P6 K- `% q
void USART1_SendNumber(uint32_t num);
* S# J4 F* K0 X8 \3 s
: X) @" b! C# l' v. Y1 d" L#endif) e! A6 a1 E' D/ z+ {/ }
0 e/ U3 K/ `: Q0 q

: L( Y; i$ a1 ^/ v& l, }, y5 k! t- h" }$ _0 O# w* H
#include "USART.h": v8 k1 t4 L# I& s$ O
5 l1 J' e+ Y. D( |6 |6 a, [" }1 u
void USART1_Init(uint32_t baudrate)
8 G( O1 L6 v8 K{
. ^& |0 k" X- t9 S        GPIO_InitTypeDef GPIO_InitStructure;
. m, Z! N7 A$ c. b+ s6 w4 b5 y        USART_InitTypeDef USART_InitStructure;
1 L# z. u7 u2 {* O
% q1 \2 t+ h: K4 v2 i7 q8 W        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);% H5 B" Y/ J% L- S- h% `2 ^7 P

3 ^( W* a6 V9 o9 {2 Q  e        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;              // PA9 TX- S, _' p  d$ G# N3 Z$ O: |
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
$ a' N" s; W' t5 \7 ]/ U        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;" |# K1 f- P" ]( G# n* N9 w
        GPIO_Init(GPIOA, &GPIO_InitStructure);2 E8 P7 x/ N  E9 q

( ?- I3 a. P9 t: h2 o4 ~0 R        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;             // PA10 RX
8 w& Z7 H; }5 z) \8 ^        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
1 I% ~8 A' \: h. e7 t" n3 D        GPIO_Init(GPIOA, &GPIO_InitStructure);
! V2 l4 D. u- N7 g
2 I/ D/ q5 r9 Q* L9 I1 Y4 `' d        USART_InitStructure.USART_BaudRate = baudrate;
4 K& E4 e; z4 g1 L2 o. K        USART_InitStructure.USART_WordLength = USART_WordLength_8b;) s% W* ^# g: L5 ~: }; @/ k) k5 L
        USART_InitStructure.USART_StopBits = USART_StopBits_1;0 s( E$ W7 M% ]( R
        USART_InitStructure.USART_Parity = USART_Parity_No;
& R9 [& g$ O3 i8 ?3 Y        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;! k5 g0 W& b& A2 p7 p$ f+ q/ U0 {$ Y
        USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
3 F& w, Y. Q6 \" j5 a        USART_Init(USART1, &USART_InitStructure);. Y/ ?& i9 `, `+ H
- H+ _8 d6 ^! b+ z% {4 l
        USART_Cmd(USART1, ENABLE);6 O' E6 j7 V+ h8 Q4 Q4 z
}
, t; w1 m  l7 y* H, B
* t+ q) J/ q5 _( t* {8 {( fvoid USART1_SendChar(char c)
  r) E, I9 \. u" U, t{: F8 Q/ O( B1 U
        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);: u: G8 ^" B. P( w
        USART_SendData(USART1, (uint16_t)c);
$ Y. ~; @. k! W6 I) b}
- r0 ?. A7 C# i' T0 T  V- T  Q& _2 x$ B* V* T& \0 l" g( j" G6 w, {
void USART1_SendString(const char *s)1 n: @, G! ~3 F; X  ]3 F
{
* p) A0 l% {3 A* b- P; W        while (*s)
& ^8 p6 P7 J# F. i& w" Y) `        {
# e. O2 M/ T. _0 S5 l- a                USART1_SendChar(*s++);
3 q/ W6 ]8 w7 O, \' x' h        }. T4 U; e4 Y6 [* C' [) L3 [
}
" Z$ ^) e) {; y( X9 K
1 J' f5 |& I% ^% P4 Tvoid USART1_SendNumber(uint32_t num)6 V# _' Q4 F9 j# W; V/ U
{
$ E/ W; H8 w' G/ Y+ f        char buf[12];
* n0 d8 h3 o, j- @- ?$ r* i% \: B        int i = 0, j = 0;
: h/ A5 K: n. W; {        char tmp;
5 ~+ @( _: j: `- ]- w        if (num == 0)
" C$ u2 e: r& |% ^        {- F  ^! q5 d2 e# R
                USART1_SendChar('0');9 j% \$ c% w5 r" X$ a" E+ Q
                return;
/ g! S6 |' ]& e7 n' S        }1 i7 j; L3 A. I
        while (num > 0 && i < (int)(sizeof(buf)))' n" T1 [- W3 ]1 |8 H
        {3 v+ i) y1 J- ^  _
                buf[i++] = (char)('0' + (num % 10));
* ]) F. {" W+ _& }8 G. n                num /= 10;. }0 z! Z: \: V* _4 x8 T
        }
1 I8 O" |7 C: A- j7 M7 H- E' S, m* K        for (j = 0; j < i / 2; j++)
, s1 b2 @4 r' f        {
( w$ q' C* r0 b1 J7 j( ?8 S                tmp = buf[j];
6 r$ Q5 x8 _( F! {                buf[j] = buf[i - 1 - j];
3 J7 k9 e6 d. O  o2 c                buf[i - 1 - j] = tmp;" s+ V1 d0 ]) h, A3 k
        }& B$ Z7 w# U" d0 Q( B! p) p. n
        for (j = 0; j < i; j++)+ }2 d' W0 i" F: r/ {+ H
        {
; l- X: S7 }3 M# U                USART1_SendChar(buf[j]);5 I, a% n6 g1 }! _3 @
        }; B% p- A8 U6 K0 c
}7 P: `. R* W  Q( j1 {1 s% u
, }0 R2 j6 D1 r+ U) R" A
  q7 N- W5 C) \$ g7 B2 O, A
将上述两个文件添加进 Keil 工程:Project.uvprojx → Hardware 组已加入 USART.c/.h(如未加入,请在工程里右键组名 → Add Existing Files…)。3 n+ C; A$ R% e' m, }  L! e/ h; c

/ b% |2 j( W. Z" O3 |3. 硬件连接
8 |) _9 x/ O/ F# dPA9 → USB 转串口模块 RX(注意是对接到对方的 RX)
9 l" Z; F9 W" q$ H- K; J, a/ VPA10 ← USB 转串口模块 TX(如仅发送可不接)
5 r0 N% e2 g, L7 m8 [; h: vGND ↔ GND 共地
- x9 V, z9 `" Z2 g串口工具设置:波特率 115200,8-N-1,无流控。
9 T$ K5 n' K/ W/ u* F
4 S. X" z* O: Q' o2 |( @% S" {4. 在 main 中初始化与发送
& ~- R" S/ @. E# d) G/ N在 User/main.c 中包含头文件并初始化串口,同时将距离通过串口发送到 PC。/ [- q4 D1 m3 A0 P4 y

7 `# O5 G8 Z( n8 k* @#include "stm32f10x.h"                  // Device header5 L. z1 r. o. J; D+ G
#include "Delay.h"0 Q2 B' s/ D* v+ K1 z
#include "OLED.h"
& n. @( N9 w/ p# B% L% b& Z- n#include "ultrasonic.h"# G! D. A- N1 K1 `% J1 {8 y
#include "USART.h"
( R# h5 {) w3 }8 s3 _# {) g; w
0 Z! u. @/ j& L/ \int main(void). D$ `+ D# ]( D) M: i9 o
{7 [1 R; Y9 f5 w. @& B/ I& K6 C
        /*模块初始化*/
, K( t. S9 Y9 U4 G  k9 G  r        OLED_Init();                //OLED初始化: F# a) c/ l- N) H- P- |- E# X" t- P
        Ultrasonic_Init();        //超声波初始化
0 F6 Z) F1 @: q, n+ e+ Z        USART1_Init(115200);        //串口初始化(115200 8N1)
" {3 G# x& k$ S2 y2 p/ z      
  n# P# B1 |3 N* n5 R* t3 \        /*OLED显示*/7 a3 ]" v6 {2 q  }! {7 [: P
        OLED_Clear();
& ?$ Y3 G' z. {9 `- C        OLED_ShowString(1, 1, "Ultrasonic:");2 K1 s7 k0 [9 ?  q( o
      
, N3 H0 O( {% X: k5 M        while (1)
% N* X5 l0 b' ?, e' z* @% r9 ?) h, X        {
8 f( h+ [4 b5 X* I; |* j; \! o                float dist_cm = UltrasonicGetLength();
& x- X# T6 L2 I8 K                OLED_ShowString(2, 1, "Dist(cm):     ");
6 m' ?) e/ T& T. m                {# N( D- ?! o. `$ L4 @
                        uint32_t d10 = (uint32_t)(dist_cm * 10.0f + 0.5f); // 四舍五入到一位小数& |3 A, X( f. Q# |# Z  t5 l) @0 \
                        uint32_t intPart = d10 / 10;
+ U0 \( x; ?4 w" Z" \$ u! r3 o                        uint32_t fracPart = d10 % 10;
/ y/ q# {9 ]5 H; Q: y                        OLED_ShowNum(2, 11, intPart, 4);
9 p9 ~+ z) ]% K) p6 K+ u                        OLED_ShowChar(2, 15, '.');9 [7 Z% L" g5 E! {% {0 Y
                        OLED_ShowNum(2, 16, fracPart, 1);: l# k3 b: X; c$ I# x. @: y8 L; J
                        // 串口输出:如 123.4cm\r\n
% l4 o, L$ x* S                        USART1_SendString("dist=");
: C4 t# k) @( |* m- g% A7 W2 K9 ?9 L                        USART1_SendNumber(intPart);- a6 L% `" C, S
                        USART1_SendChar('.');
9 O+ m/ L. j+ R' E+ |                        USART1_SendNumber(fracPart);
8 r, z; U4 b2 X4 t3 G' V3 S& y6 t+ J                        USART1_SendString("cm\r\n");/ h' g3 U; g9 ~3 D% t2 Y7 f) t
                }! X" e& I) j) o: N( P
                Delay_ms(200);% B& D, k5 B' s/ F
        }2 }0 G: o5 j# M; `! m$ k
}
; x; a: O* P1 E6 }) O8 Z" _/ H1 U5 z8 M
$ g8 o. S9 ^  ~/ S" W
+ f6 S/ `/ b0 j1 F, s5 n* W) m& d- F' r3 d# k8 f  `
5. 常见问题与排错  O# Q5 g$ b1 O0 h
无法编译,提示 stm32f10x.h 找不到:' x+ ~3 z6 O: r' X' _' |" X3 \5 f
确认 Keil 工程 C/C++ Include Path 包含 ./Start; ./Library; ./User; ./System; ./Hardware。
0 R0 ~+ A+ U0 c$ z5 NUSART1_Init 等函数隐式声明:
4 k( n, l% T- s+ {1 A4 v确认 User/main.c 已包含 #include "USART.h"。
5 Z9 q7 @2 r) e电脑无数据:2 x4 o% y. Y9 F
检查波特率设置一致;检查 TX 线连接是否正确,GND 是否共地。
$ U9 E  q  |4 E7 [  @若只接 TX/GND,PC 只能接收;如需从 PC 发回 MCU,再接 RX。0 B5 u. \2 G2 y: o
波特率更改:; P# b. l! U7 K6 z- Z
将 USART1_Init(115200) 替换为所需值(如 9600),PC 工具一并修改。3 u6 R+ R$ t' j
6. 可选增强
; m# i1 w" \8 f: `$ v) {  W( k: Z- h增加 printf 重定向到 USART,便于调试。
! A: ?4 E" h6 S4 r8 ~) ]加环形缓冲区与中断接收,支持命令解析与上位机交互。
% R3 C  Q( \( M! _( h" r/ g采用 DMA 发送以降低占用。
9 ?+ @0 x& ^& U# K
赞 收藏 评论0 发布时间:2025-10-14 18:09

举报

0个回答

所属标签

相似技术帖

官网相关资源

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