7.STM32IO引脚的复用和映射

1.端口复用是什么

STM32有很多内置外设,这些外设的外部引脚都是可以与GPIO复用的。一个GPIO可以复用为外置内设的功能引脚。
就是一个IO口可以作为很多的功能,可以根据情况选择功能
例如PA9-PA10,是作为串口使用的,而不是作为普通的GPIO

2.端口可以复用那些功能

根据芯片手册可以看出每一个IO口可以复用为那个功能。

3.端口是怎么复用的

STM32IO引脚有一个复用器,可以通过复用器连接到内置外设或模块,该复用器一次只可以选择一个复用功能连接到对应的IO口。
请添加图片描述
就是上图,我们引脚8-15的引脚可以选择左边的一个功能,中间就是复用器

4.端口复用寄存器(每一组IO口有两个32位寄存器)

每一组IO口有16个IO引脚,每个IO引脚使用4位,故需要2个32位的寄存器
如果我们需要引脚3,复用功能5(复用功能5是什么,查表)
那么就将AFRL3设置为0101(十进制就是5)
AFRL
请添加图片描述
AFRH
请添加图片描述

5.端口复用具体过程

以配置PA9,PA10为串口1为例子
1.对应GPIO端口时钟使能
_HAL_RCC_GPIOA_CLK_ENABLE();
2.复用外设时钟使能
__HAL_RCC_USART1_CLK_ENABLE();
3.端口模式配置为复用功能模式
GPIO_Initure.Mode=GPIO_MODE_AF_PP;//复用推挽输出
4.根据引脚是第几个配置GPIOx_AFRL或者GPIOx_AFRH寄存器,将IO连接到对应的功能
GPIO_INiture.Alternate=GPIO_AF7_USART1;//复用为串口1

6.端口复用具体代码

以配置PA9,PA10为串口1为例子

void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
    //GPIO端口设置
	GPIO_InitTypeDef GPIO_Initure;
	
	if(huart->Instance==USART1)//如果是串口1,进行串口1 MSP初始化
	{
		__HAL_RCC_GPIOA_CLK_ENABLE();			//使能GPIOA时钟
		__HAL_RCC_USART1_CLK_ENABLE();			//使能USART1时钟
	
		GPIO_Initure.Pin=GPIO_PIN_9;			//PA9
		GPIO_Initure.Mode=GPIO_MODE_AF_PP;		//复用推挽输出
		GPIO_Initure.Pull=GPIO_PULLUP;			//上拉
		GPIO_Initure.Speed=GPIO_SPEED_FAST;		//高速
		GPIO_Initure.Alternate=GPIO_AF7_USART1;	//复用为USART1
		HAL_GPIO_Init(GPIOA,&GPIO_Initure);	   	//初始化PA9

		GPIO_Initure.Pin=GPIO_PIN_10;			//PA10
		HAL_GPIO_Init(GPIOA,&GPIO_Initure);	   	//初始化PA10
		
#if EN_USART1_RX
		HAL_NVIC_EnableIRQ(USART1_IRQn);				//使能USART1中断通道
		HAL_NVIC_SetPriority(USART1_IRQn,3,3);			//抢占优先级3,子优先级3
#endif	
	}

}

Alternate可以复用的功能选择

#if defined(STM32F429xx) || defined(STM32F439xx)
#define IS_GPIO_AF(AF)   (((AF) == GPIO_AF0_RTC_50Hz)   || ((AF) == GPIO_AF9_TIM14)      || \
                          ((AF) == GPIO_AF0_MCO)        || ((AF) == GPIO_AF0_TAMPER)     || \
                          ((AF) == GPIO_AF0_SWJ)        || ((AF) == GPIO_AF0_TRACE)      || \
                          ((AF) == GPIO_AF1_TIM1)       || ((AF) == GPIO_AF1_TIM2)       || \
                          ((AF) == GPIO_AF2_TIM3)       || ((AF) == GPIO_AF2_TIM4)       || \
                          ((AF) == GPIO_AF2_TIM5)       || ((AF) == GPIO_AF3_TIM8)       || \
                          ((AF) == GPIO_AF4_I2C1)       || ((AF) == GPIO_AF4_I2C2)       || \
                          ((AF) == GPIO_AF4_I2C3)       || ((AF) == GPIO_AF5_SPI1)       || \
                          ((AF) == GPIO_AF5_SPI2)       || ((AF) == GPIO_AF9_TIM13)      || \
                          ((AF) == GPIO_AF6_SPI3)       || ((AF) == GPIO_AF9_TIM12)      || \
                          ((AF) == GPIO_AF7_USART1)     || ((AF) == GPIO_AF7_USART2)     || \
                          ((AF) == GPIO_AF7_USART3)     || ((AF) == GPIO_AF8_UART4)      || \
                          ((AF) == GPIO_AF8_UART5)      || ((AF) == GPIO_AF8_USART6)     || \
                          ((AF) == GPIO_AF9_CAN1)       || ((AF) == GPIO_AF9_CAN2)       || \
                          ((AF) == GPIO_AF10_OTG_FS)    || ((AF) == GPIO_AF10_OTG_HS)    || \
                          ((AF) == GPIO_AF11_ETH)       || ((AF) == GPIO_AF12_OTG_HS_FS) || \
                          ((AF) == GPIO_AF12_SDIO)      || ((AF) == GPIO_AF13_DCMI)      || \
                          ((AF) == GPIO_AF15_EVENTOUT)  || ((AF) == GPIO_AF5_SPI4)       || \
                          ((AF) == GPIO_AF5_SPI5)       || ((AF) == GPIO_AF5_SPI6)       || \
                          ((AF) == GPIO_AF8_UART7)      || ((AF) == GPIO_AF8_UART8)      || \
                          ((AF) == GPIO_AF12_FMC)       ||  ((AF) == GPIO_AF6_SAI1)      || \
                          ((AF) == GPIO_AF14_LTDC))
物联沃分享整理
物联沃-IOTWORD物联网 » 7.STM32IO引脚的复用和映射

发表评论