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
个人的第一篇博客,希望能帮到大家
按照常理,启动过程应该在复位中断中完成。在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单片机启动流程彻底探究--基于IAR开发环境
- STM8单片机启动流程彻底探究--基于IAR开发环境
- STM8单片机启动流程彻底探究--基于IAR开发环境
- 基于MPC8309的uboot启动过程
- 基于Linux2.6.35内核的zImage启动过程研究
- 基于全注解的SpringMVC启动过程
- Android应用程序启动全过程(本文基于Android7.1)
- 基于S3C2410-ARM Linux启动过程分析
- 基于Intel_x86体系结构的Linux_SMP系统启动过程
- docker 源码分析 一(基于1.8.2版本),docker daemon启动过程;
- u-boot 启动过程 —— 基于S3C2410 --转载自周明
- 基于最简单的FFmpeg包封过程:视频和音频分配器启动(demuxer-simple)
- 基于surface机制的surfaceflinger启动过程
- AngularJS进阶(三十九)基于项目实例解析ng启动加载过程
- AngularJS进阶(三十九)基于项目实战解析ng启动加载过程
- eCos启动过程详解,基于Cortex-M架构
- 我搭建基于XTI_D902-B-V平台以NFS文件系统的方式启动Android的过程
- u-boot 启动过程 (基于S3C2410) 和uImage zImage 启动分析
- 11u-boot启动过程分析——基于lpc2210的移植代码