STM32入门之文件结构

发布者:GoldenEclipse最新更新时间:2025-01-02 来源: jianshu关键字:STM32  入门  文件结构 手机看文章 扫描二维码
随时随地手机看文章

本人在学习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?imageView2/2/w/1000

例如在实际开发中,比如这个点灯,我只使用了两个:


QQ截图20210414211754.png?imageView2/2/w/1000

USER

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


QQ截图20210414212446.png?imageView2/2/w/1000

这是点灯程序的文件目录,包括一个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?imageView2/2/w/1000


在单片机中实现精准的延时是非常重要的,这里我们参考了大神的延时方法:

#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定时器详解
下一篇:STM32代码的启动过程

小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved