STM8的启动过程(基于IAR)

来源:互联网 发布:rs-100数据盒 编辑:程序博客网 时间:2024/05/17 22:20

初学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


个人的第一篇博客,希望能帮到大家大笑

原创粉丝点击