科普信息網

STM32單片機到底是如何實現軟硬件結合?-天天熱消息

發布時間:2023-05-15 22:34:11 來源:面包芯語 責任編輯:caobo

軟硬件結合

尋址空間

block 0 里面有一段叫做FLASH,也就是內部FLASH,我們的程序就是下載到這個地方,起始地址是0X800 0000,大家注意,這個只有1M空間?,F在STM32已經有2M flash的芯片了,超出1M的FLASH放在哪里呢?請自行查看對應的芯片手冊。

在block 1 內,有兩段SRAM,總共128K,這個空間,也就是我們前面說的內存,存放程序使用的變量。如果需要,也可以把程序放到SRAM中運行。407不是有196K嗎?

其實407有196K內存,但是有64k并不是普通的SRAM,而是放在block 0 內的CCM。


(資料圖)

這兩段區域不連續,而且,CCM只能內核使用,外設不能使用,例如DMA就不能用CCM內存,否則就死機。

block 2,是Peripherals,也就是外設空間。我們看右邊,主要就是APB1/APB2、AHB1/AHB2,什么東西呢?回頭再說。

block 3、block4、block5,是FSMC的空間,FSMC可以外擴SRAM,NAND FALSH,LCD等外設。

純軟件-包羅萬象的小程序

分析啟動代碼

函數從哪里開始運行?

每個芯片都有復位功能,復位后,芯片的PC指針(一個寄存器,指示程序運行位置,對于多級流水線的芯片,PC可能跟真正執行的指令位置不一致,這里暫且認為一致)會復位到固定值,一般是0x00000000,在STM32中,復位到 0X08000004。因此復位后運行的第一條代碼就是 0X08000004。前面我們不是拷貝了一個啟動代碼文件到工程嗎?

startup_stm32f40_41xxx.s,這個匯編文件為什么叫啟動代碼?因為里面的匯編程序,就是復位之后執行的程序。在文件中,有一段數據表,稱為中斷向量,里面保存了各個中斷的執行地址。復位,也是一個中斷。

是我們在 main.c 中定義的 main 函數嗎?后面我們再說這個問題。

芯片是怎么知道開始就執行啟動代碼的呢?或者說,我們如何把這個啟動代碼放到復位的位置?這就牽涉到一個一般情況下不關注的文件 wujique.sct,這個文件在 wujique\prj\Objects 目錄下,通常把這個文件叫做分散加載文件,編譯工具在鏈接時,根據這個文件放置各個代碼段和變量。

第6行 ER_IROM1 0x08000000 0x00080000定義了ER_IROM1,也就是我們說的內部FLASH,從 0x08000000 開始,大小 0x00080000。

第7行.o (RESET, +First)從 0x08000000 開始,先放置一個.o文件, 并且用(RESET, +First)指定RESET塊優先放置,RESET塊是什么?請查看啟動代碼,中斷向量就是一個AREA,名字叫RESET,屬于READONLY。這樣編譯后,RESET塊將放在0x08000000位置,也就是說,中斷向量就放在這個地方。

DCD是分配空間,4字節,第一個就是__initial_sp,第二個就是Reset_Handler函數指針。也就是說,最后編譯后的程序,將Reset_Handler這個函數的指針(地址),放在0x800000+4的地方。所以芯片在復位的時候,就能找到復位函數Reset_Handler。

第8行 *(InRoot$$Sections)什么鬼?GOOGLE??!回頭再說。

第9行 .ANY (+RO)意思就是其他的所有RO,順序往后放。就是說,其他代碼,跟著啟動代碼后面。

第11行 RW_IRAM1 0x20000000 0x00020000定義了RAM大小。

第12行 .ANY (+RW +ZI)所有的RW ZI,全部放到RAM里面。RW,ZI,也就是變量,這一行指定了變量保存到什么地址。

分析用戶代碼

通過 MAP 文件了解代碼構成

編譯結果

map文件配置

map文件

map 總信息

ROM為什么不包括ZI Data?為什么包含RW Data?

Image component sizes

首先,是我們自己的源碼,這個程序我們的代碼不多,只有 main.o,wujique_log.o,和其他一些 STM32 的庫文件。

文件map

在代碼中,我們經常會包含一些頭文件,例如:

Image Symbol Table

最后

版權聲明:本文來源網絡,免費傳達知識,版權歸原作者所有。如涉及作品版權問題,請聯系我進行刪除。

標簽:

上一篇:北京消協:選擇陪診服務建議簽訂書面協議_焦點滾動
下一篇:最后一頁

新聞排行