PY32F003F18端口复用功能映射

PY32F003F18端口复用功能映射,GPIO引脚可配置为"输入,输出,模拟或复用功能。

一、端口A复用功能映射

PY32F003F18端口复用功能映射_第1张图片

端口A复用功能映射表里,每个引脚都有AF0~AF15,修改AF0~AF15的值,就可以将对应复用用能引脚映射到CPU引脚上。

修改PA0~PA7,见下面的寄存器:

PY32F003F18端口复用功能映射_第2张图片 举例:

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,见下面的寄存器:

PY32F003F18端口复用功能映射_第3张图片

 二、端口B复用功能映射

PY32F003F18端口复用功能映射_第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;

这个28是PB7的引脚号码乘以4得到的,7*4=28

注意,不要看花了眼睛

 三、端口F复用功能映射

PY32F003F18端口复用功能映射_第5张图片

 举例:

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 position
		if(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++;
	}
}

你可能感兴趣的:(产品研发,PY32F003F18,嵌入式硬件,单片机,GPIO,引脚映射,引脚复用功能)