天天看點

國産RISCV晶片CH32V103(對标stm32f103(管腳相容))學習玩究(2)

一、前言

上節(1)中提到要搞硬體來玩,但沒現成的,是以自行設計花了點時間。

國産RISCV晶片CH32V103(對标stm32f103(管腳相容))學習玩究(1)

二、硬體設計

​ 一口氣搞了2種:一種是常用的那種市面常見的核心闆改成Type-C接口的,同時做成單面貼晶片的PCB,功能和stm32的完全一樣,但能節省點成本。單設計完成發出去打樣,确發現做一個直接帶仿真器的,玩起來應該更High點,是以又做了一款,目前兩款都已經做好。第一款需要配一個RISC-V仿真器,官方的能夠ARM和RISC-V切換使用,很不錯。

兩種PCB的3D結構如下:

一般的核心闆,TYPE-C接口,爽過Micro的。

國産RISCV晶片CH32V103(對标stm32f103(管腳相容))學習玩究(2)

帶DAP仿真器的核心闆(右邊是仿真器,一根線就随便玩了,不需要外接下載下傳器了),其它和上面的完全一樣。

國産RISCV晶片CH32V103(對标stm32f103(管腳相容))學習玩究(2)

實物圖

國産RISCV晶片CH32V103(對标stm32f103(管腳相容))學習玩究(2)

三、開始RISC-V的旅行

1.安裝mounriver軟體

​ 除了路徑選擇,一路next,不用配置環境變量啥的,挺友好。非常熟悉的界面,都是Eclipse架構。

國産RISCV晶片CH32V103(對标stm32f103(管腳相容))學習玩究(2)

​ CH32V103開發的IDE

2.打開官方的一個工程觀察下

官方提供了一個開發包,目前是1.4版本,裡面已經有大多數的外設驅動檔案了,和其它廠家的類似。

國産RISCV晶片CH32V103(對标stm32f103(管腳相容))學習玩究(2)

當然,先探探GPIO,這個一定是必須先踩點的。GPIO檔案夾打開,看到了工程檔案夾的名字GPIO_Toggle,顯然是一個IO翻轉的例子。打開後看到明顯的工程檔案,這多說兩句,使用工程檔案直接打開,顯然是和很多使用keil等軟體一脈相傳的,比較友善。然而,Eclipse架構下搭建的環境很多都沒有直接打開工程檔案的方式,需要先打開IDE,再從IDE下來打開workspace。Andriod、Vscoad就是後者。是以這一點對用慣了keil和IAR軟體的使用者來講,算是個小福利吧。

打開工程檔案

國産RISCV晶片CH32V103(對标stm32f103(管腳相容))學習玩究(2)

檔案目錄,列的很詳細,當然需要編譯的檔案和不需要編譯的都加載上去了,可以做模闆使用了。但真正用的時候可以在系統配置檔案裡做裁剪,減少編譯時間和減少占用flash空間。

國産RISCV晶片CH32V103(對标stm32f103(管腳相容))學習玩究(2)

IDE的配置不研究了,官方有相關的文檔可以檢視,另外也沒啥好配置的,因為官方推出的晶片種類還很少,是以器件差别,如flash位址等不需要變化,是以目前一路預設。

3. 編譯

選擇Project菜單,選擇Bulid Project,或者選擇下面的工具欄中的bulid(快捷方式F7)。

國産RISCV晶片CH32V103(對标stm32f103(管腳相容))學習玩究(2)

編譯要注意:如果是已經編譯過,但檔案又拷貝到新路徑的,一定要先Clean,再bulid,否則定會出錯,這是個小坑,用過安可信的ESP8266的編譯環境,對這個就很比較清楚。

編譯成功後的結果如下:這裡能看到編譯指令是make -j8 all,是以直接在終端裡使用指令也是可以的,習慣于linux的人更喜歡這個。生成的檔案是.ELF字尾,給出了占用空間的大小,以及耗時。

國産RISCV晶片CH32V103(對标stm32f103(管腳相容))學習玩究(2)

4.下載下傳

連接配接仿真器,仿真器的連接配接管腳定義和各種link一樣,SWCLK和SWDIO。再加電源和地即可。選擇Flash菜單,選擇Download for RISC-V,或者選擇下面的工具欄中的Download for RISC-V。

國産RISCV晶片CH32V103(對标stm32f103(管腳相容))學習玩究(2)
國産RISCV晶片CH32V103(對标stm32f103(管腳相容))學習玩究(2)

下載下傳完成的提示資訊:

國産RISCV晶片CH32V103(對标stm32f103(管腳相容))學習玩究(2)

5.觀察結果

核心闆沒反應,當然,程式啥都沒改,管腳都不知道是那個,肯定沒變化。智能檢視主程式,修改代碼:

打開main.c

  • /*
     *@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));
      }
      }
               
    程式說明已經告知是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亮滅一次。改一下,改為教科書裡常用的語句玩一下。
    *  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的比較。

繼續閱讀