PY32F003F18端口复用功能映射,GPIO引脚可配置为"输入,输出,模拟或复用功能。
一、端口A复用功能映射
端口A复用功能映射表里,每个引脚都有AF0~AF15,修改AF0~AF15的值,就可以将对应复用用能引脚映射到CPU引脚上。
修改PA0~PA7,见下面的寄存器:
举例:
GPIOA_AFRL的bit3:0=9时,表示将PA0映射到AF9,即将USART2_TX映射到PA0;
GPIOA_AFRL的bit3:0=10时,表示将PA0映射到AF10,即将SPI1_MISO映射到PA0;
GPIOA_AFRL的bit7:4=9时,表示将PA0映射到AF9,即将USART2_RX映射到PA1;
GPIOA_AFRL的bit7:4=10时,表示将PA0映射到AF10,即将SPI1_MOSI映射到PA1;
这个4是PA1的引脚号码乘以4得到的,1*4=4。
注意:引脚号码>7时,使用GPIOA_AFRH寄存器
GPIOA_AFRH的bit24:20=8时,表示将PA13映射到AF8,即将USART1_RX映射到PA13;
这个20是PA13的(引脚号码-8)乘以4得到的,(13-8)*4=20。
注意,不要看花了眼睛。
修改PA8~PA15,见下面的寄存器:
二、端口B复用功能映射
举例:
GPIOB_AFRL的bit27:24=0时,表示将PB6映射到AF0,即将USART1_TX映射到PB6;
GPIOB_AFRL的bit27:24=4时,表示将PB6映射到AF10,即将USART2_TX映射到PB6;
这个24是PB6的引脚号码乘以4得到的,6*4=24。
GPIOB_AFRL的bit31:28=0时,表示将PB7映射到AF0,即将USART1_RX映射到PB7;
GPIOB_AFRL的bit31:28=4时,表示将PB7映射到AF4,即将USART2_RX映射到PB7;
这个28是PB7的引脚号码乘以4得到的,7*4=28。
注意,不要看花了眼睛
三、端口F复用功能映射
举例:
GPIOF_AFRL的bit7:4=8时,表示将PA0映射到AF8,即将USART1_TX映射到PF1;
GPIOF_AFRL的bit7:4=9时,表示将PA0映射到AF9,即将USART2_RX映射到PF1;
这个4是PF1的引脚号码乘以4得到的,1*4=4。
注意,不要看花了眼睛
复用功能,能看懂这几个表,就可以了。
四、先理论后实践,见程序:
/*
举例:
GPIOB_AFRL的bit27:24=0时,表示将PB6映射到AF0,即将USART1_TX映射到PB6;
GPIOB_AFRL的bit27:24=4时,表示将PB6映射到AF10,即将USART2_TX映射到PB6;
这个24是PB6的引脚号码乘以4得到的,6*4=24。
GPIOB_AFRL的bit31:28=0时,表示将PB7映射到AF0,即将USART1_RX映射到PB7;
GPIOB_AFRL的bit31:28=4时,表示将PB7映射到AF4,即将USART2_RX映射到PB7;
*/
GPIO模式配置开始,GPIO Mode Configuration
//函数功能:当引脚配置为"AF复用功能时,需要将外设映射到引脚上
//alternate=GPIO_AF0_USART1,将引脚复用为USART1
//alternate=GPIO_AF1_USART1,将引脚复用为USART1
//alternate=GPIO_AF3_USART1,将引脚复用为USART1
//alternate=GPIO_AF3_USART2,将引脚复用为USART2
//alternate=GPIO_AF4_USART2,将引脚复用为USART2
//alternate=GPIO_AF5_USART2,将引脚复用为USART2
//alternate=GPIO_AF9_USART2,将引脚复用为USART2
void Configure_Alternate_function_mapped_with_Pin(GPIO_TypeDef *GPIOx,uint32_t Pin,uint32_t alternate)
{uint32_t temp;uint32_t position;uint32_t iocurrent;position=0;while( (Pin >> position) != 0x00u ){iocurrent = (Pin) & (1uL << position);//获取引脚位置,Get current io positionif(iocurrent != 0x00u)//这个引脚需要配置{temp = GPIOx->AFR[position >> 3u];//当GPIOx=GPIOA,position<=7时,表示GPIOA->AFR[0],读"GPIO复用功能寄存器GPIOA_AFRL"//当GPIOx=GPIOA,position>=8时,表示GPIOA->AFR[1],读"GPIO复用功能寄存器GPIOA_AFRH"//当GPIOx=GPIOB,position<=7时,表示GPIOB->AFR[0],读"GPIO复用功能寄存器GPIOB_AFRL"//当GPIOx=GPIOB,position>=8时,表示GPIOB->AFR[1],读"GPIO复用功能寄存器GPIOB_AFRH"//当GPIOx=GPIOF,position<=7时,表示GPIOF->AFR[0],读"GPIO复用功能寄存器GPIOF_AFRL"//当GPIOx=GPIOF,position>=8时,表示GPIOF->AFR[1],读"GPIO复用功能寄存器GPIOF_AFRH"temp &= ~(0xFu << ((position & 0x07u) * 4u));//当GPIOx=GPIOA,且position=0,则清除GPIOA_AFRL的bit3:0的值,映射到AF0通道//当GPIOx=GPIOA,且position=1,则清除GPIOA_AFRL的bit7:4的值,映射到AF0通道//当GPIOx=GPIOA,且position=2,则清除GPIOA_AFRL的bit11:8的值,映射到AF0通道//当GPIOx=GPIOA,且position=3,则清除GPIOA_AFRL的bit15:12的值,映射到AF0通道//当GPIOx=GPIOA,且position=4,则清除GPIOA_AFRL的bit19:16的值,映射到AF0通道//当GPIOx=GPIOA,且position=5,则清除GPIOA_AFRL的bit23:20的值,映射到AF0通道//当GPIOx=GPIOA,且position=6,则清除GPIOA_AFRL的bit27:24的值,映射到AF0通道//当GPIOx=GPIOA,且position=7,则清除GPIOA_AFRL的bit31:28的值,映射到AF0通道//当GPIOx=GPIOA,且position=8,则清除GPIOA_AFRH的bit3:0的值,映射到AF0通道//当GPIOx=GPIOA,且position=9,则清除GPIOA_AFRH的bit7:4的值,映射到AF0通道//当GPIOx=GPIOA,且position=10,则清除GPIOA_AFRH的bit11:8的值,映射到AF0通道//当GPIOx=GPIOA,且position=11,则清除GPIOA_AFRH的bit15:12的值,映射到AF0通道//当GPIOx=GPIOA,且position=12,则清除GPIOA_AFRH的bit19:16的值,映射到AF0通道//当GPIOx=GPIOA,且position=13,则清除GPIOA_AFRH的bit23:20的值,映射到AF0通道//当GPIOx=GPIOA,且position=14,则清除GPIOA_AFRH的bit27:24的值,映射到AF0通道//当GPIOx=GPIOA,且position=15,则清除GPIOA_AFRH的bit31:28的值,映射到AF0通道//同理当GPIOx=GPIOB和当GPIOx=GPIOF,也是一样temp |= ( alternate << ((position & 0x07u) * 4u) );//当GPIOx=GPIOA,且position=0,则使用alternate的值修改GPIOA_AFRL的bit3:0的值,映射到AF[alternate]通道,如:alternate=9将PA0映射到USART2_TX//当GPIOx=GPIOA,且position=1,则使用alternate的值修改GPIOA_AFRL的bit7:4的值,映射到AF[alternate]通道,如:alternate=9将PA0映射到USART2_RX//当GPIOx=GPIOA,且position=2,则使用alternate的值修改GPIOA_AFRL的bit11:8的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=3,则使用alternate的值修改GPIOA_AFRL的bit15:12的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=4,则使用alternate的值修改GPIOA_AFRL的bit19:16的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=5,则使用alternate的值修改GPIOA_AFRL的bit23:20的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=6,则使用alternate的值修改GPIOA_AFRL的bit27:24的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=7,则使用alternate的值修改GPIOA_AFRL的bit31:28的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=8,则使用alternate的值修改GPIOA_AFRH的bit3:0的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=9,则使用alternate的值修改GPIOA_AFRH的bit7:4的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=10,则使用alternate的值修改GPIOA_AFRH的bit11:8的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=11,则使用alternate的值修改GPIOA_AFRH的bit15:12的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=12,则使用alternate的值修改GPIOA_AFRH的bit19:16的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=13,则使用alternate的值修改GPIOA_AFRH的bit23:20的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=14,则使用alternate的值修改GPIOA_AFRH的bit27:24的值,映射到AF[alternate]通道//当GPIOx=GPIOA,且position=15,则使用alternate的值修改GPIOA_AFRH的bit31:28的值,映射到AF[alternate]通道//同理当GPIOx=GPIOB和当GPIOx=GPIOF,也是一样GPIOx->AFR[position >> 3u] = temp;//当GPIOx=GPIOA,position<=7时,表示GPIOA->AFR[0],将temp写入"GPIO复用功能寄存器GPIOA_AFRL"//当GPIOx=GPIOA,position>=8时,表示GPIOA->AFR[1],将temp写入"GPIO复用功能寄存器GPIOA_AFRH"//当GPIOx=GPIOB,position<=7时,表示GPIOB->AFR[0],将temp写入"GPIO复用功能寄存器GPIOB_AFRL"//当GPIOx=GPIOB,position>=8时,表示GPIOB->AFR[1],将temp写入"GPIO复用功能寄存器GPIOB_AFRH"//当GPIOx=GPIOF,position<=7时,表示GPIOF->AFR[0],将temp写入"GPIO复用功能寄存器GPIOF_AFRL"//当GPIOx=GPIOF,position>=8时,表示GPIOF->AFR[1],将temp写入"GPIO复用功能寄存器GPIOF_AFRH"}position++;}
}