复用时钟 重映射(Remap)
在GD32微控制器中,**Remap(重映射)**是指通过重新配置某些引脚的功能,将它们从默认功能切换到其他备用功能。例如,某些GPIO引脚可以被配置为SPI、USART、I2C等外设的信号引脚,或者作为普通IO使用。
### **Remap的用途**
1. **解决引脚冲突**:当默认的外设引脚被其他功能占用时,可以通过Remap将外设映射到其他可用的GPIO引脚上。
2. **灵活配置**:根据实际需求,将引脚配置为不同的功能,例如将JTAG引脚重新映射为普通IO。
### **Remap的配置步骤**
1. **使能相关时钟**:
- 必须使能复用功能(AF)的时钟,这是Remap功能的基础。例如:
```c
rcu_periph_clock_enable(RCU_AF);
```
这行代码用于启用复用功能的时钟。
2. **配置Remap**:
- 使用`gpio_pin_remap_config`函数配置Remap。例如,将SPI0的引脚重新映射到备用引脚:
```c
gpio_pin_remap_config(GPIO_SPI0_REMAP, ENABLE);
```
这行代码将SPI0的引脚从默认位置切换到备用位置。
3. **配置GPIO引脚**:
- 在完成Remap后,需要根据新的引脚配置,将GPIO引脚初始化为对应的模式(如复用推挽输出、浮空输入等)。
### **示例**
以下是一个将SPI0引脚重新映射到备用引脚的完整代码示例:
```c
void spi_flash_init(void)
{
// 使能相关GPIO和AF的时钟
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_AF);
// 关闭默认的JTAG功能,启用SW-DP
gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP, ENABLE);
// 将SPI0引脚重新映射到备用引脚
gpio_pin_remap_config(GPIO_SPI0_REMAP, ENABLE);
// 配置SPI0的引脚
gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_3 | GPIO_PIN_5); // SCK和MOSI
gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_4); // MISO
gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15); // CS
}
```
在这个例子中:
- `GPIO_SPI0_REMAP`用于将SPI0的引脚从默认位置切换到备用位置。
- `GPIO_SWJ_SWDPENABLE_REMAP`用于禁用默认的JTAG功能,以便将某些引脚释放为普通IO。
### **总结**
Remap功能允许开发者根据需求重新配置GPIO引脚的功能,以解决引脚冲突或实现更灵活的硬件设计。使用Remap功能时,必须先使能AF时钟,然后通过`gpio_pin_remap_config`函数进行配置。