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

基于STM32实例-用按键控制串口发送数据(文末附代码)

[复制链接]
STMCU小助手 发布时间:2021-9-14 13:42
实例介绍2 s# d) }# E$ u8 |; M
    视频中是实验效果:
" U. h8 c6 m8 O4 c    按下按键,串口调试助手接收区显示接收到的字符“1”,同时LED2亮一下表示发送成功。
0 f) O. U% K0 H% Z    开发板用的是STM32F03ZET6芯片。% x# t9 X  O* L; _) h' g1 [
# o) F# G& w3 i& d+ D0 C5 l! k

# }( |0 N, x! b' R, U    主函数main.c代码如下:
4 {! V1 M; F' m  ^

  1. 6 u9 O4 M6 h$ D8 N5 _9 E
  2. #include "SysTick.h"
    , V0 N$ W  v) z+ @! j
  3. #include "led.h"5 h5 e$ Y7 f* n6 r3 q1 m
  4. #include "key.h"
    # X( ]0 h1 d% r, O& G$ [
  5. #include "uart.h"
    ' x+ W2 ^( I, f5 ^9 h
  6. " Z" A7 b5 p$ W4 z0 S% X+ a) N
  7. 2 T/ y( g; T6 A9 Z1 f
  8. /*************************************************
    8 {% \9 W; \; B' ?: L1 X. P& B
  9. *函数名:主函数
    ) w, G, j) p, h7 ^
  10. *函数功能:按下按键KEY_UP,向串口发送字符1
    2 n: i& e3 s, O) m' T% C8 q# R
  11. *输入:无; A  s6 [# `: x' x/ T
  12. *输出:无
    : f% e7 n) p& B7 o4 N2 X7 t+ r
  13. **************************************************/
    0 R. O8 C( h9 ~5 U' M7 z

  14. - ^7 o8 c9 }( c2 C( U/ E  j/ N
  15. int main()) w7 j3 a9 @' ^" y, B$ s/ _- S2 K
  16. {
    ) W* g$ M# A) P$ f9 z' N' n) @6 i
  17.   SysTick_Init(72);                 //初始化延时函数  K* c* Z* c# h, u
  18.   LED_Init();                       //初始化LED            0 S( q9 I7 E! b
  19.   KEY_Init();                       //初始化按键
    / N  b# B% ~) m5 j, V4 y' p
  20.   USART1_Init(9600);                //初始化串口1,波特率9600, W6 H. u& P( N( t- G8 p, O' [

  21. 1 t7 J, _! A% J! D! b

  22. 4 T. _, {9 q' G  Z
  23.   while(1)
    # L8 C6 H" c9 ~3 [- S
  24.   {4 P* w: G" g8 l& @+ X2 w: @
  25.     if(K_UP == 1)                     //判断上按键是否按下
    & X- U8 `9 \% ?% s
  26.     {( d. \5 S5 s$ B6 s- Y% T
  27.       delay_ms(20);                   //按键消抖1 f4 W& M% u  s) Z
  28.       if(K_UP == 1)
    % `5 W9 Z0 g$ f3 \  }
  29.       {/ K0 W5 r7 Q* N2 t0 Y1 V
  30.         USART_SendData(USART1,'1');   //发送字符1
    * N9 n7 Q& o9 {( L
  31.         led2=0;                       //led2亮,表示发送成功6 M" L' u+ C/ o8 T& r
  32.         delay_ms(500);: _/ S" G) U- o9 B! {5 D
  33.       }1 D, F: E( j3 T3 H- v& k7 [
  34.     }2 O2 w- n/ K( I5 R5 z  Z: c' t
  35.     led2=1;                           //led2灭
    3 w; k' c; w5 _& l7 |# x
  36.   }+ Y/ g( ~2 p- v* V1 V" P6 j
  37. }
复制代码
4 ]$ \8 R4 C5 L+ v3 m8 p" _
, Q5 k+ n! |  Y. \% Y/ |! }
从主函数可以看出,首先对外设初始化。& `7 B6 m! k0 ?
4 [4 M& d7 d0 f! U& t
7 w5 X5 M1 p0 B  a; w  j5 X
    while死循环中,判断按键按下之后,通过串口发送字符1到PC端的串口调试助手,同时LED2亮一下表示字符发送成功。
: K6 V9 J% H: x- B
3 n6 U7 h( U! `. @+ B& V

$ d6 w0 Z- f  V& z9 K/ r6 r0 F0 @; N2 Y" O报错分析
- A* V9 T& K" d# ?- r0 T* s9 A# P7 f3 E( i8 k$ T. T

2 l* N" q8 R. m5 ~6 }/ v    记录下我踩过的坑,以及解决的办法,希望对你能有帮助。5 Z. T, l& n- U- m* \
# p. |: o2 M4 p$ x2 ~

) O' ]" B/ h. }' V4 j% i- E    当时用的标准库开发,一顿操作猛如虎,敲完代码,点击Rebuild图片,好家伙报了5个Errors。- _; J7 a* j9 y
18.png
    之前没遇到过这种报错,网上搜一下只是得到了笼统的答案,没有具体指出如何操作。   
( B0 Q- w) ~* y+ X! S) X! G1 w6 k9 s! C3 h% r, S% y

; S7 ]% a# d& p; W    产生如下报错,原因是编译器没有找到XXX函数的定义。
3 k# u$ ^! Q6 B& l3 ~
  1. ) e/ i" t8 m6 v" b
  2. XXX.axf: Error: L6218E: Undefined symbol xxx (referred from xxxx.o).
复制代码
分为如下两种情况,我遇到的是第二种:
7 x- a9 e. [7 S/ k. w, }XXX函数的头文件没有包含进工程里面,检查下图Include Paths是否缺少XXX所在源文件(.c文件)的头文件路径。4 @6 \& N0 Y6 T
16.png
XXX函数所在的源文件没有加入到工程里面。检查了一下,发现工程中缺少stm32f10x_usart.c这个串口外设库文件,添加上就行了。% O; L7 l: n2 F1 W
17.png
总结+ i5 o- v1 W6 i" A# B
    有时候为了偷懒,把旧工程文件复制一份,在此基础上建新工程。但是,复制一时爽,修改火葬场,两个工程之间细微的差别可能会造成各种各样的报错。
8 ]3 ?/ n& F. a' P* a  @! b% Q( G3 T4 [

9 O5 A7 a3 w7 ]; Q4 m代码如下:
& P' x/ s7 B; W! b/ N- m( uhttps://pan.baidu.com/share/init?surl=AvGKZ6u4nL4mi8cEyY0s-g
6 t# `/ m' `2 C0 z提取码:
- u8 q1 B8 B8 vstm3
" l+ Z! c; E, j) ^4 y/ q
+ ]0 Y$ u6 d" x# h) N文章出处:STM32嵌入式开发' e5 @( n+ D% n& S5 h2 r7 k
  L) P( o& _  ?( {# O6 W' d0 I/ |/ {
赞 收藏 评论0 发布时间:2021-9-14 13:42

举报

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