大亮
发表于 2023-9-14 17:48:56
《何老师 STC32位8051单片机原理及应用-STC32G12K128》2023/8/18
Intel 80C51 ISA Reference
逻辑指令:与 ANL A,Rn / ANL A.dir8 / ANL A, @Ri/ ANL A, #data/ ANL dir8,A(复杂指令集架构,在存储器上操作,ARM MIPS 在寄存器上操作,流水线、优化)/ANL dir8, #data/....
ORL A,Rn/ ORL A,dir8 /ORL A,@Ri... []索引位
32位操作引入后,去做应用,更加精彩
逻辑异或指令,取反的概念,XRL 数学计算和寄存器状态配置
清除指令: CLR A 机器码E4
取反指令: CPL A F4
移位指令: RL A 循环左移
循环左移带进位: RLC A -->CYCY-->带着CY去循环左移
RR A 右移 RRC A 带进位的循环右移
逻辑左移SLL Rm8位操作,补0 SLL WR SRA Rm 算数右移 移出的最高位保持不变,最低为移进CY SRL 算数左移
SWAP A 3:0 交换7:4半字节交换指令 电路 硬件描述语言
数据传输指令:(汇编语言的作用,深入理解计算机底层的逻辑)
1、数据传输指令:MOV
1、内部数据传输指令
2、外部数据传输指令
3、查找表传输指令
2、堆栈操作指令PUSH
3、数据交换指令 XCH 数据交换累加器A 8051源内容
压栈PUSH 入栈时,堆栈指针自动加1(地址加一)
出栈POP 把堆栈内容放到源寄存器,堆栈指针减一
位指令:清除指令 CLR bit (251存储器区域)/ CLR bit51(8051存储器区域)(bit)<-- 0
置位指令:SETB 指令将指定的位设置为1置位!
取反: CPL bit CPL bit51
位逻辑操作:ANL/ ORL
位传输指令: 典型应用 CY
控制指令:(指令集架构)
调用指令:ACALL addr11 该指令用于无条件调用指定地址的子程序/ ECALL
ECALL addr24ACALL的扩展应用,寻址范围正大
长调用: LCALL (调用!要返回!!)
RET 从子程序返回/ ERET 扩ECALL对应)/RETI 从中断返回
AJMP address11 无条件跳转指令 /绝对跳转
大亮
发表于 2023-9-15 09:45:47
《陈老师 1T 8051 单片机原理及应用-STC8H8K64U 》-2023/9/6-ADC 学习笔记
传输数字信号,物理量模拟量,转换,检测和输出/控制
ADC analog to digital converter 将模拟量转换为数字量的器件 / DAC digital to analog converter 将数字量转换成为模拟量器件
专业DAC,顶级DAC用于音乐播放
传感器的研究和应用 MEMS 半导体底层研究
模拟信号一般采用4~20mA DC的标准信号传输
仪器仪表
逐次逼近式模数转换器工作原理: 称量过秤加减砝码过程
SAR寄存器。选型:分辨率(位宽), 通道, 基准电压, 转换速度 1~200微秒, 采样保持器(Track/Hold T/H),量程,满刻度误差,线性度, 数字接口方式, 模拟信号的类型, 电源电压,功耗, 封装
STC8H8K64U ADC
ACD控制寄存器(ADC_CONTR):上电ADC_POWER启动ADC_START 触发ADC_EPWMT 多路控制通道选择ADC_CHS ADC_FLAG
ADC配置寄存器:
ADC扩展配置寄存器:
ADC转换结果寄存器:
ADC时序控制寄存器:
应用: 编程步骤、
1、设置相关IO口工作模式高阻输入
2、设置ADC内部时序,ADC采样时间建议设置为最大值(ADCTIM)
3、设置ADC时钟(ADCCFG)
4、使能ADC模块(ADC_CONTER)
5、驱动AD转换
6、清除标志位
ADCTIM 0 0x3F;
ADCCFG=0X2F;
ADC_CONTR=0X80;
大亮
发表于 2023-9-15 11:06:35
《陈教授 1T 8051 单片机原理及应用-STC8H8K64U 》-2023/9/11-PWM 学习笔记review
PWM 脉冲宽度调制 数字输出---》控制————》模拟电路
方波 占空比调制 数字
应用场景:
控制舵机转角
电机控制
STC8H8K64U 8通道16位高级PWM定时器生成两组周期不同的PWMA PWMB CC捕获模块
时基单元
PWM控制电机:
三相六拍式的驱动,无刷电机 ,互补PWM,直流电机!!!有霍尔器件、无霍尔器件
===================================================================================================
大亮
发表于 2023-9-16 03:51:39
《何老师 STC32位8051单片机原理及应用-STC32G12K128》2023/8/22
汇编 C 《Keil编程文档》
Bootloader 启动引导代码用汇编 配套的汇编 C语言是跨平台的语言 操作系统移植
RET指令与ACALL和LCALL配合使用,CPU译码把下一条堆栈内指令地址恢复到程序计数器里
无条件跳转指令 AJMP addr11
EJMP LJMP JMP JC:进位标志CY控制的跳转指令
"该指令执行的操作和机器指令格式" 268条指令的组合 汇编语言 逻辑严谨 CPU底层和C语言逻辑提升 在汇编的角度上看,C就是应用
学汇编语言是为了解单片机底层
关于累加器的跳转指令JZ JE:由Z标志位控制的跳转指令 JG:由Z和CY标志位控制的跳转指令
=============================汇编语言程序设计========================================
A251汇编器
1、汇编语言的程序结构和段分配
2、符号和符号的名字
3、表达式和操作符
4、控制语句
5、条件汇编
6、宏定义和调用
所谓汇编语言程序就是按照一定的规则组合在一起的机器语言助记符和汇编器助记符命令
汇编助记符表达的指令Instruction--》机器指令 汇编器命令direction-->Keil MDK
程序存储器中的(CODE)4个常数------搬移------》到数据存储器中(EDATA)
命令定位到代码区 0xFF0220上
把0xFF0246赋给DPTR, code区域由代码,还有常量
list文件链接器
============================================================================================
汇编代码中段的分配
段SGEMENT是代码块或数据存储器,可重定位的或绝对的 ,为了链接器合并
数据段DATA可通过直接或间接方式寻址
BIT段 可位寻址区域和被8整除的地址。。。。。。。。。
注释 “;”开头
大亮
发表于 2023-9-17 08:53:46
《何老师 STC32位8051单片机原理及应用-STC32G12K128》2023/8/25
上节课例子:251指令集将FLASH里的四个字的常数转存到edata内(STC32G 4K / 89C52 526个字节)C语言代码怎么编译成汇编助记符指令的?解读!
把WATCH窗口打开:View--》Watch--》Watch1
把DR8地址加一个偏移量的内容移动到寄存器里面区
循环搬移
===========================================================================================
SEGMENT语句声明一个段 RSEG语句选择一个可重定位的段 DW语句使用一个或多个字值(2个字节)初始化存储器
符号和符号的名字: 代指程序地址 A251汇编器定义并保留MCS-251ISA寄存器的名字
表达式和操作数:
数字:A251汇编器支持指定绝对地址的记数法页面 冒号表示法
字符:
字符串:
位置计数器:$
操作符:优先级
控制语句: ALIGN字节边界对齐 EVEN 强迫位置计数器指向下一个偶数地址 ORG 更改当前段的位置计数器 USING 地址控制 R0~R7复用 USING 3; 选择第3组寄存器 DB 存储器初始化 DBIT 保留存储空间 DS DSB DSW保留多少字节 过程声明 PROC ENDP 声明子程序后面可以调用 LABEL 位置定义符号名字 EXTRN/EXTERN 源声明public,外文件调用 (绝对地址!<--> 可重定位地址!) PUBLIC 段控制 ,对存储单元更精准的控制:BSEG CSEG DSEG ISEG RSEG(声明通用段)XSEG
符号定义:指定存储单元
BIT CODE DATA sbitEBIT EQU SET IDATA SFR SFR16 XDATA _ERROR_ END
=======================================^^^^^^^^^^^^^^汇编语言^^^^^^^^^^^^^^========================
大亮
发表于 2023-9-17 19:21:43
本帖最后由 大亮 于 2023-9-17 22:35 编辑
《何教授 STC32位8051单片机原理及应用-STC32G12K128》2023/8/29
今天主要内容:1、汇编语言剩下一些语法;2、两个设计应用:体现32位汇编的优势、中断的机制和应用
条件汇编:条件汇编控制,一个文件实现两种应用场景的要求:前缀为$,没有$,提供重用性和可移植性
AA SET 10
IF(AA=10)
DSEG AT 0020H
ELSE
DSEG AT 0030H
ENDIF
$IF(AA=10)
DSEG AT 0020H
$ELSE
DSEG AT 0030H
$ENDIF
宏的定义和调用
宏,一段汇编代码的集合 区别子程序 主要表现在:1、起什么作用,2、对汇编代码的效率 语法格式:定义和调用
==============================设计实例============================================
汇编的作用:对处理器内核,以及外设原理深入理解,提高认知过程,对思维的锻炼 C编译器完善了、在C下调试工具完善了
LED驱动和控制:(单片机,软件和硬件的综合体)
1、硬件设计原理:对复用管脚,提供晶体管电压控制电路思路:
2、IO端口寄存器:设置P4 和P6工作模式 寄存器设置P0~P7PxM0 PxM1配合使用 {PxM1 PxM0} 端口模式寄存器--》触发器 (控制寄存器 状态寄存器--锁存器)
外设控制器
中断!
P3.2 INT0中断引脚 P3.3 INT1中断引脚 识别中断问题 中断进得来--》设置总总断使能、各中断、优先级
IT0 EQUS:0x88.0
IT1 EQUS:0x88.2
EX0 EQUS:0xA8.0
EX1 EQUS:0xA8.2
EA EQUS:0xA8.7 ; 特殊功能寄存器名称声明,地址被8整除,利用按位寻址,S: --》SFR .索引号
my_progSEGMENT CODE
RSEG my_prog
LJMP main
ORG 0x0003
LJMP int0
ORG 0x0013
LJMP int1; 声明可重定位代码段,声明中断向量表,能 用到的部分,(LJMP 中断向量入口 ,程序计数器加1存放中断服务程序地址高8位,再加1存中断服务程序地址低8位??)
ORG 0x200;让开中断向量表位置
main:
USING 0
SETBIT0 ;用SETB 设置具体的位低电平触发
SETBIT1 ;低电平触发
SETBEX0 ;使能外部中断0
SETBEX1 ;使能外部中断1
SETBEA ;打开总中断
MOV P4M0,#0x00
MOV P4M1,#0x00
MOV P6M0,#0x00
MOV P6M1,#0x00
MOV P4,#0x00
MOV A,#0xFE
MOV P6,A ;端口6和端口4的初始化
loop:
JMP loop ;死循环 while(1) 等待中断进来 CPU在做无用功
int0:
RL A ;左移
MOV P6,A
RETI
int1: ;右移
RR A
MOV P6,A
RETI
END
硬件在线仿真进入中断
大亮
发表于 2023-9-18 00:57:41
《何教授 STC32位8051单片机原理及应用-STC32G12K128》2023/9/1(上)
c
C251架构下的C语言扩展 C跨平台语言 针对平台的扩展和优化 为了适配嵌入式/不同平台的限制和规约 站在高级抽象的角度 预计两周课程 结合具体单片机平台/硬件载体、调试、代码趣味性
课程架构:
1、存储器区域(物理实体先讲清楚)
2、数据类型
3、类型限定符
4、存储类别
5、绝对位置变量
6、指针
7、函数
8、属性
9、预处理器
10、内嵌汇编程序
11、定制文件
存储区域:
物理分离存储区域 code edata xdata 效率问题, C语言编译器识别用户程序期望的存储区域识别
STC32G系列单片机上的可用的各种存储空间与大多数大型计算机、小型计算机和微型计算机架构有很大不同,在这些架构中,程序、数据和常数都加载到计算机内同一物理存储空间,这是要注意的。
单片机、微机 运行机制不一样、 服务的对象不一样的,。
程序CODE存储器为只读、 位于单片机内部 64K程序存储器 程序代码、所有函数和库常数变量 保存在程序存储器 标识符CODE C 语言访问
unsigned char constant near / constant far code constant;
内部数据存储器
data 片上存储器前128字节 idata 片上存储器前256个字节 还有一个20H开始的16字节区域可用段8051兼容指令进行位寻址
unsigned char idata variable;
内部数据存储器三种不同类型数据 data bdata ebdata
data:内部数据存储器前128个字节 直接寻址访问 (正确使用存储器区域限定符,使C编译器指哪儿打哪儿!) unsigned char data fast_variable;
bdata": 内部存储器20h~2fH中16个字节可位寻址的存储器 128个位 unsigned char bdata bdata_var;
ebdata: 内部数据区20h~7fh760位可寻址区域 unsigned int ebdata eb_var;
struct s{
unsigned int b0:3;
unsigned int b1:2;
unsigned int b2:1;
unsigned int b3:1;
unsigned int b4:1;
unsigned int b5:1;
unsigned int b6:1;
unsigned int b7:4; //通过位限定,形成一个紧凑型结构
};
structs ebdatav;//定位0x20
void main (void){
v.b0=4;//赋值
v.b1=3;
v.b7=15;
if (v.b1){
v.b0 = 7;
}
}
int cal(int x)
{
static int y=0;//静态变量,保留上一次结果
y=x-y-i;
return y;
}
第一次调用
第二次调用
第三次调用 变量的生命周期和作用范围
绝对位置变量 _at_ 关键字定位在绝对存储器的位置 type variable_name_at_const_expr; 一旦指定,链接器无法改变
绝对地址必须复合硬件定义
通过_at_关键字操作,将数据强行放在存储某位置
C251编译器支持使用 * 字符声明变量指针 C251可操作标准C左右操作
1、没有现实存储器类型的指针成为通用指针
2、具有现实存储器类型的指针成为存储器特定指针
声明指针 指针大小/宽度一个类型
指向data或idata对象的指针可以使用near存储器类型声明
在TINY和XXTINY存储器模型memory mode中,默认指针大小位16位,指针的默认存储器类型位near*
使用far* or near * 指针,可以寻址near dataidata对象
t通过指针实现链表结构
C251编译器可以转换指针的存储器类型额
指针宽度
库函数访问时,可能涉及强制类型转换,转为通用指针, 关联存储器模式,扩展或截断,指针的位宽决定寻址范围/能力
指针强制类型转换表,非常重要!!!
Debug View--》Seiral windows-->UART 1#
大亮
发表于 2023-9-18 09:12:04
本帖最后由 大亮 于 2023-9-19 18:11 编辑
《何教授 STC32位8051单片机原理及应用-STC32G12K128》2023/9/1(下)
<Intel 8xC251Sx User's Manual>
sfwei
位操作
存储区域--外部数据存储器00:0000H 片内 01:0000H 片外扩展
CPU控制外设两种方法: 1、访问存储器映射的IO,读写控制外设;2、访问SFR
存储器区域:
近存储器 (near) 00:0000~00:FFFF 前64K((理论空间,实际4K) edata区域 16位寻址进行快速的访问
远存储器(far) 16位 64K
存储器类型 关键字 指导编译器 实现程序员需求的内存区域分配
特殊功能寄存器 SFR128字节共享存储空间 本身不是存储器,控制xxx , 可以使用MOV指令直接访问SFR存储器,不能使用间接寻址模式、。
数据类型
标准C的:void char(1个字节二进制数) int(1个二进制数) enum (定义一组离散的常数)floatdoubleIEEE754
位寻址对象 位可寻址对象 可以作为字或者位寻址的对象
bdata 8051兼容位空间16字节 ebdata 扩展的STC32G系列单片机的位空间 96字节
放在可位寻址空间,可位寻址的,位操作 尖角符号/草帽符号
数组第0元素的第7个位 不是赋值是定义位置
extern bit mybit0;提供外部变量声明
SFR区域位于0X80~0XFF 可位、字节、字访问
大亮
发表于 2023-9-18 16:09:02
《何教授 STC32位8051单片机原理及应用-STC32G12K128》2023/9/5
“C语言没有那么难学,从计算机架构上讲32位MCU还是有很多扩展的,对将来学arm底层相通”
类型限定符: const 声明在运行时未修改的对象 (程序中不能被更改) volatile 声明一个对象,该对象的值可能会被出现在其中的代码之外的某个对象修改
const unsigned short xdata a = {}0,1,2,3,4,5,6,7,8,9}; 片内阔扩展数据区
const unsigned short code a = {0,1,2,3,4,5,6,7,78,9}; 程序存储区
const的一个有趣的用法是定义一个不可更改的指针。。。。。。。
第二个类型限定符 volatile 易失性类型限定符用于限制编译器对对象值的假设 按需执行,都要执行,不要优化
XSmall --》edata
第一句
第三句 32位寄存器 大端模式
寄存器与存储器直接加
没有volatile看不到i,直接寄存器操作
存储类别 存储类用于定义变量和函数生效范围和生存周期 auto register static extern
乘法运算过程
static int y=0;从当前运行结果 y
Y的生存周期从主函数开始到最后,持续更新,为什么上次结果会保存?从wr6里取出来,不是初始化的y值,静态变量的价值!
变量可以使用_at_关键字定位在绝对存储器的位置 (第二次讲了!!!!!)
指针:
通用指针 特定存储器指针(高效)
指针宽度!
大亮
发表于 2023-9-19 10:23:06
《何教授 STC32位8051单片机原理及应用-STC32G12K128》2023/9/8
优化级别为0,展示细节, 80251的存储器划分code,片内存储,片内扩展,对存储器操作较STM32更复杂,提供丰富的存储器类型限定符
立即数给累加器,DPTR指向01:0X0000,A给到DPRT指向的地址; WR6初始化为0 WR4初始化为1,拼出来DR4为0x0001 0000,a的地址,就是xdata的0000
把DR4给到P地址。。指针,开辟一片存储区域
======================================================函数============================================================
C251编译器为标准C函数声明提供了很多扩展:(体现MCU特点,与桌面系统不同点,底层机理完全不同)声明成中断 声明成寄存器组 选择存储器模型 通过关键字体现函数丰富过ANSI C
functionname() [{small | large}]
最根本的东西 :CPU 存储器 IO-->stc251内核结构-->指令集 ---> 汇编语言--->C 语言
C语言两大难点: 指针 & 函数
存储器模型
STC存储器映射 --> 统一编址 同样适合arm架构
small : 本地变量 放在片上RAM Large:其他存储器模型
寄存器组:
0x00 ~ 0x1f被分成4组,每组8个 程序以R0 ~R7 的形式访问这些寄存器 存储器组由程序状态字PSW的两位选择 当处理中断或使用实时操作系统时(轮询的特性),直接切换不同的寄存器组 而不是保存堆栈上的所有8个寄存器 单片机可以在返回之前将之前的原始寄存器组直接地区换 非常有用
操作系统移植启动引导代码
using 属性在中断函数中最有用为不同的中断优先级指定不同的寄存器组 硬件中断 计数器、定时器、、检测外部事件、、使用串口发送接收数据等 C251支持32个中断STC32 49个中断向量 使用保留中断
interrupt和底层的关系:告诉C251编译器这是一个中断服务程序 把工作寄存器(ACC B DPH DPL PSW PSW1)堆栈 把堆栈恢复
可重入函数 reentrant 自己调用自己共享 堆栈
函数的参数:如何传递参数???与底层的关系!底层规约
函数可以传递寄存器(寄存器的内容传递给函数 R11 R0~R7 9个参数进行参数传递)或/和固定存储器位置中(指针)的参数