初学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 ADC模数转换
下一篇:STM8 IAR环境生成hex文件
推荐阅读最新更新时间:2024-03-16 16:04
设计资源 培训 开发板 精华推荐
- 智慧六月 潜伏在EEWORLD里的一休哥
- 端午节芯币兑换礼品专场
- [年末调查]工程师年末大盘点,你被点名了!
- 有奖直播【Keysight World Tech Day 2023分论坛——汽车自动驾驶与新能源】
- 任选下载有礼|《新概念模拟电路》全五册合集/《ADI 参考电路合集》
- 轻松注册世健eSHOP,百份奖品大派送!惊喜不断,好礼无限!ipad air2等你拿!
- TI 嵌入式处理器最新产品发布会 全程在线直播 4月16日精彩为您呈现!预报名、看直播、享好礼
- 观看安森美半导体高精度、高能效的电池电量计量IC方案,答题赢好礼!
- 是时候充充电啦!村田宠粉月重磅开启!
- 直播已结束【英飞凌智能门锁解决方案】