GPIO复用(重映射)-DG32
/*!
\brief configure GPIO pin remap
\param[in] gpio_remap: select the pin to remap
only one parameter can be selected which are shown as below:
\arg GPIO_SPI0_REMAP: SPI0 remapping
\arg GPIO_I2C0_REMAP: I2C0 remapping
\arg GPIO_USART0_REMAP: USART0 remapping
\arg GPIO_USART1_REMAP: USART1 remapping
\arg GPIO_USART2_PARTIAL_REMAP: USART2 partial remapping
\arg GPIO_USART2_FULL_REMAP: USART2 full remapping
\arg GPIO_TIMER0_PARTIAL_REMAP: TIMER0 partial remapping
\arg GPIO_TIMER0_FULL_REMAP: TIMER0 full remapping
\arg GPIO_TIMER2_PARTIAL_REMAP: TIMER2 partial remapping
\arg GPIO_TIMER2_FULL_REMAP: TIMER2 full remapping
\arg GPIO_TIMER3_REMAP: TIMER3 remapping
\arg GPIO_CAN0_PARTIAL_REMAP: CAN0 partial remapping
\arg GPIO_CAN0_FULL_REMAP: CAN0 full remapping
\arg GPIO_PD01_REMAP: PD01 remapping
\arg GPIO_ADC0_ETRGINS_REMAP: ADC0 external trigger inserted conversion remapping
\arg GPIO_ADC0_ETRGREG_REMAP: ADC0 external trigger regular conversion remapping
\arg GPIO_ADC1_ETRGINS_REMAP: ADC1 external trigger inserted conversion remapping
\arg GPIO_ADC1_ETRGREG_REMAP: ADC1 external trigger regular conversion remapping
\arg GPIO_CAN1_REMAP: CAN1 remapping
\arg GPIO_SWJ_NONJTRST_REMAP: full SWJ(JTAG-DP + SW-DP),but without NJTRST
\arg GPIO_SWJ_SWDPENABLE_REMAP: JTAG-DP disabled and SW-DP enabled
\arg GPIO_SWJ_DISABLE_REMAP: JTAG-DP disabled and SW-DP disabled
\arg GPIO_SPI2_REMAP: SPI2 remapping
\arg GPIO_TIMER8_REMAP: TIMER8 remapping
\arg GPIO_TIMER9_REMAP: TIMER9 remapping
\arg GPIO_TIMER10_REMAP: TIMER10 remapping
\arg GPIO_TIMER12_REMAP: TIMER12 remapping
\arg GPIO_TIMER13_REMAP: TIMER13 remapping
\arg GPIO_EXMC_NADV_REMAP: EXMC_NADV connect/disconnect
\arg GPIO_CTC_REMAP0: CTC remapping(PD15)
\arg GPIO_CTC_REMAP1: CTC remapping(PF0)
\param[in] newvalue: ENABLE or DISABLE
\param[out] none
\retval none
*/
void gpio_pin_remap_config(uint32_t remap, ControlStatus newvalue)
{
uint32_t remap1 = 0U, remap2 = 0U, temp_reg = 0U, temp_mask = 0U;
if(((uint32_t)0x80000000U) == (remap & 0x80000000U)){
/* get AFIO_PCF1 regiter value */
temp_reg = AFIO_PCF1;
}else{
/* get AFIO_PCF0 regiter value */
temp_reg = AFIO_PCF0;
}
temp_mask = (remap & PCF_POSITION_MASK) >> 0x10U;
remap1 = remap & LSB_16BIT_MASK;
/* judge pin remap type */
if((PCF_LOCATION1_MASK | PCF_LOCATION2_MASK) == (remap & (PCF_LOCATION1_MASK | PCF_LOCATION2_MASK))){
temp_reg &= PCF_SWJCFG_MASK;
AFIO_PCF0 &= PCF_SWJCFG_MASK;
}else if(PCF_LOCATION2_MASK == (remap & PCF_LOCATION2_MASK)){
remap2 = ((uint32_t)0x03U) << temp_mask;
temp_reg &= ~remap2;
temp_reg |= ~PCF_SWJCFG_MASK;
}else{
temp_reg &= ~(remap1 << ((remap >> 0x15U)*0x10U));
temp_reg |= ~PCF_SWJCFG_MASK;
}
/* set pin remap value */
if(DISABLE != newvalue){
temp_reg |= (remap1 << ((remap >> 0x15U)*0x10U));
}
if(AFIO_PCF1_FIELDS == (remap & AFIO_PCF1_FIELDS)){
/* set AFIO_PCF1 regiter value */
AFIO_PCF1 = temp_reg;
}else{
/* set AFIO_PCF0 regiter value */
AFIO_PCF0 = temp_reg;
}
}
对于一些默认的GPIO引脚不是普通的GPIO引脚时,可能会用到GPIO重映射。
PA15默认为JTDI,如果想配置为普通IO口
需要编写如下代码:
//1.GPIO引脚时钟使能
rcu_periph_clock_enable(A_GPIO_CLK);
//2.复用功能时钟使能
rcu_periph_clock_enable(RCU_AF);
//3.GPIO配置为推完输出模式
gpio_init(A_GPIO, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,A_PIN);
//4.重映射配置:JTAG-DP禁用和SW-DP使能
gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP,ENABLE);
PA15默认为JTDO,如果想配置为普通IO口
//1.GPIO引脚时钟使能
rcu_periph_clock_enable(B_GPIO_CLK);
//2.复用功能时钟使能
rcu_periph_clock_enable(RCU_AF);
//3.GPIO配置为复用推完输出模式
gpio_init(B_GPIO, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, B_PIN);
//4.重映射配置:TIMER1完全重映射
gpio_pin_remap_config(GPIO_TIMER1_FULL_REMAP,ENABLE);