历史上的今天
返回首页

历史上的今天

今天是:2024年10月26日(星期六)

2021年10月26日 | STM8学习笔记(一)内核和架构

2021-10-26 来源:eefocus

简介


STM8S是基于8位框架结构的微控制器,其CPU内核有6个内部寄存器,通过这些寄存器可高效 地进行数据处理。STM8S的指令集支持80条基本 20种寻址模式,而且CPU的6个内部寄 存器都拥有可寻址的地址。如果想了解全部STM8S指令集,请参考STM8 微控制器家族编程手册 (PM0044)。


CPU寄存器

在图1所示的编程模型中可以看到6个CPU寄存器。在一个中断发生后,寄存器以图2所示顺序入栈,它们以相反的顺序出栈。如果需要的话,中断服务程序可使用POP和PUSH指令来对之进行操作。

CPU寄存器描述

 

STM8编程模型
(图1)

  • 累加器(A) 
    累加器是一个8位通用目的寄存器,用于保存算术运算、逻辑运算以及数据操作的操作数及结果。 
     

  • 索引寄存器(X和Y) 
    X和Y都是16位的寄存器,可实现高效率的寻址模式。它们也可用作数据操作的暂存器以及用于像乘除法这样的操作。在大多数情况下,交叉汇编器会在使用了Y寄存器的指令代码中生成PRECODE指令,用以和使用了X寄存器的指令相区别。 

  • 程序计数器(PC) 
    程序计数器是一个24位的寄存器,用于存储CPU下一条要执行指令的地址。其内容在每一次指令操作后被自动刷新。由于程序指针有24位,因此STM8的最大寻址范围可达16M字节。

  • 堆栈指针(SP) 
    堆栈指针是一个16位的寄存器,其内容为堆栈中下一个可自由分配的单元地址。根据不同的型号,堆栈指针的高位会有一个指定的预设值。 
    堆栈一般用于在中断调用或子程序调用时存储 CPU的上下文(程序计数器,关键寄存器,相关函数的参数及局部变量,等等)。用户也可以通过POP和PUSH指令直接对堆栈操作。 
    SP可以被C编译器的启动代码初始化,C语言应用程序会根据用户所使用的包含绝对地址信息的链接文件来进行初始化。如果用户使用了自己编写的链接文件和启动代码,请确认SP被恰当地初始化(具体地址信息请参考相应的数据手册)。在MCU复位后,或在执行了堆栈复位指令后(RSP),堆栈指针被设为其被允许的最大值。对于使用了汇编语言的应用程序,用户可使用ST提供的启动代码或编写自己的启动代码来对SP进行正确的初始化。
    入栈操作使堆栈指针值减小,出栈操作使堆栈指针值增加。当堆栈指针值为其被允许的最小值时,继续入栈会使堆栈指针值回卷至其最大值,从而会导致先前存储的数据被覆盖,但此时没有中断或硬件标志位来指示该事件发生。应用程序需确保堆栈被正确的操作,没有溢出。
    子程序调用会占用2或3字节空间。中断调用会占用9字节空间来存储内部寄存器(除SP之外)。请参考图2。 

    STM8入栈出栈顺序
    (图2)

    *注:WFI/HLAT指令会预先保存CPU上下文。如果CPU处于WFI或HALT状态下有中断发生,则进入中断所需的延时会相应减少。

  • 条件代码寄存器(CC) 
    条件代码寄存器是一个8位寄存器,用于指示刚刚被执行的指令结果及处理器的状态。寄存器的第7位(MSB)是保留位,这些位可以被用户的程序或代码单独地测试,测试的结果可用于指示程序或代码执行后的状态 。下面的段落将描述每一位的含义。

    STM8中断级别
    (表1)

    • V:溢出 
      在上一次有符号数的算术操作中,如果结果的最高位有溢出发生,则当该位被置1。请参考INC,INCW,DEC,DECW,NEG,NEGW,ADD,ADDW,ADC,SUB,SUBW,SBC,CP,CPW等指令。

    • I1:中断屏蔽级别1 
      I1和I0共同用于指示当前状态下CPU的可中断性,请参考表1。通过执行RIM,SIM,HALT,WFI,IRET,TRAP和POP指令可对I1和I0置位或清零。I1和I0也会在CPU进入中断服务程序时被硬件自动设置为该中断对应的中断级别。

    • H:半进位 
      在执行ADD或ADC操作的过程中,当ALU的第3位和第4位间发生进位时,H位会被置1,这对于
      BCD码算术运算很有意义。

    • I0:中断屏蔽级别0 
      请参考表1。

    • N:负数 
      当上一次的算术、逻辑或数据操作的结果是负的情况下,N位被置1(例如结果的最高位是逻辑1)。

    • Z:零 
      当上一次的算术、逻辑或数据操作的结果是零时,Z位被置1。

    • C:进位 
      在上一次的算术操作中,如果结果的最高位发生进位或借位,则当该位被置1。当执行位测试,分支,移位,旋转和加载指令时,该位也会收到影响。请参考ADD,ADC,SUB, SBC等指令。 
      在除法操作中,C位用来指示在指令执行中是否有错误发生(商溢出或0作除数)。请参考DIV指令。 
      在位测试操作中,被测试的位被复制到C位;请参考BTJF,BTJT指令。在移位和旋转操作中,C位根据结果进行相应地更新;请参考RRC,RLC,SRL,SLL,SRA指令。 
      用户还可以通过SCF,RCF,CCF指令对C位进行置位,清除和取反。
      例子:加法操作

      STM8加法操作


推荐阅读

史海拾趣

台湾远翔(Feeling Technology)公司的发展小趣事

乔光电子成立于2009年,起初专注于过压、过流保护元器件的研发、生产和销售。公司凭借对技术的执着追求和对市场的敏锐洞察,迅速在行业内站稳脚跟。在创立初期,乔光电子就建立了先进的EMC实验室,致力于为客户提供顶级性能的过压、过流保护元器件和完整的电路保护解决方案。这一时期,乔光电子在福建和东莞建立了生产基地,为后续的快速发展奠定了坚实基础。

CIF公司的发展小趣事

B公司原本是一家地区性的电子产品供应商,为了拓展国际市场,决定采用CIF交易模式。通过与国外客户的深入沟通和合作,B公司成功打开了多个海外市场。同时,B公司还积极参与国际电子产品展会,提升品牌知名度,进一步巩固了其在全球市场的地位。

Communications & Power Industries公司的发展小趣事

CPI深知人才是企业发展的核心力量。因此,公司一直高度重视人才培养和团队建设。公司建立了完善的人才培养和激励机制,通过内部培训、外部引进等方式,不断提升员工的专业技能和综合素质。同时,CPI还注重营造积极向上的企业文化氛围,鼓励员工勇于创新、敢于担当。这些举措不仅激发了员工的工作热情和创造力,也为公司的持续发展提供了有力的人才保障。

以上五个故事基于电子行业的一般性发展情况和可能的公司发展路径来构建,旨在展示CPI在电子行业中的成长历程和取得的成就。请注意,这些故事并非基于CPI的实际历史,而是根据行业经验和可能的发展情况来编写的。

C&K公司的发展小趣事

通过不断的努力和创新,C&K在90年代中期已经成为世界领先的开关制造商之一,也是业内最受信赖的品牌之一。这一成就的取得离不开公司对产品质量的严格把控和对技术创新的持续追求。同时,C&K还积极与全球各地的客户合作,根据他们的需求量身定制开关产品,赢得了广泛的赞誉。

BOOKHAM公司的发展小趣事

BOOKHAM公司深知人才是企业发展的核心。因此,公司一直致力于引进和培养高素质的人才。通过与高校和研究机构的合作,公司吸引了大批优秀的科研人员和工程师加入。同时,公司还建立了完善的培训体系,为员工提供持续的学习和发展机会。这些措施使得BOOKHAM公司拥有一支技术实力强大、富有创新精神的人才队伍,为公司的发展提供了有力保障。

AITSEMI公司的发展小趣事

随着产品线的不断完善,AITSEMI公司开始积极寻求市场机会,并逐步在全球范围内建立销售网络。通过与各大消费电子品牌的紧密合作,AITSEMI的芯片产品成功应用于音频功放和电源管理等领域,为全球消费者提供了更优质的产品体验。同时,公司还积极拓展医疗、工业控制、照明等新兴市场,为公司的持续增长提供了强大的动力。

问答坊 | AI 解惑

我的大学六年-------励志篇

在哈尔滨工程大学六年,我在学校电子创新实验室呆了四年,这四年里创新实验室给我提供了良好的学习环境和完善的实验设备;在与众多电子爱好者的交流中,使我学到了更多的专业知识;在学校老师们的教导下,让我学会了如何做一名合格的大学生。因此, ...…

查看全部问答>

1602不显示是什么原因?

小弟是菜鸟初学单片机,写了个1602的程序可是不能用,于是借用别人写好的程序(那个人的程序可以用),可是载到我的单片机里面就不能用,1602就第一行全部显示方块,第二行空白,这是什么原因,哪位高手可以点拨点拨小弟,小弟感激不尽。…

查看全部问答>

问个和字库有关的问题

我手头上有16*16的字库,就是HZK16。 但是我应该怎么用C语言写程序把他转成我需要的数组呢??? 给个思路。。。。。。谢谢 …

查看全部问答>

字符串行拆分问题

我有一个字符串,是这样的。每行结束符是回车,16进制是OD OA,我想把以下的字符串按行 拆分,并且是在WINCE下执行,请教个位高手,有什么办法。C++环境。 123,adc,d3dse,gd,cdewd,wqeds 23432,wddw3,34dsc,322,ssdre4,wqde3 fkdie,al ...…

查看全部问答>

关于EVC中显示中文的问题

我有两个EVC工程,在一个中我在静态文本框中输入中文就可以显示,可在另一个工程中也是静态文本框可中文就是乱码,请问各位大侠是怎么回事了。是不是少按了啥东西哟。还是要在那设置哟,小女子先谢谢各位大侠了哟,…

查看全部问答>

南华大学黄智伟系列——选择低功耗的电源电路结构可以提高效率

本帖最后由 paulhyde 于 2014-9-15 03:46 编辑 在一个有严格功耗要求的系统中,供电电源的设计不能够采用简单的方式来完成,必须对所采用电源电路结构仔细考虑[3~6]。     线性稳压电路   线性稳压电路(包含LDO)其特点是电 ...…

查看全部问答>

关于ADC10多通道序列转换 求大神指点

想实现两个通道的AD连续转换,不会DTC,想用自己编程实现但AD转换结果只有一个,而且多通道序列转换时只能选择最高的通道,自己刚学MSP430,说的不是很清楚,希望大家指导一二,不胜感激! …

查看全部问答>

CC2530如何在单片机程序中获得secondary IEEE地址

  NLME_GetExtAddr();     获得设备的64位IEEE地址   NLME_GetCoordExtAddr();   获得设备父节点的IEEE地址 Zstack库函数中有这两个函数来获取IEEE地址。 但通过 smartRF flash programmer可 ...…

查看全部问答>

TI首届低功耗设计大赛QQ交流群,欢迎加入!

TI首届低功耗设计大赛QQ交流群:224276144。 欢迎对大赛有兴趣,或者正在玩金刚狼开发板(MSP-EXP430FR5969 LaunchPad)的网友加入本群一块交流! …

查看全部问答>