历史上的今天
返回首页

历史上的今天

今天是:2025年02月09日(星期日)

正在发生

2020年02月09日 | 基于STM32单片机流水灯控制中的GPIO_Init()函数解析

2020-02-09 来源:elecfans

学习STM32时,首先要熟悉流水灯例程,在这里就来分析流水灯中的GPIO_Init()函数

例如:流水灯例程中使用的端口是macLED1_GPIO_PORT=GPIOB,

控制的引脚是GPIO_Pin_0,

引脚的模式是GPIO_Mode_Out_PP(通用推挽输出),

引脚的速率是GPIO_Speed_50MHz,

用到的寄存器是CRL


将上述的引脚、模式、速率换算成32位的16进制,分别是:

1)控制的引脚是GPIO_Pin_0

换算成32位的16进制是:0x0000 0001

2)引脚的模式是GPIO_Mode_Out_PP(通用推挽输出)

换算成32位的16进制是:0x0000 0010

3)引脚的速率是GPIO_Speed_50MHz


换算成32位的16进制是:0x0000 0003

然后调用库函数GPIO_Init(),初始化GPIOB

GPIO_Init(macLED1_GPIO_PORT, &GPIO_InitStructure);

GPIO_Init()函数的定义如下:

基于STM32单片机流水灯控制中的GPIO_Init()函数解析

基于STM32单片机流水灯控制中的GPIO_Init()函数解析

GPIO Mode Configuration

currentmode=((uint32_t)GPIO_InitStruct-》GPIO_Mode)&((uint32_t)0x0F);

可以得出currentmode=0x0000 0010 & 0x0000 000F

=0x0000 0000

if ((((uint32_t)GPIO_InitStruct-》GPIO_Mode) & ((uint32_t)0x10)) != 0x00)

判断是否是输出模式,“是”,执行下面代码;“否”,不执行

如:0x0000 0010 & 0x0000 00010 !=0x 0000 0000

则执行下面语句

{

/* Output mode */

currentmode “= (uint32_t)GPIO_InitStruct-》GPIO_Speed;

可以得出currentmode=currentmode | 0x0000 0003=0x0000 0000

=0x0000 0003

}

GPIO CRL ConfiguraTIon

if(((uint32_t)GPIO_InitStruct-》GPIO_Pin&((uint32_t)0x00FF)) != 0x00)

判断是否是Pin0~Pin7引脚,“是”,执行下面代码;“否”,不执行

如:0x0000 0001 & 0x 0000 00FF != 0x0000 0000

则执行下面语句

{

tmpreg = GPIOx-》CRL;

备份原CRL寄存器的值

则是:tmpreg=0x4444 4444

for (pinpos = 0x00; pinpos 《 0x08; pinpos++)

{

pos = ((uint32_t)0x01) 《《 pinpos;

pos是0x0000 0001左移 pinpos 位得到的

如:pos=0x0000 0001 《《 0x00

= 0x0000 0001

为后面的if (currentpin == pos) 判断作准备

/* Get the port pins posiTIon */

currentpin = (GPIO_InitStruct-》GPIO_Pin) & pos;

可得currentpin= 0x0000 0001 & 0x0000 0001

=0x0000 0001

为后面的if (currentpin == pos) 判断作准备

if (currentpin == pos)

由上面得出的pos = 0x0000 0001

currentpin = 0x0000 0001

两者相等,则执行下面代码语句

{

pos = pinpos 《《 2;

可得pos= 0x0000 0000 《《 2

=0x 0000 0000

/* Clear the corresponding low control register bits */

pinmask = ((uint32_t)0x0F) 《《 pos;

可得pinmask=0x0000 000F 《《 0x0000 0000

= 0x0000 000F

tmpreg &= ~pinmask;

可得tmpreg= tmpreg & ~pinmask

= 0x4444 4444 & 0xFFFF FFF0

= 0x4444 4440

/* Write the mode configuraTIon in the corresponding bits */

tmpreg |= (currentmode 《《 pos);

首先,要知道currentmode 《《 pos = 0x0000 0003 《《 0x 0000 0000

= 0x 0000 0003

可得tmpreg= tmpreg | 0x0000 0003

= 0x4444 4440 & 0x0000 0003

= 0x4444 4443

/* Reset the corresponding ODR bit */

if (GPIO_InitStruct-》GPIO_Mode == GPIO_Mode_IPD)

判断是否为下拉输入模式

{

GPIOx-》BRR = (((uint32_t)0x01) 《《 pinpos);

}

else

{

/* Set the corresponding ODR bit */

if (GPIO_InitStruct-》GPIO_Mode == GPIO_Mode_IPU)

判断是否为上拉输入模式

{

GPIOx-》BSRR = (((uint32_t)0x01) 《《 pinpos);

}

}

结果,两种输入模式都不是,而是通用推挽输出,所以不执行

}

}

GPIOx-》CRL = tmpreg;

把前面处理后的暂存值写入到CRL寄存器之中

也就是GPIOx-》CRL= 0x4444 4443

}

最终,向GPIOB组的CRL寄存器写入一个值:

GPIOx-》CRL = 0x4444 4443

转换为二进制是:(0100 0100 0100 0100 0100 0100 0100 0011)B

因此,Pin0的控制值为(0011)B

下面是CRL寄存器的说明

基于STM32单片机流水灯控制中的GPIO_Init()函数解析

对比一下CRL寄存器的说明,Pin0的控制值正好可以把GPIO设置为符合我们输入参数要求的状态,即最大速率为50MHz的通用推挽输出模式。

推荐阅读

史海拾趣

中电熊猫(CEC)公司的发展小趣事

随着市场竞争的加剧和技术的不断发展,中电熊猫不断调整市场布局和战略方向。公司坚持开放联合的战略思路,善于搭建平台、取长补短、实现合作共赢。同时,中电熊猫还积极关注国内外市场动态和技术趋势,不断调整和优化产品结构和服务模式。通过这些努力,中电熊猫在保持市场领先地位的同时,也为行业的可持续发展做出了积极贡献。

蜂鸟无线公司的发展小趣事
为了减小PWM信号对电动机的干扰,可以在PWM信号输出端加入滤波电路,使输出电压更加平稳。
Deltron公司的发展小趣事

随着国内市场的不断饱和,Deltron公司开始积极拓展国际市场。通过参加国际展览、与国外企业建立合作关系、设立海外分支机构等方式,Deltron逐渐打开了国际市场的大门。其优质的产品和服务得到了国际客户的认可,为公司的发展注入了新的活力。

Aleph America Corporation公司的发展小趣事

在追求经济效益的同时,Deltron公司始终关注环境保护和可持续发展。公司大力推行绿色生产理念,引进环保设备和技术,减少生产过程中的污染物排放。同时,公司还积极参与环保公益活动,提高员工和公众的环保意识。这些举措不仅提升了Deltron的品牌形象,也为公司的长期发展奠定了坚实基础。

EFINIX公司的发展小趣事

随着中国电子行业的快速发展,EFINIX公司看到了巨大的市场潜力。公司积极拓展中国市场,与中国本土企业展开合作,推动Quantum™可编程加速器技术和Trion FPGA产品在中国市场的应用。EFINIX公司的产品和服务得到了中国客户的广泛认可,为中国电子行业的发展做出了积极贡献。

Fong Ya Enterprise Co Ltd公司的发展小趣事

为了加速Quantum™可编程加速器技术的商业化进程,EFINIX公司与中芯国际集成电路制造有限公司展开合作。中芯国际是世界领先的集成电路晶圆代工企业之一,其先进的制造能力为EFINIX公司提供了强有力的支持。双方合作仅用了不到六个月的时间,就成功交付了首批Quantum™可编程加速器产品样本,创造了行业内的里程碑。

问答坊 | AI 解惑

AVR单片机应用系统开发典型实例

我们用的AVR系统,有一套教材 上传和大家分享咯…

查看全部问答>

各个管脚的含义

在下载程序时 cyclone II 各个管脚Q O S n代表什么含义呢 -%-278280-%-…

查看全部问答>

没有任何内存的复古磁带MP3

复古磁带又出现了!这次要介绍的是款磁带形式的 MP3,没错,它看起来很像是一个磁带,却是个 MP3。它的特色可是不为人知了,看外形与价格也知道,没有昂贵的LCD 屏幕,而且它还有一个秘密,就是没有存储,底部可以发现个 SD 槽,那就是要点所在,你 ...…

查看全部问答>

在串口调试工具上,用AT命令集打电话发短信的步骤是怎样的.

在串口调试工具上,用AT命令集打电话发短信的步骤是怎样的.…

查看全部问答>

没有DCD引脚,怎么样判断modem是否在线?

当modem处于在线数据模式(on-line data),不通过任何引脚的值,有什么方法可以判断modem还是在线的?…

查看全部问答>

关于Platform Builder 建立和模拟器的连接

请教一个问题:   我在Platform Builder 建立和模拟器的连接、下载运行时映像时,遇到下面的问题。   the specified  ce boot image couldnot  be  loaded.   your virtual machi ...…

查看全部问答>

直流电源输出24V电压低的原因,求解~~~~~

我单位设备最近直流24V电源电压一直偏低,一般工作的时候电压都在17 -18V,有时候能低到15V,380V变220V变压器电压都比正常低20V左右,220V变24V直流电源在拔掉24V输出的时候,变压器电压恢复正常了,只要接上24V变压器电压变低,直流输出的24V电源 ...…

查看全部问答>

有关使用定时器产生PWM输出的配置问题、求高手!

看了STM32应用上讲的使用定时器产生PWM输出,其中一个配置步骤: 根据需要的频率和占空比计算出输出高电平的时间和低电平的时间:OCHy = 通道y的高电平时间;OCLy =通道y的低电平时间把OCHy写入对应的输出比较寄存器,并启动计数器开始计数,比较 ...…

查看全部问答>

STC单片机 PCA 和DC问题

为什么我的STC当PCA定时和DC运算同时进行时 数据会乱跳,关掉DC运算PCA定时就正常了…

查看全部问答>

Linux-2.6.21 S3c6400中断剖析<五>(原创)-上海嵌入式索漫科技培训教材

作者:下家山(请尊重原创,转载请注明)  http://www.xiajiashan.com  4.1.2.1 desc->chip->unmask(irq)函数来自哪里? 其实default_startup和default_enable最终调用的是一个函数desc->chip->unmask(irq);那么这 ...…

查看全部问答>