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

第6课 工程文件分析

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

根目录文件

  • Project.uvprojx:Keil 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.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.

相关推荐
索端阳4 分钟前
I.MX6ULL 裸机开发:LCD Framebuffer 与 RGB888 学习笔记
笔记·vscode·嵌入式硬件·学习
Amos zhang6 分钟前
AWTK 开发实践(三):AMT630HV100 SDK 移植调用链分析
单片机·嵌入式·awtk
数字新视界7 分钟前
国产动环系统技术原理与应用实践的深入剖析
嵌入式硬件·物联网·系统架构·机房管理·动力与环境监控系统
新思维软件33 分钟前
基于单片机的激光防盗报警器语音报警系统:STM32 激光围栏 + ESP32-CAM 图像留痕全链路实现
stm32·单片机·物联网·物联网开发
恶魔泡泡糖36 分钟前
stm32F103C8T6标准库串口接收之控制LED灯3
stm32·单片机·嵌入式硬件
新思维软件38 分钟前
基于无线传输的地衡系统:三节点 LoRa 组网与 MQTT 上云的分布式称重方案
分布式·stm32·单片机·嵌入式硬件·物联网·物联网开发
芯祥联1 小时前
STM32 上跑 MQTT 怎么选?嵌入式 MQTT 客户端 C 语言实现对比
c语言·stm32·单片机·嵌入式硬件·网络协议·开源·broker
Brilliantwxx10 小时前
【STM32】 NVIC 与 EXTI 中断 · 超详细源码级解析
stm32·单片机·嵌入式硬件
加载力科技11 小时前
硬盘咔咔响是坏盘信号!赶在数据丢失前克隆换盘:不重装系统、不丢文件
windows·嵌入式硬件·系统安全·策略模式·命令模式·硬盘
niuTaylor11 小时前
飞腾 FT-2000/4 Ubuntu 内存卡 / NVMe SSD 系统制作完整指南
linux·服务器·人工智能·驱动开发·单片机