第6课 工程文件分析
打开工程文件目录显示如下:

根目录文件
Project.uvprojx:Keil MDK工程主文件,保存编译配置、文件分组、芯片选型Project.uvoptx:工程本地配置(调试器、窗口布局),换电脑可删除自动生成Project.uvguix.han:用户界面布局,记录窗口位置,可删keilkilll.bat:一键清理脚本,删除Output、Listings编译生成的中间文件
文件夹
Core(内核&芯片启动相关,来自CMSIS)
Core\Startupstartup_stm32f10x_md.s:启动汇编文件,C8T6中容量芯片,复位入口、中断向量表core_cm3.c/h:Cortex‑M3内核寄存器操作(NVIC等)
Core\Systemstm32f10x.h:芯片寄存器总头文件system_stm32f10x.c/h:系统时钟初始化,配置72MHz主频
Library(原版STM32F10x_StdPeriph_Driver V3.5.0)
inc:全部外设头文件stm32f10x_gpio.h、stm32f10x_usart.h......src:外设驱动源码.c,GPIO、USART、TIM、I2C等硬件底层函数
User(用户应用层,自己写业务代码)
main.c:主函数,业务逻辑写这里stm32f10x_conf.h:标准库配置头,裁剪需要哪些外设驱动,注释=不编译该驱动stm32f10x_it.c/h:中断服务函数文件,串口中断、定时器中断写在这里
Hardware(板级驱动,用户新增外设,示例Gpio目录)
放自己写的外设驱动,比如usart、rs485、属于应用层硬件封装。
Listings
编译输出:汇编lst、map文件,看内存占用、函数分布。
Output
编译输出:.hex、.axf,烧录用hex;axf用于在线调试。
DebugConfig
调试器配置文件,MDK调试相关。
Doc
文档文件夹,放手册、笔记,不参与编译。
初步有个大概认识就可以,后面会慢慢熟悉。这个工程文件是从哪里来的呢?当然是用ST官方资料(这个标准库:STM32F10x_StdPeriph_Lib_V3.5.0)里面组织的!重新建立一些目录分层,更符合实际工程使用。
程序的启动流程

打开startup_stm32f10x_md.s。扩展名是s不是c,这是一个汇编文件。文件名最后的md代表的是中容量,关于容量大小的问题在STM32F10xxx参考手册里面有介绍。
这个文件的最开始是设置堆栈,和中断向量表相关。初期不必关心。
这是复位后要执行的代码(前面会先执行堆栈初始化),先执行SystemInit后再执行__main。__main 是 Keil 库里面的入口函数,不是用户 main.c 的 main。
所以调用链完整链路:
复位 → 设置 SP 栈指针 → Reset_Handler → SystemInit() → __main → 你的 main.c 里面 main ()
在system_stm32f10x.c的212行里面是void SystemInit (void)函数,主要功能是设置时钟。
以上内容有个初步认识就可以,下面重点讲main.c里面的内容。
c
#include "stm32f10x.h"
int main(void)
{
GPIO_InitTypeDef gpio_init_struct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
gpio_init_struct.GPIO_Pin = GPIO_Pin_13;
gpio_init_struct.GPIO_Mode = GPIO_Mode_Out_PP;
gpio_init_struct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC,&gpio_init_struct);
//GPIO_SetBits(GPIOC,GPIO_Pin_13);//输出高电平 灯灭
GPIO_ResetBits(GPIOC,GPIO_Pin_13);//输出低电平 灯亮
while(1)
{
}
}
第一行 #include "stm32f10x.h"。包含stm32f10x.h文件,STM32F103 最核心的头文件,芯片所有寄存器、位定义、芯片型号宏全部在这里,是整个工程的基础。要开发stm32f10x单片机,这个文件一定要包含。
int main(void),main函数的定义。返回类型为int型,参数类型为空。
GPIO_InitTypeDef gpio_init_struct; 定义结构体变量,类型为 GPIO_InitTypeDef (GPIO 初始化结构体定义)。鼠标点击GPIO_InitTypeDef ,底色会有阴影,这里按下键盘下的F12就能找到定义。在stm32f10x_gpio.h文件100行左右。按"ctrl"+"-"号可以再回到main.c里面。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd表示外设时钟控制,GPIOC(后面再详细讲)是挂在APB2上面的,后面的ENABLE表示使能,也可以理解为启动。意思就是启动APB2总线上的GPIOC的时钟,因为板上有个LED灯是接在PC13.
要使用哪个端口(PA,PB,PC...),就要使用这个GPIO的时钟。可以理解没有时钟就没有能量来源。
gpio_init_struct.GPIO_Pin = GPIO_Pin_13;//因为是接到PC13,所以这里是GPIO_Pin_13
gpio_init_struct.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出模式
gpio_init_struct.GPIO_Speed = GPIO_Speed_2MHz;//速度
GPIO_Init(GPIOC,&gpio_init_struct); //初台化gpio_init_struct 结构体
//GPIO_SetBits(GPIOC,GPIO_Pin_13); // 设置PC13 输出高电平(3.3V) 灯灭
GPIO_ResetBits(GPIOC,GPIO_Pin_13); //设置PC13 输出高电平(0V)输出低电平 灯亮
下面的while(1){};是无限循环。
下节课详细介绍GPIO.