前言:
本篇主要讲解一下在上一篇遇到的重映射问题,编码器2和编码器3的管脚采用重映射,这里我会给大家简单讲解一下重映射过程中需要注意的问题。
重映射和端口复用:
我们先从定义上区分一下端口复用和重映射。
端口复用的定义
STM32有许多的内置外设(如串口、ADC等等),这些外设的外部引脚都是和GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫复用。
重映射的定义
为了使不同的器件封装的外设I/O功能数量达到最优,可以把一些复用功能重新映射到其他的引脚上。STM32中有许多的内置外设的输入、输出引脚都具有重映射(Remap)的功能。
在STM32中每个内置外设都有若干个输入、输出引脚,一般这些引脚的输出端口都是固定不变的,为了更好地安排引脚的走向和功能,在STM32中引入了外设引脚重映射的概念,即一个外设的引脚除了具有默认的端口之外,还可以通过设定重映射寄存器的方式把这个外设的引脚映射到其他的端口,在我们的数据手册上也能看到这个现象。
上图箭头所指的地方就是管脚对应的重映射这一栏。
这里,我以小车上的编码器2为例,简单叙述一下重映射的一个过程。我们小车的定时器分配上编码器2的A相和B相分别连接到了PB5与PB4,通过查阅数据手册,为了能使用这个编码器,我们需要将TIM3重映射到这俩个管脚上。
1、GPIO端口时钟使能。要使用到端口复用,首先是要使能端口的时钟了;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
2、复用外设的时钟使能;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
3、使能AFIO时钟,重映射时候,必须使能AFIO时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
4、开启重映射。但这里有一个小小的插曲,那就是部分重映射和完全重映射的问题。
从中文数据手册上来看,可以看到没有映像时TIM3的四个通道所对应的引脚为PA6,PA7,PB0和PB1;部分重映像时为PB4,PB5,PB0和PB1,只改变了部分引脚,所以叫部分重映像;设置为完全重映像时为PC6,PC7,PC8和PC9,全部的引脚都改变了,所以叫完全重映像。
为了减少对其他功能的影响,这里我们使用部分重映射。
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3 ,ENABLE );
如果遇到了特殊的重映射(PB3,PB4, PA13,PA14, PA15)怎么办:
我就遇到了两个比较特殊的重映射管脚:PB3,PA15。在一开始我按照之前的步骤去操作的时候,没用出现预期的结果,直到我查看了一下数据手册才发现问题所在,这两个管脚没有被当作普通的IO口来使用。
他们分别对应的JTDO和JTDI功能,这时候,我们就必须要用到下面的函数来关闭其功能了。
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
这时候大家可能就会有疑问了,我关闭了的话,是不是就不能对我们的芯片进行烧写,对我们的代码进行调试了呢?接下来,我给大家讲述一下GPIO_PinRemapConfig()函数的含义。
GPIO_PinRemapConfig()函数参数不同,代表的含义也就不同。
GPIO_Remap_SWJ_JTAGDisable
即能用PB3,PB4,PA15做普通IO,PA13&14用于SWD调试
GPIO_Remap_SWJ_Disable
5个引脚全为普通引脚,但不能再用JTAG&SWD仿真器调试,只能用st-link调试
GPIO_Remap_SWJ_NoJTRST
PB4可为普通IO口,JTAG&SWD正常使用,但JTAG没有复位
在硬件设计方面,智然学长考虑到了这个问题,我们使用PA13和PA14进行下载与调试,我们可以使用上面提到的这个函数。