首先,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。就是乙個「欺上瞞下」的過程。
這是我看了這裡的文章和查閱資料理解以後寫的,給大家分享一下。。。。
儲存器分段和位址的形成
從8086開始採用分段的方法管理儲存器。只有充分理解儲存器分段的概念和儲存器邏輯位址和實體地址的關係,才能熟練地使用8086 8088組合語言。儲存單元的位址是無符號數,n 位二進位制數總共能夠表示 2n 個儲存單元的位址。為了書寫方便,儲存單元位址常採用十六進製制數表示。當以字方式訪問字時,處理器...
SRAM儲存器晶元位址引腳線短路檢測方法
sram是控制器電路中重要的元器件,控制器硬體出廠時,要對所有元器件進行檢測。對sram某個位址讀寫,可以判斷sram晶元是否損壞,以及資料線是否虛焊。一 根據晶元位址引腳的排列特性,列出位址引腳間可能短路的待檢引腳組 二 獲得sram晶元的起始位址,並確定所有與待檢引腳組相對應的相關位址 三 依次...
關於資料對齊和儲存器讀寫
資料對齊是跟資料在記憶體中的位置相關的話題。如果乙個變數的記憶體位址正好是他長度的整數倍,那麼它就叫做自然對齊。舉例來說,乙個32位的整型資料,如果他在記憶體中的位址剛好可以被4整除,我們就說這個整型數是自然對齊的。在編譯過程中,可以通過編譯器來調整資料對齊。一般在預設情況下,對於標準資料型別來說,...