零基础STM32入门教程--04-工程文件分析

第6课 工程文件分析

打开工程文件目录显示如下:

根目录文件

  • Project.uvprojxKeil MDK工程主文件,保存编译配置、文件分组、芯片选型
  • Project.uvoptx:工程本地配置(调试器、窗口布局),换电脑可删除自动生成
  • Project.uvguix.han:用户界面布局,记录窗口位置,可删
  • keilkilll.bat:一键清理脚本,删除Output、Listings编译生成的中间文件

文件夹

Core(内核&芯片启动相关,来自CMSIS)

  • Core\Startup
    • startup_stm32f10x_md.s启动汇编文件,C8T6中容量芯片,复位入口、中断向量表
    • core_cm3.c/h:Cortex‑M3内核寄存器操作(NVIC等)
  • Core\System
    • stm32f10x.h:芯片寄存器总头文件
    • system_stm32f10x.c/h:系统时钟初始化,配置72MHz主频

Library(原版STM32F10x_StdPeriph_Driver V3.5.0)

  • inc:全部外设头文件 stm32f10x_gpio.hstm32f10x_usart.h......
  • src:外设驱动源码 .c,GPIO、USART、TIM、I2C等硬件底层函数

User(用户应用层,自己写业务代码)

  • main.c:主函数,业务逻辑写这里
  • stm32f10x_conf.h标准库配置头,裁剪需要哪些外设驱动,注释=不编译该驱动
  • stm32f10x_it.c/h中断服务函数文件,串口中断、定时器中断写在这里

Hardware(板级驱动,用户新增外设,示例Gpio目录)

放自己写的外设驱动,比如usartrs485、属于应用层硬件封装。

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.

相关推荐
lhbweilai2 小时前
FreeRTOS(事件组)
stm32·单片机·嵌入式硬件
szarron2 小时前
VNA6 便携式矢量网络分析仪:从入门到精通
数据库·嵌入式硬件·测试工具·5g·射频工程
恒锐丰科技韩生2 小时前
率能 SS8812T|8.2‑36V 双通道 H 桥电机驱动 ETSSOP28 带散热焊盘 打印机安防机器人专用
嵌入式硬件·硬件工程
210Brian2 小时前
STM32学习笔记(七)TIM定时中断(上)
笔记·stm32·学习
LCG元2 小时前
STM32 HAL 库串口 DMA + 空闲中断接收不定长数据:从原理到量产级稳定方案
stm32·单片机·嵌入式硬件
嵌入式阿蔡3 小时前
OTA 实战四:安全启动与固件签名(Secure Boot)—— 拒绝非法固件
网络·stm32·单片机·嵌入式硬件·嵌入式实时数据库
LCMICRO-133108477463 小时前
国产长芯微LP8628完全P2P替代AD8628,零漂移、单电源、输入输出轨到轨高精度运放
arm开发·嵌入式硬件·fpga开发·硬件工程·精密运放·ad8628
DevHub3 小时前
电视盒子刷 Armbian 教程:30 元旧盒子变 NAS 跑 Docker,200+ 机型可刷
linux·嵌入式硬件·docker·容器·开源·电视盒子
wuyk55512 小时前
4.树:一对多的层次数据结构
开发语言·数据结构·stm32·单片机