大家在初学 STM 32 时,应该都会遇到这么一个情况,就是当自己的程序在一个网上买的开发板上可以运行,但是,要是把这个程序下载到另一个带有同样的STM32 的核心板的另一个品牌的开发板,似乎结果就和我们预想的不一样。这是因为每一个品牌自己设计的开发板的复用引脚都不同,臂如我们想用PWM控制舵机,假设我们会用到定时器2的第1个输出引脚 TIM2_CH1_ETR ,一个开发板的舵机模块的输出引脚在PA0 ,另一个开发板上舵机模块的输出引脚在 PA15 ,此时,程序在第一个开发板能运行,在第一个开发板肯定不能运行。此时,我们就需要引脚重映射了。
注意:1)笔者使用的是标准库
2)笔者使用的 STM32 芯片是 STM32F103C8T6A
引脚重映射步骤(以上面的例子展开):
打开自己的STM32 的芯片的引脚定义图,我们会发现定时器2的 TIM2_CH1_ETR 在 WKUP-PA0 这一行的“默认复用功能“处。
我们要想TIM2_CH1_ETR 的输出从 PA0 转到另一处引脚,此时就需要在该定义图的”重定义功能“这一列寻找第二个”TIM2_CH1_ETR “字眼,我们会在 PA15 这一行找到它。
打开Keil5,因为 AFIO 挂载在 APB2 总线上,所以在程序中打开 AFIO 的时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
因为 PA15 引脚有自己原来的主功能,所以我们先需要屏蔽原来的主功能,而 PA15 引脚是 JTAG的调试端口,所以我们要屏蔽该调试端口,使用该条函数可以实现: GPIO_PinRemapConfig() 。
去到该函数的定义处,寻找相应的第一个参数。
所以此时的第一个参数就是 GPIO_Remap_SWJ_JTAGDisable(tip: 使用该参数,会将 JTAG 的所有调试引脚的功能都会屏蔽掉,不仅仅是 PA15;还有如果小心输入参数 GPIO_Remap_SWJ_Disable ,当你把程序输入进去后,之后你就无法使用 STLinker 给单片机传程序了,因为这个参数会一同把 JTAG 和 SW 的调试端口的功能全屏蔽掉,此时你就只能使用串口给单片机传数据了)
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
然后再次使用 GPIO_PinRemapConfig() ,将 TIM2_CH1_ETR的输出口从 PA0 变到 PA15 ,此时我们需要先确定一下该函数使用的第一个参数,打开《 STM32F10xxx参考手册(中文)》,找到 8.3 复用功能 I/O 和调试配置(AFIO)(如果想更加深入了解引脚重映射,可以认真看一下该小结)。观察该表,如果要使 TIM2_CH1_ETR的输出口从 PA0 变到 PA15,第一个部分从映射方式和完全重映射方式可以实现。
然后再次转到该函数的定义,寻找相应的参数。
通过以上三条函数,便可实现所谓的引脚重映射。