【STM32】STM32端口複用和重映射(AFIO輔助功能時鐘)

【STM32】STM32端口複用和重映射(AFIO輔助功能時鐘)


STM32F1xx官方資料:

《STM32中文參考手冊V10》-第8章通用和複用功能IO(GPIO和AFIO)

 

端口複用功能
端口複用的定義
STM32有許多的內置外設(如串口、ADC、DCA等等),這些外設的外部引腳都是和GPIO複用的。也就是說,一個GPIO如果可以複用爲內置外設的功能引腳,那麼當這個GPIO作爲內置外設使用的時候,就叫複用。詳細的可以參考《STM32F103ZET6數據手冊》p30的內容,表格的倒數第二欄就表示端口複用功能。

比如說,STM32的串口1的引腳對應的I/O位PA9、PA10。而PA9、PA10默認的功能都是GPIO,所以說當PA9、PA10引腳作爲串口1使用的時候就是端口複用。

那麼,什麼時候端口是默認功能,什麼時候端口是複用功能呢?

STM32時鐘系統的配置除了初始化的時候在system_stm32f10x.c中的SystemInit函數中外,其他的配置主要在stm32f10x_rcc.c文件中, 所以GPIO等等外設的時鐘使能函數都是在此文件中。同時我們通過函數名可以得到規律:GPIOA-GPIOC是掛載在APB2下面,TIM2-TIM4是掛載在APB1下面,DMA是掛載在AHB下面。所以調用函數的名稱是需要根據這個來確定的。

端口複用初始化過程
接下來看一下端口複用初始化過程的步驟,拿串口1爲例:

1、GPIO端口時鐘使能。要使用到端口複用,首先是要使能端口的時鐘了;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
2、複用的外設時鐘使能。比如要將PA9、PA10引腳複用成串口,必須也要使能串口時鐘;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
3、端口模式配置。在I/O複用位內置外設功能引腳的時候,必須設置GPIO端口的模式。至於在複用功能下,GPIO的模式怎麼設置,可以查看手冊《STM32中文參考手冊》p110的內容。這裏拿USART1爲例,進行配置,要配置全雙工的串口1,TX引腳需要推輓複用輸出,RX引腳需要浮空輸入或者上拉輸入;

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);
  
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10 PA.10 浮空輸入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
GPIO_Init(GPIOA, &GPIO_InitStructure);  
總而言之,使用複用功能的時候至少要使能2時鐘:GPIO時鐘使能、複用的外設時鐘使能。同時還要初始化GPIO以及複用外設功能(端口模式配置)。

 

端口重映射
端口重映射的定義
爲了使不同的器件封裝的外設I/O功能數量達到最優,可以把一些複用功能重新映射到其他的引腳上。STM32中有許多的內置外設的輸入、輸出引腳都具有重映射(Remap)的功能。

我們知道,每個內置外設都有若干個輸入、輸出引腳,一般這些引腳的輸出端口都是固定不變的,爲了更好地安排引腳的走向和功能,在STM32中引入了外設引腳重映射的概念,即一個外設的引腳除了具有默認的端口之外,還可以通過設定重映射寄存器的方式把這個外設的引腳映射到其他的端口。

簡單講,就是把引腳的外設功能映射到其他的引腳上,但不是可以隨便映射的,具體的對應關係參考《STM32F103ZET6數據手冊》p30的內容,表格的最後一欄就表示端口重映射功能。

這裏同樣用串口1爲例來說明。

可以看出,我們可以將串口1重映射到PB6、PB7引腳上。

端口重映射初始化過程
接下來看一下端口重映射初始化過程的步驟,拿串口1爲例,除了之前使能複用功能的2個時鐘之外,還需要使能AFIO功能時鐘,然後調用重映射函數:

1、GPIO端口時鐘使能。要使用到端口複用,首先是要使能端口的時鐘了;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
2、複用的外設時鐘使能。比如要將PB6、PB7引腳複用成串口,必須也要使能串口時鐘;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
3、使能AFIO時鐘。重映射必須使能AFIO時鐘;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
4、開啓重映射;

GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
這樣,就將串口1的TX和RX引腳映射到PB6、PB7引腳上面了。至於哪些功能可以重映射,除了查看中文參考手冊之外,還可以從GPIO_PinRemapConfig函數入手查看第一個入口參數的取值範圍的值。stm32f10x_gpio.h中定義了一些宏定義的標識符:

#define GPIO_Remap_SPI1             ((uint32_t)0x00000001)  /*!< SPI1 Alternate Function mapping */
#define GPIO_Remap_I2C1             ((uint32_t)0x00000002)  /*!< I2C1 Alternate Function mapping */
#define GPIO_Remap_USART1           ((uint32_t)0x00000004)  /*!< USART1 Alternate Function mapping */
#define GPIO_Remap_USART2           ((uint32_t)0x00000008)  /*!< USART2 Alternate Function mapping */
#define GPIO_PartialRemap_USART3    ((uint32_t)0x00140010)  /*!< USART3 Partial Alternate Function mapping */
#define GPIO_FullRemap_USART3       ((uint32_t)0x00140030)  /*!< USART3 Full Alternate Function mapping */
#define GPIO_PartialRemap_TIM1      ((uint32_t)0x00160040)  /*!< TIM1 Partial Alternate Function mapping */
#define GPIO_FullRemap_TIM1         ((uint32_t)0x001600C0)  /*!< TIM1 Full Alternate Function mapping */
#define GPIO_PartialRemap1_TIM2     ((uint32_t)0x00180100)  /*!< TIM2 Partial1 Alternate Function mapping */
#define GPIO_PartialRemap2_TIM2     ((uint32_t)0x00180200)  /*!< TIM2 Partial2 Alternate Function mapping */
#define GPIO_FullRemap_TIM2         ((uint32_t)0x00180300)  /*!< TIM2 Full Alternate Function mapping */
#define GPIO_PartialRemap_TIM3      ((uint32_t)0x001A0800)  /*!< TIM3 Partial Alternate Function mapping */
#define GPIO_FullRemap_TIM3         ((uint32_t)0x001A0C00)  /*!< TIM3 Full Alternate Function mapping */
可以看出,USART1只有一種重映射,而USART3存在部分重映射和完全重映射。所謂部分重映射就是部分引腳和默認的是一樣的,完全重映射就是所有引腳都映射到了新的引腳。可以查看《STM32中文參考手冊》p119的內容查看部分重映射和完全重映射的內容。而在之前最後開啓重映射的函數中,根據第一個參數,來確定是部分重映射還是全部重映射。

 

AFIO輔助功能時鐘
之前在端口重映射的時候,講到要使能AFIO輔助功能時鐘。那麼什麼時候需要開啓(使能)呢?

對寄存器AFIO_MAPR、AFIO_EXTICRx和AFIO_EVCR進行讀寫操作前,應當首先開啓AFIO時鐘。

AFIO_MAPR:配置複用功能重映射
AFIO_EXTICRx:配置外部中斷線映射
AFIO_EVCR:   配置事件輸出
————————————————
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章