[其他ST产品] 两段代码的区别是什么

[复制链接]
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配置为输入模式,并启用内部上拉电阻。
逆鳞风暴 发表于 2025-3-10 23:10 | 显示全部楼层
使用GPIO_Init函数的方式更直观,ST官方的HAL库也是基于这个思路
pl202 发表于 2025-3-11 13:28 | 显示全部楼层
通过GPIO_InitStructure.GPIO_Pin指定了要配置的引脚为 GPIOB 端口的 PB12、PB13、PB14 和 PB15。
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端口的指定引脚。
cemaj 发表于 2025-3-11 14:47 | 显示全部楼层
配置 ​GPIOB的PB12-PB15引脚为输入上拉模式(IPU)​。
通过直接操作寄存器 CRH(控制GPIOB的高8位引脚)实现。
mikewalpole 发表于 2025-3-11 16:41 | 显示全部楼层
使用 STM32 标准外设库提供的函数来配置 GPIO。通过定义一个GPIO_InitTypeDef类型的结构体变量GPIO_InitStructure,并设置其中的成员变量,如GPIO_Pin(指定要配置的引脚)和GPIO_Mode(指定引脚的工作模式),然后调用GPIO_Init函数将配置应用到指定的 GPIO 端口。
wilhelmina2 发表于 2025-3-11 17:15 | 显示全部楼层
除非有特殊性能需求或底层优化场景,否则推荐使用HAL库配置GPIO。
juliestephen 发表于 2025-3-11 20:17 | 显示全部楼层
直接操作寄存器的代码可能更高效,因为它减少了函数调用的开销,并且生成的代码可能更小。
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库的代码会根据不同的微控制器型号自动适配寄存器地址和位位置,因此具有更好的可移植性。
backlugin 发表于 2025-3-12 16:25 | 显示全部楼层
第一段代码直接操作寄存器,需要对寄存器的具体位进行操作。
第二段代码使用库函数和结构体,更加抽象和易于理解。
houjiakai 发表于 2025-3-12 17:39 | 显示全部楼层
使用HAL库函数的代码更易于阅读和维护,因为它隐藏了底层的寄存器操作细节。
uytyu 发表于 2025-3-12 18:04 | 显示全部楼层
仅在需要极低层级控制(如实时性敏感、硬件调试)时使用直接寄存器操作。
jkl21 发表于 2025-3-12 19:16 | 显示全部楼层
第一段代码直接操作GPIO寄存器,通过位操作来设置引脚的模式和类型。这种方式更底层,更灵活,但也更容易出错。
usysm 发表于 2025-3-12 20:09 | 显示全部楼层
第二段代码使用HAL库函数,这种方式更易于阅读和维护,提供了更高级别的抽象,使得代码更易于移植和理解。
物联万物互联 发表于 2025-3-12 20:34 | 显示全部楼层
直接操作寄存器可以更高效地执行指令,因为它避免了函数调用的开销,执行速度更快,不需要额外的函数调用过程。
modesty3jonah 发表于 2025-3-12 20:50 | 显示全部楼层
直接操作寄存器避免了函数调用的开销。
adolphcocker 发表于 2025-3-12 21:16 | 显示全部楼层
第一段代码直接操作寄存器,代码的可读性和维护性较差。需要对寄存器的具体位定义有深入的理解。
第二段代码使用库函数,代码的可读性和维护性较好。通过结构体和函数调用来配置引脚,更加直观和易懂。
houjiakai 发表于 2025-3-12 22:52 | 显示全部楼层
对于不熟悉STM32寄存器布局的人来说,这种代码的可读性可能较低。
星闪动力 发表于 2025-3-13 21:07 | 显示全部楼层
使用STM32标准外设库时,可以通过结构体配置GPIO。
elsaflower 发表于 2025-3-14 11:41 | 显示全部楼层
GPIO_Pin 明确指定要配置的引脚(PB12-PB15)。
GPIO_Mode 设置为 GPIO_Mode_IPU(输入上拉)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部