一、端口復用
(1)端口復用概念
????????端口復用是將一個I/O賦予多個功能,通過設置I/O的工作模式來切換不同的功能。
????????STM32有很多的內置外設,這些外設的外部引腳都是與GPIO復用的。也就是說,一個GPIO如果可以復用為內置外設的功能引腳,那么當這個GPIO作為內置外設使用的時候,就叫做復用。
????????例如串口1的發送接收引腳是PA9,PA10,當我們把PA9,PA10不用作GPIO,而用做復用功能串口1的發送接收引腳的時候,叫端口復用。
(2)端口復用設置步驟
????????串口 1 的引腳對應的 IO 為 PA9,PA10.PA9,PA10 默認功能是 GPIO,所以當PA9,PA10 引腳作為串口 1 的 TX,RX 引腳使用的時候,那就是端口復用。
復用端口初始化有幾個步驟:
1) GPIO 端口時鐘使能。要使用到端口復用,當然要使能端口的時鐘了。RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);2) 復用的外設時鐘使能。比如你要將端口 PA9,PA10 復用為串口,所以要使能串口時鐘。RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);3) 端口模式配置。 在 IO 復用位內置外設功能引腳的時候,必須設置 GPIO 端口的模式//USART1_TX PA.9 復用推挽輸出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出GPIO_Init(GPIOA, &GPIO_InitStructure);//USART1_RX ?PA.10 浮空輸入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入GPIO_Init(GPIOA, &GPIO_InitStructure);
二、重映射
(1)重映射概念
????????每個內置外設都有若干個輸入輸出引腳,一般這些引腳的輸出端口都是固定不變的,為了讓設計工程師可以更好地安排引腳的走向和功能,在STM32中引入了外設引腳重映射的概念,即一個外設的引腳除了具有默認的端口外,還可以通過設置重映射寄存器的方式,把這個外設的引腳映射到其它的端口。
(2)AFIO重映射的操作步驟:
默認情況下,串口 1 復用的時候的引腳位 PA9,PA10,同時我們可以將 TX 和 RX 重新映射到管腳 PB6 和 PB7 上面去。所以重映射我們同樣要使能復用功能的時候講解的 2 個時鐘外,還要使能 AFIO 功能時鐘,然后
要調用重映射函數。詳細步驟為:1)使能 GPIOB 時鐘:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
2)使能串口 1 時鐘:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
3)使能 AFIO 時鐘:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
4)開啟重映射:GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);這樣就將串口的 TX 和 RX 重映射到管腳 PB6 和 PB7 上面了。
(3)AFIO 是什么?AFIO 時鐘什么時候需要開啟?
????????我們從《STM32中文參考手冊_V10》中找到:對寄存器 AFIO_EVCR、AFIO_MAPR 和 AFIO_EXTICRX 進行讀寫操作前,應當首先打開 AFIO 的時鐘(設置 APB2 外設時鐘使能寄存器 RCC_APB2ENR)。也就是說:當你需要配置 AFIO 這些寄存器的時候,需要把RCC_APB2ENR 寄存器的 AFIO 位置‘1’打開 AFIO 時鐘。
跟 AFIO 相關的寄存器有:
1、 事件控制寄存器(AFIO_EVCR)
2、 復用重映射和調試I/O 配置寄存器(AFIO_MAPR)
3、 外部中斷配置寄存器1(AFIO_EXTICR1)
4、 外部中斷配置寄存器2(AFIO_EXTICR2)
5、 外部中斷配置寄存器3(AFIO_EXTICR3)
6、 外部中斷配置寄存器4(AFIO_EXTICR4)
看看這些寄存器的定義,我們就明白,這些寄存器是用于“事件控制”、“重映射”、“調試IO配置”、“外部中斷”的。例如 AFIO_EXTICRX 用于選擇 EXTIx 外部中斷的輸入源。
總結:當我們需要配置這些 AFIO 寄存器的時候,就需要打開 RCC_APB2ENR 寄存器的 AFIO 時鐘,而不是用到引腳復用功能的時候打開。
(4)部分重映射 & 完全重映射
a)部分重映射:功能外設的部分引腳重新映射,還有一部分引腳是原來的默認引腳。
b)完全重映射:功能外設的所有引腳都重新映射。
例如:部分重映射就是 PB10,PB11,PB12 重映射到 PC10,PC11,PC12 上。而 PB13 和 PB14 和沒有重映射情況是一樣的,都是 USART3_CTS 和 USART3_RTS 對應管腳。完全重映射就是將這兩個腳重新映射到 PD11 和 PD12 上去。我們要使用 USART3 的部分重映射,我們調用函數方法為:GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE);