共2条
1/1 1 跳转至页
16,sst39vf3201 16位宽的sst39vf3201为什么可以用8位方式访问!
问
我的系统是AT91M40800 + SST39VF3201;
因为使用16位总线,所以ARM的A0悬空不用,ARM的A1,接SST39VF160的A0
按照这种连接方法,ARM是不可以用8位的数据指针来访问的;
但是,用下面的代码就偏偏可以!!!!!
0x01000000 是SST39VF3201的物理地址
a[] 是一个全局变量;
for(i=0;i<10;i++)
{
a[i] = *(INT8U *)(0x01000001+i);
}
查看编译出来的代码,也没有看出有先把16位数据读出来,拆分为8位的代码
0x0000006c:
e3a04000 .@.. MOV r4,#0
// 判断 i<10
0x00000070: e354000a ..T. CMP r4,#0xa
//10次循环结束,退出
0x00000074: 2a000008 ...* BCS {pc} + 0x28 ; 0x9c
//跳转COPY第一个数据
0x00000078: ea000002 .... B {pc} + 0x10 ; 0x88
// i++
0x0000007c: e2840001 .... ADD r0,r4,#1
0x00000080: e20040ff .@.. AND r4,r0,#0xff
//比较i的值是否大于10
0x00000084: eafffff9 .... B {pc} - 0x14 ; 0x70
//取39VF3201的地址 (0x01000001)
0x00000088: e59f0254 T... LDR r0,0x2e4
// (0x01000001+i)的数据读出来(8位)
0x0000008c: e7d00004 .... LDRB r0,[r0,r4]
// 取全局数组a[0]的地址
0x00000090: e59f1250 P... LDR r1,0x2e8
//的39vf3201的数据保存到a[i]中
0x00000094: e7c10004 .... STRB r0,[r1,r4]
//比较i的值是否大于10
0x00000098: eafffff7 .... B {pc} - 0x1c ; 0x7c
0x0000009c: e1a00000 .... NOP
不明白为什么用这种物理的连接方式,可以访问8位的数据,我的CPU的A0没有参加
地址绎码,象0x01000001 、0x01000003 这些地址,ARM怎么处理???
望各位指教!!!! 答 1: 顶下 答 2: 各位大侠有空研究这个问题吗? 答 3: 很简单,ARM硬件帮你完成了这个事情STRB/LDRB指令就是8位读写
但是读的时候总线是16位访问的,多余的8位给丢掉了
如果你看到数据手册的总线时序,你就明白了
因为使用16位总线,所以ARM的A0悬空不用,ARM的A1,接SST39VF160的A0
按照这种连接方法,ARM是不可以用8位的数据指针来访问的;
但是,用下面的代码就偏偏可以!!!!!
0x01000000 是SST39VF3201的物理地址
a[] 是一个全局变量;
for(i=0;i<10;i++)
{
a[i] = *(INT8U *)(0x01000001+i);
}
查看编译出来的代码,也没有看出有先把16位数据读出来,拆分为8位的代码
0x0000006c:
e3a04000 .@.. MOV r4,#0
// 判断 i<10
0x00000070: e354000a ..T. CMP r4,#0xa
//10次循环结束,退出
0x00000074: 2a000008 ...* BCS {pc} + 0x28 ; 0x9c
//跳转COPY第一个数据
0x00000078: ea000002 .... B {pc} + 0x10 ; 0x88
// i++
0x0000007c: e2840001 .... ADD r0,r4,#1
0x00000080: e20040ff .@.. AND r4,r0,#0xff
//比较i的值是否大于10
0x00000084: eafffff9 .... B {pc} - 0x14 ; 0x70
//取39VF3201的地址 (0x01000001)
0x00000088: e59f0254 T... LDR r0,0x2e4
// (0x01000001+i)的数据读出来(8位)
0x0000008c: e7d00004 .... LDRB r0,[r0,r4]
// 取全局数组a[0]的地址
0x00000090: e59f1250 P... LDR r1,0x2e8
//的39vf3201的数据保存到a[i]中
0x00000094: e7c10004 .... STRB r0,[r1,r4]
//比较i的值是否大于10
0x00000098: eafffff7 .... B {pc} - 0x1c ; 0x7c
0x0000009c: e1a00000 .... NOP
不明白为什么用这种物理的连接方式,可以访问8位的数据,我的CPU的A0没有参加
地址绎码,象0x01000001 、0x01000003 这些地址,ARM怎么处理???
望各位指教!!!! 答 1: 顶下 答 2: 各位大侠有空研究这个问题吗? 答 3: 很简单,ARM硬件帮你完成了这个事情STRB/LDRB指令就是8位读写
但是读的时候总线是16位访问的,多余的8位给丢掉了
如果你看到数据手册的总线时序,你就明白了
共2条
1/1 1 跳转至页
回复
我要赚赏金打赏帖 |
|
|---|---|
| 基于MCP23S17的输入输出功能模块控制被打赏¥20元 | |
| 【S32K3XX】SPD 软件包使用Link文件修改被打赏¥22元 | |
| Switch-Case局部变量定义问题被打赏¥23元 | |
| 基于米尔TIAM62L开发板的串口通信及应用被打赏¥20元 | |
| PCF8574功能模块及其使用被打赏¥20元 | |
| 传感器LSM6DSO及LIS3MDL的功能检测被打赏¥18元 | |
| LPS25HB气压传感器及其检测被打赏¥18元 | |
| HTS221温湿度传感器及其检测被打赏¥18元 | |
| 【S32K3XX】HSE FW 版本更新被打赏¥21元 | |
| 基于ArduinoUNO开发板的AT24C02读写测试被打赏¥16元 | |
我要赚赏金
