【Leo的手記】Linux平臺使用CMake和GCC工具鏈開發(fā)CH32V003
0. 準備工作
0.1 開發(fā)庫與開發(fā)工具鏈
所使用的開發(fā)庫與開發(fā)工具鏈如下
沁恒官方提供的固件庫
RISC-V Embedded GNUC交叉編譯工具鏈
沁恒官方提供的Openocd
VSCode
對于RISC-V Embedded GNUC交叉編譯工具鏈和Openocd在MounRiver官網(wǎng)提供的MRS_Toolchain_Linux工具包中有包含。下載以后自行安裝和配置路徑。
1.項目建立
按照統(tǒng)一的結(jié)構(gòu)來創(chuàng)建項目目錄與項目文件。在項目根目錄中創(chuàng)建如下目錄與文件。
app :目錄,用于存放業(yè)務(wù)邏輯相關(guān)代碼
system :目錄,用于存放系統(tǒng)支持相關(guān)代碼
link.ld :鏈接腳本文件,從官方庫中拷貝,用于鏈接
startup_ch32v00x.S :啟動文件,從官方庫中拷貝
CMakeLists.txt :CMake構(gòu)建腳本
在app目錄中新建main.c,用于存放主函數(shù)代碼。
在system目錄中,創(chuàng)建如下目錄
peripheral :外設(shè)庫存放目錄,將官方庫中的相關(guān)代碼放入該目錄。
platform :平臺相關(guān)代碼,用于存放RISCV內(nèi)核相關(guān)結(jié)構(gòu),將官方庫中的core_riscv.c和core_riscv,h放入
supports.c :系統(tǒng)支持源文件,新建
supports.h :系統(tǒng)支持頭文件,新建
在外設(shè)庫的頭文件存放目錄中,新建頭文件ch32v00x_libs.h,用于包含外設(shè)頭文件。如下
至此,項目目錄結(jié)構(gòu)構(gòu)建完成。
2. 編寫系統(tǒng)相關(guān)支持庫
該步驟主要編寫supports.c與supports.h
2.1 編寫supports.h
在supports.h中主要聲明SystemCoreClock全局變量與系統(tǒng)延時相關(guān)函數(shù)。代碼如下
在supports.c中包含該頭文件
2.2?編寫中斷服務(wù)函數(shù)與系統(tǒng)時鐘配置函數(shù)
在supports.c中加入如下代碼
2.3 編寫系統(tǒng)延時相關(guān)函數(shù)
在不使用RTOS的情況下,系統(tǒng)使用SysTick定時器實現(xiàn)延時。添加如下代碼
2.4 編寫SystemInit函數(shù)
在最后添加SystemInit函數(shù),該函數(shù)由啟動文件調(diào)用,在main函數(shù)執(zhí)行之前初始化系統(tǒng)資源。
如下
3. 編寫主函數(shù)
在app目錄下的main.c中添加如下代碼
該代碼實現(xiàn)了對于PD6的翻轉(zhuǎn)。
4. 編寫CMakeLists.txt
構(gòu)建腳本如下
這里額外說一個我踩的坑,因為官方?jīng)]有給出GCC工具鏈構(gòu)建選項的參考,因此我原本是直接使用CH32V103的編譯選項,后來發(fā)現(xiàn)一直進入Hardfault,最后單步調(diào)試發(fā)現(xiàn)是因為執(zhí)行了除法,所以進入了Hardfault,如此可以大概猜測,既然不是非法內(nèi)存操作導(dǎo)致進入Hardfault,那執(zhí)行除法進入Hardfault大概率是因為執(zhí)行了非法指令。后來經(jīng)過查看手冊發(fā)現(xiàn),CH32V103所支持的指令集為RV32IMAC,而CH32V003所支持的指令集為RV32EC,修改后錯誤消除。
5. 編譯與燒錄
5.1 編譯
在項目根目錄打開終端,輸入
即可完成編譯。
5.2 燒錄
需要注意的是,CH32V003使用三線串行調(diào)試接口,不包含SWCLK信號,只有WCH-LINKE支持。連接WCH-LINKE,在項目根目錄打開終端,輸入
在此我是寫成了一個腳本用于方便下載
需要注意的是,以上代碼下載之后需要手動復(fù)位一下程序才能運行。
以上