1.工程文件创建
外部的文件夹要和工程文件对应,也就是外面创建好之后,里面也要对应添加;
首先是startup启动文件,这个是程序执行最基本的文件,keil中启动文件是用汇编写的,启动文件内定义了中断向量表,中断服务函数等。(操作系统的系统调用(用户态到内核态转换)也是通过中断来实现的)中断指令会转向执行对应的中断处理指令,这些指令再内核态下面;
这个中断函数中有个复位中断,这就是整个程序的入口,当stm32上电复位或者按下复位开关之后,程序就会进入复位中断函数执行。
复位函数中断就主要做了两件事情,第一个是调用SystemInit函数,
SystemInit函数就是定义在System_xx开头的.c里的,在keil里也可以看到这个函数的定义(在main函数之前,单片机就已经执行了一堆东西了,帮我们把闪存接口,时钟等一系列杂碎的东西都配置好了)。
第二个是调用main函数,然后程序就结束了。
另外在启动文件还定义了stm32所有的其他中断,这些中断达到触发条件后就会自执行。**其他中断函数的定义就是在stm32fx_it里面的。**以上就是中断部分的逻辑。
另外,你也可以自己定义一些用户文件,来封装一些模块供主程序和中断调用,有利于程序结构的模块化,要不然所有的程序都在主函数里,那主函数就太长了。
这个工程结构主动执行的部分就介绍完了
对应启动文件如下所示:
2.被动执行部分(工程架构右1图)
被动执行部分,相当于stm32的资源了,我们在主函数或者中断函数里,就可以调用这些资源,
右上角这两个stm32f10x.h和core_cm3这些文件就是外设和内核外设的寄存器描述,
在keil可以看到,都是寄存器和寄存器名字,还有地址信息等,如果直接调用这些寄存器来使用stm32,那就是寄存器的开发方式,很麻烦。
所以就提供了库函数文件,在keil中可以看到,这每个外设都提供了一大堆函数,这些函数封装了寄存器的操作,给我们提供更加人性化的函数调用方式。
所以在使用这些库函数时,**我们只需要包含stm32f10x.h这一个头文件,就相当于包含了所有的库函数头文件,**这样我们就可以任意地调用库函数了。