4y1b3 发表于 2025-4-29 09:35

正确配置AF映射和GPIO模式指南

什么是AF映射?

让一个GPIO脚不当普通IO,而去负责某个外设功能。

配置GPIO AF的标准完整步骤
在GD32F405上,配置AF要走4步标准流程:


步骤        内容        备注
1. 开时钟        给GPIO和AF模块开RCU时钟        RCU_APB2EN
2. 配IO模式        设置引脚为复用功能(Alternate Function Mode)        输出模式、高速、推挽
3. 配AF映射        正确设置引脚的Alternate Function映射编号        通过gpio_af_set()函数
4. 可选拉电阻        如果需要,配置上拉/下拉/无拉电阻        特别是I2C/UART需上拉


实操例子(以SPI2为例)
① 开时钟
c
复制
编辑
rcu_periph_clock_enable(RCU_GPIOA);   // PA15
rcu_periph_clock_enable(RCU_GPIOB);   // PB13, PB14, PB15
rcu_periph_clock_enable(RCU_SPI2);    // SPI2外设
② 配置GPIO为复用推挽输出
c
复制
编辑
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_15); // PA15
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15); // PB13/14/15

gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15); // PA15推挽输出
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15); // PB13/14/15推挽输出
说明:

GPIO_MODE_AF ➔ 设置成Alternate Function

GPIO_OTYPE_PP ➔ 推挽输出,不是开漏

50MHz速率 ➔ 足够绝大部分SPI速度

③ 配AF编号映射
c
复制
编辑
gpio_af_set(GPIOA, GPIO_AF_5, GPIO_PIN_15); // PA15映射到AF5(SPI2_NSS)
gpio_af_set(GPIOB, GPIO_AF_5, GPIO_PIN_13); // PB13映射到AF5(SPI2_SCK)
gpio_af_set(GPIOB, GPIO_AF_5, GPIO_PIN_14); // PB14映射到AF5(SPI2_MISO)
gpio_af_set(GPIOB, GPIO_AF_5, GPIO_PIN_15); // PB15映射到AF5(SPI2_MOSI)
说明:

SPI2在GD32F4上使用的是AF5。

AF编号要对!(AF4/AF5/AF6都不一样,不要乱搞)

④ 其他注意(拉电阻)
一般SPI口内部不拉电阻,保持PUPD_NONE就好。
如果是UART RX输入,可以考虑上拉。

4. 总结配置套路(记死这3条)
时钟先开(没有时钟,后面全废)

模式设对(Alternate Function + 推挽输出 + 合适速率)

AF编号映射准(AF错了,根本收不到信号)


成熟芒果箱 发表于 2025-4-29 11:43

数据手册上写的是AF6数据手册版本是 GD32F405xx_Datasheet_Rev2.5


页: [1]
查看完整版本: 正确配置AF映射和GPIO模式指南