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

【经验分享】STM32实例-用按键控制串口发送数据

[复制链接]
STMCU小助手 发布时间:2022-6-9 10:18
实例介绍
    视频中是实验效果:
    按下按键,串口调试助手接收区显示接收到的字符“1”,同时LED2亮一下表示发送成功。
    开发板用的是STM32F03ZET6芯片。; N8 \5 I+ J( s
    主函数main.c代码如下:
  1. #include "SysTick.h"9 p1 e7 {" D1 [6 y) G
  2. #include "led.h"  c# E& g$ G) k
  3. #include "key.h"5 O5 l0 R* I1 G; J0 n. V
  4. #include "uart.h"
    ! F2 m5 C& w# J/ |
  5. + ~+ ~1 h, u" k2 k1 v4 l

  6. 7 W* |& d( K- g3 t5 ]) |; u$ [: k
  7. /*************************************************
    7 i& A0 Z4 G' i! }1 J
  8. *函数名:主函数; v1 V) S# a4 g6 Z
  9. *函数功能:按下按键KEY_UP,向串口发送字符1& e: l: @3 @- r
  10. *输入:无
    : I0 ~* l1 U" K3 _" `" H) y
  11. *输出:无9 W3 C/ X6 Q6 u5 [$ P, I
  12. **************************************************/
      J( j$ W  b6 S( V6 l9 C9 u- X# C4 A
  13. " z, c' C9 `. o8 |2 V7 L
  14. int main()0 C4 ?: Z& p" H( y6 x
  15. {+ b& C2 C! a, k6 S, |. t' B0 D
  16.   SysTick_Init(72);                 //初始化延时函数3 A1 n% V0 w; h9 u( I+ @% j
  17.   LED_Init();                       //初始化LED            
    4 v) _6 ~) y, {5 j: f
  18.   KEY_Init();                       //初始化按键
    . D. }( W; ?7 C; }) h
  19.   USART1_Init(9600);                //初始化串口1,波特率9600
    9 ?' I! U" N% j" }- `9 N
  20. % E$ ?5 }" M- v: U

  21. 4 t& y. H$ W/ ~/ g9 l
  22.   while(1)$ k( q8 x& j9 N1 x# t2 I, m" o
  23.   {/ Y. T$ U) @" L1 T2 z
  24.     if(K_UP == 1)                     //判断上按键是否按下
    * `1 l- a+ }0 c! a0 L' _, W
  25.     {
    , L& ^0 ?" z/ k3 o$ S: X9 d
  26.       delay_ms(20);                   //按键消抖1 V" T% A, b) ^  l( N* Q
  27.       if(K_UP == 1)
    . v  A$ _& N9 [; k' O
  28.       {0 x" ?) d1 I: W; r# B
  29.         USART_SendData(USART1,'1');   //发送字符16 [7 W5 U4 N4 M- Q- i
  30.         led2=0;                       //led2亮,表示发送成功
    , m' z" t  ?& b6 e' s
  31.         delay_ms(500);
    0 D7 U; N# ^3 D" Y3 {
  32.       }
    4 `0 `0 Y# D8 r0 }3 G. y# k1 T, n' p3 f
  33.     }! D$ U4 E; _. W9 r
  34.     led2=1;                           //led2灭0 ]; d! D' c, J5 D- D- m& i
  35.   }  f7 s. p9 s4 z, _$ a
  36. }
复制代码

" i% s8 y, O$ t1 ]
    从主函数可以看出,首先对外设初始化。, h$ A% j' g% J
    while死循环中,判断按键按下之后,通过串口发送字符1到PC端的串口调试助手,同时LED2亮一下表示字符发送成功。

% o" Y& Z( m4 h' _" A$ k
报错分析
; m2 m2 h% J1 ~9 U% E
    记录下我踩过的坑,以及解决的办法,希望对你能有帮助。$ f: ?/ t# M  _
    当时用的标准库开发,一顿操作猛如虎,敲完代码,点击Rebuild,好家伙报了5个Errors。
* v: v' U" N$ K' g
D~8A0_~K4TM]H7W_@KN@E_J.png

: [; L4 F8 L: Z% V" D) D: n. t$ {
    之前没遇到过这种报错,网上搜一下只是得到了笼统的答案,没有具体指出如何操作。   
    产生如下报错,原因是编译器没有找到XXX函数的定义。
  1. <font face="Tahoma"><font size="3"><font color="#000000">XXX.axf: Error: L6218E: Undefined symbol xxx (referred from xxxx.o).</font></font></font><b><font face="Tahoma"><font size="3"><font color="#000000">    </font></font></font></b>
复制代码
6 w) y2 k( e( w( v
分为如下两种情况,我遇到的是第二种:
  • XXX函数的头文件没有包含进工程里面,检查下图Include Paths是否缺少XXX所在源文件(.c文件)的头文件路径。

    3 w/ [: C3 E; Z3 b. {# q8 I9 y
FLK}WVW2MI$(53W6SK02J]U.png
  • XXX函数所在的源文件没有加入到工程里面。检查了一下,发现工程中缺少stm32f10x_usart.c这个串口外设库文件,添加上就行了。

    , [( @$ z$ k2 T3 X
M@RKI5IPC2X94T{(47(DWJ9.png
总结
    有时候为了偷懒,把旧工程文件复制一份,在此基础上建新工程。但是,复制一时爽,修改火葬场,两个工程之间细微的差别可能会造成各种各样的报错。
# [! a! T2 i% _% X
    获取完整工程代码请点击“阅读原文”,提取码stm3。如有任何问题,请加我微信hzplwbs咨询,也可以拉你入技术群交流。
! y# v# U& r- `3 A2 n& p+ A& a
* S7 C6 {  I% t+ }: T8 ~0 R
赞 收藏 评论0 发布时间:2022-6-9 10:18

举报

0个回答

所属标签

相似技术帖

官网相关资源

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