STM32入门之文件结构
2025-01-02 来源:jianshu
本人在学习STM32过程中,主要使用的是B站洋桃电子的课程(之前使用过正点原子的视频,感觉不适合本人这种小白),因而其中许多代码借鉴(抄)了其课程,故在此说明。
文件树

stm32文件树
可以看到,该文件分为六大部分,不同人对其起名可能有出入,或者文件结构有略微区别。但其关键的几个部分及开发方式是基本相同的。
STARTUP
其中STARTUP是STM32的启动代码,用汇编语言编写。
我们正常在操作一款单片机的时候,都是从main函数开始进行编程的,但是单片机上电是从main函数开始执行的吗?答案当然是否定的,在main函数之前单片机最先执行的是硬件设置SP、PC然后是“启动文件”,一般主要是项目文件里面的startup_xxxxx.s文件。其实这个就是我们常说的Bootloader。
其实不光STM32系列单片机是这样,我们接触的NXP的微控制器、TI的MSP430以及51单片机等等其实都是有上述的启动文件的。启动文件负责的就是从单片机复位开始到main函数之前这段时间所需要进行的工作。我们一般很少接触启动文件的主要原因是开发环境往往给开发者自动的提供了这个启动文件,不需要我们再去操心,直接从main函数开始进行设计就可以了。
这里我们嵌入一些汇编代码(我也看不懂)在做单片机开发的时候,这一块不用改动
Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp ;Heap Configuration ; Heap_Size EQU 0x00000200 AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base Heap_Mem SPACE Heap_Size __heap_limit PRESERVE8 THUMB ; Vector Table Mapped to Address 0 at Reset AREA RESET, DATA, READONLY EXPORT __Vectors EXPORT __Vectors_End EXPORT __Vectors_SizeHeap Size (in Bytes) <0x0-0xFFFFFFFF:8> ;
CMSIS

CMSIS
这一块的.c文件有两个,分别是Arm Coxert-M3(单片机内核)和STM32F103系列的系统文件(官方提供文件,无需编写)
FWLB
即固件库
这部分是STM32的固件库文件,这个库就是“库函数版”的“库”,STM32有使用标准库版本开发的,有使用HAL库开发的,有使用LL库,也有使用寄存器版本的,当然,也有大佬使用自己写的库。
这部分可以根据自己项目需求添加或者删除,但是最基本的misc.c,gpio.c,rcc.c需要保留,如果项目中要用到SPI通信连接外设,则需添加spi对应的固件库。
以下是所有的固件库文件

QQ截图20210414211725.png
例如在实际开发中,比如这个点灯,我只使用了两个:

QQ截图20210414211754.png
USER
用户文件夹,用于编写工程中外设的源文件和头文件,以及main函数,这是单片机开发程序编写的主要文件。

QQ截图20210414212446.png
这是点灯程序的文件目录,包括一个main文件,一个系统的it.c文件,还有led灯外设,一个按键外设。
当然还有人将所有外设统一放置在一个HARDWARE文件下。
#include 'stm32f10x.h'
#include 'bsp_led.h'
#include 'bsp_key.h'
int main(void)
{
LED_GPIO_Config();
LED1_ON;
Key_GPIO_Config();
while(1)
{
if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON )
{
LED1_TOGGLE;
}
if( Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY_ON )
{
/*LED2·´×ª*/
LED2_TOGGLE;
}
}
}
在main.c文件中引用外设的头文件,即可调用相关函数进行编写。这里main函数主要是1通过扫描按键状态控制led灯反转。
DOC
即doc文档,负责对代码进行说明,不属于代码文件,主要是为了记录代码开发过程中的说明,便于阅读代码。
Basic
这一块主要放一些公用性极强的代码文件,比如sys.c,dalay.c(用于实现软件延时)

QQ截图20210414213608.png
在单片机中实现精准的延时是非常重要的,这里我们参考了大神的延时方法:
#define AHB_INPUT 72 void delay_us(u32 uS){
SysTick->LOAD=AHB_INPUT*uS;
SysTick->VAL=0x00;
SysTick->CTRL=0x00000005;
while(!(SysTick->CTRL&0x00010000));
SysTick->CTRL=0x00000004;}void delay_ms(u16 ms){
while( ms-- != 0){
delay_us(1000);
}}
void delay_s(u16 s){
while( s-- != 0){
delay_ms(1000);
}}通过对滴答定时器的操作实现了精准的s,ms,微秒级延时。
上一篇:入门单片机stm32定时器详解
下一篇:STM32代码的启动过程
- 意法半导体中国本地造STM32微控制器启动规模量产
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 基于机智云与STM32的智能拐杖安全监测系统在养老物联网中的应用
- 内置全栈安全,一站式满足CRA法案与IEC 62443标准——米尔STM32MP257核心板
- 如何用 STM32 FLASH 实现等效 100 万次擦写的 EEPROM 功能?
- 实战解析:通过一个小项目掌握STM32所有外设
- STM32学了两年半,却还是不会做项目
- 意法半导体推出最新STM32MP21微处理器,兼具高性价比、低功耗、高灵活性
- 基于STM32的矿井作业环境监测系统设计与实现
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 蓝牙信道探测技术原理与开发套件实践
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析
- Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策




