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

发布者:CW13236066525最新更新时间:2017-01-13 来源: eefocus关键字:STM8单片机  启动流程 手机看文章 扫描二维码
随时随地手机看文章

初学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单片机  启动流程 引用地址:STM8单片机启动流程彻底探究--基于IAR开发环境

上一篇:STM8建立IAR工程
下一篇:STM8的GPIO驱动

推荐阅读最新更新时间:2024-03-16 15:30

找回失去的青春--玩单片机STM8
把失去的青春补回来! 你以为我要说离开IT业?常被人说成“IT刁丝”,“IT民工”,我不以为然。不仅如此,我为做IT而骄傲。看看我们身边的产品,无不与IT有着密切的关系。你说你平时不用电脑。OK,你平时可以不用手机么?你知道手机是“IT刁丝”搞出来的么?再退一步,你说你也不用手机。OK,超市你去不?收银员用的收银机是“IT刁丝”搞出来的。你说你是搞金融的,不是碰IT,错,金融业的后台服务器,同样是“IT刁丝”搞出来的。 言归正传,我说的“青春”,是我在大学错过的一段的经历,就是“玩”单片机。注意我用的文字“玩”。下次不要说你在“学习”单片机,要说玩单片机。单片机,其实我8年的手机行业工作经历一直都在用,可是手机芯片的单片机
[单片机]
找回失去的青春--玩<font color='red'>单片机</font><font color='red'>STM8</font>
STM8单片机中断的主要功能解析
内部中断:一般是由硬件错误或者运算过程中出错引起的,一般是不可避免的; 外部中断:是处理器的外设发出的中断请求,如定时器中断,UART接收中断,外部中断一般都可以通过中断控制器进行屏蔽; 1.ITC功能概述: ……所有IO引脚都具有外部中断能力,每个端口都有独立的中断向量以及独立的标志;外设中断能力; ……软件中断能力(TRAP) ……具有灵活的优先级和中断等级管理,支持可嵌套和同级中断管理: ——多达4个软件可编程的嵌套等级;——最多有32个中断向量,其入口地址由硬件固定;——2个不可避免的中断:RESET,TRAP;——1个不可避免的最高优先级硬件中断TL1; 2.中断的主要功能 1. 实现高速CPU和低速外设之间速度
[单片机]
<font color='red'>STM8</font><font color='red'>单片机</font>中断的主要功能解析
基于STM8单片机的CMOS图像采集系统应用设计
在物联网系统中实现图像采集,必须要考虑物联网的以下特点: (1)物联网节点对价格敏感。物联网是信息传感技术的大规模应用,传感节点数目成百上千,若每个节点的成本提高一点,整个物联网系统的成本就会提高很多。所以传感节点图像采集的成本应尽量低。 (2)大部分物联网应用对图像质量要求不高。图像采集主要是帮助用户不需要到现场就可以观察现场情况,对于大多数应用只要能分辨出现场场景即可,没必要采集很高像素的图像。 (3)基于成本考虑,物联网大多选用RS232,Zigbee,GPRS等传输速率不高的联网方式,图像传输时间较长。但许多监测节点安放的位置固定,采集的图像是准静态图像,也就是说,大部分情况下,图像是不变的,所以对帧率要求不高。即使图像采
[电源管理]
基于<font color='red'>STM8</font><font color='red'>单片机</font>的CMOS图像采集系统应用设计
STM8单片机软件判断复位源
下面跟大家说一下STM32单片机的端口重映射,这里是以USART1的重映射为例. STM32上有很多I/O口,也有很多的内置外设想I2C,ADC,ISP,USART等,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的,也就是I/O管脚的复用功能。但是STM32还有一特别之处就是:很多复用内置的外设的I/O引脚可以通过重映射功能,从不同的I/O管脚引出,即复用功能的引脚是可通过程序改变的. 三个红框交汇处.STM32F103VCT6 这个CPU的USART1接的是PB6/PB7 但是上电初始化后默认功能并非是USART1.所以想要用串口功能 .必须用端口重映射.. 大家知道,STM32的单片机每个功能模块有自己
[单片机]
<font color='red'>STM8</font><font color='red'>单片机</font>软件判断复位源
STM8单片机串口发送引脚和接收引脚分开使用
在使用STM8S003单片机时,需要用到ADC采样功能,STM8S003总共有5个ADC采样口,但是其中两个采样口是和串口复用的,如果当ADC口用,就不能用串口,如果当串口用,就不能用ADC口。 通过芯片管脚的原理图可以看到PD5口可以当作模拟采样第5通道使用,也可以用当做串口发送口使用。PD6口可以当做模拟采样第6通道使用,也可以当做串口接收口使用。 在项目中需要将串口当做AD口使用,但是也需要串口向外发送监控数据。AD功能和串口功能需要同时使用,于是想到,串口只用到了发送引脚,那么能不能将串口的接收引脚当做AD功能用。这样PD5口作为串口发送引脚使用,PD6口作为模拟采样第6通道使用。 先写一个简单的测试程序测试一
[单片机]
<font color='red'>STM8</font><font color='red'>单片机</font>串口发送引脚和接收引脚分开使用
BLOB启动流程与Bootloader程序可移植性研究
  在嵌入式系统应用中,通过引导程序(Bootloader)可以初始化硬件设备、建立内存空间的映射图、加载内核,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境 。Bootloader依赖于实际的硬件和应用环境,对于不同的硬件架构以及相同架构的不同 电路 板,都需要不同的Bootloader。由于单独开发Bootloader的工作量较大,因此开发人员一般针对固定体系构架开发一种可移植性的Bootloader,使之能够在少量修改后应用于同一体系构架的其他电路板。BLOB就是一种针对ARM体系定制的可移植性良好的嵌入式Linux引导程序。BLOB支持多种CPU,包括SA1100、SA1110、PXA
[单片机]
BLOB<font color='red'>启动</font><font color='red'>流程</font>与Bootloader程序可移植性研究
STM8单片机学习总结初步02
之前做的PCB板回来前,需构建“驱动代码”的“架构”问题,相对简单,按流程图整理出的文件截图共2页,具体如下: 第1页: 第2页: --------------------------华丽分割线 1------------------------- 编程使用的“版本”为“IAR for STM8 1401”,使用还不错,比较顺手,由于已经完成过部分驱动,并将所有头文件封装进 includes.h 中,包含的头文件如下: #ifndef __INCLUDES_H_FOR_STM8 #define __INCLUDES_H_FOR_STM8 #include ultra_maps.h #include ultra_edi
[单片机]
<font color='red'>STM8</font><font color='red'>单片机</font>学习总结初步02
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved