一、前言
上節(1)中提到要搞硬體來玩,但沒現成的,是以自行設計花了點時間。
國産RISCV晶片CH32V103(對标stm32f103(管腳相容))學習玩究(1)
二、硬體設計
一口氣搞了2種:一種是常用的那種市面常見的核心闆改成Type-C接口的,同時做成單面貼晶片的PCB,功能和stm32的完全一樣,但能節省點成本。單設計完成發出去打樣,确發現做一個直接帶仿真器的,玩起來應該更High點,是以又做了一款,目前兩款都已經做好。第一款需要配一個RISC-V仿真器,官方的能夠ARM和RISC-V切換使用,很不錯。
兩種PCB的3D結構如下:
一般的核心闆,TYPE-C接口,爽過Micro的。

帶DAP仿真器的核心闆(右邊是仿真器,一根線就随便玩了,不需要外接下載下傳器了),其它和上面的完全一樣。
實物圖
三、開始RISC-V的旅行
1.安裝mounriver軟體
除了路徑選擇,一路next,不用配置環境變量啥的,挺友好。非常熟悉的界面,都是Eclipse架構。
CH32V103開發的IDE
2.打開官方的一個工程觀察下
官方提供了一個開發包,目前是1.4版本,裡面已經有大多數的外設驅動檔案了,和其它廠家的類似。
當然,先探探GPIO,這個一定是必須先踩點的。GPIO檔案夾打開,看到了工程檔案夾的名字GPIO_Toggle,顯然是一個IO翻轉的例子。打開後看到明顯的工程檔案,這多說兩句,使用工程檔案直接打開,顯然是和很多使用keil等軟體一脈相傳的,比較友善。然而,Eclipse架構下搭建的環境很多都沒有直接打開工程檔案的方式,需要先打開IDE,再從IDE下來打開workspace。Andriod、Vscoad就是後者。是以這一點對用慣了keil和IAR軟體的使用者來講,算是個小福利吧。
打開工程檔案
檔案目錄,列的很詳細,當然需要編譯的檔案和不需要編譯的都加載上去了,可以做模闆使用了。但真正用的時候可以在系統配置檔案裡做裁剪,減少編譯時間和減少占用flash空間。
IDE的配置不研究了,官方有相關的文檔可以檢視,另外也沒啥好配置的,因為官方推出的晶片種類還很少,是以器件差别,如flash位址等不需要變化,是以目前一路預設。
3. 編譯
選擇Project菜單,選擇Bulid Project,或者選擇下面的工具欄中的bulid(快捷方式F7)。
編譯要注意:如果是已經編譯過,但檔案又拷貝到新路徑的,一定要先Clean,再bulid,否則定會出錯,這是個小坑,用過安可信的ESP8266的編譯環境,對這個就很比較清楚。
編譯成功後的結果如下:這裡能看到編譯指令是make -j8 all,是以直接在終端裡使用指令也是可以的,習慣于linux的人更喜歡這個。生成的檔案是.ELF字尾,給出了占用空間的大小,以及耗時。
4.下載下傳
連接配接仿真器,仿真器的連接配接管腳定義和各種link一樣,SWCLK和SWDIO。再加電源和地即可。選擇Flash菜單,選擇Download for RISC-V,或者選擇下面的工具欄中的Download for RISC-V。
下載下傳完成的提示資訊:
5.觀察結果
核心闆沒反應,當然,程式啥都沒改,管腳都不知道是那個,肯定沒變化。智能檢視主程式,修改代碼:
打開main.c
-
程式說明已經告知是PA0,闆子是常用的bluepill,連接配接LED的引腳為PA13,改一下即可,這裡我們也看到這裡的函數都是似曾相識,很有喜感。但這句話GPIO_WriteBit(GPIOC, GPIO_Pin_13, (i==0) ? (i=Bit_SET):(i=Bit_RESET))參數用了一個選擇性的語句,代碼簡潔,意思是如果i是0選擇設定i=1,如果是1選擇設定i=0;每隔250毫秒,管腳設定變換一次,也就是LED每250ms亮滅一次。改一下,改為教科書裡常用的語句玩一下。/* *@Note GPIO例程: PA0推挽輸出。 */ #include "debug.h" /* Global define */ /* Global Variable */ /******************************************************************************* * Function Name : GPIO_Toggle_INIT * Description : Initializes GPIOA.0 * Input : None * Return : None *******************************************************************************/ void GPIO_Toggle_INIT(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } /******************************************************************************* * Function Name : main * Description : Main program. * Input : None * Return : None *******************************************************************************/ int main(void) { u8 i=0; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); Delay_Init(); USART_Printf_Init(115200); printf("SystemClk:%d\r\n",SystemCoreClock); printf("GPIO Toggle TEST\r\n"); GPIO_Toggle_INIT(); while(1) { Delay_Ms(250); GPIO_WriteBit(GPIOA, GPIO_Pin_0, (i==0) ? (i=Bit_SET):(i=Bit_RESET)); } }
* int main(void) { u8 i=0; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); Delay_Init(); USART_Printf_Init(115200); printf("SystemClk:%d\r\n",SystemCoreClock); printf("GPIO Toggle TEST\r\n"); GPIO_Toggle_INIT(); while(1) { Delay_Ms(1000); GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET); Delay_Ms(1000); GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET); } }
編譯、下載下傳後,PC13連接配接的led每秒鐘閃爍一次。
四、總結
上面完成了一個最簡單的入門過程。但能看出,過程和arm核心的類似,對官方提供的庫遠觀,會發現和arm的CMSIS的庫很類似。這對迅速的适應RSIC-V非常重要,但要深入了解,還要繼續深挖。
後續将繼續進行晶片各部分的學習以及對應arm的比較。