找回密码
 立即注册
楼主: f278457546

学习stc32g

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2026-05-01 03:00:05
已绑定手机

2

主题

54

回帖

144

积分

注册会员

积分
144
发表于 7 天前 | 显示全部楼层

15.32位单片机的存储器结构和地址空间

image.png

24位地址 8+16 段分地址

每个段有64kb空间

其中第00:0000h放置了4k的edata

01:0000放置了扩展xdata

7e:0000放置扩展特殊功能寄存器

ff:0000存放代码

程序启动地址ff:0000 Ljmp resert

中断向量表与c51安排的差不多

image.png

中断

中断源

中断优先级 0-3 数字越大,优先级越高, 还有几十轮询顺序

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2026-05-01 03:00:05
已绑定手机

2

主题

54

回帖

144

积分

注册会员

积分
144
发表于 7 天前 | 显示全部楼层

16-17 指令集架构

论坛这个markdown 好坑,写了半天的笔记提交时候没了

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2026-05-01 03:00:05
已绑定手机

2

主题

54

回帖

144

积分

注册会员

积分
144
发表于 7 天前 | 显示全部楼层

18-23 汇编指令集介绍

add a #1

addc a #1

sub wr wr

subb a #1

inc r0 a++

dec r0 a--

mul

div

cmp

anl 与

orl 或

xrl 异或

rl 左移

rlc 带进位的左移

sll 左移填充0

sra 右移 溢出到C

srl 右移填充0

swap a 半字节交换

mov 通用传送

movh 传送到高位 16位覆盖

movs

movc 从code区加在 间接寻址

movx 从xdata区加在 间接寻址

push pop

xch 数据交换 xchd 半字节交换

clr 清零

setb

acall ecall lcall eret ret iret

ajmp ljmp sjmp jmp jc jb

jnb jbc jz jnz je jne jle jsl cjne djnz nop trap

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2026-05-01 03:00:05
已绑定手机

2

主题

54

回帖

144

积分

注册会员

积分
144
发表于 6 天前 | 显示全部楼层

24-30 汇编速通 略

31 c语言 存储器区域

程序存储器 code 只读

数据存储器 edata=(data+idata) xdata 读写

data=前127字节

idata=前256字节

内部数据存储器分三种{

data

bdata bitdata 20h-2fh 128bit

ebdata 可位寻址 20h-7fh

}

image.png

image.png

内存类型 核心特性与用途 访问方式 / 指令 适用场景
bdata 内部数据存储器,16 字节,位寻址区 支持位、字节混合访问 需频繁位操作的变量(如标志位)
code 程序存储器,最大 64KB MOVC @A+DPTR 存储常量、字符串、程序代码
data 直接寻址内部数据存储器,128 字节 直接地址访问 高频变量(访问速度最快)
ebdata 扩展位寻址区,地址范围 20H-7FH 支持位、字节混合访问 扩展位操作需求
idata 间接寻址内部数据存储器,256 字节 MOV @R0/@R1 内部 RAM 全空间变量(含高 128 字节)
near 64KB 线性空间,重叠 data/idata MOV @WRj/ 直接地址 兼容扩展架构的函数调用(LCALL/ACALL
far 全 16MB 地址空间,单对象限 64KB MOV @DRk,16 位地址运算 跨 64KB 的外部 RAM,大数组 / 结构体(限 64KB 内)
huge 全 16MB 地址空间,对象无大小限制 MOV @DRk,32 位地址运算 超 64KB 的超大变量 / 数组
xdata 外部数据存储器,最大 64KB MOVX @DPTR 外部扩展 RAM(如片外 SRAM)

外部数据存储器 xdata 01:0000h

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2026-05-01 03:00:05
已绑定手机

2

主题

54

回帖

144

积分

注册会员

积分
144
发表于 6 天前 | 显示全部楼层

33 数据类型

char 8bit

int 16bit

long int 32bit

flot 32bit

enum

sfr

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2026-04-26 13:54:07

0

主题

1

回帖

78

积分

注册会员

积分
78
发表于 6 天前 | 显示全部楼层
c251更新了

更新了c251

更新了c251
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2026-05-01 03:00:05
已绑定手机

2

主题

54

回帖

144

积分

注册会员

积分
144
发表于 6 天前 | 显示全部楼层

34 类型限定符

类型限定通常只针对编译器,对程序运行时不一定具有效用,但是在编译器处理的时候可以用某些方法导致限定效果在程序运行时也生效,比如const定义变量不可被修改,但是运行时候可以通过指针方式修改const定义的变量,但是如果编译器把这个变量放在了code区,那么你就改不了了

const 标识定义的对象不能修改,也就是只读

volatile 标识定义的对象不要被编译器进行修改或者优化,但是程序运行时可以被自身修改

keil c251编译器在遇到操作8位数据的时候会使用c51的指令集,操作16,32位操作的时候会使用对应的c251指令集

大多数32位mcu对16bit 32bit的数据进行操作的时候一般都会设计到位对齐的问题,c251一般也要求对齐,但是他可以不对齐,但是不对齐是有代价的

image.png

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2026-05-01 03:00:05
已绑定手机

2

主题

54

回帖

144

积分

注册会员

积分
144
发表于 6 天前 | 显示全部楼层

日常抓虫
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2026-05-01 03:00:05
已绑定手机

2

主题

54

回帖

144

积分

注册会员

积分
144
发表于 6 天前 | 显示全部楼层

35 C语言的限定符二

控制变量的作用域和范围

auto :默认存储位置.等于没写 蛋疼

register : 声明变量保存位置在寄存器中,已过时,没啥人用,蛋更疼

static :两种情况 1.子程序内部的长期变量,程子程序退出也不会销毁,

2.文件级变量,让变量或者程序限定在这个c文件内

extern :

  • 只是声明,不是定义extern不会给变量分配内存,它只是告诉编译器这个变量在别的地方有定义,你可以用它
  • 可以跨文件访问:用来实现不同 .c文件之间共享全局变量 / 函数
  • 函数默认是 extern 的:你平时写的函数声明,默认就是 extern的,所以你写 void func();extern void func();是完全等价的

代码示例:跨文件共享变量

// file1.c:定义全局变量
int global_num = 100; // 定义,分配内存
// file2.c:使用其他文件的全局变量
#include <stdio.h>
// 声明这个变量是外部的,告诉编译器它在别的文件里
extern int global_num;

int main() {
    printf("全局变量的值是:%d", global_num); // 正常输出100
    return 0;
}

针对Keil C251编译器(适配STC等增强型8051单片机),static修饰的变量存储位置需结合单片机内存架构和编译器设置,核心规则如下,与通用C语言的静态存储区逻辑一致,但对应具体物理内存区域更明确:

C251环境下static变量的具体存储位置

C251编译器针对8051架构(含STC32G等增强型芯片)的内存特点,static变量仍属于静态存储区,但会根据单片机内存类型(片内/片外)和编译器内存模型,分配到具体的物理内存区域,核心分两种情况:

1. 默认情况(编译器自动分配)

C251提供3种内存模型,不同模型下,static变量的默认存储区域不同(优先分配到访问速度更快的片内内存):

  • Small模型(推荐常用):默认将 static变量分配到片内data区(片内RAM低128字节),访问速度最快,适合高频访问的小体量static变量(如计数器),但空间有限。
  • XSmall模型(兼容旧项目):传统8051中默认分配到片内data区;现代增强型8051(如STC32G)中,编译器会优先将 static变量分配到片内edata区(扩展片内RAM),这是STC芯片新增的高速片内内存,访问速度接近data区,空间比data区更大(通常几K~几十K)。
  • Large模型:默认将 static变量分配到片外xdata区(外部扩展RAM,最大64KB),适合体量较大的static变量(如大数组),但访问速度比片内内存(data/edata)慢,需通过DPTR间接寻址。

2. 手动指定存储位置(精准控制)

无论使用哪种内存模型,都可手动指定 static变量的具体存储区域,适配不同场景需求,格式如下:

// 1. 存放到片内edata区(高速扩展内存,优先推荐)
static edata int static_edata_var = 10;

// 2. 存放到片外xdata区(适合大体量变量)
static xdata char static_xdata_buf[1024];

// 3. 存放到片内data区(高速小内存,适合高频访问)
static data int static_data_cnt = 0;

补充说明:C251中 static变量的“静态特性”(生命周期贯穿程序全程、值可保留)不变,仅物理存储位置适配8051架构的内存分区;对于STC32G等新型芯片,edata区可支持32位访问,xdata区虽对外显示16位,但芯片内部为32位设计,可满足更大体量static变量的存储需求。

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2026-05-01 03:00:05
已绑定手机

2

主题

54

回帖

144

积分

注册会员

积分
144
发表于 6 天前 | 显示全部楼层

36 限定符

--at-- xxxxx 让编译器将声明的变量或者函数位置放到xxxx地址去

具体放在code edata需要具体指定

image.png

你可以指定自己的程序放在0x000000位置,当然 遇到中断就会飞

指针

通用指针

存储器特定指针

image.png

image.png

一、near 指针

  1. 适用场景:指向 data/idata 对象的指针,可用 near 声明;near 指针也可访问 data/idata 存储器。

  2. 默认规则:在 TINYXTINY 存储器模型中,默认指针大小为 16位,默认存储器类型为 near *

  3. 寻址限制:仅能访问 16 位地址空间(最大寻址范围 0xFFFF,即 64KB),无法访问 0x010000 以上的存储器区域。

  4. 指令效率:使用更高效的 @WRj 指令访问,执行速度快。

二、far / huge 指针

  1. 适用场景:访问 0x010000 以上的存储器区域时,必须声明为 far *huge *

  2. 寻址能力:可以寻址 neardataidata 对象,但 far/huge 对象不能用 near 指针寻址

  3. 指令效率:使用 @DPk 指令访问,效率低于 near 指针。

回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-5-1 12:00 , Processed in 0.127874 second(s), 105 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表