今天分享以下兩點內(nèi)容:
2.關(guān)于STM32的 I/O 復(fù)用功能及什么時候開啟AFIO時鐘;
1為什么我們要先開啟STM32外設(shè)時鐘
講述本節(jié)內(nèi)容之前先說一個案例:
前段時間,有一個朋友為配置EXTI的代碼折騰了一天,最終沒有結(jié)果。于是問了我這樣一個問題:“你用過STM32F051C8T6的外部中斷嗎,就是GPIO管腳做中斷,我這邊就是進不了中斷”。
然后他把基于標準外設(shè)庫、寄存器寫的代碼都給我發(fā)過來了。我仔細看了又看,沒發(fā)現(xiàn)有什么毛病啊。(但是,代碼是截圖分來給我發(fā)過來的)。
于是,我將之前配置IO外部中斷的代碼,按照他(PB2)的要求,寫成一個“EXTI配置”函數(shù)發(fā)給他,他直接拷貝過去,成功了。
于是,他仔細對比了代碼,終于發(fā)現(xiàn)了問題的原因,配置的順序不對,使能時鐘不是在最開始。
我想許多朋友都曾遇到過這種坑,我最初學(xué)習(xí)STM32的時候同樣也遇到過,下面我就來說說為什么我們要先開啟STM32外設(shè)模塊時鐘,再對其外設(shè)模塊初始化配置?
1.系統(tǒng)架構(gòu)
不同類型的STM32,它的系統(tǒng)架構(gòu)各有不同,但原理都類似,由多條主控總線和多條被控總線組成(請參看【參考手冊】存儲器和總線架構(gòu)章節(jié))。
如STM32F4:
● 八條主控總線:
— Cortex-M4F 內(nèi)核 I 總線、 D 總線和 S 總線
— DMA1 存儲器總線
— DMA2 存儲器總線
— DMA2 外設(shè)總線
— 以太網(wǎng) DMA 總線
— USB OTG HS DMA 總線
● 七條被控總線:
— 內(nèi)部 Flash ICode 總線
— 內(nèi)部 Flash DCode 總線
— 主要內(nèi)部 SRAM1 (112 KB)
— 輔助內(nèi)部 SRAM2 (16 KB)
— 輔助內(nèi)部 SRAM3 (64 KB)(僅適用于 STM32F42xxx 和 STM32F43xxx 器件)
— AHB1 外設(shè)(包括 AHB-APB 總線橋和 APB 外設(shè))
— AHB2 外設(shè)
— FSMC
借助總線矩陣,可以實現(xiàn)主控總線到被控總線的訪問,這樣即使在多個高速外設(shè)同時運行期間,系統(tǒng)也可以實現(xiàn)并發(fā)訪問和高效運行。
2.關(guān)于AHB和APB總線
AHB:Advanced High-performance Bus,即先進的高性能總線.
APB:Advanced Peripheral Bus,即先進的外圍(外設(shè))總線.
上面說了系統(tǒng)總線的架構(gòu)引伸出來的就是AHB和APB總線,那為什么要講述AHB和APB總線呢?
我們操作的外圍設(shè)備一般都是位于AHB和APB總線上,而AHB可以引伸出AHB1、AHB2,甚至AHB3。同樣APB也存在APB1、APB2等。
如:USART1外設(shè)位于APB1總線上,GPIOA位于AHB1高速總線上。
請注意參考手冊中“AHB/APB 總線橋”這一小節(jié),有一條重要的內(nèi)容:每次芯片復(fù)位后,所有外設(shè)時鐘都被關(guān)閉( SRAM 和 Flash 接口除外)。使用外設(shè)前,必須在 RCC_AHBxENR 或 RCC_APBxENR 寄存器中使能其時鐘。
3.STM32時鐘控制
請參看STM32參考手冊關(guān)于【復(fù)位與時鐘控制RCC】章節(jié)。
STM32的時鐘控制模塊因MCU芯片不同,各有差異,但原理都類似,功能也相當豐富。主要的目的就是給相對獨立的外設(shè)模塊提供時鐘,也是為了降低整個芯片的功能。
降低功耗是主要原因,還有一個原因,就是為了兼容不同速度的設(shè)備,有些高速,有些低速,如果都用高速時鐘,勢必造成浪費。
RCC給外設(shè)提供時鐘是一個主要目的,那么為什么要提供時鐘呢?原因在于外圍設(shè)備的寄存器需要時鐘才能工作。你可以把外設(shè)當做一個設(shè)備,而這個設(shè)備需要給它提供電源(時鐘)才能工作。
你在STM32參考手冊的“RCC”章節(jié)可能會看到這么一句話:當外設(shè)時鐘沒有啟用時,軟件不能讀出外設(shè)寄存器的數(shù)值,返回的數(shù)值始終是0x0。
4.總結(jié)
看到這里相信聰明的你其中已經(jīng)明白為什么我們要先開啟STM32外設(shè)模塊時鐘,再配置其外設(shè)模塊了。
簡單來說:操作外設(shè)是通過外設(shè)總線來實現(xiàn),只有外設(shè)總線有時鐘了才能操作外設(shè)。
坑:
A.先使能外設(shè)時鐘,再對其進行配置
B.時鐘配置需對應(yīng)總線
這種基于標準外設(shè)庫的低級錯誤,相信肯定有不少人遇到過,希望提高警惕。
2關(guān)于STM32的I/O復(fù)用功能及什么時候開啟AFIO時鐘
前面有朋友問:“什么時候開啟AFIO時鐘”。寫了上面章節(jié),就順便再講述一下關(guān)于STM32的I/O復(fù)用功能及什么時候開啟AFIO時鐘。
1.什么是I/O 復(fù)用功能?
簡單來說就是把普通I/O用作其它的功能。如:將PA9引腳用作USART1的Tx引腳,那么我們就把這個Tx引腳稱為PA9的復(fù)用功能。
打開數(shù)據(jù)手冊,會發(fā)現(xiàn)類似如下的列表:
2.什么時候開啟AFIO時鐘
為了優(yōu)化芯片引腳封裝的外設(shè)數(shù)目,可以把一些復(fù)用功能重新映射到其他引腳上。設(shè)置復(fù)用重映射和調(diào)試I/O配置寄存器實現(xiàn)引腳的重新映射。這時,復(fù)用功能不再映射到它們的原始分配上,而是映射到“重定義功能”上(見上圖)。
這種將引腳重定義到其它引腳上的功能在幾乎所有STM32芯片中都有這個功能,但是實現(xiàn)的方法可能有所不同,其中STM32F1就是通過事件控制的方式將特定功能引腳連接到對應(yīng)PORT和PIN上。
簡單來說,如果需要使用重定義功能,那么就需要開啟AFIO時鐘。
最后,如果你覺得你的程序可能是因為時鐘配置的問題,不妨上電第一步使能所有時鐘試試。
推薦閱讀:
1.STM32標準外設(shè)庫SPL轉(zhuǎn)換成Cube LL
2.利用STM32 ST-LINK Utility查看內(nèi)核運行狀態(tài),助你判斷程序是否跑飛
5最后
若覺得文章好,記得點贊、分享。掃描下面二維碼、關(guān)注,在底部菜單中查看更多精彩內(nèi)容!
長按識別圖中二維碼關(guān)注
贊賞是對作者的認可與支持!
原文標題:關(guān)于STM32時鐘配置的那些坑
文章出處:【微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
ARM
+關(guān)注
關(guān)注
134文章
9265瀏覽量
373265 -
STM32
+關(guān)注
關(guān)注
2282文章
10986瀏覽量
361111 -
Atmel
+關(guān)注
關(guān)注
17文章
312瀏覽量
108183 -
AMBA
+關(guān)注
關(guān)注
0文章
70瀏覽量
15259 -
AFIO
+關(guān)注
關(guān)注
0文章
6瀏覽量
3084
發(fā)布評論請先 登錄
相關(guān)推薦
Modbus TCP通信的那些坑!你遇到過幾個?

STM32CubeMX用于STM32配置和初始化C代碼生成
時鐘配置來啦!HPMicro Tool Web v0.5.0 更新

一千余字解讀stm32時鐘樹

用SPI來配置ADS7229芯片,用外部時鐘SCLK和內(nèi)部時鐘CCLK有區(qū)別嗎?
關(guān)于PCM1864時鐘配置問題求解
AT32講堂088 | 雅特力AT32F402/F405時鐘配置

音頻設(shè)備的PLL和時鐘配置應(yīng)用說明

器件的時鐘配置和TAx5x1x系列的靈活時鐘

stm32用串口燒錄怎么設(shè)置
CKS32F107xx系列時鐘系統(tǒng)具體配置方法講解

評論