历史上的今天
今天是:2025年02月23日(星期日)
2021年02月23日 | 从STM32F4的库函数分析如何实现点亮一个LED(点亮LED)(三)
2021-02-23 来源:eefocus
使用库函数点亮LED,不用我们自己去查看寄存器,方便我们的开发,但是库函数是怎样封装的呢?
int main(void)
{
//声明一个结构体变量
GPIO_InitTypeDef GPIO_InitStructure;
//使能GPIO外设时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
//定义一个结构体
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9 |GPIO_Pin_10;//连接LED的引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; //输出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz; //100MHz
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; //推挽
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOF,&GPIO_InitStructure);
delay_init(84);
while(1)
{
GPIO_SetBits(GPIOF,GPIO_Pin_9 |GPIO_Pin_10);
delay_ms(1000);
GPIO_ResetBits(GPIOF,GPIO_Pin_9 |GPIO_Pin_10);
delay_ms(1000);
}
}
一. 首先我们应该先从整体上了解内存地址分布,从0~0xFFFFFFFF,将其分成8个block,每个block为512M。

在block0中,比较关心的应该是flash,也就是我们存放代码的地方(应该可以说是二进制代码)。
在block1中,是SRAM,128KB。
在block2中,这个才是这里最关键要讲的,这里包含了APB1,APB2,其中有很多的外设如IIC,SPI,TIMER等,从图中,我们就可以看到该外设的总线的基地址。
二.先明确一点,我们通常是如何操作寄存器的。
*((uint32_t *)0x42024000)=0x00000001;
将一个数值将其强制装换为一个32位地址,然后就可以将其进行32位的存取操作
三.接下看看库函数中是如何封装的,以GPIOF为例
思路:先判断GPIO在那条总线上,然后找到其总线基地址,然后GPIOF的偏移量是多少
所以如下图可知,GPIOF在AHB1总线上,找到AHB1的总线地址,为0x40020000(上面图少个一个0,是4个字节)

在头文件stm32f4xx.h
总外设的基地址:

AHB1外设总线的基地址为:

因此,地址显而易见
0x40000000+0x00020000=0x40020000
接下来我们再找到GPIO的基地址:
在STM32F4xx中文参考手册中,我们可以找到这样的文字,看出它的偏移地址为0x00001400

因此GPIOF的基地址定义如下

四.寄存器结构体(我自己命名的,不知道有没有这种说法)
所谓寄存器结构体,就是将某种功能的寄存器,一起封装而成,以GPIOF为例
我们知道要操作一个IO口,要进行多种寄存器配置,所以库函数头文件stm32f4xx.h中,就有如下结构体

为什是要按照这个顺序排列呢,从下面几图就可以清楚看出来



封装之后这些寄存器就好控制了,但是现在和我们上面说的基地址有什么关系?自己刚看出来的时候,觉得巧妙
库函数中对其进行如下处理:

将以GPIOF_BASE为基地址转化为结构体指针 ,也就是说,该结构体以0x40021400为基地址,结构体中的寄存器进行4个字节偏移的偏移,然后进行操作,如下图所示
先将GPIOF指针传入,然后直接进行寄存器进行操作,库函数的寄存器封装到此为止


五.人性化结构体(这也是我自己这样叫的)
所谓人性化结构体,就是以我们正常人比较好理解的方式进行封装成结构体,如下

这种结构体我们一下就可以看出它是做什么的,怎么赋值的,所以人性化,
一般常见于,我们平常所要用的外设头文件中,所以该结构体在是stm32f4xx_gpio.h中(点到为止,该类结构体类似)
将该人性化结构体进行声明,定义之后,就可以将其传入库函数中,判断,拆解之后,直接用 寄存器结构体 操作底层寄存器,进行GPIO的初始化。

最后就可以进行GPIO的控制了,当然是在GPIOF时钟使能之后了
-----------------------这是终结线------------------------------------------
其他外设也是如此,可以去库函数中以此类推
上一篇:STM32F4之什么是SPI?
史海拾趣
|
EDA 技术的发展与应用 1 前言 人类社会已进入到高度发达的信息化社 会, 信息社会的发展离不开电子产品的进步。现 代电子产品在性能提高、复杂度增大的同时, 价 格却一直呈下降趋势, 而且产品更新换代的步伐 也越来越快, 实现这种进步的主要原 ...… 查看全部问答> |
|
四 体温监护特性的检验和评估方法 基于热敏电阻原理的体温监护是监护仪上的必备监护参数之一,特别是在体温的长时间、趋势性监测方面具有重要的临床意义,但在实时体温的测量方面,由于热敏电阻的热平衡响应时间慢而导致测量体温 ...… 查看全部问答> |
|
1 启保停电路 该电路实现线圈(电机)的启动,保持和停止功能。实现了断电保持(意思是启动触点断开,电机也仍然运行)。这个是比较常用的一段电路图。I1.0为启动,I1.1为停止。 2 多点启保停电路 与上面的启 ...… 查看全部问答> |
|
LaunchPad-ADC10介绍 ADC10简介 ADC10是MSP430单片机的片上模数转换器,根据其命名大家知道转换位数为10比特。 该模块内部是一个SAR型的AD内核,可以在片内产生参考电压,并且具有数据传输控制器。 数据传输控制器能够在CPU不参与的情 ...… 查看全部问答> |
|
虽然EEWORLD自有主张,我们网友也可以随便猜猜议论吧?我观察有限,只是看过扫过一部分的帖子本来已经先提的,不过不放心,还是编辑先问一下,juring是哪里人呀?学生还是工作了?什么单位?(印象里好像是院校吧),哪里人?如果是学生,多少年级 ...… 查看全部问答> |
|
replyreload += \',\' + 1787603;电池 + 磁铁组成的“小火车”+ 一个铜线圈 ,一款玩具就诞生了!你知道其中的原理吗? Timson,如果您要查看本帖隐藏内容请回复 … 查看全部问答> |




