端口复用
STM32有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。
简单易懂的说,就是某些普通的外设引脚也可以用来其它功能。比如说串口1 的发送接收引脚是PA9,PA10,当我们把PA9,PA10不用作普通的GPIO口,而用做复用功能串口1的发送接收引脚的时候,叫端口复用。
重映射
我们知道每个内置外设都有若干个输入输出引脚,一般这些引脚的输出脚位都是固定不变的,为了让设计工程师可以更好地安排引脚的走向和功能,在STM32中引入了外设引脚重映射的概念,即一个外设的引脚除了具有默认的脚位外,还可以通过设置重映射寄存器的方式,把这个外设的引脚映射到其它的脚位。
STM32的端口重映射有三种模式:
- 没有重映射
- 部分重映射
- 完全重映射
以TIM3为例,没有重映射就是使用复用端口引脚,如下图,没有重映射4个输出通道引脚分别是在PA6、PA7、PB0、PB1;部分重映射,从字面上理解就是只改变一部分输出或输入引脚的端口,部分重映射后,TIM3的通道1和通道2从原先的PA6、PA7引脚改变到PB4、PB5了,而通道3、通道4还是在PB0、PB1保持不变;完全重映射,引脚全部改变了,通道1到通道4从原先的PA6、PA7、PB0、PB1变为PC6~PC9。
重映射编程步骤
- 打开重映射时钟和重映射后的I/O口引脚时钟;
- I/O口重映射开启;
- 配制重映射引脚, 这里只需配置重映射后的I/O,原来的不需要去配置。
还是以TIM3为例
/*TIM3默认4个通道:PA6,PA7,PB0,PB1*/
/*部分重映射到: PB4,PB5,PB0,PB1*/
/*完全重映射到: PC6,PC7,PC8,PC9*/
/**/
void TIM_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//开启时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /*开启TIM3时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); /*开启重映射时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /*开启GPIOB时钟*/
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);/*JTAG-DP 禁用 + SW-DP 使能,没有这一句PB4不能用*/
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3 , ENABLE); /*TIM3部分重映射*/
//配置引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /* 复用推挽输出模式 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5;
GPIO_Init(GPIOB,&GPIO_InitStructure); /*初始化*/
}