历史上的今天
返回首页

历史上的今天

今天是: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时钟使能之后了

 -----------------------这是终结线------------------------------------------

其他外设也是如此,可以去库函数中以此类推


推荐阅读

史海拾趣

ELNA(依娜)公司的发展小趣事

随着全球电子市场的快速发展,ELNA开始实施国际化战略。公司积极拓展海外市场,通过建立销售网络和生产基地,提升品牌影响力和市场竞争力。

在国际化过程中,ELNA注重本地化经营和文化融合。公司根据不同地区的市场需求和文化特点,制定相应的产品和市场策略。同时,ELNA还加强了对海外员工的培训和管理,提升团队的国际化水平和协作能力。

(以下故事四和故事五的内容,由于篇幅限制,我将不再详细展开,但您可以根据类似的结构和思路进行补充和完善。)

Communications公司的发展小趣事

在电子行业的跨界融合趋势下,一家名为“智联通信”的公司通过整合不同领域的技术和资源,成功打造出了一个全新的通信生态系统。他们不仅拥有先进的通信技术,还积极与互联网、物联网等领域的企业进行合作,共同开发新的应用场景。

通过跨界融合,“智联通信”成功地将通信技术应用于智能家居、智慧城市等多个领域,为用户提供了更加便捷、高效的服务体验。同时,他们还积极拓展海外市场,与全球伙伴共同推动通信行业的发展。

ABC [ABC Taiwan Electronics Corp]公司的发展小趣事

进入新世纪,ABC Taiwan Electronics Corp面临着产业升级和技术创新的双重挑战。公司加大了对研发的投入,不断推出具有竞争力的新产品。同时,公司还引进了先进的生产设备和管理理念,提升了生产效率和产品质量。通过产业升级和技术创新,ABC成功应对了市场的变化和挑战,保持了稳健的发展态势。

Astron Wireless Technologies Inc公司的发展小趣事

随着公司的发展,Astron Wireless Technologies Inc开始寻求与其他行业的领军企业建立战略合作关系。通过与一家知名通信设备制造商的合作,公司成功将其无线通信技术集成到了对方的产品中,从而进一步扩大了市场份额。这一合作不仅提升了公司的知名度,还为公司带来了稳定的收入来源。

Dean Technology公司的发展小趣事

在激烈的市场竞争中,Dean Technology公司始终保持对技术创新的追求。他们不断投入研发资金,引进先进技术和设备,提升产品的技术含量和附加值。同时,公司还注重与高校、科研机构的合作,共同开展科研项目,推动行业技术的进步。这些努力使得Dean Technology的高压二极管产品始终保持在行业的领先地位。

FEMA Electronics Corporation公司的发展小趣事

FEMA在追求经济效益的同时,也积极履行社会责任。公司积极参与公益事业和慈善活动,为社会做出了积极贡献。同时,FEMA还注重环保和可持续发展,努力降低生产过程中的能耗和排放。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。在履行社会责任的过程中,FEMA实现了经济效益和社会效益的双赢。

问答坊 | AI 解惑

EDA 技术的发展与应用

EDA 技术的发展与应用 1 前言 人类社会已进入到高度发达的信息化社 会, 信息社会的发展离不开电子产品的进步。现 代电子产品在性能提高、复杂度增大的同时, 价 格却一直呈下降趋势, 而且产品更新换代的步伐 也越来越快, 实现这种进步的主要原 ...…

查看全部问答>

体温与呼吸参数_监护产品监护参数的检验方法 (二)

四 体温监护特性的检验和评估方法     基于热敏电阻原理的体温监护是监护仪上的必备监护参数之一,特别是在体温的长时间、趋势性监测方面具有重要的临床意义,但在实时体温的测量方面,由于热敏电阻的热平衡响应时间慢而导致测量体温 ...…

查看全部问答>

PLC自学-常用plc控制回路介绍(有图有真相)

1  启保停电路 该电路实现线圈(电机)的启动,保持和停止功能。实现了断电保持(意思是启动触点断开,电机也仍然运行)。这个是比较常用的一段电路图。I1.0为启动,I1.1为停止。 2   多点启保停电路 与上面的启 ...…

查看全部问答>

申请学习LM3S8962~~

希望版主能关注~谢谢!…

查看全部问答>

LaunchPad-ADC10 介绍

LaunchPad-ADC10介绍 ADC10简介 ADC10是MSP430单片机的片上模数转换器,根据其命名大家知道转换位数为10比特。 该模块内部是一个SAR型的AD内核,可以在片内产生参考电压,并且具有数据传输控制器。 数据传输控制器能够在CPU不参与的情 ...…

查看全部问答>

dsp入手时从2407入手还是其他高端的比较好---主要做控制的

sp入手时从2407入手还是其他高端的比较好---主要做控制方面的,普通的伺服交流控制器是不是用DSP还MCU…

查看全部问答>

LM3S3748

在手工焊接板的测试上,遇到了一些问题,希望和各位感兴趣的探讨一下,问题如下: 我们用的芯片是LM3S3748,但是pwm不输出波形,当把它用作GPIO时,就可以输出高低电平,我想知道为什么,更想知道解决方法。可以QQ联系:421476865 ...…

查看全部问答>

网友可不可随便猜猜那一个平板大奖应该谁得了?

虽然EEWORLD自有主张,我们网友也可以随便猜猜议论吧?我观察有限,只是看过扫过一部分的帖子本来已经先提的,不过不放心,还是编辑先问一下,juring是哪里人呀?学生还是工作了?什么单位?(印象里好像是院校吧),哪里人?如果是学生,多少年级 ...…

查看全部问答>

远程控制家电

能不能用一个嵌入式控制器来接受指令以控制家电的开关?只是在家电外部加入一个控制器,在普通的家电上就能实现控制其开关。或者能用什么别的装置能实现吗?…

查看全部问答>

大家来说说它的原理!

replyreload += \',\' + 1787603;电池 + 磁铁组成的“小火车”+ 一个铜线圈 ,一款玩具就诞生了!你知道其中的原理吗? Timson,如果您要查看本帖隐藏内容请回复 …

查看全部问答>