對(duì)于STM32系列芯片的管腳定義,因?yàn)榻^大部分管腳除了默認(rèn)的GPIO功能外,還可以有復(fù)用或額外功能,搞得很復(fù)雜。初次使用可能讓人犯暈。這里以STM32F0系列為例,來(lái)聊聊管腳相關(guān)的話題。 STM32F0芯片管腳除了個(gè)別電源或特定功能腳【比如復(fù)位腳、引導(dǎo)控制腳】外,芯片復(fù)位后,其它管腳的默認(rèn)功能就是GPIO,同時(shí)各GPIO口往往具有其它復(fù)用功能或者額外功能。關(guān)于芯片管腳的說(shuō)明在芯片的數(shù)據(jù)手冊(cè)里有詳細(xì)介紹。
一、芯片管腳默認(rèn)功能、復(fù)用功能、額外功能界定話題
在芯片的數(shù)據(jù)手冊(cè)里都有關(guān)于各系列芯片的管腳描述表。如下圖表格可以看出,各個(gè)管腳有分3個(gè)功能塊,一個(gè)復(fù)位后默認(rèn)功能【function after reset】,一塊復(fù)用功能【alternate functions】,還一塊就是額外功能【additional functions】。額外功能主要集中在做AD輸入腳、外部晶體腳及其它個(gè)別額外功能腳。 FIG1. 管腳描述表 默認(rèn)功能沒(méi)啥好說(shuō)的,就是芯片復(fù)位后的管腳功能或狀態(tài)。復(fù)用功能是通過(guò)配置GPIOx_AFR寄存器后選擇的功能。額外功能就是配置相關(guān)外設(shè)寄存器來(lái)選擇的功能,比方配置ADC使能某些通道、開(kāi)啟USB應(yīng)用等來(lái)使能相應(yīng)管腳的額外功能。  FIG2 管腳復(fù)用功能對(duì)應(yīng)表
二、有些管腳的定義安排貌似有沖突或重復(fù)的話題。以下圖中的I2C1管腳說(shuō)明為例。
 從上圖可以看出,對(duì)于48腳或64腳的32F030芯片,I2C1復(fù)用功能腳似乎可位于兩個(gè)位置,咋看上去好像標(biāo)錯(cuò)了。讓人疑惑到底使用哪對(duì)腳。 那我們?cè)倏纯从嘘P(guān)復(fù)用功能寄存器對(duì)應(yīng)表,結(jié)合上面FIG2 管腳復(fù)用功能對(duì)應(yīng)表的PB6、PB7、PB8、PB9所對(duì)應(yīng)的AF1那一欄,其實(shí)那4個(gè)腳可以有4種組合來(lái)實(shí)現(xiàn)I2C1的復(fù)用功能。可以分別是PB6\PB7,PB8\PB9,PB6\PB9,PB7\PB8四組中其中之一來(lái)做I2C1的通信功能腳。 我們可以用STM32CUBEMX工具來(lái)驗(yàn)證測(cè)試下上面的理解。下面只列出了PB6\PB9,PB8\PB7的配置使用過(guò)程。 
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等。總之,參照那個(gè)復(fù)用功能表結(jié)合你芯片管腳合理安排就好。當(dāng)然有STM32CUBEMX配合也就更方便了。
三、一個(gè)跟管腳安排理解有關(guān)的應(yīng)用異常話題 不只一個(gè)工程師反映把基于STM32F072R6主芯片學(xué)習(xí)板上的調(diào)試OK的USB 應(yīng)用項(xiàng)目,移植到基于STM32F042F4的目標(biāo)系統(tǒng)時(shí),發(fā)現(xiàn)PC機(jī)無(wú)法發(fā)現(xiàn)設(shè)備。 STM32F072R6和STM32F042F4隸屬于STM32F0同一系列,二者主要差別在于有無(wú)DAC。其它外設(shè)基本一樣,具體到這2個(gè)型號(hào),就是GPIO數(shù)目上及管腳安排上的細(xì)微差異。二者的數(shù)據(jù)手冊(cè)也明明白白的寫(xiě)了都支持USB FS DEVICE功能。對(duì)于USB應(yīng)用,二者除了可能管腳安排的差異外,內(nèi)部驅(qū)動(dòng)程序應(yīng)該是一模一樣。 從手冊(cè)上看,64腳STM32F072R的USB外設(shè)功能管腳為PA11,PA12,屬于額外功能,即只需使能相關(guān)usb外設(shè)應(yīng)用即可。
再看看下面20腳 STM32F042F4的相關(guān)管腳定義和安排。 顯然,管腳編號(hào)為17/18的功能描述有點(diǎn)另類,圖下方緊跟一句說(shuō)明。大致意思PA11/PA12可以通過(guò)配置SYSCFG_CFGR1來(lái)進(jìn)行重映射來(lái)取代PA9/PA10的功能。是個(gè)重要提醒,也不是特別明了,再細(xì)看芯片如下的管腳功能描述表。 我們上面第一個(gè)話題就提到32f0芯片管腳往往可能有三種功能,默認(rèn)功能,復(fù)用功能及額外功能。結(jié)合上面表格,同樣的17、18腳,可能作為PA9 \PA10或后面一大堆的復(fù)用功能選擇之一,也可能作為PA11\PA12或者與之對(duì)應(yīng)的復(fù)用功能及額外功能的選擇之一。 不過(guò),要做PA11\PA12或相關(guān)復(fù)用功能或額外功能,必須首先使能SYSCFG外設(shè)并配置SYSCFG_CFGR1寄存器才行,否則基于PA11\PA12的默認(rèn)功能及復(fù)用和額外功能都不會(huì)生效。 上面工程師碰到的問(wèn)題剛好就出在這里,他們只是簡(jiǎn)單的連接了芯片的第17腳18腳,此時(shí)USB_DM/USB_DP功能沒(méi)生效,即使你代碼寫(xiě)得再漂亮,PC機(jī)還是無(wú)法識(shí)別USB設(shè)備。 我們不妨通過(guò)STM32CUBE MX配置工具來(lái)看看STM32F042F4芯片的管腳配置情況。不打開(kāi)還好,咋一打開(kāi)似乎讓你發(fā)現(xiàn)新大陸。 當(dāng)打開(kāi)基于STM32F042F4的STM32CUBE的配置界面時(shí),發(fā)現(xiàn)跟USB有關(guān)的外設(shè)配置都是無(wú)效狀態(tài),第一感覺(jué)就是它不支持USB功能。  
再次打開(kāi)STM32F042F4的數(shù)據(jù)手冊(cè),上面分明寫(xiě)了它是支持USB device的。結(jié)合前面的描述,感覺(jué)是不是CUBEMX里沒(méi)有打開(kāi)相關(guān)外設(shè)或選型的配置。其實(shí),STM32F0系列芯片里有個(gè)外設(shè)就是系統(tǒng)配置控制器【SYSCFG】,只有開(kāi)啟了它,上面提到的SYSCFG_CFGR1寄存器配置才有意義。 具體到32f0的CUBEMX界面里就有個(gè)SYS的外設(shè)可以配置。當(dāng)你點(diǎn)開(kāi)那里時(shí)你會(huì)發(fā)現(xiàn)另一番天地。上面提到的一些東西都會(huì)赫然而現(xiàn)。 當(dāng)在左邊外設(shè)欄的SYS和USB的適當(dāng)?shù)胤焦催x,右邊管腳配置圖立即出現(xiàn)USB通信腳位安排位置。 小結(jié): 1、STM32芯片的管腳可能呈現(xiàn)三種功能狀態(tài)之一,默認(rèn)功能、復(fù)用功能、額外功能。 2、stm32芯片外設(shè)往往很豐富,管腳復(fù)用安排往往很龐大復(fù)雜。數(shù)據(jù)手冊(cè)里有管腳說(shuō)明及各類表格,查看時(shí)耐心、細(xì)心點(diǎn)。 3、STM32CUBEMX工具為我們的芯片管腳安排提供了巨大的方便,但再方便也不能完全不看數(shù)據(jù)手冊(cè),比方上面提到第3個(gè)話題如果不看數(shù)據(jù)手冊(cè)很可能會(huì)把自己帶進(jìn)誤區(qū)。
【拋磚引玉 旨在交流,如有錯(cuò)疏 歡迎賜教】 |