stm32啟動文件ld md hd cl vl xl分析及選擇
說的直白點(diǎn)就是以下區(qū)別,在選擇啟動文件的時(shí)候有選擇性區(qū)別!
startup_stm32f10x_cl.s
互聯(lián)型的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字節(jié)的STM32F101xx,STM32F102xx,STM32F103xx
疑問一:為什么需要選擇啟動文件?
1.建立中斷服務(wù)入口地址,即把中斷向量與中斷服務(wù)函數(shù)鏈接起來。
我們知道在串口NVIC配置中我們只定義了個(gè)NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
也就是中斷服務(wù)向量,再然后我們在stm32f10x_it.c文件的void USART2_IRQHandler(void){} 函數(shù)里添加串口的服務(wù)程序。
但是mcu怎么知道中斷向量USART2_IRQn對應(yīng)的是USART2_IRQHandler(){}呢,這個(gè)就是啟動文件所起的作用。
在啟動文件.s中 以g_pfnVectors:開頭。
2.從systeminit()函數(shù)進(jìn)入到main()函數(shù).
對于stm32我們定義系統(tǒng)時(shí)鐘的時(shí)候直接在system_stm3210x.c文件里修改宏定義即可,而事實(shí)上到底是從哪開始執(zhí)行的呢?
system_stm3210x.c文件里有個(gè)SystemInit()函數(shù),就是對時(shí)鐘的設(shè)置。
而這個(gè)SystemInit()在哪調(diào)用的呢,就是啟動文件先調(diào)用了,然后才進(jìn)入到mian()函數(shù)。
在啟動文件.s中有以下一段話可以解釋。
blSystemInit
bl __libc_init_array
bl main
bx lr
3.有些啟動文件定義了堆棧大小,可以在這里進(jìn)行修改。(有些是在.ld進(jìn)行定義的)
疑問二:這些文件在哪里?
打開官方庫文件,可以了解到STM32F10x_StdPeriph_lib/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup
下有4個(gè)文件夾armgcc_ride7iarTrueSTUDIO
到底選擇哪個(gè)文件夾呢?這與編譯器有關(guān),不同的編譯器調(diào)用的指令集是不同的,所以需謹(jǐn)慎選擇
arm適用于arm編譯器gcc_ride7適用基于GCC_ride7編譯器的iar就不用說了都清除TrueSTDIO是ST自己的編譯器當(dāng)然也是基于GCC的用MDK于eclipse可以使用
(在eclipse下用的GCC插件的話,需要把后綴名 .s 改為 .S成大寫,不然會編譯出錯(cuò))
疑問三:怎么選擇101xx 102xx 103xx是小容量、中容量還是大容量?
查user manual手冊,以下為摘錄
可以這么認(rèn)為:flash容量<=32k選擇ld
64k<=<=128k選擇 md
256<=<=512k選擇hd
那怎么區(qū)分MCU是多大的flash容量呢?
可以參考下表對于芯片命名說明:Flash memory size
6:32K 8:64K
B:128K C:256K
D:384K E:512KFlash memory size!