
7.1 Keil创建工程模板 在前面“C语言使用HAL库开发”章节里,体验了如何使用HAL快速开发。不同于使用汇编和寄存器开发,使用HAL库需要为工程准备许多相关文件,也就是创建HAL库的工程模板。工程模块没有统一的格式,通常是根据多年的开发经验和使用习惯总结出来的,以“5_程序源码\1_创建工程模板”为例,介绍如何一个工程模板是如何创建的。 如图 7.1.1 所示,一个工程包含五个文件夹,一个清理脚本,一个说明文本文件。. \' b5 q9 t( H/ D' [. n' H9 L& ` ![]() 图 7.1.1 工程模板文件夹 ; j& P" F. E* a4 W3 _. I5 ~5 U4 J3 W8 d1 ~ K7 i2 f4 v, T9 t7 Q4 n" o 各文件夹、文件说明如下: * k/ }6 t7 H! N) p Core:存放从SDK文件夹抽取的部分可能会修改的核心文件; Driver: 存放用户编写的外设驱动文件; L$ i: _( P1 X6 E; f Main: 存放主函数文件;& }6 ^; f9 C3 [- X; N 8 q2 M C4 D( {- X5 Z Project: 存放Keil工程文件,包含目标二进制文件; 0 i3 p3 V' J: B/ L! J SDK:存放CMSIS和HAL库; H" w, H( R4 s+ f1 o. E' v 5 h! e8 Y/ q a8 L Clean.bat:Windows脚本,用于清理Project里Keil生成的工程文件; 8 m1 L. j* a8 c M$ k) k& p, K Readme.txt:该工程的说明信息;2 g/ `9 U5 i$ v ; z( o/ Y8 N O3 v% l0 n “SDK”目录的内容来自配套资料“2_原厂资料\7.0_en.stm32cubef1(原厂固件包示例源码).zip”,即里面“Drivers”目录下的“CMSIS”和“STM32F1xx_HAL_Driver”。 “Core”目录的内容来自“CMSIS\Device\ST\STM32F1xx\Source\Templates\arm\startup_stm32f103xb.s”; “STM32Cube_FW_F1_V1.8.0\Projects\STM3210E_EVAL\Templates\”下的“Src\system_stm32f1xx.c”、“Src\stm32f1xx_it.c”、“Inc\stm32f1xx_it.h”、“Inc\stm32f1xx_hal_conf.h”;还需要手动创建“stm32f1xx_clk.c”和“stm32f1xx_clk.h”,这两个文件内容是一些时钟初始化,参考“1_工程模板”的工程代码。! b k1 h4 d) Y, L3 X3 k) f) [ + Q1 A4 L4 V" a) L+ Y/ d0 n “Driver”目录存放用户编写的外设驱动代码,比如LED灯驱动,这里示例不涉及外设,暂为空。 “Main”为存放主函数文件目录,创建“main.c”和“main.h” ,参考“1_工程模板”的工程代码。5 `' o' Z" q& s& D9 P0 W ( b N8 q# {* S) T' X “Project”用于存放工程文件,工程文件由创建Keil工程自动生成,这里打开Keil。9 |) R1 f. ~5 V9 p( h * o7 N8 V6 N3 P) | " C7 V4 a( c7 D) P) d& ?4 [ 打开Keil后,点击“Project”下的“New μVision Project”,如图 7.1.2 所示。: x- L) B4 j0 r# q8 ]% ^ ![]() 2 W, m4 m; I! p; O 图 7.1.2 创建Keil工程 / S$ h p0 S5 X" w8 S Q/ _; c5 o- O- a7 ]! Y Z3 x& F 随后在弹出的路径选择界面,选择“Project”目录,工程名字任意,假设这里为“Template”,如图 7.1.3所示。 ![]() 图 7.1.3 选择工程路径和设置工程名称 ; R& A b @9 y1 P: @' W+ g# C0 }" ~- }8 l' Z8 w$ T; e 接着在设备选择界面的搜索框输入“STM32F103C8”,然后选择“STM32F103C8”,点击“OK”,如图 7.1.14 所示。 2 G$ o2 d! F. U7 x ![]() 图 7.1.4 选择设备型号 ; }3 v2 a5 o8 |& i随后弹出运行时环境(Run-Time Environment,RTE),目前用不到,直接选择“Cancel”,如图 7.1.5所示。0 \) c* i% j0 l$ Z, `9 s. _7 c, I ![]() 图 7.1.5 管理RTE 接着进入主界面,点击“工程项目管理”按钮 ,为工程添加文件,如图 7.1.6 所示。 ![]() 图 7.1.6 工程项目管理按钮 9 f; H/ \3 ^5 n在工程项目管理界面,有三个窗口,分别是目标工程(Project Targets)、分组(Groups)、文件(Core)。双击“Project Targets”下的“Target 1”,可修改名字,这里改为“Template”,双击“Groups”下的“Source Groups 1”,改为“Core”,如图 7.1.7 所示。 H8 B3 k- A' ? 6 X% C+ b" ^/ i! ^# |: W/ l2 p ![]() T; I5 j# ~3 U) u 图 7.1.7 工程项目管理界面 $ C. O( H) F) b5 H. |0 W) c接着选中“Core”,点击“Add Files…”,接着在弹出的文件选择界面,进入“Core”目录,然后需要修改“文件类型”下拉选择框为“All files(*.*)”,才能看到所有文件,如图 7.1.8 所示。! M1 D/ I/ A6 P' H: v; A: \ ![]() 图 7.1.8 选择所有文件类型 然后选中“startup_stm32f103xb.s”,点击“Add”,如此循环直至如图 7.1.9所示的五个文件全部加入“Core”。 ![]() 图 7.1.9 选择加入Core的文件 4 Q9 d t! ~0 G6 w 再点击“Groups”的 新建图标,创建一个新的组,名为“Main”,如图 7.1.10 所示。; E. c6 e' t- [+ y 4 @7 @2 {! R$ b' p% J" m ![]() 2 v; ^# F! ^; `7 |1 X 图 7.1.10 创建新组Main 3 Y/ w* E3 k& I5 P1 a接着选中“Main”组后,点击“Add Files…”,选中“main.c”,再点击“Add”,如图 7.1.11 所示。 ![]() 图 7.1.11 选择加入Main的文件 $ U/ F& }# J2 R# T1 R. x5 C再点击“Groups”的 新建图标,创建一个新的组,名为“Driver”,该组没有文件,无需添加。再新建“SDK”,加入“SDK\STM32F1xx_HAL_Driver\Src”下的几个必须文件,如图 7.1.12 所示。 + w: |% T. _# D ![]() 图 7.1.12 选择加入Src的文件 所有文件添加完成后,效果如图 7.1.13 所示。 4 r; h# q7 Y, w6 E) ^6 r5 v) B+ ]7 [ ![]() 1 Z5 ^" ]$ j; N1 O& E% P$ U 图 7.1.13 工程添加后各目录效果 & \$ b o9 @; x9 |按上图添加完后,点击“OK”保存,如图 7.1.14 所示。, P, v; _8 q; @, ` & c b) ?' K$ E ![]() 2 N* S; w; ~& b1 }* s 图 7.1.14 添加完成 5 ?0 }9 g/ s, V2 Z4 e5 L+ Q接着进入主界面,点击“工程项目选项”按钮。: i7 O; R2 y* I/ B $ b# `& e! Q1 U: [$ ^; \ ![]() 2 A# x1 N: t; @# k 图 7.1.15 工程项目选项按钮 8 C! \5 Y5 b6 J3 W) ~) ]在弹出的窗口,选择“Target”标签,如图 7.1.16 所示。追求稳定,这里设置ARM交叉编译工具链为“Use default compiler version 5”。“Use MicroLIB”也可以勾选上,编译出来的文件占用资源会更小,也为后面调试串口实验提供printf。再下面是Flash和RAM的起始地址和大小,与前面图 6.1.4 所示的Flash和RAM是吻合的,这里无需修改。# e7 j8 ~( i: i; ^ ![]() $ \ a l" M. K o; |$ B8 ?7 N 图 7.1.16 Keil设置Target ! n; ^7 R! S, M+ U) Y6 }切换到“Output”,勾选上“Create HEX File”,生成hex文件供其它烧写工具使用,如图 7.1.17 所示。1 h$ B- i9 f! A$ N& x$ A6 I ![]() 图 7.1.17 Keil设置Output 6 X( V6 a0 A% g$ B5 _1 L1 p! L% j' W5 ^: B! E 再切换到“C/C++”标签,在“Define”栏填入“USE_HAL_DRIVER,STM32F103xB”,分别表示使用HAL库,使用的芯片型号系列。HAL库很多C语言语法采用C99标准,这里需要勾选上“C99 Mode”,不然会编译报错。最后点击“Include Paths”最右边的按钮 添加头文件,如图 7.1.18 所示。3 `; H' s' w/ C3 @0 w! m* h # v% J( K( Z; d7 W$ X 在弹出的文件夹设置窗口,点击 按钮,依次添加如图 7.1.19 所示路径,最后点击“OK”。 3 ]/ T7 O) \, f1 n5 P1 ]1 l$ ~) @ ![]() ! y' g& N6 h) r. N/ E+ `) b1 ] 图 7.1.18 Keil设置C/C++ ! N% s. w! Y1 q/ d% M3 S. U ![]() " u( T( A4 _' @6 T2 Z 图 7.1.19 添加头文件路径 ) W; l' Q G. q+ H2 M: {切换到“Debug”标签,我们使用的ST-Link,因此需要选择“ST-Link Debugger”,最后点击“OK”,如图 7.1.20 所示。0 e- Q! l/ d* _8 Y/ n& T " {# a! u0 P/ K: x% ~- p ![]() 2 }6 C3 D4 |! s$ v2 R3 G# w 图 7.1.20 Keil设置Debug ! H, M; _2 j+ ]$ `+ l\, U- A$ M1 O% \" \% W+ X' M; }% y7 g 以上全部设置完后,点击编译,编译完后,点击下载(这里需连接ST-Link才能点击下载,否则使用100ASK_STM32F103_Tools的自动下载),出现如图 7.1.21 所示的红色下划线提示,即表示编译、烧写都正常(当前工程主函数没有任何内容,开发板无任何现象)。之后便可以,以此工程为模板,编辑main.c,向“Driver”添加外设驱动程序,进行开发。7 y# a0 ^! y* k4 F m, @& N * v8 E+ d$ |# u( b7 c* T4 m: [ ![]() 6 }# r2 z( q( |& `9 K 图 7.1.21 编译、下载测试 ; f: K6 t W) e5 l5 `5 @3 P: z0 A; f: B 【总结】 工程模块的创建步骤如下: ! t9 C0 U6 \& a7 Y% [4 l1 ^ 1. 创建相关文件夹;( V) M; ]8 L3 a* i, n( t/ X2 S; b% R 7 N. C1 J+ d! r3 ?4 s 2. 复制CMSIS和HAL库;" e6 [# z: C4 e5 j# Y 3. 创建“main.c/h”和“stm32f1xx_clk.c/h”; * k$ S- P: z2 Q6 k( G2 A6 A 4. 创建新Keil工程;0 r5 h+ U+ @( H8 _ ' V3 C4 x1 n d/ o 5. 添加组文件夹和工程文件; 3 }4 F/ n0 Q' {/ c- ?& R7 ?/ m 6. 配置Keil设置 & u3 N- E, ]8 ^( A& b, p 7.2 Keil常用设置 除了上述基本设置外,还有一些设置可以方便日常使用。6 `0 {* ~. ]/ w* E+ t X/ _ F1 A8 H3 n6 Z8 |$ u$ V 1.2.1 下载后自动运行程序 Keil默认在下载程序后,需要手动按下开发板复位才能启动程序。通过修改修改配置,可以下载后自动复位重启运行程序,方便调试。' ?3 }: B# ]; e) Y$ Y4 F 点击“Optinos for Target…”按钮,切换到“Utilities”标签,点击“Settings”,如图 7.2.1 所示。! O. W; Z* x: |! I # G- O5 X1 O R' l e- l0 a2 Z ![]() 2 U/ f, q6 t) D$ Q. G6 O" [1 I 图 7.2.1 Keil设置Utilities % R+ }7 ]' C1 s/ }- K1 i/ d+ K9 q* m+ h. _" b7 o. s* | 随后弹出设置界面,切换到“Flash Download”标签,勾选上“Reset and Run”,如图 7.2.2 所示。接着再切换到“Pack”标签,去掉勾选“Enable”,如图 7.2.3 所示。 ! a$ f" g4 L: R" \& T ![]() ' P m; z- ^( J8 w2 P! W/ q, c 图 7.2.2 设置自动运行1 4 c0 T7 P/ j$ }0 V2 m( U![]() ! f' |/ g( s6 N0 K) W 图 7.2.3设置自动运行2 % k! a4 _. a2 a/ n* t8 ?+ d5 \4 q$ F" a, f 1.2.2 生成Bin文件 实际开发中,可能需要Bin格式的下载文件,而Keil默认不会生成Bin格式文件,需要进行相关配置。点击 按钮,切换到“User”标签,在“After Build/Rebuild”添加“fromelf --bin -o "$[url=mailto ![]() ( K% V. d2 L1 R( n ![]() % M! y: J+ u/ e4 E2 D, n4 q 图 7.2.4 设置生成bin文件 设置完成后,点击“OK”保存。重新编译整个工程,将在工程的“Project\Objects”目录下生成xx.bin文件(xx为工程名)。 , X0 O# t- l5 K6 d6 M6 b S9 \/ _: [. x( w 1.2.3 字体编码等设置 点击下图按钮,进入Keil设置界面,如图 7.2.5 所示。0 t( n8 W) f4 i% c1 _3 ^2 v k 5 ^( E% X( r' F% A' N ![]() 图 7.2.5 Keil设置界面 在“Editor”标签,字符编码选择“Chinese GB2312(Simplified)”,可以解决代码中中文注释乱码问题。在下方的“C/C++ Files:”的“Tab size:”设置为4,可以解决代码中缩进对齐问题,如图 7.2.6 所示。 ( Y) p2 m% E7 h/ c$ R ![]() 图 7.2.6 Keil设置Editor 然后切换到“Colors & Fonts”界面,选择“C/C++ Editor files”,可修改字体、数字、关键词等的字体样式、大小、颜色,如果没特殊需求,默认即可,如图 7.2.7 所示。2 P, o/ t @7 v2 b; F9 d ) }7 x. @0 A+ s% A# V ![]() ( l) C: ]6 u0 Y 图 7.2.7 Keil设置Colors&Fonts ( ]3 r9 W1 K6 E+ ]" P5 c9 ?; N# C$ r% f9 B/ W! w$ I 7.3 STM32CubeMX创建工程模板 STM32CubeMX是ST意法半导体推出的STM32系列芯片图形可视化配置工具,用户可以通过图形化向导为Cortex-M系列MCU生成初始化代码工程模板。 : z+ @; J+ E8 F7 q% z 相较于Keil创建工程模板,STM32CubeMX步骤少、上手快,但生成的工程模板比较臃肿,因此本小结只简单介绍下相关创建操作,后面的实验仍使用前面自定义创建工程模板。读者也无需纠结使用哪一种方法,以后熟悉后,自然知道修改哪些内容,在两种方式之间任意转换。4 ]6 ~1 z5 t( z8 n& K 从ST官网下载STM32CubeMX,解压、安装、打开。首次运行会自动下载更新文件,待更新完成,点击“ACCESS TO MCU SELECTOR”通过选择芯片创建工程,如图 7.3.1 所示。 5 J7 D' [! x6 r5 T0 ? ![]() 图 7.3.1 通过选择芯片创建工程 7 s! g% L6 U& y, b* r随后在搜索框输入“STM32F103C8”,右边选择“LQFP48”封装,最后点击“Start Project”,开始创建工程,如图 7.3.2 所示。0 l& {% ^% N" [4 `, a ![]() + x$ m5 ] s' f. m8 d+ b1 b% O 图 7.3.2 选择芯片型号 随后进入引脚配置界面,该界面可以图形化选择芯片引脚并配置,如图 7.3.3 所示,这里就不展开叙述,感兴趣的读者可以网上搜索下资料,比较简单。 ![]() $ U% \# d7 J, h W. _ 图 7.3.3 引脚配置 y8 ~$ @; B2 L" N点击“Clock Configuration”进入时钟配置界面,如图 7.3.4 所示,在该界面可以图形化的配置时钟来源、倍频、分频等,这里也不展开介绍。 ![]() 图 7.3.4 时钟配置 点击“Project Manager”进入工程管理界面,如图 7.3.5 所示,在该界面先设置工程名字,再设置导出目标IDE为“MDK-ARM”,版本默认V5.27。' K$ W' s1 S* ^6 X7 S* N ![]() * I8 X, t$ {: @5 Y7 \5 z1 ^/ y 图 7.3.5 工程管理界面 再点击“Code Generator”,勾选如图 7.3.6 所示,最后点击“GENERATE CODE”。 3 }3 q" p, h% _; `9 ]' G" u; ` V ![]() 图 7.3.6 设置生成代码样式 待代码生成完后,出现如图 7.3.7 所示提示,点击“Open Project”打开工程。 - O% d0 m! M' _7 k! I& {& J ![]() 图 7.3.7 打开工程 " x- K& T7 M5 G P" |# _: c! n" q' J . H7 v- R- L7 X' o 随后,将使用Keil自动打开工程,点击编译测试,编译成功,没有错误,如图 7.3.8 所示。以后用户只需要在“main()”里添加代码内容即可。 4 N$ D. }) e2 n ![]() ! b8 y) W0 Z% @, ~2 d) t; h 图 7.3.8 编译测试 4 ?$ X7 h1 E! u$ g5 g: l( [% S8 S6 L4 }9 n) R9 Q! P- M 【总结】 使用STM32CubeMX创建工程,非常的便利。但同时也限制了用户对工程的调整,代码内容、注释也臃肿。如果用户需要快速搭建工程环境,STM32CubeMX是一个非常不错的选择;如果想深入学习,根据自己的习惯优化,可先熟悉如何自定义创建工程模板,以后根据自己习惯调整。 作者:攻城狮子黄 1 p- k/ [! U; g 2 i. U; W# u0 W |
Keil下的STM32N6之RAM运行工程配置说明
【STM32MP257-DK】01开发板开箱、ST MPU 生态资源使用、环境搭建以及镜像更新
兔哥的初代M33【002】-H503Nucleo 内部flash操作
兔哥的杂谈【002】——如何性价比更高地去编译STM32
OpenBLT移植到STM32F405开发板
汇编浮点库qfplib移植STM32F769I-DISCO开发板与硬件浮点运算性能测试对比
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
FreeRTOS学习笔记2
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数