历史上的今天
今天是:2024年10月26日(星期六)
2021年10月26日 | STM8学习笔记1:CPU简介
2021-10-26 来源:eefocus
写在前面
最近项目中涉及到一些实时性要求很高的底层驱动设计,在IAR下用C语言写完后总是感觉响应不是足够快,平时在网上会看到很多嵌入式大牛直接通过汇编来写,效果超级明显。之前在学校里接触过51的汇编,感觉又low又难懂。随着时间的推移,越来越有一种潜意识,觉得高级程序虽然有着开发效率高的特点,但有一些地方的局限还是很多大的,如果想要继续深入地了解和运用一些单片机底层的资源,能且只能通过汇编来实现。现在工作中接触的MCU主要是STM8系列,所以就从他开始吧!
STM8 简介
意法半导体的这款8位单片机一直知名度不高,在上学时,一般耳熟能详的八位机都有PIC、51、AIR之类,STM系列也只听说过STM32,工作后接触到STM8,觉得这款芯片还是挺强大的,虽然是CISC架构,但大部分指令都能单周期内进行,更主要的是他丰富的外设,如果要求不高的话实用性完全超过了低价位的STM32芯片。
常用外设
从官网上了解到,STM8 系列有三个大类:S(mainstream MCUs,主流MCU),L(ultra-low-power MCUs,低功耗MCU),和AF/AL(automotive MCUs,车载嵌入式系统)。S系列以其价格优势占领了不少市场,但相比于后两者而言,功能较少,适用于一些功能简单的应用场合。A系列没接触过,L系列虽然号称低功耗,但它具有丰富的外设,并且具有1个多通道DMA,你可以灵活利用他们以节约系统资源去做更多的事情。比如利用SPI和595通讯以及AD采样,只需要合理设置,然后直接向定义的全局变量赋值或者读取数据就可以了,非常方便了可以说是。
STM8资料地址
你可以在这里下载两个重要的东西:参考手册(RM0031 Reference manual)和编程手册(PM0044 Programming manual)。其中编程手册一定要把右上角的加号点开,看准文件编号,上面那个讲Flash存储器性能的,没什么卵用。
DS6948_STM8L151x8,STM8L152x8,STM8L151R6,STM8L152R6单片机数据手册
DS6372_STM8L151x4,STM8L151x6,STM8L152x4,STM8L152x6单片机数据手册
32KB和64KB产品的不同块之间的起始地址都是相同的,但大容量产品Flash,RAM和EEPROM要大一倍。
指令流水线
三级流水线标配,大部分指令(长转移指令和16位运算以及乘除法运算指令执行时间较长)可以在单周期内执行完成。


具体内容请参考:
PM0044_STM8单片机编程手册
寻址方式
大部分MCU寻址可以概括为三种基本寻址方式:直接寻址,间接寻址和寄存器寻址。而STM8在此基础上衍生出了8种:
| 寻址方式 | 例子 |
|---|---|
| 固有寻址(Inherent) | NOP |
| 立即寻址(Immediate) | LD A,#$55 |
| 直接寻址(Derect) | LD A,$55 |
| 索引寻址(Indexed) | LD A,($55,X) |
| 堆栈索引寻址(SP Indexed) | LD A,($55,SP) |
| 间接寻址 | LD A,([$55],X) |
| 就近寻址(Relative) | JRNE loop |
| 位寻址(Bit operation) | BSET byte,#5 |
具体内容请参考上述文档(PM0044_STM8单片机编程手册).
指令集
同样,文档中解释的很详细。然后有几个地方需要注意下,这里简单说说。
1. 成对的指令
(a) 调用指令:
CALL label; 和RET; 是一对,CALLF label; 和RETF是一对。在C编程时调用汇编函数一定要看一下C语言的编译结果,在调用汇编的时候用的是CALL还是CALLF,他们的区别是:CALL执行时,PC的低位PCL和高位PCH被压入堆栈,同样RET将PC值的高位和低位出栈;而CALLF是将三字节数据压入堆栈: PC的低位PCL,PC位的高位PCH和PC的额外位PCE,同样RETF是将以上三字节数据出栈。如果没有搭配好,程序在返回调用位置时当然会出错了。如果有幸PC值的额外位没有用到,堆栈的顺序已经乱掉了,程序基本就没法运行了。对了,STM8没有中断返回指令RETI。
(b) 堆栈指令:
PUSH和POP是一对,PUSHW和POPW是一对,而且两者在同一段程序中顺序也要注意,先进后出。
2. 除法指令
除法指令能不用尽量不用,据我所知这个家伙是所有指令执行周期最长的了。用汇编的目的就是为了缩短指令执行时间,这玩意儿一加等于是一纳秒一纳秒抠出来的时间全扔了。

3. 位操作指令
BSET和BRES可以对一个字节的数据的某个位进行操作,非常好用。但只能是RAM中的数据,CPU寄存器一个也不支持。不过这都无所谓,毕竟直接操作内存数据更方便。

STM8内核的介绍就写这么多吧,具体的内容去看官方的参考手册,不仅内容详细,而且内容详细。。。
ps:新版CSDN文本编辑器真坑,图片调不了大小,排版丑的。。。哎凑合写写吧,还要众筹出书咋地。。。
下一篇:找STM8固件库的方法
史海拾趣
|
本帖最后由 辛昕 于 2018-5-3 16:35 编辑 其实从后来的经历来看。 此内容由EEWORLD论坛网友辛昕原创,如需转载或用于商业用途需征得作者同意并注明出处 这件事,除非是自己去做,否则没多大意义。 当然了,花几百块买一台100Mhz以上带宽的 ...… 查看全部问答> |
|
lm3s811到底要怎么写程序啊!!要什么.h文件,怎么初始化!我真心蛋疼了 lm3s811到底要怎么写程序啊!!要什么.h文件,怎么初始化!我真心蛋疼了 整了一晚上加一天,一个程序都没运行成功! 求指教! 求批评! 求鞭策!… 查看全部问答> |
|
寻求一片稳压芯片LDO,压差最好能控制在0.3V一下,推荐一款 寻求一片稳压芯片LDO,压差最好能控制在0.3V一下,推荐一款!现在用的AMS1117-3.3,锂电池的电压在3.6V~4.2V,1117-3.3不能稳到3.3V,1117要求压差大于1.25V才能稳压到3.3V,1.25V+3.3V=4.55V,求推荐那款TI的LDO芯片能实现压差在0.3V之内的?… 查看全部问答> |
|
途中的上面的波形电压V范围是1.5伏特-5伏特,中间的那个电平U始终比最高的那个电平低1.5伏特,当V=1.5伏特时U=0伏特; 怎么才能转成下面的那个电平,我用比较器试验可以但是那个门槛电平需要浮动。有没有更简单的方法。… 查看全部问答> |
|
通讯读取MSP430F135 FLASH 0x1090--0x109F 读取不了 比如:发送80 14 04 04 90 10 10 00 MSP430F135 读取不了 ?为什么 BSL通讯读取MSP430F1101、MSP430F1232 FLASH 0x1090--0x109F 可以直接读取 &n ...… 查看全部问答> |
|
ADC内核完成将模拟信号转换成12位数据并存入转换存储寄存器中,输入模拟电压的最终结果满足公式: 本论文要求有pH值信号和温度信号两路模拟信号进行A/D转换,为了减少误差,可采用多次取值然后取平均值的方 ...… 查看全部问答> |
|
本帖最后由 497759272 于 2016-3-25 19:02 编辑 小弟最近正在做一个电子节拍器的项目,通过MSP430的定时器控制PWM波进而产生中断效果同时产生 ‘嗒’ 的音,但是输出之后的声音除了嗒之外有明显的噪音。小弟就想知道这种噪音是能够程序的改进避免 ...… 查看全部问答> |




