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全弄一块,看个人习惯)

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

3、分组配置和魔术棒设置
同上文 STM32F4新建最小工程笔记 - 知乎 (zhihu.com),添加分组及文件。
打开魔术棒->C\C++,在Define添加USE_STDPERIPH_DRIVER(用英文逗号隔开),并添加头文件路径
(USE_STDPERIPH_DRIVER 为#include "stm32f4xx.h" 中定义,蓝色框)

至此,配置完成,但编译还会存在一些error,详情见下文
4、error分析及解决办法
(1)缺少main.h

添加图片注释,不超过 140 字(可选)
按上述工程配置编译后,出现上述报错,打开stm32f4xx_it.c,会发现ST官方给的文件里包含了main.h

解决办法:
参考链接:
解决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相关函数)

解决办法:可以在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进行库函数操作)

5.2代码详解
(1)GPIO时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
引脚是PE11,在总线AHB1上,所以是AHB1PeriphClockCmd函数,点f12跳转到定义,如下
两个参数:RCC_AHB1Periph引脚端口,NewState使能不使能

(2)GPIO结构体声明
GPIO_InitTypeDef GPIO_InitStructure;
一般官方习惯取名为GPIO_InitStructure,这个自己取名即可

然后是结构体参数赋值
选择输出模式:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

选择推挽模式:
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

选择引脚号11:
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;

选择无上下拉模式:
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

选择快速模式(50Mhz):
GPIO_InitStructure.GPIO_Speed = GPIO_Fast_Speed;

具体结构体的介绍可参考链接:
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);
完成上述,编译下载即可

浙公网安备 33010602011771号