共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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【笔记】生成报错synthdesignERROR被打赏50分 | |
【STM32H7S78-DK评测】LTDC+DMA2D驱动RGBLCD屏幕被打赏50分 | |
【STM32H7S78-DK评测】Coremark基准测试被打赏50分 | |
【STM32H7S78-DK评测】浮点数计算性能测试被打赏50分 | |
【STM32H7S78-DK评测】Execute in place(XIP)模式学习笔记被打赏50分 | |
每周了解几个硬件知识+buckboost电路(五)被打赏10分 | |
【换取逻辑分析仪】RA8 PMU 模块功能寄存器功能说明被打赏20分 | |
野火启明6M5适配SPI被打赏20分 | |
NUCLEO-U083RC学习历程2-串口输出测试被打赏20分 | |
【笔记】STM32CUBEIDE的Noruletomaketarget编译问题被打赏50分 |