您的位置 首页 电源

STM8单片机发动流程完全探求–根据IAR开发环境

初学STM8会发现,STM8官方的固件库并没有提供一个.s文件的启动代码,那么她是如何启动然后跳转到main函数执行的呢首先,我们根据ARM的只是可以推测,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函数地址

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/209269.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部