目前新唐已經量產多款8051系列產品,例如MS51、ML51、CM1003系列等。我們現在來重點講解一下新唐的RAM分佈情況。
RAM分為片內和片外兩種,片內又分為直接尋址和間接尋址。片外稱為xdata,片內直接尋址稱為data,片內間接尋址稱為idata。
data:指片內 0x00-0x7F 的 128 個 RAM,可以用 acc 直接讀寫,速度最快,生成的程式碼也最小。
idata:指片內 0x00-0xFF 的 256 個 RAM,其中前 128 和 data 的 128 完全相同,只是因為訪問的方式不同。
xdata:指片外 0x0000-0x7FF 空間。(針對不同 Flash 大小的晶片,此部分大小是有差異的)
詳細內容可以參考規格書,或者參考《一分鐘了解8051的RAM如何分布和使用》文章。
官方連結:http://nuvoton-mcu.com/forum.php?mod=viewthread&tid=65929&extra=page%3D1
在STARTUP.A51檔案中有進行描述,記得根據不同規格的晶片調整大小。
MS51-Flash 16K:MS51FB9AE_MS51XB9AE_MS51XB9BE(對應XDATALEN 2FFH)
MS51-Flash 32K:MS51FC0AE_MS51XC0BE_MS51EB0AE_MS51EC0AE_MS51TC0AE_MS51PC0AE(對應XDATALEN 7FFH)
變數如果需要使用idata的高128字節,別忘了將STARTUP.A51中的IDATALEN從80H改成100H。
針對ML51系列產品,目前有16K、32K、64K的產品,程式碼是上下相容的。我這邊查了2020年的ML51舊版本STARTUP.A51,當時的晶片比較少,XDATALAN是2FFH。目前ML51新版本的程式碼已經改成FFFH。所以建議針對ML51全系列產品的XDATALAN直接改成0FFFH。
有小夥伴詢問在操作新唐8051 RAM變數時,變數是否需要賦初值?如果像上面的設定都是符合規範的話,STARTUP.A51 裡面有進行變數清零,但為了程式碼的規範性,建議還是手動清零。
如何確認RAM是否已清除,請參考以下步驟。
1、進入模擬環境,在需要測試RAM的地方設置一個斷點,例如在XDATALAN下面執行的地方設置斷點,在main()程式的第一行程式碼也設置一個斷點。這樣做的目的是為了確認執行完STARTUP.A51檔案後,跳轉到main時,RAM變數是否已清零。
2、全速運行到斷點處,修改任意在 RAM 地址範圍內的數據,比如地址 0x82,改成 55。點擊 RST 重新執行程式碼,再次全速運行,通過查看記憶體,可以發現 0x82 地址處的數據已經被清零。這樣就可以說明這塊 RAM 的區域已經被清零了。
3、可以透過這樣的方式測試DATALEN和IDATALEN定義範圍內的RAM是否已清零,前提是不能超出這個定義的大小。
參考來源