发新帖我要提问
12
返回列表
打印
[其他ST产品]

两段代码的区别是什么

[复制链接]
楼主: classroom
手机看帖
扫描二维码
随时随地手机跟帖
21
linfelix| | 2025-3-10 16:51 | 只看该作者 回帖奖励 |倒序浏览
第一段代码的配置(0x8888)‌
CRH寄存器分析:每个引脚由4位控制(Pin12~Pin15对应CRH的高16位)。
0x8对应的二进制是1000,即每4位的配置为:
MODE[1:0]‌ = 10 → 输出模式,最大速度50MHz。
CNF[1:0]‌ = 00 → 通用推挽输出模式。
结果:将GPIOB的Pin12~Pin15配置为推挽输出模式,最大速度50MHz。
第二段代码的配置(GPIO_Mode_IPU)‌
GPIO_Mode_IPU:将引脚设置为内部上拉输入模式(Input Pull-Up)。
结果:将GPIOB的Pin12~Pin15配置为输入模式,并启用内部上拉电阻。

使用特权

评论回复
22
逆鳞风暴| | 2025-3-10 23:10 | 只看该作者
使用GPIO_Init函数的方式更直观,ST官方的HAL库也是基于这个思路

使用特权

评论回复
23
pl202| | 2025-3-11 13:28 | 只看该作者
通过GPIO_InitStructure.GPIO_Pin指定了要配置的引脚为 GPIOB 端口的 PB12、PB13、PB14 和 PB15。

使用特权

评论回复
24
everyrobin| | 2025-3-11 14:08 | 只看该作者
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;:这行代码设置了GPIO结构体中的GPIO_Pin字段,指定要配置的引脚为12、13、14和15。
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;:这行代码设置了GPIO结构体中的GPIO_Mode字段,指定这些引脚的模式为上拉输入(IPU)。
GPIO_Init(GPIOB, &GPIO_InitStructure);:这行代码调用HAL库的GPIO_Init函数,它使用GPIO_InitStructure中的值来初始化GPIOB端口的指定引脚。

使用特权

评论回复
25
cemaj| | 2025-3-11 14:47 | 只看该作者
配置 ​GPIOB的PB12-PB15引脚为输入上拉模式(IPU)​。
通过直接操作寄存器 CRH(控制GPIOB的高8位引脚)实现。

使用特权

评论回复
26
mikewalpole| | 2025-3-11 16:41 | 只看该作者
使用 STM32 标准外设库提供的函数来配置 GPIO。通过定义一个GPIO_InitTypeDef类型的结构体变量GPIO_InitStructure,并设置其中的成员变量,如GPIO_Pin(指定要配置的引脚)和GPIO_Mode(指定引脚的工作模式),然后调用GPIO_Init函数将配置应用到指定的 GPIO 端口。

使用特权

评论回复
27
wilhelmina2| | 2025-3-11 17:15 | 只看该作者
除非有特殊性能需求或底层优化场景,否则推荐使用HAL库配置GPIO。

使用特权

评论回复
28
juliestephen| | 2025-3-11 20:17 | 只看该作者
直接操作寄存器的代码可能更高效,因为它减少了函数调用的开销,并且生成的代码可能更小。

使用特权

评论回复
29
claretttt| | 2025-3-12 15:55 | 只看该作者
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;      
GPIO_Init(GPIOB, &GPIO_InitStructure);
这段代码使用了HAL库的GPIO初始化结构体。用户将四个引脚(12-15)设置为输入上拉模式(IPU)。这种方式更直观,且不容易出错,因为HAL库已经处理了底层寄存器的配置。同时,HAL库的代码会根据不同的微控制器型号自动适配寄存器地址和位位置,因此具有更好的可移植性。

使用特权

评论回复
30
backlugin| | 2025-3-12 16:25 | 只看该作者
第一段代码直接操作寄存器,需要对寄存器的具体位进行操作。
第二段代码使用库函数和结构体,更加抽象和易于理解。

使用特权

评论回复
31
houjiakai| | 2025-3-12 17:39 | 只看该作者
使用HAL库函数的代码更易于阅读和维护,因为它隐藏了底层的寄存器操作细节。

使用特权

评论回复
32
uytyu| | 2025-3-12 18:04 | 只看该作者
仅在需要极低层级控制(如实时性敏感、硬件调试)时使用直接寄存器操作。

使用特权

评论回复
33
jkl21| | 2025-3-12 19:16 | 只看该作者
第一段代码直接操作GPIO寄存器,通过位操作来设置引脚的模式和类型。这种方式更底层,更灵活,但也更容易出错。

使用特权

评论回复
34
usysm| | 2025-3-12 20:09 | 只看该作者
第二段代码使用HAL库函数,这种方式更易于阅读和维护,提供了更高级别的抽象,使得代码更易于移植和理解。

使用特权

评论回复
35
物联万物互联| | 2025-3-12 20:34 | 只看该作者
直接操作寄存器可以更高效地执行指令,因为它避免了函数调用的开销,执行速度更快,不需要额外的函数调用过程。

使用特权

评论回复
36
modesty3jonah| | 2025-3-12 20:50 | 只看该作者
直接操作寄存器避免了函数调用的开销。

使用特权

评论回复
37
adolphcocker| | 2025-3-12 21:16 | 只看该作者
第一段代码直接操作寄存器,代码的可读性和维护性较差。需要对寄存器的具体位定义有深入的理解。
第二段代码使用库函数,代码的可读性和维护性较好。通过结构体和函数调用来配置引脚,更加直观和易懂。

使用特权

评论回复
38
houjiakai| | 2025-3-12 22:52 | 只看该作者
对于不熟悉STM32寄存器布局的人来说,这种代码的可读性可能较低。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则