stm32的afio時鐘真的是在開啟引腳復用功能的時候開啟嗎?其實並不是~
我們知道,stm32有很多外設,這些外設的外部引腳都是與gpio共用的。我們可以通過軟體來配置引腳作為gpio引腳還是作為外設引腳。當引腳配置為外設引腳時就叫做復用。如串列埠預設
復用的引腳為:
pa9、pa10引腳可配置為普通io,也可配置為串列埠引腳(pa9為tx,pa10為rx)。
最近看到乙份**(基於stm32f103zet6)的串列埠配置如下:
看到這裡開啟了afio時鐘,讓我疑惑了一下,為什麼spi相關的引腳也配置為復用但並沒有開啟apio時鐘也能正常工作。所以afio時鐘應該什麼時候開呢?
我們回顧一下,我們為什麼要開啟時鐘呢?因為我們要對晶元內部的硬體進行控制(讀寫其暫存器),要控制哪一部分,就要開啟那一部分的時鐘。
本例中,使能gpioa、usart1的時鐘是因為我們要對gpioa、usart1相關的暫存器進行操作。那麼afio呢?其管理的暫存器有哪些呢?從參考手冊關於通用和復用功能i/o(gpio和afio)
這一章節可以看到afio管理的暫存器如下:
可以知道,本例對usart1進行配置,並沒有涉及到afio相關的暫存器,所以並不需要開啟afio時鐘!
所以這裡的第7行**可以刪掉。當然不刪也可以正常工作,但是會白白增加能耗、寫無用**(白白浪費程式儲存器空間)而已!
按照上面分析的,當然是要操作afio相關的暫存器的時候才開啟afio時鐘。此處依舊以串列埠為例。我們看到afio管理的暫存器中有復用重對映和除錯i/o配置暫存器(afio_mapr)
這一暫存器,這個暫存器怎麼用呢?
首先,我們要知道什麼是重對映。
使用重對映功能可以把一些復用功能重新對映到其他引腳上,在某些時候可以方便板級硬體的布局設計。設定afio_mapr
暫存器實現引腳的重新對映。此時,復用功能不再對映到它們的原始分配上。 可以重對映到任意引腳嗎?其實是有規定的,可查閱參考手冊,如串列埠1的重對映:
我們可以配置pb6、pb7作為串列埠1的tx、rx引腳,具體配置**如下:
這裡得呼叫乙個重對映配置函式gpio_pinremapconfig
,可在這個函式在stm32f10x_gpio.c
中,如下:
其中第乙個引數為要重對映的外設,可在stm32f10x_gpio.h
中檢視:
其中重對映又分為部分重對映和完全重對映,區別就是要重對映全部的引腳還是部分引腳,這也是有規定的。比如定時器1:
我們從gpio_pinremapconfig
函式的實現中可以看到我們需要操控afio_mapr
暫存器,所以需要開啟afio時鐘。
綜上,需要操控afio管理的暫存器才需開啟afio時鐘,否則不需要開啟。
STM32 STM32啟動方式
在復位時,會按照boot的狀態判斷進入哪種模式,boot腳不用保持長狀態。模式1 boot0拉低,使用使用者快閃儲存器區,這是最正常啟動的模式,即,在正常啟動時,boot0應該下拉為低電平 模式3 從sram執行,由於stm32的flash擦寫的次數是有限的,所以為了保護我們的flash,延長mcu...
STM32 STM32學習記錄3 按鍵輸入
1 io配置 上拉輸入模式 區別在於沒有輸入訊號的時候預設輸入高電平 因為 有弱上拉 下拉輸入模式 區別在於沒有輸入訊號的時候預設輸入低電平 因為有弱下拉 對於浮空輸入模式顧名思義也就 是輸入什麼訊號才是什麼訊號,對於浮空輸入要保證有明確的輸入訊號。2 stm32的gpio既可以設定為輸出也可以設定...
STM32系統時鐘
1 參考資料 stm32f1開發指南 庫函式版本 4.3小節 時鐘系統 stm32中文參考手冊v10 第六章 復位和時鐘控制 rcc 2 時鐘系統知識總結 1 stm32有5個時鐘源 hsi hse lsi lse pll hsi是高速內部時鐘,rc振盪器,頻率為8mhz,精度不高 hse是高速外部...