除錯工具: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 ...