總線矩陣
上圖為stm32f4的總線矩陣,其中主控總線有8條,被控總線有7條,主設備和從設備通過各自的總線兩兩相交連接,圖中兩條總線相交且為圓圈的地方,表示這兩條總線對應的主設備可以訪問從設備,如I總線(指令總線),只有跟 M0、M2和M6這三根被控總線交叉的時候才有圓圈,就表示I總線只能跟這三根被控總線通信,這樣就可以知道stm32f4的啟動有三種分別是FLASH、內部SRAM、外部存儲FSMC。
總線矩陣用於主控總線之間的訪問仲裁管理,仲裁采用循環調度算法。有了總線矩陣,就可以讓主設備和從設備進行並行訪問,提升了訪問效率,同時也降低了功耗。需要注意的是,雖然總線矩陣使得多個主設備可以並行訪問不同的從設備,但在一個定義的時間段內,只有一個主設備擁有總線矩陣的控制權,如果有多個主設備同時出現總線請求時就得進行仲裁。所以有了總線仲裁器,就能保證每個時刻只有一個主設備通過總線矩陣對從設備進行訪問。
注意並非所有主設備訪問從設備都得經過總線矩陣,如上圖中,有些主設備和從設備間有直通通道。
存儲器映射
存儲器本身不具有地址信息,給存儲器分配地址的過程就稱為存儲器映射,盡管預定義的存儲器映射的地址是固定的,但也具有很高的靈活性,允許芯片設計人員使用不同的內存和外設來設計他們的產品,以實現更好的產品差異化。給某個地址再分配一個地址的過程叫存儲器重映射,但是Cortex M4芯片沒有MMU所以並不支持。如上所示,就是stm32f4xx的部分通過存儲器映射的寄存器地址,詳見《STM32F4xx中文參考手冊》的P52~P54頁。
上圖為預定義的存儲器映射圖,來自 Cortex M3與M4權威指南中的第六章第三節。在4GB的可尋址內存空間中,一些部分被分配給內部外設,如NVIC和調試組件。這些內部外設的地址是固定的。此外,內存空間在結構上被划分為若干內存區域,對應上圖:
Code:只讀段,用於保存默認的向量表;
SRAM:連接SRAM,主要是片內SRAM,但沒有確切的內存類型限制。SRAM區域的前1MB是位可尋址的,如果可選位帶特性包括在內。還可以從該區域執行程序代碼;
Peripherals:主要用於片內外設。由芯片公司進行定義的一些寄存器地址,如GPIO寄存器地址、USART和I2C的寄存器地址等等;
RAM:變量存儲區,如果開發板從片內的Flash啟動,就需要指定RAM,不過一般只要選好了器件型號,keil5就自動選好了;
Devices:主要是用於給片外的設備分配地址;
System:內核定義的一些寄存器,包含了:NVIC,MPU, SysTick,SCB,FPU,FPB,DWT等。
GPIO的位帶操作
在預定義的存儲器映射圖有兩個位帶區,分別對應了兩個位帶別名,其實也就是將位帶區每個的比特位一個一個按順序取出來,將其映射成32位4字節的寄存器,這樣位帶別名的大小應該是位帶區的32倍,事實也是這樣。
查看stm32f4xx的芯片手冊可以發現GPIO的寄存器地址屬於Peripherals的位帶區,所以可以進行位帶操作,使用位帶操作可以大大提高程序的運行速率和提升安全性,操作IO口的性能將達到極致,而不必要去調用GPIO_SetBits、GPIO_ResetBits、GPIO_WriteBit等GPIO操作的庫函數,調用函數要進行入棧出棧等操作,會占用時間。
上圖為位帶區轉換為位帶別名區的宏定義代碼,以GPIOE端口的第n根引腳為例,進行了輸出高低電平的操作,只要預先初始化好了GPIOE端口第n根引腳,就可以使用這個宏定義,讓第n根引腳輸出高低電平,如:
PEout(13) = 0;//讓GPIOE的第13根引腳輸出低電平
PEout(13) = 1;//讓GPIOE的第13根引腳輸出高電平
總結
1.總線矩陣很重要,不可忽略;
2.了解了存儲器映射便能大概知道內核的結構;
3.位帶操作可以提高速率和提升安全性,能使用就盡量使用,I/O初始化就不必要,因為這樣的話代碼會很多,直接使用庫函數初始化就可以。
相關下載
鏈接:https://pan.baidu.com/s/10gTR5-5cFMnb9XZZmtxjsQ
提取碼:nfsj
復制這段內容后打開百度網盤手機App,操作更方便哦