AG32芯片內(nèi)的兩個(gè)核和兩個(gè)bin
一、概述:
與傳統(tǒng)單核芯片(如:ST系列)不同,AG32整顆芯片包含兩個(gè)核:mcu和cpld。
這里的mcu核已經(jīng)相當(dāng)于ST的整顆芯片。而CPLD核是比普通芯片多出來的那個(gè)核。
這兩個(gè)核是相互獨(dú)立的(各自編譯、各自下載),又可以相互連通起來(信號(hào)連通)共同工作。
所以,AG32工程會(huì)編譯出來2個(gè)bin。一個(gè)是代碼的bin,一個(gè)是邏輯的bin,稱之為code.bin和logic.bin。最終使用時(shí),需要把這兩部分的bin都燒錄進(jìn)去,芯片才能工作起來。
mcu編譯出來bin容易理解,在VScode下點(diǎn)編譯就可以了。
cpld的bin,則根據(jù)使用方式的不同,生成方式也會(huì)不同。參照以下介紹。
.
二、兩個(gè)bin怎么生成
根據(jù)使用預(yù)期的不同,分成三種情況:
1.只使用mcu部分,不使用cpld部分;
2.同時(shí)使用mcu和cpld來聯(lián)合編程;
3.只使用cpld部分,不使用mcu部分;
首先說明的是,以上3種方式都是會(huì)生成2個(gè)bin的。只不過情況1和情況3生成出來的第二個(gè)bin,是系統(tǒng)自動(dòng)做的,用戶無感而已。
分別說明:
情況1:如果芯片中只使用mcu不使用cpld:
此時(shí),VE文件里只配置mcu用到的PIN腳即可。
這種情況下,vscode工程中點(diǎn)“upload LOGIC”時(shí),會(huì)自動(dòng)生成默認(rèn)logic(該logic中“用戶邏輯”為空而已),并編譯出bin,再燒錄,一鍵完成全過程。(這里的logic可以認(rèn)為是cpld.bin)
整個(gè)過程中,logic部分對(duì)開發(fā)者來說是無感的。
情況2:如果芯片中同時(shí)使用mcu和cpld:
這種開發(fā)過程參照?mcu+cpld聯(lián)合開發(fā)?,這里只簡(jiǎn)要描述cpld.bin的生成。
這種模式下,VE文件里需要配置 mcu和pin之間、mcu和cpld之間、cpld和pin之間 的信號(hào)關(guān)聯(lián)。
然后在VScode下點(diǎn)“prepare LOGIC”按鈕,會(huì)為開發(fā)者生成CPLD的空的框架工程。開發(fā)者需要在這個(gè)框架下完成cpld邏輯的編寫。這個(gè)編寫調(diào)試中,開發(fā)者持有主動(dòng)權(quán)。等cpld邏輯全部開發(fā)完成,自己編譯出bin。這個(gè)bin就是“情況1”中自動(dòng)生成出來的那個(gè)bin。
生成cpld.bin以后,燒錄就又回到VScode下,仍然是點(diǎn)“upload LOGIC”去燒錄。
情況3:如果芯片中只使用cpld不使用mcu:
這種開發(fā)過程參照 純CPLD開發(fā) ,這里也只是簡(jiǎn)要描述bin的生成。
這種模式下,開發(fā)過程是在quartus環(huán)境下完成的,首先是生成cpld.bin運(yùn)行調(diào)試。而mcu的bin則是自動(dòng)生成的。
跟“情況1”剛好相反:cpld.bin是自己調(diào)試生成,mcu.bin是系統(tǒng)自動(dòng)生成。
.
三、兩個(gè)bin怎么調(diào)試和燒錄
mcu的調(diào)試,在VScode下進(jìn)行。
cpld的編寫,需要使用quartus和supra兩個(gè)工具。目前cpld的調(diào)試,不支持在線工具,可以使用modelsim進(jìn)行模塊級(jí)測(cè)試。
VScode下的燒錄,燒錄兩個(gè)bin,分別使用“Upload”和“Upload LOGIC”兩個(gè)按鈕。

而Supra下燒錄cpld,則使用Supra的upload功能。
最后,用于生產(chǎn)時(shí),都是要生成二合一的batch.bin的。用downloader.exe工具來燒錄這個(gè)bin。
.
四、flash大小與兩個(gè)bin的燒錄位置
關(guān)于芯片flash大?。?/strong>
在AG32系列中,flash大小有兩個(gè)型號(hào):256K和1M.
flash起始地址從0x80000000開始。flash的可擦寫塊大小為4K(每次擦寫的最小單位為4K,每塊的擦寫起始是4K對(duì)齊)。具體讀、寫、擦的函數(shù),請(qǐng)參考example工程下的example_flash.c。
整片flash上需要存儲(chǔ)基礎(chǔ)的兩個(gè)bin:code.bin和logic.bin(logic.bin就是cpld部分編譯后的bin)。其他區(qū)域可供用戶使用(存儲(chǔ)用戶信息)。
默認(rèn)情況下,code.bin存儲(chǔ)到0x80000000,logic.bin存儲(chǔ)到最后100K。
也就是說,不管所選型號(hào)的flash是256K還是1M,最后100K都是留給fpga/cpld使用的。
如果使用的芯片是256K的flash,那么就是156K程序+100K的cpld.bin,即:用戶程序不能超過156K。如果超過156K編譯是可以通過的,但燒錄后會(huì)沖掉logic部分。
logic被沖掉后,程序運(yùn)行會(huì)表現(xiàn)出各種異常(通常是系統(tǒng)時(shí)鐘初始化失?。?。
如果程序code.bin的size比較大,cpld.bin又剛好比較小,可以調(diào)整這個(gè)界限的值。調(diào)整方法如下:
board_logic.compress = true?//(可選)對(duì)cpld.bin部分進(jìn)行壓縮,更省空間。壓縮后小于48K。通常程序可能小于30K。
board_upload.logic_address = 0x80034000?//存放cpld.bin的起始點(diǎn)。根據(jù)實(shí)際情況調(diào)整該邊界值。
//flash的大小是在agrv2k_103.json 中定義的。
//flash起始地址是0x80000000,ram是0x20000000。
bin的存儲(chǔ)與運(yùn)行:
code.bin和cpld.bin都是存儲(chǔ)在flash上的。
運(yùn)行時(shí),cpld.bin被加載到cpld內(nèi)核區(qū)域運(yùn)行(注意,這個(gè)區(qū)域不是芯片的128K的ram區(qū))。code.bin則仍然在flash區(qū)域運(yùn)行。
.
五、其他說明
在使用MCU時(shí),如果不用CPLD部分,是不是CPLD就是多余的?
不是的。
整個(gè)芯片的開發(fā),依賴于配置文件.ve。在這個(gè)配置文件里,需要用戶配置需要使用到的時(shí)鐘和全部引腳。這里邊配置的引腳,就是生成到cpld.bin去的。
這里又引入另一個(gè)概念:mcu信號(hào)和引腳。這部分內(nèi)容比較多,詳情請(qǐng)參考 引腳配置 。這里只要知道,需要該cpld的參與,mcu的信號(hào)才能最終使能到引腳。