**:
說的直白點就是以下區別,在選擇啟動檔案的時候有選擇性區別!
startup_stm32f10x_cl.s
互聯型的stm32f105xx,stm32f107xx
startup_stm32f10x_hd.s 大容量的stm32f101xx,stm32f102xx,stm32f103xx
startup_stm32f10x_hd_vl.s 大容量的stm32f100xx
startup_stm32f10x_ld.s 小容量的stm32f101xx,stm32f102xx,stm32f103xx
startup_stm32f10x_ld_vl.s 小容量的stm32f100xx
startup_stm32f10x_md.s 中容量的stm32f101xx,stm32f102xx,stm32f103xx
startup_stm32f10x_md_vl.s 中容量的stm32f100xx
startup_stm32f10x_xl.s 超大容量flash在512k到1024k位元組的stm32f101xx,stm32f102xx,stm32f103xx
疑問一:為什麼需要選擇啟動檔案?
1.建立中斷服務入口位址,即把中斷向量與中斷服務函式鏈結起來。
我們知道在串列埠nvic配置中我們只定義了個 nvic_initstructure.nvic_irqchannel = usart2_irqn;
也就是中斷服務向量,再然後我們在stm32f10x_it.c檔案的void usart2_irqhandler(void){} 函式裡新增串列埠的服務程式。
但是mcu怎麼知道中斷向量usart2_irqn對應的是usart2_irqhandler(){}呢,這個就是啟動檔案所起的作用。
在啟動檔案 .s 中 以 g_pfnvectors: 開頭。
2.從systeminit()函式進入到main()函式.
對於stm32我們定義系統時鐘的時候直接在system_stm3210x.c檔案裡修改巨集定義即可,而事實上到底是從哪開始執行的呢?
system_stm3210x.c檔案裡有個systeminit()函式,就是對時鐘的設定。
而這個systeminit()在哪呼叫的呢,就是啟動檔案先呼叫了,然後才進入到mian()函式。
在啟動檔案 .s 中有以下一段話可以解釋。
疑問二:這些檔案在**?
開啟官方庫檔案,可以了解到stm32f10x_stdperiph_lib/libraries/cmsis/cm3/devicesupport/st/stm32f10x/startup
下有4個資料夾arm gcc_ride7 iar truestudio
到底選擇哪個資料夾呢? 這與編譯器有關,不同的編譯器呼叫的指令集是不同的,所以需謹慎選擇
arm適用於arm編譯器 gcc_ride7適用基於gcc_ride7編譯器的 iar就不用說了都清除 truestdio是st自己的編譯器當然也是基於gcc的用mdk於eclipse可以使用
(在eclipse下用的gcc外掛程式的話,需要把字尾名 .s 改為 .s成大寫,不然會編譯出錯)
疑問三:怎麼選擇101xx 102xx 103xx是小容量、中容量還是大容量?
查user manual手冊,以下為摘錄
可以這麼認為:flash容量<=32k 選擇 ld
64k<= <=128k 選擇 md
256<= <=512k 選擇 hd
那怎麼區分mcu是多大的flash容量呢?
可以參考下表對於晶元命名說明:flash memory size
STM32 啟動檔案
先來看看啟動 中的偽操作和偽指令 equ 用於定義常量,相當於c中的巨集定義 如stack size equ 0x00000400 define stack size 0x00000400 align 位元組對齊方式 align 3 export 相當於宣告了乙個全域性變數 export vecto...
stm32啟動檔案
這是st提供的3個啟動檔案,分別適用於不同容量的stm32晶元。這三個檔案為 startup stm32f10x ld.s startup stm32f10x md.s startup stm32f10x hd.s 其中,ld.s適用於小容量 產品 md.s適用於中等容量產品 hd適用於大容量產品 ...
stm32的啟動檔案
libraries cmsis core cm3 startup arm資料夾下是由彙編編寫的系統啟動檔案,不同的檔案對應不同的晶元型號。cl 互聯型產品,stm32f105 107系列 vl 超值型產品,stm32f100系列 xl 超高密度 容量 產品,stm32f101 103系列 ld 低密...