之前在iar下开发都是在官方例程或网络中下载的例程,开发时IAR直接跳入main中执行c代码,最近想创建个新的stm32工程来写一些汇编文件了解下CM3汇编指令,于是痛苦摸索了很多天。
起初创建了IAR新工程,使用的stm32f103x,加入了官方提供的iar工程文件:startup.s,原本想将keil下的startup文件直接copy过来,然而现实是keil和iar使用的一些汇编伪指令差别很大,一个百行的startup.s就有一万个错误,直接爆炸。不过官方分别提供了keil iar gcc对应的工程及启动文件,可以按需求使用。
startup.s文件中最重要的自然是__vector_table,一个异常向量表,表中记录了所有异常的入口地址

除第一个外,其它都是入口地址。CM3将第一个视为芯片复位后MSP的值,这里我一直有个猜测但还没有实验,CM3的MSP不需要手动配置,而是复位后默认去flash的0x80000000地址去取 (我的stm32f103 flash首地址从0x80000000开始,似乎也会被映射位0x0,两个地址都可用,但相对的都是flash的0地址。也就是说工程生成的bin文件前四个字节就是MSP的复位值),这样的话是不是CM3的bootloader不一定非要使用汇编来写,直接跑c也是可以的?如果说汇编能够使用16位指令来节省空间,那么c在编译时不会生成16位指令吗?
加入启动文件还要根据芯片选择官方提供的.ICF文件,ICF文件主要用来告诉编译器芯片的RAM ROM地址范围以及程序中的不同段在存储器中的存放位置。
IAR中有一些段的内部关键字如CSTACK,HEAP等
使用的ICF中将向量表放在flash的首地址
place at address mem:0x80000000 {

本文讲述了作者在IAR环境下创建STM32新工程的过程,包括使用startup.s文件、ICF配置、理解异常向量表和__vector_table,以及遇到的__iar_program_start未定义问题。文章探讨了是否可以在不使用汇编的情况下编写CM3 Bootloader,并讨论了全局变量初始化和__iar_data_init3的相关问题。
最低0.47元/天 解锁文章
7965

被折叠的 条评论
为什么被折叠?



