STMCU小助手
发布时间:2022-8-30 13:50
|
7.1 Keil创建工程模板 在前面“C语言使用HAL库开发”章节里,体验了如何使用HAL快速开发。不同于使用汇编和寄存器开发,使用HAL库需要为工程准备许多相关文件,也就是创建HAL库的工程模板。工程模块没有统一的格式,通常是根据多年的开发经验和使用习惯总结出来的,以“5_程序源码\1_创建工程模板”为例,介绍如何一个工程模板是如何创建的。 如图 7.1.1 所示,一个工程包含五个文件夹,一个清理脚本,一个说明文本文件。 6 w7 n' o! q3 X2 j, | V
5 ^. W3 Y5 H8 G' N+ O3 j# h& Z0 u 图 7.1.1 工程模板文件夹 各文件夹、文件说明如下: Core:存放从SDK文件夹抽取的部分可能会修改的核心文件;2 u" q( n6 j- z8 |1 e, ^) h ( \' G: n* V$ w7 k. [' e0 B Driver: 存放用户编写的外设驱动文件;2 J4 q) Y: J1 c: B8 _9 p- ]: {6 ?4 _ 4 s% L* |5 f# G' j/ G Main: 存放主函数文件;* F% g/ B; D$ i 7 N3 e m. k; r, d Project: 存放Keil工程文件,包含目标二进制文件;- {" s, N+ q& H7 ~6 S ) y+ G. y- z. f7 R SDK:存放CMSIS和HAL库;3 D! M0 {8 W% V$ ^& @* D Clean.bat:Windows脚本,用于清理Project里Keil生成的工程文件;$ _0 u3 @7 y& {: d* o/ D! h * m& c" n W2 }6 b8 s5 j. ^" c Readme.txt:该工程的说明信息; “SDK”目录的内容来自配套资料“2_原厂资料\7.0_en.stm32cubef1(原厂固件包示例源码).zip”,即里面“Drivers”目录下的“CMSIS”和“STM32F1xx_HAL_Driver”。4 {& H+ w) m) i+ g ' L/ a s$ i$ X2 F( D1 M, B l# T “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_工程模板”的工程代码。 1 X" j9 ]8 v2 f8 `' U$ K “Driver”目录存放用户编写的外设驱动代码,比如LED灯驱动,这里示例不涉及外设,暂为空。 4 U3 t& ~* q- r5 p “Main”为存放主函数文件目录,创建“main.c”和“main.h” ,参考“1_工程模板”的工程代码。 ) d$ j6 O7 y5 w “Project”用于存放工程文件,工程文件由创建Keil工程自动生成,这里打开Keil。 / U/ G8 A& M! e' j4 V8 r W+ w6 P 打开Keil后,点击“Project”下的“New μVision Project”,如图 7.1.2 所示。2 X, j/ g8 K. f7 O/ w1 t
! W% l0 Q1 M2 P0 N2 d! s- k 图 7.1.2 创建Keil工程 ; G2 K7 w9 S1 _; h, A0 F/ E. Z. {: l* }; q& `$ s' _ u' f 随后在弹出的路径选择界面,选择“Project”目录,工程名字任意,假设这里为“Template”,如图 7.1.3所示。
# n* m' J3 E2 K W* H1 q+ b! W 图 7.1.3 选择工程路径和设置工程名称 接着在设备选择界面的搜索框输入“STM32F103C8”,然后选择“STM32F103C8”,点击“OK”,如图 7.1.14 所示。 6 w% h& j" U M/ ]$ |9 r
8 ?# x) J+ E7 ]! e- ]+ y 图 7.1.4 选择设备型号 随后弹出运行时环境(Run-Time Environment,RTE),目前用不到,直接选择“Cancel”,如图 7.1.5所示。 G/ G @, g2 z+ G+ j1 L: c
图 7.1.5 管理RTE 9 K. _& h( B* t4 l0 g% e接着进入主界面,点击“工程项目管理”按钮 ,为工程添加文件,如图 7.1.6 所示。
图 7.1.6 工程项目管理按钮 在工程项目管理界面,有三个窗口,分别是目标工程(Project Targets)、分组(Groups)、文件(Core)。双击“Project Targets”下的“Target 1”,可修改名字,这里改为“Template”,双击“Groups”下的“Source Groups 1”,改为“Core”,如图 7.1.7 所示。 - W# L2 b6 ]$ ]% ^, N: i! z- ]
5 q: Z! }+ | Z 图 7.1.7 工程项目管理界面 % X. r4 T. t/ P6 h2 C接着选中“Core”,点击“Add Files…”,接着在弹出的文件选择界面,进入“Core”目录,然后需要修改“文件类型”下拉选择框为“All files(*.*)”,才能看到所有文件,如图 7.1.8 所示。" _( P, I* q, G+ b2 T1 W* Z: e
图 7.1.8 选择所有文件类型 5 l5 e' N8 t' B4 r/ u+ P2 y6 X X0 b4 O- d/ j# H, D4 B& [ 然后选中“startup_stm32f103xb.s”,点击“Add”,如此循环直至如图 7.1.9所示的五个文件全部加入“Core”。5 G9 }2 [( u7 M: B$ G) u
6 ]5 c: p$ Z0 f) G8 b! M 图 7.1.9 选择加入Core的文件 - o) ^$ V) O4 ~6 H& M再点击“Groups”的 新建图标,创建一个新的组,名为“Main”,如图 7.1.10 所示。
图 7.1.10 创建新组Main 接着选中“Main”组后,点击“Add Files…”,选中“main.c”,再点击“Add”,如图 7.1.11 所示。: c* O. w, G* c+ V$ G
2 I3 W; x1 F2 l- C L 图 7.1.11 选择加入Main的文件 3 m d7 U9 S1 E6 X! d8 a/ w3 Y% x' G再点击“Groups”的 新建图标,创建一个新的组,名为“Driver”,该组没有文件,无需添加。再新建“SDK”,加入“SDK\STM32F1xx_HAL_Driver\Src”下的几个必须文件,如图 7.1.12 所示。) J- `6 _5 ?, r- e# p+ g7 K + S' s! g* M% N5 U3 J2 ?/ D
1 l8 v* {# E9 R; }; K; l- I e; z" o 图 7.1.12 选择加入Src的文件 / }0 m6 Q; e! l0 [$ L7 L所有文件添加完成后,效果如图 7.1.13 所示。
图 7.1.13 工程添加后各目录效果 & P7 S' M' S% n( g按上图添加完后,点击“OK”保存,如图 7.1.14 所示。. y, u7 C1 f, J4 Q
图 7.1.14 添加完成 接着进入主界面,点击“工程项目选项”按钮。
图 7.1.15 工程项目选项按钮 # q* q$ r2 Y1 o( h: N# c在弹出的窗口,选择“Target”标签,如图 7.1.16 所示。追求稳定,这里设置ARM交叉编译工具链为“Use default compiler version 5”。“Use MicroLIB”也可以勾选上,编译出来的文件占用资源会更小,也为后面调试串口实验提供printf。再下面是Flash和RAM的起始地址和大小,与前面图 6.1.4 所示的Flash和RAM是吻合的,这里无需修改。' |% ?; ^& @" @
' R" r: H' I5 P$ i1 V4 E) d4 K l 图 7.1.16 Keil设置Target 9 d: O- X5 O+ |* N( Q$ `7 Y P切换到“Output”,勾选上“Create HEX File”,生成hex文件供其它烧写工具使用,如图 7.1.17 所示。
图 7.1.17 Keil设置Output ) N( I \- A3 q5 U p, E: q1 a' w% _9 c q; K5 o1 @' p/ m3 u 再切换到“C/C++”标签,在“Define”栏填入“USE_HAL_DRIVER,STM32F103xB”,分别表示使用HAL库,使用的芯片型号系列。HAL库很多C语言语法采用C99标准,这里需要勾选上“C99 Mode”,不然会编译报错。最后点击“Include Paths”最右边的按钮 添加头文件,如图 7.1.18 所示。4 `# c# ?- a3 X) t M+ B$ `4 _ 在弹出的文件夹设置窗口,点击 按钮,依次添加如图 7.1.19 所示路径,最后点击“OK”。! {, S* x# _, L+ Z2 b ; \' c- B$ S2 F9 f
图 7.1.18 Keil设置C/C++ / j$ f+ d: p1 p7 a- r3 A3 ?% T3 w- ? 5 M6 D& p# G9 U" B
: n5 X2 Z- h+ S- @' q 图 7.1.19 添加头文件路径 切换到“Debug”标签,我们使用的ST-Link,因此需要选择“ST-Link Debugger”,最后点击“OK”,如图 7.1.20 所示。' U& {& \( d4 N. B* i 5 S! p/ Y: a" a9 T. v
图 7.1.20 Keil设置Debug 以上全部设置完后,点击编译,编译完后,点击下载(这里需连接ST-Link才能点击下载,否则使用100ASK_STM32F103_Tools的自动下载),出现如图 7.1.21 所示的红色下划线提示,即表示编译、烧写都正常(当前工程主函数没有任何内容,开发板无任何现象)。之后便可以,以此工程为模板,编辑main.c,向“Driver”添加外设驱动程序,进行开发。
8 d6 `) y9 q% u2 Y3 E. P 图 7.1.21 编译、下载测试 + r8 I/ h! ^- n- w 【总结】3 Z, @* s* I) j8 m% r3 m1 A2 a* _ - e5 A3 ]3 k; _2 Y 工程模块的创建步骤如下: 1. 创建相关文件夹; / y; s% R( N. h3 m1 | 2. 复制CMSIS和HAL库; 3. 创建“main.c/h”和“stm32f1xx_clk.c/h”; 6 F! O9 _) J0 P" T( \ s! U 4. 创建新Keil工程;( r( \- L/ D$ A) R: \* r+ E2 A 5. 添加组文件夹和工程文件; 6. 配置Keil设置) v# C# A0 ^3 f! P 4 A8 C( D2 `. x% Y% Q, L 1 i! Z) \7 Z, z8 k 7.2 Keil常用设置3 a, v, I8 `: P9 A' l 除了上述基本设置外,还有一些设置可以方便日常使用。; e H0 l2 ]* Z' B # `0 Y2 R5 C- h6 G0 J2 h g 1.2.1 下载后自动运行程序 Keil默认在下载程序后,需要手动按下开发板复位才能启动程序。通过修改修改配置,可以下载后自动复位重启运行程序,方便调试。 点击“Optinos for Target…”按钮,切换到“Utilities”标签,点击“Settings”,如图 7.2.1 所示。- I) @( h" K# f2 _' ?- ~
0 w+ ]9 v7 A- u# X 图 7.2.1 Keil设置Utilities 3 |# ~3 e# T @' H7 K 随后弹出设置界面,切换到“Flash Download”标签,勾选上“Reset and Run”,如图 7.2.2 所示。接着再切换到“Pack”标签,去掉勾选“Enable”,如图 7.2.3 所示。 ! O4 b$ H: r: E# t* a+ v
图 7.2.2 设置自动运行1 4 l$ H+ w1 M A ^5 o- O9 G& s; F1 U
" Y( t' n; E4 T6 b 图 7.2.3设置自动运行2 ( M( D$ Z" v6 N, R8 T& X 1.2.2 生成Bin文件 实际开发中,可能需要Bin格式的下载文件,而Keil默认不会生成Bin格式文件,需要进行相关配置。点击 按钮,切换到“User”标签,在“After Build/Rebuild”添加“fromelf --bin -o "$[url=mailto @L.bin]L@L.bin[/url]" "#L"”,同时勾选“Run #1”,表示在编译完后,执行fromelf命令生成bin文件,如图 7.2.4 所示。
图 7.2.4 设置生成bin文件 设置完成后,点击“OK”保存。重新编译整个工程,将在工程的“Project\Objects”目录下生成xx.bin文件(xx为工程名)。4 ?( r9 s( v8 N, Z 1.2.3 字体编码等设置6 L$ I" Y$ R, Z( X 点击下图按钮,进入Keil设置界面,如图 7.2.5 所示。
6 r1 f; V4 {5 a2 u 图 7.2.5 Keil设置界面 在“Editor”标签,字符编码选择“Chinese GB2312(Simplified)”,可以解决代码中中文注释乱码问题。在下方的“C/C++ Files:”的“Tab size:”设置为4,可以解决代码中缩进对齐问题,如图 7.2.6 所示。
! q' q2 y% B# |5 m0 t: R' h 图 7.2.6 Keil设置Editor # \3 B0 A$ F' N: r- `. T5 K5 X" d然后切换到“Colors & Fonts”界面,选择“C/C++ Editor files”,可修改字体、数字、关键词等的字体样式、大小、颜色,如果没特殊需求,默认即可,如图 7.2.7 所示。& B/ y7 c: ^, K; L# m$ w. z
图 7.2.7 Keil设置Colors&Fonts ) V! t# u e) o+ V2 B7.3 STM32CubeMX创建工程模板 STM32CubeMX是ST意法半导体推出的STM32系列芯片图形可视化配置工具,用户可以通过图形化向导为Cortex-M系列MCU生成初始化代码工程模板。8 j3 W: C0 z- r& N0 D" q2 c 0 \- U; F* T; L3 f" z 相较于Keil创建工程模板,STM32CubeMX步骤少、上手快,但生成的工程模板比较臃肿,因此本小结只简单介绍下相关创建操作,后面的实验仍使用前面自定义创建工程模板。读者也无需纠结使用哪一种方法,以后熟悉后,自然知道修改哪些内容,在两种方式之间任意转换。 * Z9 j9 w1 e8 w/ V$ D) q" h 从ST官网下载STM32CubeMX,解压、安装、打开。首次运行会自动下载更新文件,待更新完成,点击“ACCESS TO MCU SELECTOR”通过选择芯片创建工程,如图 7.3.1 所示。 + H# c; y4 ?! ~8 U
) }2 ?( n' R7 \9 `" f- E 图 7.3.1 通过选择芯片创建工程 ' L$ E) M& s" S' i* P随后在搜索框输入“STM32F103C8”,右边选择“LQFP48”封装,最后点击“Start Project”,开始创建工程,如图 7.3.2 所示。3 V$ A& ^1 m" q1 x! L
D! ^& H/ v H( {' O 图 7.3.2 选择芯片型号 7 f- d4 W1 B$ L& c随后进入引脚配置界面,该界面可以图形化选择芯片引脚并配置,如图 7.3.3 所示,这里就不展开叙述,感兴趣的读者可以网上搜索下资料,比较简单。, M, d" z a5 j( H! w 0 B# { v! q% o3 R, T
" u0 `, C" Y. |% X' ]! u2 F/ T# z 图 7.3.3 引脚配置 点击“Clock Configuration”进入时钟配置界面,如图 7.3.4 所示,在该界面可以图形化的配置时钟来源、倍频、分频等,这里也不展开介绍。5 z: n' |8 ]4 T+ r! x ( P; t* V" B$ R B1 n. e
2 y8 C% n5 ~! @4 K/ K- Y% ^$ }9 s 图 7.3.4 时钟配置 点击“Project Manager”进入工程管理界面,如图 7.3.5 所示,在该界面先设置工程名字,再设置导出目标IDE为“MDK-ARM”,版本默认V5.27。2 E' e) X1 _& m4 I( g& `# f
+ y. r0 ]5 I) O# j' B 图 7.3.5 工程管理界面 再点击“Code Generator”,勾选如图 7.3.6 所示,最后点击“GENERATE CODE”。( w+ `& a) P5 x. I: N: x% ~ k " p! j$ E' _9 U: X3 y8 |
6 d3 m) p9 e r% d 图 7.3.6 设置生成代码样式 待代码生成完后,出现如图 7.3.7 所示提示,点击“Open Project”打开工程。" K# w4 E! Z) ?2 d0 X1 n% j e4 u( {& d" V
图 7.3.7 打开工程 ' J- x6 {$ X! I+ W/ A" v6 Q6 j& t9 Q. Z5 s$ }' Z7 }- i7 f3 d 9 P: a/ f/ D+ d! U 随后,将使用Keil自动打开工程,点击编译测试,编译成功,没有错误,如图 7.3.8 所示。以后用户只需要在“main()”里添加代码内容即可。/ L7 C8 Q2 O- N5 L, E9 J$ ? 9 f8 x* |$ T5 e# Z' c
) q5 O& U( t1 j0 m0 g" }/ k2 B4 Z: d 图 7.3.8 编译测试 & m5 O0 P4 c6 Z3 J% ?$ n! k$ Y* ]" {4 ^ T0 |/ t) M " J/ p5 u/ S* z- @. G 【总结】 使用STM32CubeMX创建工程,非常的便利。但同时也限制了用户对工程的调整,代码内容、注释也臃肿。如果用户需要快速搭建工程环境,STM32CubeMX是一个非常不错的选择;如果想深入学习,根据自己的习惯优化,可先熟悉如何自定义创建工程模板,以后根据自己习惯调整。 4 P9 D' n, `3 ~) ? z ; D \ I! M9 R+ w0 f& K5 i 作者:攻城狮子黄 % N/ ]/ b$ ~2 X: i 4 y* L2 G7 k7 Y, o |
《STM32CubeMX2 实战课程》学习笔记5+CubeMX2生成的Uart初始化代码中没有使能
《STM32CubeMX2 实战课程》学习笔记4+FreeRTOS中的SysTick错误及改正
使用stm32C542做的低功耗密码锁示例
《STM32CubeMX2 实战课程》学习笔记1+由MX2生成MDK5项目并打开
《STM32CubeMX2 实战课程》学习笔记3.+sleep/stop/standby低功耗模式的入口
《STM32CubeMX2 实战课程》学习笔记2+MX2生成的MDK5工程中添加已存在文件(*.c / *.h)
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
Keil-MDK 在线调试设置断点的高级用法
请教下STM32N6570 怎么把分辨率改成320x240并可以全屏显示
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
微信公众号
手机版