LPC1788在外部RAM除錯總結

2021-09-30 12:23:12 字數 3977 閱讀 3981

除錯工具:mdk 4.72  jlink8

一、mdk設定

圖12.asm

圖2 1處必須預定義no_crp,因為在lpc1788啟動檔案startup_lpc177x_8x.s中有如下**

圖3 117-120這段**是nxp公司的lpc1700系列的mcu特有的一段**,其他公司的cortex-m3 mcu的啟動程式是沒有這段**的。這段**是指定lpc1700的crp加密級別的**段,晶元上電後會自動讀取0x02fc這一位址的值以確定加密方式,其中crp_key = 0xffffffff為0級加密,crp_key = 0x12345678為1級加密,crp_key = 0x87654321為2級加密,crp_key = 0x43218765為3級加密(最高端加密),3級加密將會禁止所有的isp指令,也就是說,晶元將不能讀寫、不能擦除。

如果在圖2中的1處沒有定義了no_crp,118-120行**會被執行,即定義crp_key,這會導致退出外部ram除錯時核心被鎖,在mdk中的debug setting中無法檢測到目標板;只能通過拉低p2[10]引腳後通過j_flash軟體的target->connect連線目標板,然後erase chip擦除目標板flash,這樣才能在debug setting中重新檢測到目標板

圖41)、如果圖2中1處(使用target對話方塊中的記憶體布局)打勾,則表示使用預設的分散載入檔案生成映像檔案,其內容為

圖5 其中圖3中的位址1對應於target對話方塊中read/only memory areas區內的預設儲存空間的起始位址,預設為片內flash;位址2是對應於arget對話方塊中read/write memory areas區內的預設儲存空間的起始位址,預設為片內sram。如果此時圖1target對話方塊中的read/only memory areas和read/write memory areas區域的儲存空間設定的不是預設值,則會出現編譯錯誤。

link control string中的內容為(工程名為proj1):

圖6 2)、如果圖2中1處不打勾,並在3處選擇了分散載入檔案,則會按分散載入檔案中的內容生成映像檔案;此時target對話方塊中指定的ro和rw儲存空間無效。這次除錯使用的分散載入檔案內容為

圖7 將向量表和所有必須在root region中的library sections(如__main.o, __scatter*.o, __dc*.o, 和region$$table)放在起始位址為0x10000000,大小為0x10000的儲存空間中(片內sram)中;將剩餘的**,讀寫資料和零初始化資料放大起始位址為0xa0000000,大小為0x1000000的儲存空間(片外sdram)中。

link control string中的內容如圖2 ,分散載入檔名為sdram.sct。

3)、如果圖2中1處不打勾,且3處沒有選擇分散載入檔案,則會按2處的r/o base和r/w base生成映像檔案;此時target對話方塊中指定的ro和rw儲存空間無效。

link control string中的內容為(r/o base和r/w base如圖2)

圖84、debug

include mt48lc8m32lfb5.ini

//include sst39vf160_for_download.ini

initsdram(); // initialize memory

//emc_norflashinit();

load .\flash\lcd_lq043t3dx0a.axf incremental // download program

/* rnr */

_wdword(0xe000ed98, 0x00000000); // use no.0 mpu

/* rbar */

_wdword(0xe000ed9c, 0xa0000000); // set mpu base addr

/* rasr */

_wdword(0xe000eda0, 0x03000031); // set mpu size and permission

/* shcsr */

// _wdword(0xe000ed24, 0x00000100); // enable memory managemeng fault

/* mpu_control */

_wdword(0xe000ed94, 0x00000005); // enable mpu

/* vtor */

_wdword(0xe000ed08, 0x10000000); // set vector table offset

sp = _rdword(0x10000000); // set stack pointer

pc = _rdword(0x10000004); // set program counter

10-22行的關於mpu的設定一定要有,否則程式在sdram中的執行會出現錯誤,這是因為cortex_m3處理器在0xa0000000-0xdfffffff之間的儲存空間的預設訪問屬性是不可執行的,是不可執行區,圖中第16行**通過設定mpu region屬性及容量暫存器mpurasr,使其以0xa0000000為起始位址的32mb(mpurasr[5:1]=0b11000)儲存空間為共享記憶體(mpurasr[26:24]=0b011),且此區允許取指(mpurasr[28]=0)。

initsdram()函式在mt48lc8m32lfb5.ini中,作用為初始化外部sdram,其內容為

10 1處不能打勾,這個選項的意思是在進入除錯前先更新目標板,但是我們並沒有配置目標板的flash,所以這個選項如果不去掉,在除錯時就會彈出錯誤,大意是在***x位址沒有找到演算法。

6、utilities setting

11 因為是在外部ram中除錯,所以1中不用載入flash程式設計演算法,左上角選擇erase sectors或do not erase都可以。

二、問題總結

3、步驟

1)、target或linker

2)、asm (lpc1788特有)

3)、debug

4)、utilities

記錄下 分散載入LPC1788

這個鏈結是我在官網上找到的關於分散載入檔案的資料。講的比較詳細了。這裡通過乙個例子記錄下我學習的過程,通過分散載入檔案把 從flash裡拷貝到ram裡執行,基於lpc1788。先貼下我的sct檔案 lr irom1 0x00000000 0x00002000 rw iram1 0x20000000 ...

LPC1788內部EEPROM使用的問題

最近使用lpc1788內部eeprom儲存資料時候發現問題 lpc1788的eeprom扇區只有 0 62 63扇區不存在 uint32 t i,j uint8 t count uint8 t error 0 debug frmwrk init dbg menu eeprom init count ...

給Promise在外部增加斷點

跟蹤問題的時候,我想在每乙個promise的then後邊增加乙個日誌,列印一下每乙個then輸出的結果.於是有了這個問題,直接想到的是要複寫promise中的then方法.但是then方法是在例項上的,所以,想到了可以通過 proxy 進行 var p new promise rel rel ok ...