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))