找回密码
 立即注册
查看: 160|回复: 11

不懂就问:规格书上间接寻址的方式进行读写是啥意思?程序上需要做哪些操作?

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-04-30 09:34:03
已绑定手机

11

主题

44

回帖

299

积分

中级会员

积分
299
发表于 2025-4-1 00:17:58 | 显示全部楼层 |阅读模式
截图202504010017051112.jpg
回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-1 00:18:00 | 显示全部楼层
关于间接寻址方式的读写操作解析

在嵌入式系统或微控制器编程中,间接寻址(Indirect Addressing)是一种常见的寻址方式,它允许程序通过寄存器或内存地址间接访问目标数据,而不是直接指定目标数据的地址。这种方式在需要动态访问内存或处理复杂数据结构时非常有用。以下是对间接寻址的详细解释及程序操作步骤的说明。

1. 间接寻址的基本概念
间接寻址的核心思想是通过一个中间地址(通常存储在寄存器或内存中)来访问目标数据。具体来说,程序首先将目标数据的地址存储在一个寄存器或内存单元中,然后通过该寄存器或内存单元间接访问目标数据。

例如,假设我们有一个目标数据存储在内存地址 0x1000 处,我们可以将 0x1000 存储在一个寄存器(如 R1)中,然后通过 R1 间接访问该数据。

2. 间接寻址的读写操作
在程序中进行间接寻址的读写操作通常包括以下步骤:

2.1 存储目标地址
首先,程序需要将目标数据的地址存储在一个寄存器或内存单元中。例如:
  1. assembly
  2. MOV R1, #0x1000  ; 将目标地址 0x1000 存储到寄存器 R1 中
复制代码

2.2 通过间接地址访问数据
接下来,程序可以通过该寄存器或内存单元间接访问目标数据。例如:
  1. assembly
  2. LDR R2, [R1]  ; 通过 R1 间接读取地址 0x1000 处的数据,并存储到 R2 中
  3. STR R3, [R1]  ; 将 R3 中的数据写入到地址 0x1000 处
复制代码

2.3 修改间接地址
如果需要访问多个连续的数据,可以通过修改间接地址来实现。例如:
  1. assembly
  2. ADD R1, R1, #4  ; 将 R1 中的地址增加 4,指向下一个数据
  3. LDR R2, [R1]    ; 读取新的地址处的数据
复制代码

3. 间接寻址的应用场景
间接寻址在以下场景中非常有用:
动态内存访问:当目标数据的地址在运行时才能确定时,间接寻址可以灵活地访问内存。
数组和结构体操作:通过间接寻址可以方便地遍历数组或访问结构体中的成员。
函数指针和回调函数:间接寻址可以用于实现函数指针和回调函数,增强程序的灵活性。

4. 程序示例
以下是一个简单的程序示例,展示了如何使用间接寻址进行读写操作:
  1. assembly
  2. MOV R1, #0x1000  ; 将目标地址 0x1000 存储到 R1
  3. LDR R2, [R1]     ; 读取地址 0x1000 处的数据到 R2
  4. ADD R2, R2, #1   ; 对 R2 中的数据进行加 1 操作
  5. STR R2, [R1]     ; 将修改后的数据写回地址 0x1000
  6. ADD R1, R1, #4   ; 将 R1 中的地址增加 4,指向下一个数据
  7. LDR R3, [R1]     ; 读取新的地址处的数据到 R3
复制代码

5. 总结
间接寻址是一种强大的寻址方式,它通过中间地址间接访问目标数据,适用于动态内存访问、数组和结构体操作等场景。在程序中使用间接寻址时,需要先存储目标地址,然后通过该地址进行读写操作,并可以根据需要修改间接地址以访问连续的数据。掌握间接寻址的使用方法,可以显著提高程序的灵活性和效率。

希望以上解释和示例能够帮助您更好地理解间接寻址的概念及其在程序中的应用。如有进一步问题,欢迎继续探讨。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-4-1 10:04:10 | 显示全部楼层

因为高速PWM时钟和CPU时钟不同步,需要使用这些寄存器间接读写PWM寄存器组



截图202504011004003506.jpg

DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-04-30 09:34:03
已绑定手机

11

主题

44

回帖

299

积分

中级会员

积分
299
发表于 2025-4-1 18:04:22 | 显示全部楼层
Debu*** 发表于 2025-4-1 10:04
因为高速PWM时钟和CPU时钟不同步,需要使用这些寄存器间接读写PWM寄存器组

可以举个例子吗?程序应该怎么体现,就是异步读写吗?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2025-4-1 18:32:53 | 显示全部楼层
hhhh*** 发表于 2025-4-1 18:04
可以举个例子吗?程序应该怎么体现,就是异步读写吗?

参考官网AI8051U实验箱例程包例子“68-高速HS-PWM1-HS-PWM2-HS-PWM3-HS-PWM4,驱动P0口呼吸灯实验程序”
下载地址:https://www.stcai.com/syx
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-04-30 09:34:03
已绑定手机

11

主题

44

回帖

299

积分

中级会员

积分
299
发表于 2025-4-1 21:59:49 | 显示全部楼层
乘风*** 发表于 2025-4-1 18:32
参考官网AI8051U实验箱例程包例子“68-高速HS-PWM1-HS-PWM2-HS-PWM3-HS-PWM4,驱动P0口呼吸灯实验程序”
...

为什么高速高级PWM DMA写入占空比,通过间接寻址方式操作寄存器不行,反而直接操作寄存器可以。
这个只有表格中的寄存器需要间接寻址方式吗??
PWMAT的寄存器需要采用间接寻址嘛?


截图202504012158358741.jpg





截图202504012157583583.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:452
  • 最近打卡:2025-05-01 06:20:50
已绑定手机

13

主题

1257

回帖

2971

积分

金牌会员

积分
2971
发表于 2025-4-1 22:54:59 | 显示全部楼层
乘风*** 发表于 2025-4-1 18:32
参考官网AI8051U实验箱例程包例子“68-高速HS-PWM1-HS-PWM2-HS-PWM3-HS-PWM4,驱动P0口呼吸灯实验程序”
...

    PWMA_PS = 0x00; //高级 PWM 通道输出脚选择位
    PWMA_PS |= PWM1_1; //选择 PWM1_1 通道
    PWMA_PS |= PWM2_1; //选择 PWM2_1 通道
    PWMA_PS |= PWM3_1; //选择 PWM3_1 通道
    PWMA_PS |= PWM4_1; //选择 PWM4_1 通道
例程中涉及到的代码有这几行,这算直接寻址还是间接寻址?C代码是如何C51控制编译器直接寻址或间接寻址相关的寄存器的呢?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2025-4-2 10:02:51 | 显示全部楼层
21cns*** 发表于 2025-4-1 22:54
PWMA_PS = 0x00; //高级 PWM 通道输出脚选择位
    PWMA_PS |= PWM1_1; //选择 PWM1_1 通道
    PWMA ...

像这种需要通过 HSPWMx_ADR, HSPWMx_DAT 访问的属于间接寻址方式访问:
  1.     //通过异步方式设置PWMA的相关寄存器
  2.     WritePWMA((u8)&PWMA_CCER1, 0x00);
  3.     WritePWMA((u8)&PWMA_CCER2, 0x00);
  4.     WritePWMA((u8)&PWMA_CCMR1, 0x60);            //通道模式配置
  5.     WritePWMA((u8)&PWMA_CCMR2, 0x60);
  6.     WritePWMA((u8)&PWMA_CCMR3, 0x60);
  7.     WritePWMA((u8)&PWMA_CCMR4, 0x60);
  8.     WritePWMA((u8)&PWMA_CCER1, 0x55);            //配置通道输出使能和极性
  9.     WritePWMA((u8)&PWMA_CCER2, 0x55);
复制代码
需要进行间接寻址的寄存器地址范围如下,不在这些地址范围内的可以直接访问:
截图202504020954294099.jpg

而PWMx_PS则是比较特殊的,不用通过间接寻址(异步访问)方式控制:
截图202504021006244867.jpg

点评

明白了,多谢。  发表于 2025-4-2 11:12
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2025-4-2 10:59:41 | 显示全部楼层
这些地址本身也只能间接寻址
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-04-30 09:34:03
已绑定手机

11

主题

44

回帖

299

积分

中级会员

积分
299
发表于 2025-4-2 11:38:22 | 显示全部楼层
乘风*** 发表于 2025-4-2 10:02
像这种需要通过 HSPWMx_ADR, HSPWMx_DAT 访问的属于间接寻址方式访问:
需要进行间接寻址的寄存器地址范围 ...

那我明白了,那如果没有使用间接寻址,会有什么现象?我现在直接寻址用着也没什么问题好像。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 03:55 , Processed in 0.155936 second(s), 118 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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