一、专栏简介, E, Z% `: u [ 本专栏介绍如何利用库函数进行STM32单片机开发,主要针对的单片机型号为STM32F103ZET6。总结来说,“速成”体现在以下方面8 G0 N) ]6 b' \8 A& b • 在讲述基础知识后会有相应的实例或者模板程序 • 学习完后会有小项目练习5 f/ E1 V4 n6 i' l" i* V • 专栏基础知识部分内容精简,对于“速成”选手更加友好 其次专栏还有以下内容 • 简单介绍编程规范和程序架构 • 专栏不断更新一些外设的使用方法并提供例程 P3 U% ?" \ |5 j3 { 6 S5 U- ] Q- x, N4 m ) z0 b J) ]$ x5 S: e" q 二、前期准备 前期准备主要有物品以及相关软件的准备。首先是物品,单片机选用的是普中科技的一款核心板,主控芯片为STM32F102ZET6,是下面的样子7 e2 w/ ^. u' ?+ W- c5 f STM32F103ZET6 * D) @3 w2 z2 R3 t% ] 图片上是带有LCD屏幕排母的,有一种是不带的,因为本人开发时经常使用LCD,所以买了带排母的,在某宝和聚诚科技购买的,不带彩屏169RMB。学习过程中除了单片机以外还需要购买调试器,ST-LINK,用来下载程序和调试。USB转TTL(可以直接搜索TTL),用来做串口通信时使用,也可以用来下载程序,但是不可以调试。对于前期学习来讲,这些物品就足够啦。 X& f8 v: C" G& b: w 除了物品之外还需要提前准备一些软件和驱动。比如Keil5,CH340(串口驱动),ST-LINK的驱动,这些都是需要安装的。其他的类似于下载软件,串口调试助手都是不需要安装的,本人用的是普中科技提供的一些常用辅助开发软件,小伙伴们可以自己动手找一下,没有找到的话私信留一下邮箱,注明需要常用辅助开发软件,后续会邮件发送。, I2 {# X- |5 `# h/ ^# c5 ]# @0 r , B4 a9 v# @. ]7 x8 h 三、编程规范以及程序架构简介 1. 编程规范1 k/ z+ c* {. Q* U5 @' E1 b 对于新手来讲,编程规范以及代码架构也非常重要,有一个良好的编程规范和代码架构,可以提高开发效率,方便问题排查以及后续的程序维护。这里介绍的编程规范很简单,要求不严格。主要有以下几点 ' f% e8 M+ o: k) {* d7 t# t • 变量定义 变量定义时最好是能够体现该变量所属的外设模块,该变量是否为全局变量,静态变量或者指针变量。变量首字母小写,后面的单词首字母大写。举例如下 ' X( T* n, H# X1 N: p 5 l/ O' v3 c# a P
9 T. |2 P; f( E • 注释 函数注释举例如下$ U5 D2 q/ C% V$ Z- p& h! |2 [0 M
$ l* M2 z5 }' m5 ~( ~6 z8 \$ ? 对于程序语句注释,如果过长可以在程序上方加注释,如果不是很长可以在程序语句后面空三格输入注释。 3 w1 V% h& n7 w* L2 o ; Q1 [3 u6 B, Z • 函数命名 函数命名要体现函数所属的层级以及函数的功能,关于层级会在代码架构的部分详细说明,这里只说一下函数命名方式。( w5 p i6 N/ @7 g5 s
N- r" p0 G0 I6 A: z j 这里med指示该函数位于功能层,属于ADC模块,作用是读取AD值。1 @2 w3 }( M) K' W6 g4 M • if,while等语句的使用 使用if或者while等语句时,需要在括号前面加一个空格,如下
• 四则运算 四则运算符号前后需要加空格,包括等于号等符号。如下' E, J/ c+ r/ r( u3 ?$ N
* T* V* J8 W5 F9 G) Q+ U 2. 程序架构 该程序架构是本人在工作期间学习的,个人感觉还是有助于提高开发效率,方便后续维护的。主要思想是将一个模块的程序分成三部分,每一部分是一个新建的文件夹,下面都是其他模块相同层级的文件。 • Drv 驱动层 该层主要是写一些模块的初始化程序,例如GPIO的初始化,ADC的初始化等。( E N* t! X' r# b/ ]9 ]/ k* |* i: I • Med 功能层 该层主要是完成一些功能性的操作,比如读取AD值,点亮LED等。Med层的函数可以包含Drv层的函数。1 N" g5 n- H( L* [$ Y • App 业务层 该层主要是完成一些业务,比如在点亮LED的基础上实现流水灯,比如显示电压值等。 四、STM32F103ZET6简介 STM32F103ZET6是由意法半导体(ST)生产的一款单片机,32指32位。STM32也可以成为32位微处理器。STM32F103ZET6的主时钟频率为72MHz,512KB的FLASH,64KB的SRAM。常用到的有GPIO,中断,ADC,TMR,UART,DMA等。0 K$ b/ \4 f/ N5 X( B- z4 z 五、程序模板 在使用Keil5编程时,针对一个外设需要新建对应的.c和.h文件。这里以LED模块为例,简单介绍一下本人的常用模板 .c文件6 S2 U9 T0 U; x( `
需要注意的是一定要空出来一格,否则编译会报警告。 文件最后未空一行的警告 / N" B% \. c0 w2 Z9 k.h文件7 F* z6 p0 C C6 }0 A
.h文件最后也要空出一行,否则也会有警告。) ^$ }8 K7 Z5 G( D0 L; D ; L% y- U( y. j& h2 ?' g0 @ 新建完之后需要将这两个文件添加到工程中。 5 \% k( Z% t. S- K! M4 Q 对于.c文件,右键工程文件夹,选择“Manage Project Items”打开。' k4 _) |0 x4 W$ \, k 8 { O$ G/ Z+ Q4 e) F/ G 点击“Add Files”将新建的.c文件加入到对应的文件夹下。 6 b9 [3 O+ i7 P 4 ~: Z3 d# Y$ C7 B( l ^- {& A/ o# R 添加.c文件 % ]3 p. m) c# p8 V+ c 对于.h文件,点击魔术棒,选择“C/C++”,点击三个小点选择对应文件夹即可。 9 D/ x5 L: p$ M' y 添加.h文件 6 B, R+ n( D$ o; m0 ]- H六、ST-Link调试 在开发过程中学会使用Debug调试,能够帮助我们更快地定位问题。这里简单介绍一下利用ST-Link和普中核心板Debug调试方法。# Q/ m/ I+ H k7 S4 ?+ j . Q1 o. A" Y1 L: n9 O 6.1 硬件连接 首先将ST-Link与核心板连接起来,ST-Link的引脚如下 " c; N) J p% k7 G; x& y ST-Link引脚 & h+ S4 W1 B# l0 m( }5 p" |% V& l1 ]0 ?- n4 J 核心板上并没有给ST-Link预留单独的接口,而是跟JTAG一起。9 a' C4 x3 Z6 e7 L0 C9 ] 2 ?' m$ L) J& O7 e- F 其原理图和硬件图如下 $ C; ^. w% k& w' _2 F9 e9 E 7 |4 N; G. s m9 r5 `$ Z4 p- u JTAG原理图 2 N# z5 t% ~- i/ E$ A JTAG硬件图 / z; e9 y+ \# `$ [: H9 p" f" Z& k: W j! D! T7 n4 G1 T3 z - r$ s6 t0 b$ S4 E3 N1 Z1 ~ 由原理图可知,ST-Link的“SWCLK”连接核心板的“JTCK”,“SWDIO”连接核心板的“JTMS”,“RST”接“RESET”。 VCC不要接,接好ST-Link后再单独给核心板供电。% ~) v) n9 ~8 G2 o: ~; D . z; ~2 ^- F) F i, e7 | & H2 v9 v: I: p- V7 @# E, p& \" I 6.2 Keil配置0 V0 W: R; R: j3 `8 K, K 硬件连接好后开始配置Keil5,关于ST-Link驱动的安装这里就不再做介绍了。& ^5 L+ l: F; |" n) G $ e# w# ]' T3 z6 M1 F- ? • 首先确定ST-Link驱动是否正常0 x3 }, A5 Y- ?. Q7 s " `8 U; o: u& s, ]3 s 确认ST-Link驱动是否安装正常 ) Z+ t9 a. i7 n; i9 M* R+ W W; N% G I8 w& O: | 5 k z2 q' [4 L5 _6 E( [. l • 配置Debug 点击魔术棒,选择Debug,下图处选择“ST-Link Debugger”。 4 g* ^& S+ {1 v% k1 n }" ?+ o& Q4 w" r - H+ ]- O$ n, g& ]% _+ U Debug配置 ! D& j8 z6 T/ K/ j 然后再点击“Settings”,在“SWIO”右侧不显示“no target connected”就说明ST-Link连接正常。点击“Flash Download”' k( d+ }! J. O7 F 8 d& N2 o" U$ ?/ Z# E Flash Download $ i6 x2 H$ K9 b- k# a' o$ e1 T3 m4 G8 | 0 |9 K1 |5 d4 G 按照图示配置,“Programming Algorithm”只要选择符合芯片型号的即可,需要注意的是,只能保留一个。 2 Y. Q$ M+ ]1 n% F$ j+ @ . e6 t6 ^' |' w: k- K3 k- E0 c9 D Flash Download配置 ; j& C4 R# P1 S% V4 [, b 按照下图配置“Utilities”。: w. D! _7 o/ C# j - w& ], S3 p" O* n' u7 b 配置Utilities . T7 J: B( P& _1 H. v* ?* f- L6 R2 y K& C7 [. v) j; t 至此,Keil5关于ST-Link的内容配置完成,如果小伙伴遇到其他问题,可以多去看一些大佬们的博客。% L, F7 D) x6 O7 g0 } 8 K% Z% W$ U1 d' C 6.3 下载调试 配置完上面的内容后就可以使用ST-Link进行下载调试了。下载的话比较简单,编译完成后直接点击下图标注的图标,等到下载完成即可。( C2 s2 R6 s) C2 [& d3 Y / K2 }! p+ [$ z2 @' Y 下载程序 w& d7 k% c' y7 W" n, B: F" h* R$ v" q 调试时点击下图所示按钮,进入Debug调试。 ( Z9 w4 k, v1 X% A- Z$ k* o/ T 4 B- e( T9 `7 Q. ` o0 f E+ R 调试按钮 ( l& ^3 ~" E- @4 F+ c7 h1 D! a2 }! P! |3 U n. q 下面简单介绍一下调试窗口中各个按钮的作用,其他更加详细的介绍需要小伙伴自行搜索,这里参考了这篇大佬的文章KEIL5中Debug调试。 调试窗口按钮含义 ; R9 k4 v- Z5 \+ Z第一部分从左到右7 ]1 o* i) N0 M • 复位$ x# P( T1 b' I) L$ \ • 全速运行 • 停止 • 每点一次运行一行,遇到函数体会进入8 Z: h+ B( v0 M5 X! s+ M2 Z9 C$ J • 每点一次运行一行,遇到函数体不进入,直接执行完到下一行& t: _, ?, n1 H, a • 快速执行当前函数剩余语句,然后跳出该函数体,准备执行下一条$ C `" g$ J! a$ @* B7 R3 K • 直接运行到光标处2 j1 p/ f6 y6 H0 }8 t# c - o9 `3 r. X; A! _. u 第二部分从左到右! x- H$ l* F7 e • 设置当前光标处为断点 • 失能当前光标处断点; T9 z; F0 H- s, R6 k9 f • 失能全部断点# h2 d, ?% ~! [; J* t/ | • 删除全部断点 打断点的方法比较简单,直接在想要打断点的一行左侧点击一下,出现一个红点就表示已经添加了断点。断点的作用是能够让程序运行到断点处停止,有助于我们分析函数运行方式以及变量的变化。2 w1 A) [4 K6 H 断点示意图 * z' k1 e, u1 z) f2 }# {2 P 5 p+ f1 }0 t. _7 e; J+ [ 调试时可以查看某一个变量的值。选中想要查看的变量,右键8 P+ i, @9 ^" W) ?# T4 x % d# |- Y8 `% i8 o! F9 v 查看变量值 7 W* y* N, V B 9 Z. p: ~$ Q; c4 M此时就会出现一个窗口,能够查看该变量的值。 ' C- \1 P3 R% _+ N4 A' x- B( v 7 D9 {$ ]# J8 L! `: j9 [ 查看变量值 转载自: 二土电子 如有侵权请联系删除+ Q; r7 [1 G. A+ @" u/ |) d - ^1 x# k7 g( @0 D- }: a q |
【管管推荐】STM32经验分享篇
STM32固件库分享,超全系列整理
小马哥STM32F103开源小四轴RoboFly全部资料大放送
【MCU实战经验】+STM32F107的USB使用
基于STM32F103两轮平衡小车设计(开源)
STM32F107VCT6官方原理图和PCB
【福利】用STM32库的朋友有福了:STM32F10x_StdPeriph_Lib_V3.5.0chm...
基于STM32F10xx存储器和系统架构经验分享
基于STM32F1的CAN通信之BH1750
基于STM32F1的CAN通信之OLED