1. 程式人生 > >stm32-USART1重對映

stm32-USART1重對映

首先來說下什麼是埠複用。

STM32有很多的內建外設,這些外設的外部引腳都是與GPIO複用的。也就是說,一個GPIO如果可以複用為內建外設的功能引腳,那麼當這個GPIO作為內建外設使用的時候,就叫做複用。

其實說白了,簡單易懂的說,就是某些普通的外設引腳也可以用來其它功能。比如說那我使用的正點原子哥的板子來說吧,串列埠1 的傳送接收引腳是PA9,PA10,當我們把PA9,PA10不用作普通的GPIO口,而用做複用功能串列埠1的傳送接收引腳的時候,叫埠複用。

接下來說下埠複用的配置過程

首先,GPIO埠時鐘使能。(這個不管用不用埠複用,要使用某個IO口必須要對時鐘進行使能)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE)
;

接下來就是你要使能複用外設時鐘。(這裡以串列埠1為例)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

接下里就是埠模式配置。 GPIO_Init()函式。

  GPIO_InitTypeDef GPIO_InitStructure;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//複用推輓輸出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10

這個可以參考(這裡僅僅貼出了串列埠和定時器的埠配置模式)

以上就是埠複用的配置。

接下來說下什麼是重對映。

每個內建外設都有若干個輸入輸出引腳,一般這些引腳的輸出埠都是固定不變的,為了讓設計工程師可以更好地安排引腳的走向和功能,在STM32中引入了外設引腳重對映的概念,即一個外設的引腳除了具有預設的埠外,還可以通過設定重對映暫存器的方式,把這個外設的引腳對映到其它的埠。

為了使不同器件封裝的外設IO功能數量達到最優,可以把一些複用功能重新對映到其他一些引腳上。STM32中有很多內建外設的輸入輸出引腳都具有重對映(remap)的功能。

打個比方說,串列埠1的TX,RX引腳是在PA9,和PA10埠,但是同時它有兩個對映埠PB6,PB7。開啟重對映,PB6和PB7同樣可以使用串列埠1。

詳情可參考下表關於串列埠1和串列埠2的重對映表。

這裡寫圖片描述

此外,還有有一個部分重對映,所謂部分重對映,顧名思義,就是有部分的埠進行了重對映。

比如time1(當做部分對映時,TIM1_BKIN為PA6引腳,而作為完全重對映是為PE15引腳而TIM1_ETR一直為PA12引腳)

這裡寫圖片描述

接下來還是以串列埠1為例寫下配置過程。

首先,使能GPIO時鐘(注意:重對映後的IO);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

接下來是使能功能外設時鐘;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

然後是使能AFIO時鐘:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

這裡註明下為什麼要使能這個AFIO時鐘。

對暫存器AFIO_MAPR,AFIO_EXTICRX和AFIO_EVCR進行讀寫操作前,應當首先開啟AFIO時鐘。

AFIO_MAPR:配置複用功能重對映
AFIO_EXTICRX:配置外部中斷線對映
AFIO_EVCR:   配置EVENTOUT事件輸出

最後要開啟重對映:

GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);

之後只需要再次初始化GPIO埠即可。

以上也就是埠重對映的配置過程了。

閱讀全文