您的位置:首页 > 其它

STM8的启动过程(基于IAR)

2017-10-14 11:19 330 查看
初学STM8S已经一段时间了,但是一直不太明白它的启动过程。众所周知,所有的嵌入式CPU启动时,都应该有一个Bootloader程序,一般存放在复位地址处。这个程序一半来自于固件库附带的启动文件,如51的STARTUP.A51,或者STM32的STM32F103x.s等,但IAR中并未提供STM8S的启动文件。那么它是如何找到main函数并完成启动的呢?

按照常理,启动过程应该在复位中断中完成。在STM8S的数据手册中,可以找到CPU中断向量表:



可以发现,复位中断向量地址是8000h。

然而查看数据手册可以发现,复位后地址是应该是6000h。





调试时,无法看到6000h处的代码。没办法,只好再找数据手册。



这是STM8S的启动流程图。由此可见,从6000h到8000h的步骤根本不用软件来操心,而是硬件根据选项字节完成的。

那么,程序跳转到8000h后继续做了什么呢?查找数据手册(又是数据手册……)可见



STM8S的中断向量是由82h+向量地址的高中低字节构成的。进入调试器,找到8000h地址存储的指令



由此可见,我们复位中断的地址应该是008207h。再跳转到8207h查看程序,过程就很明晰了



先设置栈底地址,然后调用__low_level_init函数。

__low_level_init的内容是将X清零再自增。返回后检测X是否成功置1,如果没有就跳转到地址+0x03,也就是JP  EXIT的指令,退出程序。可见,这是测试X寄存器是否正常的步骤。

接着进行__iar_data_init函数,测试Y功能是否正常。

如果一切正常,那么CALL main,即进入main函数,启动完成。

说句题外话,关于stm8的中断有一个很有趣的地方。stm8s_it.c文件中定义着各中断的处理函数,然而最高到TRAP软件中断,单单没有RESET中断的处理函数。参考其他文章的一张图片



可以发现,IAR自动把复位中断向量的地址,也就是__iar_program_start写入了8000h的位置。而在stm8s.h中,可以看到



其他中断向量地址是通过#pragma vector的方式写入到对应的中断入口的。而向量默认地址(我这里是8207h)由于选型不同并不一样,应该是由IAR自动决定的。

参考文章:

STM8单片机启动流程彻底探究--基于IAR开发环境

#pragma vector

个人的第一篇博客,希望能帮到大家
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stm8 嵌入式 cpu