STM32F4 基于标准库新建工程笔记

STM32F4 基于标准库新建工程笔记

笔记整理,有笔误还请看官指正,鄙人学识尚浅小小菜狗,看官勿喷

2024.9.30

书接上文 STM32F4新建最小工程笔记 - 知乎 (zhihu.com)

1、library文件夹

在基于寄存器的最小工程的基础上

在工程目录下新建library文件夹(存放固件包中的标准库函数文件)

固件库路径...\ST固件库F4-v1.80\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\STM32F4xx_StdPeriph_Driver

包含头文件inc和源文件src两个,把他们copy到新建library文件夹(可分inc和src俩文件,也可以.c和.h全弄一块,看个人习惯)

1

2、索引文件

将固件库中stm32f4xx_conf.h(库函数配置文件)、stm32f4xx_it.c&.h(中断定义文件)copy到user文件夹下

详见参考链接 stm32f10x_it.c、stm32f10x_it.h和stm32f10x_conf.h文件作用 - Chuck-Yue - 博客园 (cnblogs.com)

固件库路径...\ST固件库F4-v1.80\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Project\STM32F4xx_StdPeriph_Templates

2

3、分组配置和魔术棒设置

同上文 STM32F4新建最小工程笔记 - 知乎 (zhihu.com),添加分组及文件。

打开魔术棒->C\C++,在Define添加USE_STDPERIPH_DRIVER(用英文逗号隔开),并添加头文件路径

(USE_STDPERIPH_DRIVER 为#include "stm32f4xx.h" 中定义,蓝色框)

3

至此,配置完成,但编译还会存在一些error,详情见下文

4、error分析及解决办法

(1)缺少main.h

img

添加图片注释,不超过 140 字(可选)

按上述工程配置编译后,出现上述报错,打开stm32f4xx_it.c,会发现ST官方给的文件里包含了main.h

4

解决办法:

参考链接:

解决STM32F2系列工程提示缺少main.h问题_stm32缺少main.h-CSDN博客

解决Error:L6218E:Undefined symbol TimingDelay_Decrement (referred from stm32f2xx_it.o)问题-CSDN博客

(1)、删去或注释stm32f2xx_it.c中main.h,还要注释TimingDelay_Decrement等

(2)、添加main.h,ST官方模板在固件库如下路径

固件库路径...\ST固件库F4-v1.80\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Project\STM32F4xx_StdPeriph_Templates

添加后编译,报错依然在,原因是,ST官方给的main.h中声明了void TimingDelay_Decrement(void);

(延时delay相关函数)

5

解决办法:可以在main.c中,或者新建delay.c&.h文件,加入TimingDelay_Decrement函数

static __IO uint32_t uwTimingDelay;

void TimingDelay_Decrement(void)
{
  if (uwTimingDelay != 0x00)
  { 
    uwTimingDelay--;
  }
}
 

完成上述后,编译成功

2024.10.10补更,实操,点灯程序验证

5、点灯程序验证

5.1程序

硬件看上一篇介绍: STM32F4新建最小工程笔记 - 知乎 (zhihu.com)

程序如下(对led灯PE11进行库函数操作)

6

5.2代码详解

(1)GPIO时钟使能

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);

引脚是PE11,在总线AHB1上,所以是AHB1PeriphClockCmd函数,点f12跳转到定义,如下

两个参数:RCC_AHB1Periph引脚端口,NewState使能不使能

7

(2)GPIO结构体声明

GPIO_InitTypeDef GPIO_InitStructure;

一般官方习惯取名为GPIO_InitStructure,这个自己取名即可

8

然后是结构体参数赋值

选择输出模式:

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

9

选择推挽模式:

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

10

选择引脚号11:

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;	

11

选择无上下拉模式:

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

12

选择快速模式(50Mhz):

GPIO_InitStructure.GPIO_Speed = GPIO_Fast_Speed;

13

具体结构体的介绍可参考链接:

STM32-GPIO详解_stm32otype-CSDN博客

【STM32标准库】【基础知识】GPIO_stm32f4标准库对应pcout-CSDN博客

(3)GPIO初始化

GPIO_Init(GPIOE,&GPIO_InitStructure);

两个参数:GPIO引脚E,结构体的地址(注意前面要取地址&)

(4)GPIO引脚置高置低

GPIO_SetBits(GPIOE,GPIO_Pin_11);
GPIO_ResetBits(GPIOE,GPIO_Pin_11);

完成上述,编译下载即可

posted @ 2026-05-08 14:15  f12138  阅读(13)  评论(0)    收藏  举报