本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
端口复用
端口复用介绍
STM32 有很多的内置外设,这些外设的外部引脚都是与 GPIO 复用的。也就是说,一个 GPIO如果可以复用为内置外设的功能引脚,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。
具体哪些 GPIO 管脚是可以复用为哪些内置外设的参考相关资料。(《STM32 中文参考手册 V10》的 P109, P116~P121 )
外设: 外部设备简称“外设”,是指连在计算机主机以外的硬件设备。对数据和信息起着传输、转送和存储的作用,是计算机系统中的重要组成部分
复用端口初始化步骤
- 使能相应GPIO 端口时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA
- 复用的外设时钟使能。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//为了端口 PA9,PA10 复用为串口,使能串口时钟
- 配置端口模式:GPIO_Init()函数 不同复用外设参考相应资料(《STM32 中文参考手册 V10》 8.1.11 一节内容)
例:PA9,PA10复用为串口1:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);IO时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);外设时钟使能
//初始化IO为对应模式
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF_PP; //模式选择为复用推挽输出
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;//速率选择为50M
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIOA
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IN_FLOATING; //模式选择为浮空输入
GPIO_Init(GPIOA,&GPIO_InitStructure);
重映射
重映射简介
为了使不同器件封装的外设 IO 功能数量达到最优,可以把一些复用功能重新映射到其他一些引脚上。 (更好地安排引脚的走向与功能)
即一个外设的引脚除了具有默认的端口外,还可以通过设置重映射寄存器的方式,把这个外设的引脚映射到其它的端口。
重映射步骤
- 使能被重映射的IO端口时钟。
- 使能被重映射的外设时钟。
- 使能AFIO时钟
- 开启重映射
第三步,开启AFIO的情况: 对寄存器AFIO_MAPR,AFIO_EXTICRX与AFIO_EVCR进行读写操作,则应打开AFIO时钟 AFIO_MAPR:配置复用功能重映射 AFIO_EXTICRX:配置外部中断线映射(X=1,2,3,4) AFIO_EVCR:配置EVENTOUT事件输出
例:将原PA9,PA10的复用串口1重映射到PB6,PB7
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能 GPIOB 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //使能串口 1 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //使能 AFIO 时钟
GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);//开启重映射,根据第一个参数确定部分重映射还是全部重映射
部分重映射:功能外设的部分引脚重新映射,还有一部分引脚是原来的默认引脚。 完全重映射:功能外设的所有引脚都重新映射。
两者区别
一开始我也被两种功能弄乱了,感觉两个好像是同一回事,后来才慢慢弄清:
每一个IO口都有两种功能,一种是作为普通的输入输出,此时的IO口对芯片是没有差异的,不存在其余功能的,只是单纯的高低电平输出或者是接收器而已。另一种就是复用,此时的IO口作为特殊的IO口存在,比如作为复用为串口相关的IO口,虽然依旧只是输出或者输入高低电平而已,但此时改引脚已经和芯片内部某种功能联结在一起。
而重映射可以看为是特殊的复用,将原本是引脚A的复用功能,映射到引脚B上面去。比如,引脚A复用后作为EXTI1功能,但为了引脚功能数量较优,或者画板子较容易等等原因,将EXTI1功能重映射到引脚B上去,这样,引脚B就得到原本没有的功能。
但是请注意,复用和重映射不是随便的,每一个IO口,可以得到的复用功能和重映射功能都是有限且明确的,具体可以网上找一下资料或查看用户手册。