wpppmlah 发表于 2023-8-12 10:10:47

【实验箱已收到】wpppmlah的课程打卡23-08

本帖最后由 wpppmlah 于 2023-8-21 09:05 编辑

STC32位寄存器 与传统8051寄存器的兼容和扩展
R0-R7 是兼容传统8051的,另外还扩展了寄存器。
何老师在讲解寄存器时,通过 KEIL的实际操作,演示并讲解了字节、字、双字寄存器的组成和联系,这些知识都是底层基础知识,
平时所接触的课程都没有这么详细。老师说:学习底层的东西不是浪费时间,可以让我们更好的理解寄存器的运行方式,底层和原理的学习
做为应用级别的水平的基础。

为什么8051由8位升级到32位会非常精彩呢?
通过对STC32位MCU与传统8位MCU的对比来诠释了,STC32位MCU开创了全球51单片机新时代的精彩。
STC32位MCU 堆栈放在了EDATA中   占用4KB   理论可达64KB
               片内扩展RAM 8KB      理论范围:6KB-8MB
STC32位MCU 中DATA 和 SFR 地址范围内区域均可以位寻址!!



中断原理和功能
STC32G单片机做到了让KEIL能够识别到更多的中断。
中断的作用:能让MCU以最快的速度处理事件
                   能以最小的代价去处理事件
在STC32G 中加入了DMA功能 ,这一方法是处理事件效率最好的一种方式。



中断优先级
中断优先级最重要的价值,是使中断嵌套的处理过程有条不紊!
中断嵌套:允许高优先级中断打断当前中断处理的机制叫中断嵌套。
这个中断优先级,开始学习时会有一些不太清楚 ,在STC32G中,中断优先级分为0-3共四个级别。0为最代级,看上图:STC32G中断结构图。
听了老师的讲解,中断按照优先级的处理过程,我是这样理解的:
同级别的中断,按照中断索引来确定执行的先后顺序(看STC32G手册12.3 STC32G 系列中断列表看下图:)
高优先级别的中断可以打断当前中断,当高优先级中断执行完毕以后再返回当前中断继续执行



这是观看何老师的课程后,对其中一些我认为重点的一些知识的总结。也是我平时对这些知识不太清楚的地方 。
何老师的课,不仅有理论,还有实操。
不仅实操,而且还非常详细,竟然是手把手保姆级授课,真赞。希望大家不要错过这些课程。
https://www.stcaimcu.com/data/attachment/forum/202308/11/095114l9ajw6h2zr9oh9z5.png












月光如盐 发表于 2023-8-12 11:31:25

楼主可继续打卡学习
有机会优先获赠实验箱+包邮

https://www.stcaimcu.com/data/attachment/forum/202308/11/091702k4gxonb0js1021jx.png

wpppmlah 发表于 2023-8-15 09:04:04

2023/08/14 打卡 陈老师STC8H8K64U原理及应用
学习提纲
一 C51 对ANSI C 的扩展
二 单片机C语言中的常用运算
三STC8H8K64U单片机C51程序架构

一 C51 对ANSI C 的扩展
1 ANSI C 是标准的C语言。C51有19个扩展关键字:
_at_、sbit、sfr、bit、sfr16、idata、bdata、xdata、pdata、data、code、
alien、small、compact、 large、using、reentrant、interrupt、_task_。
(标红的关键字是比较重要的)

(1)变量或数据类型
bit                                    位型                  0或1
signed char                      带符号字符型    -128-127
unsigned char                  无符号字符型    0-255
enum                                                      -128-127或-32768-32767
signed short                  带符号短型         -32768-32767
unsigned short               无符号短型          0-65535
signed int                        带符号整形         -32768-32767
unsigned int                  无符号整形         0-65535
signed long                  带符号长整形   -2147483648-2147483647
unsigned long                无符号长整形      0--4294967295
float                               浮点型                -1.175494E38--3.402823E+38
在单片机中经常用到的是无符号的数!
C51当中特有的数据类型:
sbit            0~1            (从字节中定义的位变量 0或1)
sfr             0x80-0xff   (作用是声明特殊功能寄存器)
sfr16         0x80-0xff   (作用是声明特殊功能寄存器)
变量定义的一些重点说明 :
bit 型变量 ,可用于变量类型和函数声明、函数返回值等,存储于内部RAM20H-2FH单元中。
需要注意的是:a 位不能声明为一个指针。b 不能有BIT数组 如bit arr;这是错误的。
sbit可位寻址区说明
使用sbit声明可独立访问可位寻址对象的位。sbit声明要求基址对象的存储器类型为bdata,否则只有绝对的位声明是合法的。
位的位置(^后)的最大值依赖于指定的基类型,对于char/unsigned char来说是0-7,对于int/unsigned int/short/unsigned short来说
是0-15,对于long/unsigned long来说是0-31.例如:
int bdata bittest _at_ 0x20;
sbit bit0 = bittest^0;//0x20单元的第0位
sbit bit15 = bittest^15;//0x21单元的第7位
可位寻址对象的位的声明,只能放到MAIN函数的外部做为全局变量使用,否则编译不通过 !
特殊功能寄存器(SFR)
STC8H8K64U单片机的特殊功能寄器(SFR)寻址区,用于控制定时/计数器、串口、IO及其他部件。
为了支持sfr、sbit等关键词。


内存区域的指定
code关键字表示将变量保存到程序存储区。这样可以节省内部RAM的使用。
      例如:LED数码管的显示字模unsigned char code led_buf={0x30,0x06......};
data:直接寻址区,内部RAM的低128字节,地址范围:00H-7FH
idata:间接寻址区,包括整个内部RAM区256字节,地址范围:00H-0FFH.
bdata:可位寻址区,地址范围:20H-2FH
外部数据存储器
xdata :可指定多达64KB的外部直接寻址区,地址范围0000H-0FFFFH.


keil C51 指针!!!C语言的重点、难点。也是C语言的灵魂!!


KeilC51 支持一般指针,和存储器指针。
怎么学呢?用小例子来实验!


unsigned char xdata *pt;            //pt本身依存存储模式存储
unsigned char xdata * data pt;   //pt 被保存在内部RAM
unsigned char xdata *xdata pt;   //pt 被保存在外部RAM

基于存储器的指针,说明时即指定了存储类型,例如:
char data *str;                           //str指向data区中char型数据
int xdata *pow;                           //指向了xdata


C51的指针还可以用来访问外部并行扩展的部件。例如:外部IO
#define CBYTE ((unsigned char volatile code *)0)
.....
这里出现了一个 关键字 volatile   .它的作用是告诉编译器,变量随时会发生变化,不要进行编译优化。
比如:连续对一个变量赋值,就会让编译器,优化掉第一个赋值的语句:
a=1;
a=2;
编译器就会优化掉a=1;

指针 对于扩展RAM区域的特殊功能寄存器的声明:
    #define P0PU(*(unsigned char volatitle xdata *)0xfe10)
C51 对函数的扩展
    1)中断函数的声明
      中断函数通过使用interrupt 和 中断号来声明。
         例如:
      void USRT1_ISO(void) interrupt   4      //interrupt   是中断函数关键字   4是串口1中断号。
      {
         //中断服务代码
       }
   关键字 interrupt 和中断号是中断函数的重要标志,函数名可以自己定义,当然要和中断服务相对应!
    2)指定工作寄存
   
    unsigned char GetKey(void) using 1   //using   是指定工作寄存器关键字   1 是工作寄存器
    {
      //用户代码
   }
   
3)指定存储模式
用户可以使用small、compact及large说明存储模式。例如:
      void disp_data(void)large   //large说明函数内部变量 全部使用 扩展RAM
   {
      //用户代码
   }


二 单片机C语言中的常用运算



1,关系运算符 ,其结果只能是 0 或 1
    <小于
    > 大于
   <=小于等于
>=大于等于
   ==等于            //经常发生只写一个等号的情况 导致计算错误,要注意!!!
!=不等于
   
2,逻辑运算符
    && 与    ;    ||或 ;   !非;三种


3,位运算符
   & 位与;| 位或; ~取反;^位异或;<<左移;>>右移;六种





三STC8H8K64U单片机C51程序架构(C51程序设计)

通过实例流水灯来进行C语言程序设计的方法。
#include "stc8h.h"
......





STC8H8K64U 内部eeprom的介绍和操作
它的EEPROM的大小是可以由用户来定义的,如何定义呢?
通过STCISP 下载用户代码时 自己设置。当然它的区块位于FLASH地址的最后区块!


EEPROM的例程:

#include "stc8h.h"
#include "intrins.h"
void IapIdle()
{
    IAP_CONTR = 0;                              //关闭IAP功能
    IAP_CMD = 0;                              //清除命令寄存器
    IAP_TRIG = 0;                               //清除触发寄存器
    IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
    IAP_ADDRL = 0;
}

char IapRead(int addr)
{
    char dat;

    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 12;                               //设置等待参数12MHz
    IAP_CMD = 1;                              //设置IAP读命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();
    dat = IAP_DATA;                           //读IAP数据
    IapIdle();                                  //关闭IAP功能

    return dat;
}

void IapProgram(int addr, char dat)
{
    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 12;                               //设置等待参数12MHz
    IAP_CMD = 2;                              //设置IAP写命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_DATA = dat;                           //写IAP数据
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();
    IapIdle();                                  //关闭IAP功能
}

void IapErase(int addr)
{
    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 12;                               //设置等待参数12MHz
    IAP_CMD = 3;                              //设置IAP擦除命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();                                    //
    IapIdle();                                  //关闭IAP功能
}

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

    IapErase(0x0400);
    P0 = IapRead(0x0400);                     //P0=0xff
    IapProgram(0x0400, 0x12);
    P1 = IapRead(0x0400);                     //P1=0x12

    while (1);
}


另外:陈老师关于STCISP当中延时函数中为什么会用do{} while的问题和姚总进行了交流。
最后从汇编的角度进行了分析 ,DO{} WHILE数出来的时钟会更准确。所以侧面 说明了汇编的重要性!!


感谢老师精彩的讲解。








wpppmlah 发表于 2023-8-16 10:23:05

2023/08/15何老师MCS251 汇编课主要学习内容

一 数据类型和端
二 指令集中的符号规则
三 单片机CPU寻址模式
四 指令模式的选择
五 单片机CPU指令类型和格式



一 数据类型和端
MCS-251 ISA(架构)寻址的数据类型。
关键点:16位即字或32位的双字可以保存在存储器中任何字节开始的地址,
             注意不 需要在16位字(两字节)或32位双字(四字节)边界上对齐。
   在MCS-251 ISA中,字和双字以大端形式保存在内存和 寄存器文件中
#在将数据保存到存储器中时,字或双字的最高有效字节(Most Significant Byte, MSB)在指令中指定的存储器的字节中,
其余字节保存在存储器高地址的位置,最低有效字节(Least Significant Byte, LSB)保存在存储器最高地址的位置
#对于大端来说,满足高址低字节,低址高字节的规则。而小端正好相反,满足高址高字节,低址低字节的规则





二 指令集中的符号规则

MCS・251的ISA兼容了 MCS-51的ISA,也就是说在MCS-251的ISA中包含了全部MCS-51 ISA中的指令
#本节介绍MCS-251 ISA中对于指令中使用的各种符号的定义规则
#包括传统MCS-51 ISA中的寄存器符号的表示、地址符号的表示,以及指 令中操作数的符号表示规则
*MCS-51 ISA中规定的符号包括:
A:表示MCS-51 (简称8051) CPU核中的8位累加器ACC
DPTR:表示16位的数据指针,指向外部数据空间或者代码存储空间
PC:表示16位的程序计数器,指向下一条要执行指令的地址
   C:表示进位标志CY
AB:表示A和B寄存器对,用于乘和除操作
SB:表示堆栈指针
DPS:数据指针选择寄存器
R0-R7: 8个8位的寄存器

*在MCS-251 ISA中,操作数的符号描述含义:











三 单片机CPU寻址模式

    寻址模式的概念:在单片机中,将CPU寻找操作对象(操作数)所在存储位置的方 式,称为寻址模式
    操作码和操作数的概念:
    一条机器指令包含两部分,即:操作码和操作数
   *操作码的目的是要对被操作对象进行处理
   *典型的,对被操作对象实现逻辑与或非运算、加减乘除运算等
   *在机器/汇编语言指令中,将操作对象称为操作数
   *在STC增强型8051单片机和STC32G系列单片机中,这些被操作的对象 (操作数)可以保存在CPU的内部寄存器、
   片内Flash程序存储器、片内 基本RAM、片内扩展RAM或者片外扩展存储器中,也可能是仅是一个常 数, 它作为操作码的一部分存在
MCS-251的ISA支持下面的寻址模式(区分源和目的) 包括:

寄存器寻址   在这种寻址模式中,指令中指定包含操作数的寄存器




立即寻址    在这种寻址模式中,指令中包含着操作数





直接寻址   在这种寻址模式中,指令包含操作数地址



间接寻址   在这种寻址模式中,指令指定包含操作数地址的寄存器




位移寻址    在这种寻址模式中,指令指定一个寄存器和一个偏移量。操作数地址是寄 存器内容(基地址)和偏移量之和




相对寻址    在这种寻址模式中,指令包含从下一条指令到目标地址(控制转移的地址, 例如跳转地址)的带符号偏移量







位寻址       在这种寻址模式中,指令包含位地址




五 单片机CPU指令类型和格式



基于MCS-251 ISA的所有 MCU都 可以设置为两种模式:
包括(Source)模式以及二进制(binary)模式,见下图:



源模式(Source)是MCS-251 ISA默认的工作模式。在使用MCS・ 251 ISA时,二进制模式用于兼容51架构的高效机器指令 编码模式
注:(1)二进制模式只是一个命名,并不表示该模式的机器码就 是二进制形式表示,机器码依旧以16进制表示)
(2)注:STC32G系列单片机只支持源模式,并不支持二进制模 式,这一点要特别注意。

在MCS-251 ISA中为什么要存在两种模式?
#这需要从"A5H"指令前缀开始说起,这里需要强调“A5H" 是只是一个机器指令码前缀
# “A5H"前缀会在编译器编译指令时,依据所设置的模式(源模式/二进 制模式)自动生成


MCS-251 ISA中包含了268条指令 ,而MCS-51 ISA中只有111条指令。
按照所实现的功能,将STC32单片机内8051 CPU指令集分为:
#算术运算指令
#逻辑指令
#数据传输指令
#位指令
#控制指令
以下由何都是对常用 的几种指令做了讲解 :
加法指令 ADD    (ADD A,Rn(*))
将源操作数与目的操作数相加,目的操作数可以是寄存器 或累加器,将结果保存在寄存器或累加器中
#        CY标志的判断如果相加结果的第7位有进位,则将进位标志位CY设置为"V
#        AC标志的判断 如果与字节变量相加,且相加结果的第3位有进位,则将标志位AC设置为 1,
注:AC只对8位数据的相加运算有效,这一点要特别注意! ! !
溢出的判断
#对于无符号的整数加法,CY标志可用于指示相加的结果是否发生了溢出
#如果加法结果的第6位有进位但第7位没有进位,或者第7位有进位而第6 位没有进位,则设置溢出标志OV。
对于有符号整数相加,当两个正数相加结果为负数,或者两个负数相加结果为正数时,表示计算结果的溢出,
此时将溢出OV标志设置为1
#零标志的判断
#当两个数相加的结果为0时,将零标志z设置为"1";当两个数相加的结 果不为0时,将零标志z设置为"0”
#符号标志的判断
#当两个数相加结果的第7位为1时,将符号标志N设置为 1;当两 数相加结果的第7位为"0”时,将符号标志设置为“0”
注:上面提到的第6位和第7位指的是操作数最高有效字节中(8位、16位或32 位)的第6位和第7位。
这是因为MCS-251 ISA中的加法指令支持8位、16位和 32位操作。


ADDC指令 ,带进位标志的加法。
该指令实现带进位标志的加法。同时将指定的字节变量.
CY标志和累加器内容相加,将结果留在累加器中
#如果第7位有进位,则置位CY标志位
#如果第3位有进位,则置位AC标志位
#溢出标志的判断
#当无符号整数相加时,CY标志表示发生溢出
#如果第6位进位第7位没有进位,或第7位进位但第6位没有进位,则置位 0V标志位。当有符号整数相加时,
0V标志表示两个正数相加结果为负数, 或两个负数相加结果为正数。第6位和第7位指的是操作数的最高有
效字节(8、16或32位)的第6位和第7位


减法指令SUB   ( SUB Rmd,Rms )


该指令用于从目标操作数中减去指定的变量,将结果留在目标操作数中
#如果第7位需要借位,则SUB指令设置CY标志位。否则,CY位 清零
#当减去有符号整数时,OV标志表示当从正数中减去负数时产生 了负数,或者当从负数中减去正数时产生了正数。这里的第7位 指的是操作数的最高有效字节(8、16或32位)中的第7位
#该指令影响进位标志CY、溢出标志OV、符号标志N和零标志Z
注:仅对于8位操作数来说,才会影响辅助进位标志AC。对于宇和双字寄存器, 不会影响AC标志位

带借位的减法SUBB指令






















wpppmlah 发表于 2023-8-16 10:45:26

接楼上,一个帖子编辑太长了,电脑还卡了。。。。接着来
带借位的减法SUBB指令



# SUBB指令从累加器A中减去指定的变量和CY标志,将结果保存 到累加器A中
#进位标志的判断
#如果第7位需要借位,则设置CY (借位)标志位,否则清除CY标志位。 如果在执行SUBB指令之前
已经设置了CY标志位,这表明在减法的上一 步需要借位,因此从累加器A中减去CY标志位和源操作数
#辅助进位标志的判断
#如果第3位向第4位借位,则设置AC标志位,否则清除AC标志





递增指令INC Rn(*)


递减指令DEC dir8(*)




乘法指令 MUL
乘法指令将源寄存器中的无符号整数与目标寄存器中的无符号整数相乘
#两个8位数相乘,乘积的结果为16位
#乘积结果的最高有效字节保存在目的寄存器所在字的低字节中。最低有效字节保存在后面的字节寄存器中
#如果乘积结果大于255 (0xFF),则设置OV标志位;否则,清除OV标志
#两个16位数相乘,乘积的结果为32位
#乘积结果的最高有效字保存在目标寄存器所在的双字低位字中。最低有效字保存在后面的字寄存器中
#如果乘积结果大于65535 (0xFFFF),则设置OV标志位;否则,清除OV标志.
#在执行乘法指令后,CY标志总是为零
#当对乘积结果的MSB置位时,设置N标志位
#当乘积的结果为零时,设置Z标志



除法指令 DIV

除法指令将寄存器中的无符号整数除以无符号整数操作数, 并清除CY和OV标志

#如果设置了商的MSB,则将设置标志位N
#如果商为零,则设置Z标志
注:如果<src>包含0x00,则两个操作数中返回的值都是未定义的;清除CY标 志,设置OV,其余标志未定义



BCD调整指令   DA A(*)






比较指令CMP


该指令从目标操作数中减去源操作数,结果不保存在目的 操作数中
#如果第7位需要借位,则设置CY标志。否则,清除CY标志
#当减去有符号整数时,OV标志位指示正数减去负数出现了负数结果,或者指示负数减去正数出现了正的结果
注:这里的第6位和第7位指的是操作数的最高有效字节中的(8、16或32位)第6位和第 7位
#对于该指令,仅当操作数为8位操作数时,才影响AC标志
#比较的结果将会影响N和Z标志



内容很多不能一次总结出来,但是可以观看录像回放,对不太懂的知识,再加以复习,查漏补缺!感谢老师的精彩
讲解,感谢STC公司的硬件。
(终)














wpppmlah 发表于 2023-8-16 10:46:34

视频回放链接:https://www.stcaimcu.com/forum.php?mod=forumdisplay&fid=76

神农鼎 发表于 2023-8-16 10:56:05

楼主对我们的免费公开课 认可/支持/给力,建议主动联系我们同事
=====提前获得 【免费+包邮送】的 STC32G12K128实验箱 或 STC8H8K64U实验箱
=====现在送的,都可以利用MCU自带的 硬件USB直接仿真,硬件USB直接下载

【免费+包邮】 送/申样/采购 可加 如下 QQ或微信联系
加STC华南区客服刘经理QQ: 3398500488 ;微信:18106296592要求 【免费+包邮】 送, 还免费教仿真
加STC华南区客服曹经理QQ:1933892258 ;微信:18106296595 要求 【免费+包邮】 送, 还免费教仿真
加STC华东区客服聂经理QQ:2593903262;微信:18106296598要求 【免费+包邮】 送, 还免费教仿真
加STC西北区客服孙经理QQ: 1347154513 ;微信:18106296593要求 【免费+包邮】 送, 还免费教仿真
加STC华北区客服石经理QQ: 1638975601 ;微信:19952583876要求 【免费+包邮】 送, 还免费教仿真
加STC华中区客服唐经理QQ:2571301708 ;微信:18106296589 要求 【免费+包邮】 送, 还免费教仿真
加STC东北区客服张经理QQ:3141888640 ;微信:19952583265   要求 【免费+包邮】 送, 还免费教仿真
加STC西南区客服张经理QQ:3141888640 ;微信:19952583265   要求 【免费+包邮】 送, 还免费教仿真
工作时间:8:30-12:00,13:00-17:30(周一 到 周五, 法定节假日除外)

【免费+包邮】 送/申样/采购传统电话热线:0513-55012928、0513-55012929、0513-55012966
工作时间:8:30-12:00,13:00-17:30(周一 到 周五, 法定节假日除外)

wpppmlah 发表于 2023-8-16 17:48:41

本帖最后由 wpppmlah 于 2023-8-17 10:48 编辑

2023年8月16日 陈老师 关于STC8H8K64U的工作原理 之 中断篇
1、中断的概念
      中断的概念是在20世纪50年代中期提出的,是计算机中的一个很重要的技术,它既和硬件有关,也和软件有关。正是因为有了中断技术,
才使得计算机的工作更加灵活、效率更高,中断技术的出现使得计算机的发展和应用大大的推进了一步。所以,中断功能的强弱己成为
衡量一台计算机功能完善与否的重要指标。
      最初引进中断技术的目的是为r提高计算机输入输出的效率,改善计算机的整体性能。 当CPU需要与外部设备交换一批数据时,由于CPU
的工作速度远远高于外设的工作速度,每传送一组数据后,CPU等待“很长”时间才能传送下一组数据,在等待期间CPU处在空运行 状态,
造成CPU的浪费。
   所谓中断是指计算机在执行其他程序的过程中,当出现了某些异常事件或某种请求时, CPU暂时中止正在
执行的程序,而转去执行对异常事件或某种请求的服务程序。当服务完毕后,CPU再回到被暂时中止的程序继续执行。
2、其他中断相关概念
    请示CPU中断的请求源称为中断源。
    中断源向CPU发出中断申请,CPU暂停当前工作转去处理中断源事件称为中断响应。
    对整个事件的处理过程称为中断服务。
    事件处理完毕CPU返回到被中断的地方称为 中断返回。



3、中断的优先级
    计算机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断, 要求为其服务的时候,就存在CPU优先响应哪一个中断源
请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先
响应优先级别最高的中断请求。
    当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了 另外一个优先级比它更高的中断源请求,CPU暂停原来中断源的服务程序,转而去 处理优先级更高的中断请求源,处理完以后,再回到原低优先级中断的服务程序, 这样的过程称为中断嵌套。







4.中断的优势
计算机采用中断技术,大大提高了工作效率和处理问题的灵活性,主要表现在3个方面:
①      解决了快速CPU和慢速外设之间的矛盾,可使CPU和外设并行工作。
②      可及时处理控制系统中许多随机参数和信息。
③      具备了处理故障的能力,提高了机器自身的可靠性。
中断类似于程序设计中的调用子程序,但它们又有区别,主要区别如表6-1所示。
一般保护断点是硬件完成的,保护现场须在中断处理程序中用相应的指令完成。




5、开中断和关中断
    中断的开放(称为开中断或中断允许)和中断的关闭(称为关中断或 中断禁止)可以通过指令设置相关特殊功能寄存器的内容来实现,
这是CPU 能否接受中断请求的关键。只有在开中断的情况下,才有可能接受中断源的 请求。




6、保护现场和恢复现场 (入栈 出栈)
    在主程序调用子程序或中断处理过程时,分别要保存返回地址(断点地址)和 保护现场,以便在返回时能够回到调用前的程序段,继续
运行原来的程序。
    进入子程序或中断处理程序后保护相关寄存器中的值的操作,叫做保护现场; 子程序返回或中断处理返回前,恢复相关寄存器中的值
的操作,叫做恢复现场。
    保护现场的方法是将现场条件(寄存器的值)先推入(使用PUSH命令)堆栈 保存,然后再使用这些寄存器,返回主程序前,弹出
(使用POP指令)寄存器的值 。这些功能都要通过堆栈操作来实现。
    其中通用寄存器的保存和恢复需要由堆栈操作指令来完成;返回地址的保存与 恢复的堆栈操作都是在相应的子程序的调用和返回指令
的操作中自动完成的,无需 再用专门的堆栈操作指令。


7、堆栈
   堆栈区是将内部存储器的一部分区域划作专门用于堆栈的区域。堆栈操作有其特定的规则,叫做后进先出(Last In First Out, LIFO)规则
,即最后存入的数据将被最先取出。堆栈区当前的理叫用堆栈指针寄存器(SP)中的值表示,即 SP始终指向栈顶。





8、中断的撤除
   在响应中断请求后,返回主程序之前,该中断请求标志应该撤除,否则,单片机执行完中断服务程序会误判为又发生了中断请求
而错误地再次进入中断服务程序。单片机中有些中断请求标志会自动撤除,有些不能自动撤除,必须用户使用相应的指令撤除。





1 .中断源
STC8H8K64U单片机共有44个中断源,它们分别是:
5个外部中断(INT0-INT4 )
5个定时/计数器溢出中断(T0~T4)
4个异步串口中断(UART1~UART4 )
1个串行外设接口中断(SPI)
1个I2C总线中断、1个USB中断
1个模数转换中断(ADC)、1个低压检测中断(LVD)、1个比较器中断(CMP)
2个PWM中断(PWMA和PWMB)
8个端口中断(P0~P7)
12个DMA中断
1个RTC中断
1个LCM中断








3.中断标志位
(1)外部中断和定时器的中断请求标志
    外部中断0 (INT0)和外部中断1 (INT1)既可双边沿触发(即上升沿和下降沿都可以触发) ,也可以只有下降沿触发。这两个外部中断的
请求标志位分别是寄存器TCON中的IEO/TCON.1和 IE1/TCON.3。当外部中断服务程序被响应后,中断标志位IE0和IE1会自动清0。
外部中断0 (INTO )和外部中断1 (INT1)还可以用于将单片机从掉电模式唤醒。TCON的各个位含义如下:




①      IT0:外部中断INT0触发方式控制位。可由软件置1或清0。
       0:上升沿和下降沿均可触发外部中断。当INT0引脚出现上升沿或者下降沿时,置位IE0。
       1:下降沿触发方式。INT0引脚上电平由高到低的负跳变时,置位IE0。
②      IE0:外部中断INT0请求标志。
③      IT1:外部中断INT1触发方式控制位,与IT0类似。
④      IE1:外部中断INT1请求标志,其意义和IE0相同。


⑤    TR0:定时/计数器T0启动/停止控制位。
⑥TF0:定时/计数器T0的溢出中断标志。若CPU响应中断,在进入中断后, CPU自动将TF0清0。TF0也可用软件清0 (查询方式)。
⑦    TR1:定时/计数器T1启动/停止控制位。
⑧    TF1:定时/计数器T1的中断标志,功能和TFO类似。

(2)串口的中断请求标志
    串口 1、串口2、串口3和串口4的中断请求标志分别锁存在特殊功能寄存器SCON、S2CON、 S3CON和S4CON中。这些中断请求标志
都不能自动清0,需要用户在中断服务程序中使用软件清0。各位的定义如下:




(3)电源控制寄存器PCON中的标志位




      LVDF是低电压检测标志位,同时也是低电压检测中断请求标志位。在正常工作和空闲工作状态时,如果内部工作电压VCC低于低电压
检测门槛电压,低电压中断请求标志位 (LVDF/PCON.5)自动置1,与低电压检测中断是否被允许无关。即在内部工作电压VCC 低于低电压检
测门槛电压时,不管有没有允许低电压检测中断,LVDF/PCON.5都自动为1。该位要用软件清0,清0后,如内部工作电压VCC低于低电压检
测门槛电压,该位又被自 动设置为1。


(4) SPI状态寄存器SPSTAT中的标志位


SPIF是SPI传输完成标志。当一次传输完成时,SPIF被置位。此时,如果SPI中断被打开(ESPI=1, EA=1),将产生中断。

(5)ADC控制寄存器ADC_CONTR中的标志位



ADC_FLAG是A/D转换结束标志位。A/D转换完成后,ADC_FLAG=1。此时,若允许 A/D转换中断(EADC=1, EA=1),则由该位申请产生中断。
也可以由软件查询该标志位判断A/D转换是否结束。不管是A/D转换完成后由该位申请产生中断,还是由软件查询该标志位A/D转换是否结束,
当A/D转换完成后,ADC FLAG=1, 一定要软件清0。


4.中断的允许.禁止及优先级
(1)中断的开放和禁止
STC8H8K64U单片机中断的开放和禁止是通过设置相关寄存器的控制位实现的,对中断源的开放 和禁止由两级控制组成的,即总控制和
对每个中断源的分别控制。总控制用于决定整个中断系统是 开放还是关闭,当整个中断系统关闭时,CPU不响应任何中断清求。对于每个
中断源的分别控制是 在中断系统开放的前提下,决定某一个中断源是开放还是禁止。
IE (地址为0A8IL夏位值为00H)中的各中断允许控制位定义如下:




1)EA:中断允许总控制位。
   0:关闭中断系统,所有中断源的中断清求均被禁止,称为关中断。
   1:开放中断系统,所有中断源的中断请求均被开放,称为开中断,但某一个中断源的请求是否开放,还要由该中断源所对应的
          中断允许控制位所决定。
其他中断的标志寄存器参看手册。

       ELVD:低压检测中断允许位。      
      0:禁止低压检测中断      1:允许低压检测中断
      EADC: A/D转换中断允许位。
      0:禁止A/D转换中断      1:允许A/D转换中断
      ES:申行口 1中断允许位。
      0:禁止串行口 1中断      1:允许串行口 1中断
      ET1:定时/计数器T1的溢出中断允许位。
      0:禁止T1中断      1:允许T1中断
      EX1:外部中断1中断允许位。
      0:禁止INT1中断      1:允许INT1中断
      ET0:定时/计数器T0的溢出中断允许位。
      0:禁止T0中断      1:允许T0中断
      EX0:外部中断0中断允许位。
      0:禁止INTO中断      1:允许INTO中断
      单片机复位后,各中断允许寄存器控制位均被清0,即禁止所有中断。如果需要开放某些中断, 可在程序中将相应中断控制位置为1。



(2)中断优先级





5.单片机中断处理过程
(1)中断响应的条件及过程
    当中断源向CPU发出中断清求时,如果中断的条件满足,CPU将进入中断响应周期。单片机响应 中断的条件是:
   1)      中断源有请求。
   2)      中断允许寄存器IE相应位置1。
   3)      CPU中断开放(EA=1)。
         CPU响应中断时,将相应的优先级状态触发器置1,然后由硬件自动产生一个长调用指令LCALL, 此指令首先把
   断点地址压入堆栈保护,再将中断服务程序的入口地址送入到程序计数器PC,使程序转向相应的中断服务程序。

单片机对中断优先级的处理原则是:
    1)      不同级的中断源同时申请中断时,先高后低;
    2)      处理低级中断又收到高级中断请求时,停低转高;
    3)      处理高级中断却收到低级中断请求时,高不睬低;
    4)      同一级的中断源同时申请中断时,事先规定。(按中断查询次序来执行,参看12.3STC8H 系列中断列表中的次序项)
例如:
         ORG 0003H      ;外部中断0入口地址
         LJMP INT0_ISR
                     …      ;其他程序代码
      INT0_ISR:      ;外部中断0服务程序
         RETI
    这样,当CPU响应外部中断0的中断请求时,进入到0003H单元,执行LJMP
    INT0_ISR指令后,转入执行程序存储器的INT0_ISR标号处的外部中断0服务程序。

在程序的运行过程中,并不是任何时刻都可以响应中断请求。当出现下列情况时,CPU不会响 应中断请求:
    1)        中断允许总控制位EA=0或发出中断请求的中断所对应的中断允许控制位为0。
    2)        CPU正在执行一个同级或高一级的中断服务程序。
    3)        当前执行的机器周期不是指令周期的最后一个机器周期。
    4)        正在执行的指令是中断返回指令RETI或者是访问专用寄存器IE或IP的指令时,CPU 至少要再执行一条指令才能响应中断请求。



(2)中断服务
    中断服务程序从入口地址开始执行,直到执行返回指令RETI为止。RETI指令表示中断服务程序的结束,CPU执行该指令,一方面
清除中断响应时所置位的优先级有效触发器,一方面由栈顶弹出断点地址送程序计数器PC,从而返回主程序。中断服务程序由四个部
分组成,即保护现场、中断服务、 恢复现场以及中断返回。
    由于在主程序中一般都会用到累加器A和程序状态字寄存器PSW,所以在现场保护时一般都需要保护A和PSW,其他寄存器根据使用情况
决定是否需要保护。
    在编写中断服务程序时应注意以下两点:
      1)        单片机响应中断后,不会自动关闭中断系统。如果用户程序不希望出现中断嵌套,则必须在中断服务程序的开始处关闭中断,
从而禁止更高优先级的中断请求中断当前的服务程序。
      2)        为了保证保护现场和恢复现场能够连续进行,在保护现场和恢复现场之前应先关中断,当现场保护或现场恢复结束后,再根
据实际需要决定是否需要开中断。


(3)中断请求的撤除
    当某个中断源的请求被CPU响应后,应将相应的中断请求标志清除,否则 CPU会再一次响应该中断源的请求,这将使CPU进入死循环。
对于不同的中断源 ,清除中断请求的方法不同。
      (1)        有些中断请求由硬件自动清除,在处理这些中断时,用户无需关心清除 中断请求标志的问题。
      (2)        有些中断请求不能自动清除,在处理这些中断时,用户需要通过指令清除。

另外:姚总补充了一个STC8H8K64U的知识,不可屏蔽中断,即定时器0的工作模式3
          不可屏蔽中断的16位自动重载模式与模式0相同,不可屏蔽中断,中断优先级最高,高于其他所
有中断的优先级,并且不可关闭,可用作操作系统的系统节拍定时器,或者系统监控定时器。
         除非重新烧写其他代码,否则只要打开了定时器0的模式3中断,那么它就会一直执行下去!厉害了。


本节课完
















wpppmlah 发表于 2023-8-21 10:15:53

本帖最后由 wpppmlah 于 2023-8-21 11:54 编辑

何宾教授 :从8051到32位8051 2023年8月18日下午课程主要内容

1,注意PC自动增1 或 增2的细节,增1 或增2 是由机器指令字节数来决定的。
2,指令A5前缀的由来(上一节课中详细的进行了分析)

第六章 单片机CPU指令集架构
本节介绍逻辑指令,包括
■逻辑“与”指令
■逻辑“或”指令
■逻辑“异或”指令
■清除指令
■取反指令
■移位指令
■半字交换指令

■逻辑“与”指令
ANL A,Rn(*)




ANL dir8,A(*)



[例6-24]下面的指令执行逻辑"与"操作,即
ANL P1 ,#011100118
执行该指令,将清除P1端口的第7位、第3位还有第2位

[例6・25]下面的指令执行逻辑"与"操作,即
ANL R1,R0
在执行指令之前,寄存器R1的内容(R1) = "1100 0011",寄
存器R0的内容(R0) = "0101 0101"
■在执行该指令后,寄存器R1的内容(R1) = "0100 0001"


ANL Rm,#data



ANL Rm,dir8


ANL WRj,#data16


ANL WRj,dir16



■逻辑“或”指令
逻辑“或“指令在指定变量之间执行按位逻辑“或“运算, 并将结果保存在目的操作数中
■该指令影响符号标志N和零标志Z
ORL A,Rn (*)



[例6・25]下面的指令执行逻辑"或”操作,即
ORL A,R0
在执行该指令之前,累加器A中的内容(A) = "1100 0011",
寄存器R0中的内容(R0) = "0101 0101"
运行该指令后,累加器A中的内容(A) = "1101 0111"
ORL A,@Ri(*)


ORL A,#data (*)


ORL dir8,A (*)


ORL dir8,#data (*)



[例6-26] 下面的指令执行逻辑"或"操作,即
ORL P1, #00110010B
在执行该指令后,将P1端口的第5位、第4位和第1位设置为 1


ORL Rm,dir8


ORL Rm,dir16



ORL Rm,@DRk




■逻辑“异或”指令
逻辑“异或“指令,在指定变量之间执行按位逻辑“异或" 运算,并将结果保存在目标操作数中
XRL A,Rn (*)


【例6・27】下面的指令执行逻辑"异或"操作,即
                     XRL A,R0
在执行指令之前,累加器A中的内容(A)= “1100 0011” ,寄存器
R0中的内容(R0) = "1010 1010"      
执行完该指令后,累加器A中的内容(A)=” 0110 1001"

XRL dir8,A(*)

XRL dir8,#data (*)

XRL Rm,dir8

XRL Rm,dir16
XRL Rm,@DRk

■清除指令
CLR A (*)



[例6-29]下面的指令执行清除操作,即
                     CLR A
执行指令之前,累加器A中的内容(A) ="1100 0011"
■执行完该指令后,累加器A中的内容(A) = "0000 0000"


■取反指令
CPL A(*)

■移位指令
RL A (*)

RLC A (*)
■该指令的功能是使得累加器A的内容带进位标志循环左移
■具体来说,累加器A中的8位和进位标志一起向左循环移动1位,累加器A 的第7位移动到进位标志位
CY中,且进位标志位CY的之前状态移动到累加器A的第0位
■影响N和Z标志位



RR A(*)
■该指令的功能是使得累加器A的内容循环右移
■具体来说,累加器A中的8位向右循环移动一位,且累加器A的第0位循环移动到其第7位的
位置
■只影响N和Z标志


RRC A(*)
■该指令的功能是使得带进位标志的累加器A的内容循环右移
■具体来说,累加器A中的8位和进位标志一起向右循环移动1位,累加器的 第0位移动到进位标志位CY中,进位标志位CY的之前状态移动到累加器A 第7位的位置
■ N和Z标志位也会收到影响


SLL Rm
该指令将寄存器Rm的内容逻辑左移一位,最低有效位用"0" 填充,移出的MSB保存在
进位标志位CY中,影响N和Z标志位


SLL WRj
该指令将寄存器WRj的内容逻辑左移一位,最低有效位用"0" 填充,移出的MSB保存在
进位标志位CY中,影响N和Z标志位




SRA Rm
该指令将寄存器Rm的内容算术右移一位,移出的最高有效位保 持不变。移出的LSB
保存在进位标志位CY中,影响N和Z标志位


SRA WRj
该指令将寄存器WRj的内容算术右移一位,移出的最高有效位保持不变。移出的LSB
保存在进位标志位CY中,影响N和Z标志位


SRL Rm
该指令将寄存器Rm的内容逻辑右移一位,最高有效位用"0” 填充,移出的LSB保存在
进位标志位CY中,影响N和Z标志位


SRL WRj
该指令将寄存器WRj的内容逻辑右移一位,最高有效位用"0” 填充,移出的LSB保存在
进位标志位CY中,影响N和Z标志位







■半字交换指令
SWAP A(*)


[例6-31]下面的指令执行半字交换操作,即
                   SWAP A
在执行指令之前,累加器A中的内容(A)="1100 0101"
■在执行完该指令后,累加器A中的内容(A) =" 0101 1100”

数据传送指令

MCS-251 ISA中的数据传送指令包括:
■数据传输指令
■堆栈操作指令
■数据交换指令



STC单片机中的数据传输指令包括:
■内部数据传输指令
■外部数据传输指令
■查找表传输指令


/************************************/
■数据传输指令

   通用传输(MOV)

    它是最通用的指令。该类型指令用于传输(搬运)变量, 它将源操作数指定的字节变量复制到目标操作数指定的位 置,
而源操作数不受影响
■与MCS-51 ISA相比,其寻址模式在MCS-251 ISA中进行扩展
■ MOV可以在任意两个寄存器之间或寄存器与地址空间中的任何位置之间 传输字节(8位)、字(16位)或双字(32位)
■该类型指令不影响标志位

MOV A,dir8 (*)


MOV dir8,Rn (*)


MOV dir8,dir8 (*)



MOV dir8,@Ri (*)



MOV dir8,#data (*)



MOV @Ri,a(C语言中的指针就会编译成间接寻址的方式 )



MOV @Ri,dir8 (*)



MOV @Ri,#data (*)




【例6・32】下面的指令执行传输操作,即:
假设片上数据存储器RAM地址0x30的位置保存着数据为0x40,即(0x30) =0x40;数据存储器RAM地址0x40的位置
保存着数据为0x10,即(0x40) =0x10, P1 端口的内容(P1) =" 11001010" (OxCA)
依次执行下面的指令:
MOV      R0,#30H      ;(R0)=0x30
MOV      A,@R0      ;(A)=0x40
MOV      R1,A                ;(R1)=0x40
MOV      B,@R1      ;(B)=0x10
MOV      @R1,R1      ;(0x40) =0xCA
MOV      P2,P1          ;(P2) =0xCA

MOV DPTR,#data16 (*)

MOV Rm,#data
MOV Rm,#data16


MOV WRj,#data16

MOV WRjd,WRjs

MOV DRk,#0data16

MOV DRk,#1data16



MOV DRkd,DRks


MOV DRk,#dir16

MOV DRk,dir16



MOV Rm,dir8

MOV WRj,dir8


MOV Rm,@WRj

MOV WRjd,@WRjs

MOV @WRjd,WRjs

MOV Rm,@WRj+dis16



MOV @WRjd+dis16,WRjs


MOV @DRk+dis24,Rm(edata-xdata)



MOVH DRk(hi),#data16
■该指令执行的操作和机器指令格式该指令将16位立即数#data16搬移到双字寄存器DRk的高位字中
■具体来说,将16位立即数#data16移动到32位双字寄存器DRk的高位字中。双字寄存器的低位字保持不变,该指令不影响标志位


MOVS WRj,Rm

该指令将8位寄存器的内容加载到有符号扩展的16位寄存器中
具体来说,将8位寄存器Rm的内容加载到16位寄存器WRj的低字节,然 后用符号扩展填充16位寄存器WRj的高字节。
该指令不影响标志位
注:当符号扩展时,使用0xFF/Ox00填充高字节,取决于源寄存器Rm的MSB。



MOVZ WRj,Rm

■该指令将8位寄存器的内容加裁到16位寄存器,并用全“0”填 充高字节
■具体来说,将8位寄存器Rm的内容加载到16位寄存器WRj的低字节中, 高字节用全"0"填充,该指令不影响标志位


MOVC 代码空间数据传输指令


■如果在调用该子程序之前累加器A的内容(A) =0x02,执行完 该子程序后,累加器A的内容(A) =0x88
■ MOVC指令之前的INC A指令是为了在查表时跨越RET而设置的
■如果MOVC和表格之间被多个字节隔开,则为了正确地读取表格 必须将相应的字节数预先加到累加器A上
使用了MOVC指令 就可以知道 DPTR指向了代码空间!


MOVX 外部数据存储器传输指令

该类型指令在累加器A和外部数据RAM (包括片内扩展 RAM和片外扩展RAM)中的一个字节之间传输数据有两 种类型的指令,
包括:
■为外部数据RAM提供8位间接地址
■由于只有8位地址,因此所访问的外部数据RAM的地址范围为 0x00~OxFF (0-255),可访问的外部数据RAM的容量为256字节
■为外部数据RAM提供16位间接地址
■由于16位地址,因此所访问的外部数据RAM的地址范围为 0x0000~0xFFFF (0-65535),可访问的外部数据RAM的容最为2的16次方
即 64KB







■堆栈操作指令
压栈(PUSH)
■该指令执行压入堆栈(入栈)操作
■具体来说,当入栈时,堆核指针自动加1,然后将指定变量的内容保存到 当前堆栈指针所指向的片上数据RAM的存储地址中
■该指令不影响标志位
PUSH dir8(*)



PUSH #data16

出栈(POP)

POP WRj

POP DRk


■数据交换指令


XCHD A,@Ri (*)










wpppmlah 发表于 2023-8-21 12:01:36

位指令


CLR 清除指定的位,可操作进位标志CY或任何可直接寻址的位!




置位指令SETB





位与指令ANL



页: [1] 2 3
查看完整版本: 【实验箱已收到】wpppmlah的课程打卡23-08