端口復用的定義
STM32有許多的內置外設(如串口、ADC、DCA等等),這些外設的外部引腳都是和GPIO復用的。也就是說,一個GPIO如果可以復用為內置外設的功能引腳,那么當這個GPIO作為內置外設使用的時候,就叫復用。詳細的可以參考《STM32F103ZET6數據手冊》p30的內容,表格的倒數第二欄就表示端口復用功能。
比如說,STM32的串口1的引腳對應的I/O位PA9、PA10。而PA9、PA10默認的功能都是GPIO,所以說當PA9、PA10引腳作為串口1使用的時候就是端口復用。
在配置GPIO引腳功能時需要打開對應端口(port)所在的總線時鍾,例如:
#define RCC_AHB1Periph_GPIOA ((uint32_t)0x00000001)
#define RCC_AHB1Periph_GPIOB ((uint32_t)0x00000002)
#define RCC_AHB1Periph_GPIOC ((uint32_t)0x00000004)
#define RCC_AHB1Periph_GPIOD ((uint32_t)0x00000008)
#define RCC_AHB1Periph_GPIOE ((uint32_t)0x00000010)
#define RCC_AHB1Periph_GPIOF ((uint32_t)0x00000020)
#define RCC_AHB1Periph_GPIOG ((uint32_t)0x00000040)
#define RCC_AHB1Periph_GPIOH ((uint32_t)0x00000080)
#define RCC_AHB1Periph_GPIOI ((uint32_t)0x00000100)
#define RCC_AHB1Periph_GPIOJ ((uint32_t)0x00000200)
#define RCC_AHB1Periph_GPIOK ((uint32_t)0x00000400)
#define RCC_AHB1Periph_CRC ((uint32_t)0x00001000)
#define RCC_AHB1Periph_FLITF ((uint32_t)0x00008000)
#define RCC_AHB1Periph_SRAM1 ((uint32_t)0x00010000)
#define RCC_AHB1Periph_SRAM2 ((uint32_t)0x00020000)
#define RCC_AHB1Periph_BKPSRAM ((uint32_t)0x00040000)
#define RCC_AHB1Periph_SRAM3 ((uint32_t)0x00080000)
#define RCC_AHB1Periph_CCMDATARAMEN ((uint32_t)0x00100000)
#define RCC_AHB1Periph_DMA1 ((uint32_t)0x00200000)
#define RCC_AHB1Periph_DMA2 ((uint32_t)0x00400000)
#define RCC_AHB1Periph_DMA2D ((uint32_t)0x00800000)
#define RCC_AHB1Periph_ETH_MAC ((uint32_t)0x02000000)
#define RCC_AHB1Periph_ETH_MAC_Tx ((uint32_t)0x04000000)
#define RCC_AHB1Periph_ETH_MAC_Rx ((uint32_t)0x08000000)
#define RCC_AHB1Periph_ETH_MAC_PTP ((uint32_t)0x10000000)
#define RCC_AHB1Periph_OTG_HS ((uint32_t)0x20000000)
#define RCC_AHB1Periph_OTG_HS_ULPI ((uint32_t)0x40000000)
端口復用初始化過程
接下來看一下端口復用初始化過程的步驟,拿串口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以及復用外設功能(端口模式配置)。
