對于STM32系列芯片的管腳定義,因為絕大部分管腳除了默認的GPIO功能外,還可以有復用或額外功能,搞得很復雜。初次使用可能讓人犯暈。這里以STM32F0系列為例,來聊聊管腳相關的話題。 STM32F0芯片管腳除了個別電源或特定功能腳【比如復位腳、引導控制腳】外,芯片復位后,其它管腳的默認功能就是GPIO,同時各GPIO口往往具有其它復用功能或者額外功能。關于芯片管腳的說明在芯片的數據手冊里有詳細介紹。
一、芯片管腳默認功能、復用功能、額外功能界定話題
在芯片的數據手冊里都有關于各系列芯片的管腳描述表。如下圖表格可以看出,各個管腳有分3個功能塊,一個復位后默認功能【function after reset】,一塊復用功能【alternate functions】,還一塊就是額外功能【additional functions】。額外功能主要集中在做AD輸入腳、外部晶體腳及其它個別額外功能腳。 FIG1. 管腳描述表 默認功能沒啥好說的,就是芯片復位后的管腳功能或狀態。復用功能是通過配置GPIOx_AFR寄存器后選擇的功能。額外功能就是配置相關外設寄存器來選擇的功能,比方配置ADC使能某些通道、開啟USB應用等來使能相應管腳的額外功能。  FIG2 管腳復用功能對應表
二、有些管腳的定義安排貌似有沖突或重復的話題。以下圖中的I2C1管腳說明為例。
 從上圖可以看出,對于48腳或64腳的32F030芯片,I2C1復用功能腳似乎可位于兩個位置,咋看上去好像標錯了。讓人疑惑到底使用哪對腳。 那我們再看看有關復用功能寄存器對應表,結合上面FIG2 管腳復用功能對應表的PB6、PB7、PB8、PB9所對應的AF1那一欄,其實那4個腳可以有4種組合來實現I2C1的復用功能。可以分別是PB6\PB7,PB8\PB9,PB6\PB9,PB7\PB8四組中其中之一來做I2C1的通信功能腳。 我們可以用STM32CUBEMX工具來驗證測試下上面的理解。下面只列出了PB6\PB9,PB8\PB7的配置使用過程。 
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) { GPIO_InitTypeDef GPIO_InitStruct; if(hi2c->Instance==I2C1) { /* USER CODE BEGIN I2C1_MspInit 0 */ /* USER CODE END I2C1_MspInit 0 */ /**I2C1 GPIO Configuration PB6 ------> I2C1_SCL PB9 ------> I2C1_SDA */ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; GPIO_InitStruct.Alternate = GPIO_AF1_I2C1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); 
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) { GPIO_InitTypeDef GPIO_InitStruct; if(hi2c->Instance==I2C1) { /* USER CODE BEGIN I2C1_MspInit 0 */ /* USER CODE END I2C1_MspInit 0 */ /**I2C1 GPIO Configuration PB7 ------> I2C1_SDA PB8 ------> I2C1_SCL */ GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; GPIO_InitStruct.Alternate = GPIO_AF1_I2C1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); 像上面類似管腳安排的不只I2C1,比方還有SPI等。總之,參照那個復用功能表結合你芯片管腳合理安排就好。當然有STM32CUBEMX配合也就更方便了。
三、一個跟管腳安排理解有關的應用異常話題 不只一個工程師反映把基于STM32F072R6主芯片學習板上的調試OK的USB 應用項目,移植到基于STM32F042F4的目標系統時,發現PC機無法發現設備。 STM32F072R6和STM32F042F4隸屬于STM32F0同一系列,二者主要差別在于有無DAC。其它外設基本一樣,具體到這2個型號,就是GPIO數目上及管腳安排上的細微差異。二者的數據手冊也明明白白的寫了都支持USB FS DEVICE功能。對于USB應用,二者除了可能管腳安排的差異外,內部驅動程序應該是一模一樣。 從手冊上看,64腳STM32F072R的USB外設功能管腳為PA11,PA12,屬于額外功能,即只需使能相關usb外設應用即可。
再看看下面20腳 STM32F042F4的相關管腳定義和安排。 顯然,管腳編號為17/18的功能描述有點另類,圖下方緊跟一句說明。大致意思PA11/PA12可以通過配置SYSCFG_CFGR1來進行重映射來取代PA9/PA10的功能。是個重要提醒,也不是特別明了,再細看芯片如下的管腳功能描述表。 我們上面第一個話題就提到32f0芯片管腳往往可能有三種功能,默認功能,復用功能及額外功能。結合上面表格,同樣的17、18腳,可能作為PA9 \PA10或后面一大堆的復用功能選擇之一,也可能作為PA11\PA12或者與之對應的復用功能及額外功能的選擇之一。 不過,要做PA11\PA12或相關復用功能或額外功能,必須首先使能SYSCFG外設并配置SYSCFG_CFGR1寄存器才行,否則基于PA11\PA12的默認功能及復用和額外功能都不會生效。 上面工程師碰到的問題剛好就出在這里,他們只是簡單的連接了芯片的第17腳18腳,此時USB_DM/USB_DP功能沒生效,即使你代碼寫得再漂亮,PC機還是無法識別USB設備。 我們不妨通過STM32CUBE MX配置工具來看看STM32F042F4芯片的管腳配置情況。不打開還好,咋一打開似乎讓你發現新大陸。 當打開基于STM32F042F4的STM32CUBE的配置界面時,發現跟USB有關的外設配置都是無效狀態,第一感覺就是它不支持USB功能。  
再次打開STM32F042F4的數據手冊,上面分明寫了它是支持USB device的。結合前面的描述,感覺是不是CUBEMX里沒有打開相關外設或選型的配置。其實,STM32F0系列芯片里有個外設就是系統配置控制器【SYSCFG】,只有開啟了它,上面提到的SYSCFG_CFGR1寄存器配置才有意義。 具體到32f0的CUBEMX界面里就有個SYS的外設可以配置。當你點開那里時你會發現另一番天地。上面提到的一些東西都會赫然而現。 當在左邊外設欄的SYS和USB的適當地方勾選,右邊管腳配置圖立即出現USB通信腳位安排位置。 小結: 1、STM32芯片的管腳可能呈現三種功能狀態之一,默認功能、復用功能、額外功能。 2、stm32芯片外設往往很豐富,管腳復用安排往往很龐大復雜。數據手冊里有管腳說明及各類表格,查看時耐心、細心點。 3、STM32CUBEMX工具為我們的芯片管腳安排提供了巨大的方便,但再方便也不能完全不看數據手冊,比方上面提到第3個話題如果不看數據手冊很可能會把自己帶進誤區。
【拋磚引玉 旨在交流,如有錯疏 歡迎賜教】 |