有关STM32外设配置的几个常见问题
作者:MilerShao
?
在做STM32開發應用的過程中,常常會遇到這樣那樣的問題,其中相當部分問題是與各外設及相關GPIO的配置有關的。就這方面的問題,這里一起總結交流下。
目前的STM32芯片是基于ARM內核的可編程微處理器,我們可以簡單地把內核以外的東西統稱為外設,比方?TIMER、UART、SPI、USB、I2C、存儲器等功能模塊。以32F427芯片功能框圖為例,那些紅圈上的都是。
?
好,我們直接切入主題。圍繞外設的配置,我們遇到的問題,大致可以分為兩大類。
一、時鐘問題,就這方面的問題又可以細分為幾小點。
1.1?時鐘沒打開就使用。
這個不難理解,就是相關外設的時鐘沒有打開。比如UART5的時鐘沒有打開,SPI的時鐘沒打開等,自然操作不了或沒反應。
1.2?時鐘因為總線的判斷錯誤而開錯了時鐘。簡單點說是張冠李戴了。
這個之前經常有人發生。比如類似USART1與USART2、SP1與SP2、TIM1與
TIM2可能并不在同一總線上,配置時以為一樣,結果出了問題。
1.3?時鐘數率配置錯誤。
這點跟第2點似乎有些交叉,這里主要是指因為時鐘數據配置錯誤導致供給外設的時鐘過高導致異常。曾經就有人因給32F1系列芯片的USB配置時鐘時因高于48M,使其性能極不穩定而抓狂。
1.4?復用時鐘沒打開,即AFIO時鐘沒打開。
前面三點都沒問題,配置正確無誤,有些功能必須打開復用時鐘,結果不知或忘記打開。說AFIO時鐘主要是針對STM32F1系列的芯片。這點后面還會繼續補充陳述。
二、GPIO管腳物理安排及配置問題,這個也可以細分兩類。
2.1?管腳復用時出現了競爭沖突,即某個或某幾個管腳同時分配給了2個外設來使用。
某工程師在使用STM32F103V的芯片時,同時用到兩個I2C,結果發現總是I2C2工作正常,而I2C1工作不正常。時鐘、腳位本身配置都沒有問題。后來,發現他啟用了相關FSMC的功能,其中FSMC有個功能腳剛好與I2C1的SDA?腳沖突了。
2.2?需要重映射的腳位沒進行REMAP操作。
對于STM32F1系列需要重映射的功能腳,數據手冊里會在REMAP欄標注出來。
比如上圖中的USART_TX/RX的功能必須執行相關REMAP指令后才能在PB6/7是體現相關功能。記住還要打開GPIOB的時鐘和USART1的時鐘。
2.3?接著1.4的話題多說幾句。
前面1.4提到了AFIO時鐘問題。AFIO時鐘只是在STM32F1系列里被提及。對于32F1系列,涉及到管腳的EXTI、REMAP、事件輸出時就需要開啟AFIO時鐘。比方上面提到的管腳REMAP,必須先開AFIO時鐘。配置EXTI中斷也是一樣,否則不生效。
對于STM32F1以外的其它STM32系列,不再提AFIO,多了個SYSCFG【系統控制器】外設,其功能跟F1的AFIO?有些類似但有差異,主要管理內存空間的映射、與EXTI中斷源有關的IO配置以及其它配置等事務,不同32系列間還各有細小差異。
如果不打開SYSCFG時鐘,有關內存空間重映射、與EXTI配置的操作就會無效。
/* Enable SYSCFG clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
對于STM32F1以外的其它系列的管腳復用安排,跟F1也有所不同,它給出了專門的管腳功能復用寄存器及各個腳可能擔當的復用功能之映射表,?不再單純提管腳的REMAP及AFIO時鐘。若想把某些腳做什么用,結合參考手冊中GPIOx_AFR.寄存器與數據手冊上的復用功能映射表查表配置即可。
?
下面表格是STM32F207芯片的復用功能表。其中的PA2/PA3可以根據不同復用功能需要做不同的選擇。如果作為USART2的TX/RX,就選擇AF7,AF7就對應到相應GPIO復用功能寄存器的配置位。這里它用GPIOA的低8位的口線
,則在GPIOA_AFRL寄存器里進行配置。將0x0111分別寫入AFRL2、AFRL3即可。當然,如果使用STMCU的官方庫代碼的話,操作也還比較直觀。貼圖下面的示例代碼只是用來輔助說明話題而已。
??
/* Enable GPIO clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA , ENABLE);
/* Enable USART clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
/* Connect USART TX/RX pins to AF7 */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2,?GPIO_AF_7);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3,?GPIO_AF_7);
這里順便提下,GPIO_PinSource2?與?GPIO_Pin_2在ST官方庫代碼里定義是不一樣的,有時候有人把這兩個也搞混而出錯。他們的定義如下,一個是側重表示管腳在端口上的位置,一個側重表示管腳在端口上的序號。
#define GPIO_Pin_2?((uint16_t)0x0004) /* Pin 2 selected */
#define GPIO_PinSource2 ((uint8_t)0x02)
?
小結下,上面提到的問題,當工程師基于ST官方固件庫或自行建立工程進行開發的情形下可能會發生的比較多。可喜的是,ST官方有推出一個STM32CUBE的配置工具,該工具在處理STM32 MCU的管腳安排、時鐘配置方面非常方便,可以回避很多因為管腳或時鐘理解上的誤會、視覺上的疏忽而導致的困擾和麻煩,建議盡量使用該工具做輔助開發。
?
?
?
?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的有关STM32外设配置的几个常见问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stm32f103c8t6掉坑记
- 下一篇: STM32之中断与事件---中断与事件的