本人在学习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?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代码的启动过程
- 热门资源推荐
- 热门放大器推荐
- Er3105Di 500Ma宽输入电压同步降压稳压器内部默认参数选择典型应用示意图
- 使用 LTC2377CMS-16、16 位、500ksps、低功耗 SAR ADC 的典型应用
- L7806C负输出电压电路的典型应用
- LT3959 的典型应用 - 具有 6A、40V 开关的宽输入电压范围升压/SEPIC/反相转换器
- LPS33W适配器板,标准DIL24插座
- 使用 Analog Devices 的 LT3470AIDDB 的参考设计
- MC33364通用输入电池充电器典型应用电路
- AM2G-2405SH30Z 5V 2W DC/DC 转换器的典型应用
- 用于电池测试解决方案的 ADP1972 降压或升压、PWM 控制器的典型应用
- LT1121IS8-3.3 5V 低压差稳压器的典型应用电路,用于具有关断的电池供电电源

非常经典的关于LLC的杨波博士论文
5962L0052401VPA

XC6406PP60DL






京公网安备 11010802033920号