STM8单片机启动流程彻底探究--基于IAR开发环境
初学STM8会发现,STM8官方的固件库并没有提供一个.s文件的启动代码,那么她是如何启动然后跳转到main函数执行的呢
首先,我们根据ARM的只是可以推测,STM8也是通过复位向量来启动的,假设流程在复位响亮中完成的,应该首先去复位向量表中间去找,看复位向量又要看存储器映射,一环扣一环
STM8使用的是统一编址技术,以下是存储器编址图
我们可以看到,最大取指空间是0XFFFFFF,也就是说,是16M,这是因为PC的特性决定的
在程序内部,它是将16M分为了256个节(sector),每个节的大小为64K,64*256= 16384K=16M,由图我们可以看到,在SECTOR0区间里面似乎还有些玄妙,之后的就是普通空间了
这就是sector的分区,分区如下
0-17ff 是RAM空间,而且是最大的ram空间,STM8的ram一般都小于6K由此可见,在这个ram空间里面就包含有我们的堆栈区域.但是不一定是6K,(3G寻址的win7也没见多少人真的装3G啊,装2G内存条的多的是)
1800-3fff是保留区域
4000-47ff是最大2K的数据保存区(相当于EEPROM)
4800-487f是选项字节空间,用于设置一些配置信息
4900-4fff是保留空间
5000-57ff IO以及外设的寄存器空间(统一编址技术)
5800-5fff 保留区域
6000-67ff 2K的启动代码rom
6800-7eff 保留区间
7f00-7fff 系统寄存器的地址
8000-8080 中断向量
在往下才是flash空间,也就是说,我们的代码存放的区域就是在0x8000开始的
在上面那张图我们可以看见复位向量
那是不是说芯片启动立马就到了复位向量0x8000的位置了呢?
其实不然,查看手册我们发现这一段话
也就是说,系统启动的时候不在复位向量的地方,那这个6000区域存放的是啥
原来是启动代码,还是数据手册
鉴于此,我们可以很肯定地说,系统启动的过程是
复位-->跳转到boot ram--->boot ram进行某种初始化-->处理用户有可能的程序更新-->跳转到0x8000-->复位向量执行
既然复位向量在8000,那么代码中应该有指示
我们在IAR里面看到他对中断的处理依靠这个宏定义,实际上他就是定义了两个重要的宏定义
INTERRUPT_HANDLER_TRAP(a)和INTERRUPT_HANDLER(a, b )
我们展开第一个
得到
INTERRUPT_HANDLER_TRAP(a) ==
_Pragma(vector = 1) __interruptvoid (a) (void)
这里面涉及到两个编译器关键字分别是Pragma和interrupt
Pragma是一个预处理指令,它包含不同的语句的时候有不同的含义,我们现在包含的是vector,那就和vector有关系了
什么意思呢,我们得看具体语法
也就是说,相当于在中断向量表标号中写入指定的函数
_Pragma(vector = 1) __interruptvoid (a) (void)
相当于在中断向量1的位置写入a这个函数的指针
INTERRUPT_HANDLER( a, b )展开来
_Pragma(vector = b+2) __interruptvoid (a) (void)
就是在中断向量表B+2的位置写入a这个函数的指针,(因为0和1被reset和trap占用了)
现在我们来看it.c中的语句就很清楚了
第一个函数是trap指针,我们需要实现TRAP_IRQHandler这个函数就能关联上对应的中断向量
第二个函数同样我们只要实现TLI_IRQHandler这个函数就OK了
函数的视线需要遵循
__interrupt void (a) (void)的模式,否则宏定义报错
可是trap有了,reset去哪了呢?这是IAR的一个手段,他把RESET隐藏了,我们来看这个图片
相当于,IAR在RESET处默认存放了一个中断向量指针,指针的指向是__iar_program_start函数,这个函数我们无法找到,属于iar内置函数,但是我们可以看到,调试就可以了
打开仿真
在reset位置放置了一个0x80c3地址(0x82属于固定填充,24位地址,32位高八位不用),80c3位置代码如下
由此可见我们的推论是正确的
先设置堆栈基地址0x17ff然后经历lowinit和datainit之后跳转到main函数执行
所以,IAR下编译STM8启动的过程总结如下
复位-->跳转到boot ram--->boot ram进行某种初始化-->处理用户有可能的程序更新-->跳转到0x8000-->复位向量执行à跳转到__iar_program_start-->跳转到main函数地址
STM8单片机启动流程彻底探究--基于IAR开发环境的更多相关文章
- 痞子衡嵌入式:在IAR开发环境下将关键函数重定向到RAM中执行的三种方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将关键函数重定向到RAM中执行的三种方法. 嵌入式项目里应用程序代码正常是放在 Flash 中执行的,但有时候也需要将 ...
- 痞子衡嵌入式:在IAR开发环境下RT-Thread工程函数重定向失效分析
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下RT-Thread工程函数重定向失效分析. 痞子衡旧文 <在IAR下将关键函数重定向到RAM中执行的方法> ...
- 痞子衡嵌入式:在IAR开发环境下将整个源文件代码重定向到任意RAM中的方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将整个源文件代码重定向到任意RAM中的方法. 痞子衡旧文 <在IAR下将关键函数重定向到RAM中执行的方法> ...
- EFM32在使用IAR开发环境配置ICf文件以及指定程序存储地址空间
EFM32在IAR开发环境下指定代码,数据的存储空间 为了便于后续的项目升级,管理,需要对代码,数据的存储空间加以设定,也在网上找下相关的资料,笔者水平有限, 如下内容不一定完全正确,如有错误之后,还 ...
- 痞子衡嵌入式:在IAR开发环境下为工程开启CRC完整性校验功能的方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下为工程开启CRC完整性校验功能的方法. CRC校验在嵌入式领域里的应用非常广,比如在通信领域,CRC检验值可以作为数据 ...
- vagrant特性——基于docker开发环境(docker和vagrant的结合)-0-简介
原文https://www.hashicorp.com/blog/feature-preview-docker-based-development-environments Feature Previ ...
- Hadoop伪分布配置与基于Eclipse开发环境搭建
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- vagrant特性——基于docker开发环境(docker和vagrant的结合)-1-基本使用
Docker vagrant提供了使用Docker作为provider(其他的provider有virtualBox.VMware\hyper-V等)的开箱即用支持.这允许你的开发环境由Docker容 ...
- vagrant特性——基于docker开发环境(docker和vagrant的结合)-3-boxes和配置
Docker Boxes Docker provider不需要vagrant box.因此其config.vm.box设置是完全可选的.但是,仍然可以使用并指定一个box来提供默认值.由于一个带着bo ...
随机推荐
- 轻松创建nodejs服务器(1):一个简单nodejs服务器例子
这篇文章主要介绍了一个简单nodejs服务器例子,本文实现了一个简单的hello world例子,并展示如何运行这个服务器,需要的朋友可以参考下 我们先来实现一个简单的例子,hello world ...
- postgres-xl 集体搭建(2)
$ pgxc_ctl prepare config minimal 生成一个单机伪分布集群配置简单模板 根据该模板进行简单修改就可以配置成一个集群 $ pgxc_ctl init all $ pgxc ...
- 控制器view的加载顺序initWithNibName >>> viewDidLoad >>> viewWillAppear >>> viewDidAppear
-(void)viewWillAppear:(BOOL)animated { self.navigationController.navigationBarHidden=NO;// 邓超界:放在wil ...
- MySQL数据备份和恢复
1.数据备份 mysqldump -uroot -p databasename > file.sql 2.数据还原 mysql -u root -p databasename < file ...
- 两台linux利用heartbeat+drbd 完美实现双机热备
一直想做基于linux的双机热备,一直没有时间和机会.一直以为只要做双机热备的实验就必须两台机器外接一个存储.甚至一个月以前在学习keepalived的时候还在琢磨keepalvied去掉哪些条件可以 ...
- Mysql找回root密码
1.停止数据库服务 service mysql stop 2.修改my.cnf 添加skip-grant-tables 3.重启数据库 service mysql restart 4.修改root密码 ...
- ListView控件的Insert、Edit和Delete功能(第二部分)
本系列文章将通过一个简单的实例,结合我自己使用ListView的情况,展示如何用ASP.NET 3.5 ListView控件进行基本的Insert.Edit和Delete操作. 系统要求: Windo ...
- iOS开发:后台运行以及保持程序在后台长时间运行
第一部分 1.先说说iOS 应用程序5个状态: 停止运行-应用程序已经终止,或者还未启动. 不活动-应用程序处于前台但不再接收事件(例如,用户在app处于活动时锁住了设备). 活动-app处于“使用中 ...
- Struts中的数据处理的三种方式
Struts中的数据处理的三种方式: public class DataAction extends ActionSupport{ @Override public String execute() ...
- jQuery 图片随滚动条滚动加载
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...