STM32/重映射和AFIO复用功能
目录1 重映射1.1 重映射1.2 为什么要使用重映射2 AFIO2.1 AFIO复用功能输入/输出‌2.2 示例2.2.1 引脚重映射示例以USART1重映射为例2.2.2 外部中断配置示例以按键中断为例2.2.3 调试引脚复用示例以释放调试引脚为例1 重映射1.1 重映射重映射是指将芯片内部功能模块的引脚重新映射到其他的物理引脚上以增加设计的灵活性。前提是其他的物理引脚具有这个重映射功能模块功能。1.2 为什么要使用重映射当一个芯片的引脚有限时多个外设可能默认使用相同的引脚这样就会出现引脚冲突。那么重映射就可以解决这种冲突例如串口一USART1默认使用引脚PA9和PA10但这两个引脚已经被其他功能占用。则可以通过重映射将USART1移到PB6和PB7但前提是PB6和PB7具有USART1的复用功能也就是说并不是随便一个引脚都可以重映射。2 AFIO2.1 AFIO复用功能输入/输出负责管理引脚复用和重映射。在‌引脚重映射、‌外部中断配置和‌调试引脚复用时都需要开启AFIO时钟。‌2.2 示例2.2.1 引脚重映射示例以USART1重映射为例void USART1_Remap_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; /*使能AFIO时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); /*使能重映射*/ GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE); /*使能GPIOB和USART1时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); /*配置引脚*/ GPIO_InitStructure.GPIO_Pin GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOB, GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOB, GPIO_InitStructure); /* 配置USART*/ USART_InitStructure.USART_BaudRate 115200; USART_InitStructure.USART_WordLength USART_WordLength_8b; USART_InitStructure.USART_StopBits USART_StopBits_1; USART_InitStructure.USART_Parity USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART1, USART_InitStructure); USART_Cmd(USART1, ENABLE); }2.2.2 外部中断配置示例以按键中断为例void Key_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /*使能GPIOA和AFIO时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Pin GPIO_Pin_1; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1); EXTI_InitStructure.EXTI_Line EXTI_Line1; EXTI_InitStructure.EXTI_Mode EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd ENABLE; EXTI_Init(EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel EXTI1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority 2; NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; NVIC_Init(NVIC_InitStructure); } /*中断服务函数*/ void EXTI1_IRQHandler(void) { KEY_STA 1; //标志位用于外部判断按键是否按下 EXTI_ClearITPendingBit(EXTI_Line1); }2.2.3 调试引脚复用示例以释放调试引脚为例在STM32F10xx系列中要将PA13、14、15和PB3、4作为普通I/O口使用就必须对其相对应的调试协议禁用失能在上表中PA13、14是SWD的默认调试端口而PA15、PB3、4是JTAG的默认调试端口。/*步骤一使能AFIO时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); /* 步骤二二选一 GPIO_Remap_SWJ_JTAGDisable禁用JTAG启用SWDPA15和PB3、4可做普通I/O使用推荐 GPIO_Remap_SWJ_Disable禁用JTAG和SWDPA13、14、15和PB3、4可做普通I/O使用(不推荐) */ GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); //正常配置所释放I/O口......注以上内容适用于STM32F10xx系列仅供参考。注以上内容仅个人理解不具备唯一性和绝对正确性仅供参考。