在STM32中,如果是在MDK下创建一个工程,一般都有提示是否加入Star up Code文件,这个就是启动文件,这里有个误区,一般对于初学者来看,很容易误以为STM32F10x.s这个启动文件是STM32所有类型芯片的通用启动文件,因此也自然不会去理会它的作用,事实上,这个启动文件只是针对部分STM32系列,如果仔细看过它的启动代码就会发现里面很多中断函数定义是没有的,甚至有些和STM32F10x_it.c里的函数是有出路的,如果刚好用到了默认的这个中断服务子函数的话,程序一旦运行到了中断是找不到入口地址的,这样就会莫名其妙地不知问题所在。STM32F10x.s是MDK提供的启动代码,从其里面的内容看来,它只定义了3个串口,4个定时器。实际上STM32的系列产品有5个串口的型号,也只有有2个串口的型号,定时器也是,做多的有8个定时器。比如,如果你用的STM32F103ZET6,而启动文件用的是STM32F10x.s的话,你可以正常使用串口1~3的中断,而串口4和5的中断,则无法正常使用。所以STM32F10x.s并不能适用所有的STM32型号,对于不同型号的STM32,正确做法是选择不同的启动文件。ST公司提供了3个启动文件:startup_stm32f10x_ld.s /startup_stm32f10x_md.s/startup_stm32f10x_hd.s 分别适用于小容量/中容量/大容量的STM32芯片,具体判断方法如下:
事实上,_main 和main是两个完全不同的函数!_main代码是编译器自动创建的,因此无法找到_main代码。MDK文档中有一句说明:it is automatically craated by the linker when it sees a definition of main() .大体意思可以理解为:当编译器发现定义了main函数,那么就会自动创建_main.