关注 + 点赞 不错过精彩内容
大家好,我是硬核王同学,最近在做免费的嵌入式知识分享,帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作!
八、总结新建工程的顺序
1. 建立工程文件夹, Keil 中新建工程,选择型号
2. 工程文件夹里建立 Start 、 Library 、 User 等文件夹,复制固件库里面的文件到工程文件夹
一定要将需要的文件加入到工程文件夹里面来,不要添加工程文件夹外面的文件,否则文件一旦挪位置,工程就找不到文件了,保持工程的独立性
3. 工程里对应建立 Start 、 Library 、 User 等同名称的分组,然后将文件夹内的文件添加到工程分组里
这一步是为了方便管理keil的文件,因为keil里面无法直接添加文件夹
.h文件不参与编译,但主动添加进来为了方便查看
4. 工程选项, C/C++ , Include Paths 内声明所有包含头文件的文件夹
start、library等文件夹是自己建的,keil软件并不知道,所以要用自己文件夹里面的.h文件,就必须声明一下路径,最好是把所有自己建的文件夹都声明,这样就不会出现.h文件找不到的问题了
5. 工程选项, C/C++ , Define 内定义 USE_STDPERIPH_DRIVER
这是使用库函数的条件编译,使用库函数就必须定义这个
6. 工程选项, Debug ,下拉列表选择对应调试器, Settings , Flash Download 里勾选 Reset and Run
选择调试器下载的选项,选择STLINK那一项即可
九、工程架构
这部分建议看视频学习!
1.启动文件
首先 startup_xx.s 启动文件,这个是程序执行最基本的文件,也就是程序启动的第一个文件
keil中启动文件是用汇编写的,启动文件内部定义了中断向量表、中断服务函数等,中断服务函数中有一个复位中断,这是整个程序的入口
当STM32上电复位或者按下复位键时,程序就会进入复位中断函数的执行,复位中断函数主要做两件事情:一个是调用SystemInit函数,第二个是调用main函数,这部分代码对应启动文件这里:
程序到ENDP就结束了,事实上单片机由于while的循环程序永远不会结束,在启动文件中,首先跳转到SystemInit的函数就是定义在这个system_xx.c/.h文件里的
可以在keil中看到这个函数的定义,brief简介中写了函数的作用,是设置微控制处理器的启动,初始化嵌入式闪存接口、锁相环、更新系统内核的时钟变量,note部分写得是这个函数仅在复位后需要调用
在这个函数下面这些代码就是用来配置这些东西的,不需要修改,只需要知道在main函数之前,单片机已经执行了一堆东西了,帮把这个闪存接口、时钟等一系列杂碎的东西都配置好了
2.中断部分的执行逻辑
另外在启动文件中还定义了STM32所有的其他中断,这些中断达到条件后会自动执行
在启动文件下面这部,就是STM32其他的中断调用了 ,这个中断函数定义就是在stm32fx_it里面
打开stm32fx_it可以看到中断函数的定义
ST还建议我们将中断写在这个位置,当然我们还是习惯在哪里用就写在哪里
这些就是中断部分的执行逻辑了,另外可以自己定义一些用户文件,来封装一些模块来供主函数和模块中断调用,这有利于我们程序结构模块化,不然所有结构都堆在主函数里面,主函数会非常长
3.被动执行资源
以上是工程主动执行部分内容,剩下的是被动执行的东西了,相当于STM32的资源
在主函数或者中断函数里面就可以调用这些资源
右上角是stm32f10x.h和core_cm3.c / .h分别是外设寄存器描述 内核寄存器描述
打开文件stm32f10x.h和core_cm3.c / .h可以看到,代码中寄存器和寄存器每一位的名字和对应的地址信息,直接调用寄存器来使用STM32(有些麻烦),这就是寄存器的开发方式,这种方式有些弊端还比较麻烦
所以ST公司提供了库函数文件misc.c / .h、stm32f10x_adc.c / .h库函数
打开库文件可以看到,这每个外设都提供了一大堆的函数,这些函数封装了寄存器的操作,给我们提供更加人性化的函数调用方式,只要学会了操作套路,那配置一个外设就是很简单的,连手册都不需要看一眼
这个conf的文件就是用来配置头文件的包含关系的
打开stm32f10x_conf.h文件可以看到,conf文件include所有库函数的头文件
同时我们打开在stm32fx.h的最后,又包含了stm32f10x_conf.h,所以在使用这些库函数时只需要包括stm32f10x.h这一个头文件即可,就相当于包含了所有库函数的头文件,这样我们就可以任意调用库函数了
作 者 :硬核王同学
------- END------
关注公众号回复“加群”按规则加入技术交流群 回复“1024”查看更多内容