首先,SST39VF16 FLASH是16位的,也就是以兩個位元組(半字)為最小操作單位的。也就是說你在FLASH地址上給0x00000,則它給出的資料是第一個16位的半字;在FLASH地址上給0x00001,它給出的是第二個16位的半字;在FLASH地址上給0x00002,它給出的是第三個16位的半字。。。但ARM的地址是以位元組編址的,它可以以位元組單位來讀取或者寫外設。
假設我們要讀取FLASH的第一個[color=#FF0000]位元組[/color],LDRB R0,[R1];將R1內容寫0x00000,這個時候ARM執行的是這樣的操作:
1、送出地址0x00000
2、在D0-D15上讀取資料
3、將讀到的16位元據的[color=#FF0000]低[/color]8位給R0低8位(高24位為0)
假設我們要讀取FLASH的第二個[color=#FF0000]位元組[/color],LDRB R0,[R1];將R1內容寫0x00001,
這個時候ARM執行的是這樣的操作:
1、送出地址ox00001
2、在D0-D15上讀取資料
3、將讀到的16位元據的[color=#FF0000]高[/color]8位給R0的低8位(高24位為0)
從上面的操作可以看到,如果我們一一對應的將ARM和FLASH得地址串連,那麼我們想讀FLASH的第2個位元組的話,就沒有辦法讀到了。因為你地址給0x00001,FLASH就在資料線上給的是第3個位元組和第4個位元組的資料,並將高8位(FLASH的第4個位元組)給R0;如果你給的地址是0x00000的話,ARM的理解就是將資料線D0-D15的低8位給R0,顯然這個16位的資料是FLASH的第1個位元組和第2個位元組的資料,低8位指的就是第一個自己的資料。顯然怎麼也讀不到FLASH的第2個資料。
我們既要遵循ARM的規則,又要讓FLASH給我們正確的資料。你自己想應該怎麼辦?很簡單,把ARM給的地址最低位剪掉,把剩下的給FLASH。要讀第2個位元組,還是送0x00001,但是最後的1被剪掉了,FLASH得到的地址是ox00000,顯然給出的資料是第1個和第二個位元組。而ARM覺得送出的地址是0x00001啊,應該把高地址給R0啊,即把第2個位元組給了R0。就是一個“欺上瞞下”的過程。
這是我看了http://www.100ask.net/showtopic-308.aspx這裡的文章和查閱資料理解以後寫的,給大家分享一下。。。。