单片机
返回首页

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 (in Bytes) <0x0-0xFFFFFFFF:8>
; 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_Size

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,微秒级延时。


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 1瓦线性调频增强器

  • 12V 转 28V DC-DC 变换器(基于 LM2585)

  • 红外遥控音量控制

  • LM317过压保护

  • 12V转110V/220V 500W逆变器

  • DS1669数字电位器

    相关电子头条文章