共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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】智能可穿戴设备AR/VR如何引领科技新潮流! | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
【有奖活动】震撼来袭!这场直播将直击工程师的心灵! | |
“我想要一部加热台”活动,不花钱赢取开发好工具!活动开始了哦 | |
【有奖活动】伙伴们:您的“需求”解决了吗? |
打赏帖 | |
---|---|
【换取手持数字示波器】AHT10温度检测分享被打赏40分 | |
【换取手持数字示波器】ACM32F070开发板点亮LCD屏和触控按键,串口,ADC被打赏40分 | |
【换取手持数字示波器】ACM32F070LCD屏和触控按键功驱动蜂鸣器分享被打赏40分 | |
【换取手持数字示波器】国民技术PWM功能知识分享被打赏40分 | |
【换取手持数字示波器】放大器运放知识分享被打赏40分 | |
【分享评测,赢取加热台】+开关电源AC输入知识分享被打赏30分 | |
【换取手持数字示波器】N32G430点亮数码管与串口打印、ADC被打赏40分 | |
老胖子聊电路--分析一个反馈电路被打赏50分 | |
【换取手持数字示波器】+点亮WS2812RGB灯被打赏50分 | |
【换取手持数字示波器】+线性调整器理论知识分享被打赏40分 |