keilMDK:如何新建工程
1 code磁盘结构
先在磁盘上把自己的代码目录结构搭好,然后再去keil中新建project工程;
1.1 code目录
1.1.1 .gitignore: *.crf >> #*.icf>>*.d>>*.o>>*.dep>>*.htm>>*.lnp>>*.lst>>*.sct>>*.dbgconf
1.2 mdk目录 :存放keilProject工程相关
1.3 xx.si4project:sourceInsight自己会创建,位置留着不用管;
2 keil project工程新建
新建的keil工程想要编译,keil都需要配置哪些信息告诉编译器编译规则呢?
2.1 project new
project >> new project >> 命名后保存在mdk目录中 >> 此时建立完成了keil5工程的框架;
2.2 project mapp
添加xx.c和xx.h文件给编译器编译链接;添加xx.s文件给汇编器编译链接;
2.2.1 target右键>>manage project items>>add group>>add file>>add xx.c
(未加入xx.c文件)Error: L6218E: Undefined symbol edidListDIP (referred from task_audiomain.o).
2.2.2 target右键>>manage project items>>add group>>add file>>add xx.s
2.2.3 target右键>>options for target >>C/C++>>Include Paths>>递归添加xx.h目录(keil不会递归查找);
(未加入xx.s文件) error: L6236E: No section matches selector - no section to be FIRST/LAST;
2.3 project macro
作为各类库和芯片的预处理补充,告诉编译器应该包含编译哪些xx.h文件,以USE_STDPERIPH_DRIVER代码举例;
F1标准库 :target右键 -> options for target -> C/C++ -> Define: < USE_STDPERIPH_DRIVER, STM32F10X_HD >;
F1HAL库 :target右键 -> options for target -> C/C++ -> Define: < USE_HAL_DRIVER, STM32F103xE >;
H7HAL库 :target右键 -> options for target -> C/C++ -> Define: < USE_HAL_DRIVER, STM32H743xx >;
2.3.1 以hal库举例
target右键>>options for target>>Device >> STM32F103RC >> 属于增强型系列 >>包含hal库增强型宏;
target右键 -> options for target -> C/C++ -> Define: < USE_HAL_DRIVER, STM32F103xE >;
/***stm32f10x.h line 8296***/ #ifdef USE_STDPERIPH_DRIVER #include "stm32f10x_conf.h" #endif /***stm32f10x_conf.h***/ /* Includes ------------------------------------------------------------------*/ /* Uncomment/Comment the line below to enable/disable peripheral header file inclusion */ #include "stm32f10x_adc.h" #include "stm32f10x_bkp.h" #include "stm32f10x_can.h" #include "stm32f10x_cec.h" #include "stm32f10x_crc.h" #include "stm32f10x_dac.h" #include "stm32f10x_dbgmcu.h" #include "stm32f10x_dma.h" #include "stm32f10x_exti.h" #include "stm32f10x_flash.h" #include "stm32f10x_fsmc.h" #include "stm32f10x_gpio.h" #include "stm32f10x_i2c.h" #include "stm32f10x_iwdg.h" #include "stm32f10x_pwr.h" #include "stm32f10x_rcc.h" #include "stm32f10x_rtc.h" #include "stm32f10x_sdio.h" #include "stm32f10x_spi.h" #include "stm32f10x_tim.h" #include "stm32f10x_usart.h" #include "stm32f10x_wwdg.h" #include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */
3 keil 编译包含
keil编译器在编译的时候又是如何使用加载的xx.c和xx.h编译代码的呢?
3.1 xx.c编译
将xx.c加入project结构目录下,keil编译时会编译project目录下的xx.c文件,为xx.c中的函数以函数名生成唯一的函数地址;
或者将xx.c以#include "xx.c"包含,keil编译时同样可以寻址到对应的xx.c文件;
3.2 xx.h检查
将xx.c内的函数声明写到xx.h中去,然后在xx.c内包含xx.h,编译器在编译的时候会检查函数地址一样的函数,它的变量是否一致;
目前实践后xx.h文件在编译过程中的唯一实际用处就是编译检查变量,这个作用实际没啥卵用;那为什么xx.h又那么常见呢?
xx.h的主要作用是像目录一样抽象代码结构,方便查阅理解;
比如将闭源代码的xx.h的函数接口提供给客户使用;比如将需要共享的数据结构放到xx.h文件中包含使用,便于结构一致和维护;
3.3 xx.h找不到报错
既然xx.h在编译中不起作用,那为什么有时候编译报错找不到的时候,包含一个xx.h就可以了呢?
有时候只要加xx.c到project结构目录下,不需要包含xx.h就可以查找到;因为函数在被调用时已经编译过了;
有时候不仅把xx.c加到project结构目录下,还需要包含xx.h才可以查找到;因为函数在被调用时还没编译过;
总结就是xx.c只要已经编译过了,包含不包含xx.h文件都可以被调用;等价于函数声明要写在main函数前的原因;
4 keil工程编译
实际使用时,我们不仅除了编译源码,还希望可以生成一些可以下载的bin或hex文件;那这些小配置又是如何配置的呢?
4.1 使能printf
target右键>>options for target>>Target>>√ use MicroLIB>> <stdio.h>fputc() 使能 >> printf();
4.2 生成xx.hex
target右键>>options for target>>output>>√ create HEX file;[Name of Executable]重命名xx.axf,间接命名xx.hex;
把Browse Infomation、Debug Infomation√去掉,编译速度才快20秒,不值得特地去;
4.3 生成xx.bin
target右键>>options for target>>user >>after build/rebuild>>√ Run #1>>User Command如下:
fromelf.exe --bin -o ../Release/USERAPP.bin "#L"
fromelf.exe为bin和hex的链接输出工具;输出相对路径为相对xx.uvprojx目录;"#L"是编译器宏,链接到当前项目的xx.axf作为输入;
5 软件仿真配置
[ 鸡肋的功能 ];
改天整理一下把,先放着;
3.1 target右键-> options for target -> Debug
->[• use simulator]
F1系列仿真配置: -> [左边的dialog DLL :DARMSTM.DLL ] [左边的parameter:-pSTM32F103ZE]
rtthread_cm3内核仿真: -> [左边的dialog DLL :DCM.DLL ] [左边的parameter:-pCM3]
修改配置软件仿真时使用的动态链接库dll,(为啥不用默认dll配置我也不晓得,大概有啥区别吧);
3.2 target右键-> options for target -> Target
把时钟改成软件仿真的时钟;可能需要修改,可能不需要,看代码是否配置sysclk;
3.3 菜单栏 debug-> start/stop debug session
右键需要仿真观察的变量,add '***' to.. ->LogicAnalyzer;然后仿真就可以了;
3.4 通过虚拟串口查看kei调试的串口
keil MDK 中使用虚拟串口调试串口 - Hiker天下 - 博客园 (cnblogs.com)
mode com1 115200,0,8,1 :设置计算机的com1口为串口,后面的数据为串口的配置参数;
assign com1 <s1in>s1out :<s1in>s1out表示是单片机的串口1,assign com1表示将串口映射到com1上;
3.5 KEIL5的GPIO仿真:(PORTA & 0X00000002)>>1:仿真输出portA的pin1引脚的值;
(PORTA & 0X00000004)>>2:仿真输出portA的pin2引脚的值;
6 STLink 下载仿真
[ 实用的功能 ];
6.1 target右键-> options for target -> Debug
->[• use ST-Link Debuger ] ;接着点击旁边的settings,对下载器进行设置;
在Debug中可以选择JTAG模式还是SW模式下载;Debug目录下的Download to flash应该是debug模式时决定是否下载到flash,;
在Flash Download中勾选program,verify,reset and run;下载完后如果程序没运行,排除是硬件问题,那就是这里没勾选的问题;
这个"***reset and run***"务必重视;多次bug积累出的"***";
6.2 STLINK固件安装
MDK自带的STlink驱动程序路径:D:\MDK5\installFile\ARM\STLink\USBDriver;dpinst_amd64.exe
点击安装就安装完了stlink的驱动程序了,然后回到前一页路径upgrade一下就完了;就可以使用STLINK下载了;
6.3 STLINK硬件仿真
点击菜单栏的debug按钮,进入debug模式 >> 将想查看的全局变量右键add to watch1 >> 点击run >> 即可查看全局变量状态;
通过查看全局变量的值来粗略判断代码是否正常运行,值是否如期待变化;也可以因此排查掉一些问题;
这个keil的STLINK仿真功能可能挺多功能的把;
7 STM32学习概览
* 学习STM32的时候需要参考什么资料呢?单片机的资料都比较杂,没法系统概括,主要资料如下:
1.1 F10XXX中文参考手册:包含寄存器的详细信息,技术参考手册;主要是各种外设的参考信息;
1.2 Cortex-M3 技术参考手册:关于Cortex-M3核心、SysTick定时器和NVIC的详细说明;
1.3 Cortex-M3 编程手册:关于Cortex-M3核心、SysTick定时器和NVIC等内核外设的详细说明;主要是内核功能的信息;
1.4 Cortex-M3 权威指南:对底层及ARM架构的分析,包含部分底层汇编说明;主要参考cortex-xx编程手册;
1.5 芯片数据手册:芯片功能框架图,地址映射,引脚复用,芯片型号的具体解释;
1.6 对于stm32相关的参考资料,在官网搜型号,然后点进去即可看到;cube的话直接搜cube,hal库和cmsis软件接口标准包含在STM32CubeH7中;
* 统一编程命名规范,变量为首字母小写的驼峰,函数为首字母大写的驼峰,常量大写,名词用下划线分割把;
* 各种外设的了解无非是首先了解该外设的时钟,时钟决定传输性能;
然后了解该外设的工作原理和配置原理;然后根据代码了解接口如何使用;
*外设使用
先看别人的例程,把代码移植之后跑起来或者看库函数,都有哪些函数使用了什么寄存器;
然后看中文参考手册的寄存器总结,然后再看原理框图;
然后总结一下源码;
外设用完之后要养成习惯关掉它,时钟使能之后要养成习惯关掉它,中断开启之后又养成习惯关掉它;
8 细分领域
车载,电机,物联网IoT;蓝牙,gsm,wifi,usb,can,zigbee,ad采集,伺服电机,看门狗,pwm
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器