我們用cortex M3軟核在xilinx的artix7a35T FPGA上實現一個簡單的SOC系統后,如何進行程序的調試?這里使用keil MDK軟件開發環境,首先要把你的st link v2調試器的GND、swdio、swclk三個引腳與fpga的對應引腳連接,而fpga的swdio、swclk兩個引腳,是你在構建cortexM3系統時自己定義的,例如下圖:


由于swdio是雙向端口,所以在arm內核的引出腳swdo和swdi上要加一個簡單的三態門控制,控制端為arm內核的引出腳swdoen,模塊與實現代碼如下:

module swdio_tri_buf(
inout swdio,
input swdo,
input swdoen,
output swdi
);
// assign swdi = swdio;
// assign swdio = (swdoen) ? swdo : 1'bz;
IOBUF swd_iobuf_inst(
.O(swdi),
.I(swdo),
.IO(swdio),
.T(~swdoen) // 3-state enable input, high=input, low=output
);
endmodule
在此示例中我們可以通過io引腳約束文件,把swdio、swclk兩個引腳定義到你認為合適的任意IO端口上:

swdio、swclk兩個引腳定義位置不同,可能會略微影響時序,但是swd是幾M的慢速系統,影響不大,如果影響明顯也可在fpga布局布線時加入時序約束。
在項目的option中選擇debug,如下圖所示,選擇stlink degguger:

再進入setting,如果連接和設計無誤,keil會自動找到調試器,顯示如下圖所示,注意我們這里顯示的stlink固件版本號為V2J37S7,如果是太老的版本是無法進行后續的調試的,一般此處系統會提示你是否更新固件版本號,應該選擇更新:

在此還需要配置flash download選項,如下圖所示,點擊add加入后面我們自己編譯修改生成的FLM:

關于FLM需要輸入較多文字,在此自己看后續視頻講解:
1.FlashDev.c文件修改
struct FlashDevice const FlashDevice = {
FLASH_DRV_VERS, // Driver Version, do not modify!
"OnChip DTCM", // Device Name
ONCHIP, // Device Type
0x00000000, // Device Start Address
0x00008000, // Device Size in Bytes (256kB)
1024, // Programming Page Size
0, // Reserved, must be 0
0xFF, // Initial Content of Erased Memory
100, // Program Page Timeout 100 mSec
3000, // Erase Sector Timeout 3000 mSec
// Specify Size and Address of Sectors
0x008000, 0x000000, // Sector Size 8kB (8 Sectors)
SECTOR_END
};
2.FlashPrg.c文件修改
int EraseChip (void) {
/* Add your Code */
memset((unsigned char*)0,0,0x8000);
return (0); // Finished without Errors
}
。。。。。。。。。。。。。。。。
int EraseSector (unsigned long adr) {
/* Add your Code */
memset((unsigned char*) adr,0,1024);
return (0); // Finished without Errors
}
。。。。。。。。。。。。。。。。。。
int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {
/* Add your Code */
memcpy((unsigned char*) adr,buf,sz);
return (0); // Finished without Errors
}
視頻講解:
關注微信公眾號:電路與電測