沁恆CH32V103C8T6開發環境筆記

来源:https://www.cnblogs.com/milton/archive/2022/05/08/16245084.html
-Advertisement-
Play Games

CH32V103C8T6是沁恆的RISC-V內核MCU, 基於RISC-V3A處理器, 內核採用2級流水線處理,設置了靜態分支預測、指令預取機制,支持DMA. 需要準備一片 WCH-Link 用於燒錄沁恆的晶元. 市面上有相容 DAP-Link 和 WCH-Link 的燒錄器. 註意看燒錄器的說明,... ...


CH32V103C8T6

CH32V103C8T6是沁恆的RISC-V內核MCU, 基於RISC-V3A處理器, 內核採用2級流水線處理,設置了靜態分支預測、指令預取機制,支持DMA. 主要參數如下

  • CPU: 32位RISC-V3A, RV32IMAC指令集, 最高80MHz, 典型72MHz
  • RAM: 20KB
  • Flash: 64KB
  • BootLoader: 3.75KB 系統引導程式存儲區
  • 供電: 2.7V - 5.5V (相容3.3V和5V)
  • Timer: 通用3, 高級1, 看門狗2, 系統時鐘1
  • ADC: 12bit, 10CH
  • SPI: 2
  • I2C: 2
  • UART: 3
  • USBHD: 1
  • 封裝: LQFP48

硬體部分

需要準備一片 WCH-Link 用於燒錄沁恆的晶元. 市面上有相容 DAP-Link 和 WCH-Link 的燒錄器. 註意看燒錄器的說明, 其模式在加電前通過按鍵可以切換. 燒錄 CH32V103 時, 必須處於 WCH-Link的狀態

開發板 Blue Pill

因為 CH32V103C8T6 引腳佈局與 STM32F103C8T6, CH32F103C8T6 完全一致, 硬體設計通用,PIN對PIN相容, 所以可以直接使用 STM32F103C8T6 核心板(Blue Pill)作為開發板.
手裡正好有一片 STM32F103C6T6 的開發板, 電路和 STM32F103C8T6 是一樣的, 只是晶元型號不同, 於是用熱風焊將C6T6吹下來, 把 CH32V103C8T6 換上去.

熱風槍溫度設置成290度, MCU加上助焊油, STM32F103C6T6 吹掉之後的焊盤

焊上了 CH32V103C8T6, 第一次放得有點歪

又吹了一遍, 這次小心放正了

測了一遍各PIN腳間電阻, 感覺有些PIN虛焊了, 所以又用電烙鐵拖了一遍


連線

WCH-Link -> Blue Pill
3V3      -> 3V3
GND      -> GND
SWD      -> SWIO
SCK      -> SWCLK
RX       -> PA9 
TX       -> PA10

如果不觀察串口輸出的話, RX/TX可以不連


軟體部分

軟體部分其實就是 MounRiver Studio, 下載完解壓後安裝. MounRiver Studio 是基於 Eclipse 的擴展開發環境, 對於熟悉 Eclipse 的人用起來還比較方便. 安裝 MounRiver Studio 的同時, WCH-Link 的驅動就裝上了, 不需要再另外安裝.

如果需要觀察串口輸出, 還需要使用串口工具, 例如 putty.

測試項目

創建項目

下麵建一個測試項目, 通過GPIO驅動板子上的PC13 LED

File -> New -> MounRiver Project, 在對話框中

  • 選擇晶元型號 WCH -> CH32V103 [RIsC-V] -> CH32V103C8T6
  • 輸入Project Name, 例如 Test001
  • 勾選 Use default location, 如果需要放到其他目錄, 這裡可以不勾選, 自行選擇
  • Template Type 選擇 NoneOS, 因為這隻是個簡單測試, 只需要while迴圈即可
  • 點擊 Finish

在項目 Project Explorer 中會出現目錄結構,

編輯代碼

用戶代碼在 User 目錄下, 展開 User, 打開 main.c 將內容修改為

#include "debug.h"


void GPIO_Toggle_INIT(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
}


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(500);
        GPIO_WriteBit(GPIOC, GPIO_Pin_13, (i == 0) ? (i = Bit_SET) : (i = Bit_RESET));
        printf("TEST\r\n");
    }
}

編譯項目

編譯和燒錄的過程, MounRiver 都已經包裝得很好, 所以這部分比較簡單.

使用圖標欄中的編譯按鈕, 或者按F7編譯項目(完整編譯使用Shift+F7)

燒錄

首先在設備管理器中查看 Ports (COM & LPT), 如果燒錄器處於WCH-Link狀態並且已經連接電腦, 會出現 WCH-LinkRV SERIAL(COMx) 這樣的設備

使用圖標欄中的下載按鈕(Download), 或者按F8燒錄.

如果以上步驟都正常, 應該能看到開發板上的LED每隔半秒切換一次亮滅狀態. 串口使用115200波特率連接, 能看到輸出的文字"TEST"


其他測試

PWM輸出

#include "debug.h"

/* PWM Output Mode Definition */
#define PWM_MODE1    0
#define PWM_MODE2    1

/* PWM Output Mode Selection */
#define PWM_MODE    PWM_MODE1
//#define PWM_MODE     PWM_MODE2

void TIM1_PWMOut_Init(uint16_t arr, uint16_t psc, uint16_t ccp)
{
    GPIO_InitTypeDef        GPIO_InitStructure = {0};
    TIM_OCInitTypeDef       TIM_OCInitStructure = {0};
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    TIM_TimeBaseInitStructure.TIM_Period = arr;
    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure);

#if(PWM_MODE == PWM_MODE1)
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

#elif(PWM_MODE == PWM_MODE2)
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;

#endif

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = ccp;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);

    TIM_CtrlPWMOutputs(TIM1, ENABLE);
    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable);
    TIM_ARRPreloadConfig(TIM1, ENABLE);
    TIM_Cmd(TIM1, ENABLE);
}

int main(void)
{
    uint8_t i = 0, d = 0;
    Delay_Init();
    USART_Printf_Init(115200);
    printf("SystemClk:%d\r\n", SystemCoreClock);

    TIM1_PWMOut_Init(255, 72 - 1, i);

    while(1)
    {
        Delay_Ms(10);
        if (d == 0)
        {
            TIM_SetCompare1(TIM1, i++);
            if (i == 255) d = 1;
        }
        else
        {
            TIM_SetCompare1(TIM1, i--);
            if (i == 0) d = 0;
        }
    }
}

參考


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 回顧總結 到目前為止,Spring源碼中AbstractApplicationContext#refresh方法的已經解讀到第11個方法finishBeanFactoryInitialization,前10個方法介紹了: BeanFactory的準備,創建,刷新,個性化BeanFactory的擴展點 ...
  • package com.oop.demo06;public class Person { public void run(){ System.out.println("run"); }} package com.oop.demo06;public class Student extends Pers ...
  • 1、前言 好久沒有更新博客了,最近沒什麼假期,但是卻比以前還忙!工作、工作、工作,就像趕集似的,聚在一起。這個上海啥時候才能解封困在這裡暗無天日的。早點解封出去看看想見的人的人,做做該做的事。工作中有那麼一個需求客戶想要通過自己選擇列表的checkbox然後下載所選列表裡面的圖片,圖片我們是存在圖片 ...
  • 一 什麼是轉換 轉換是接受一個類型的值並使用它作為另一個類型的等價值的過程。 下列代碼演示了將1個short類型的值強制轉換成byte類型的值。 short var1 = 5; byte var2 = 10; var2 = (byte) var1; //強制轉換,將var1的值轉換成byte類型 二 ...
  • VS2019如何把項目部署和發佈 這裡演示:通過IIS文件publish的方式部署到Windows本地伺服器上 第一步(安裝IIS) 1.在自己電腦上搜索Windows功能里的【啟用或關閉Windows功能】 2.配置Internet Information Services 3.然後點擊確認就OK ...
  • 1、回調函數 關於回調函數,在之前的文章《回調函數》已經詳解講解過了,這個文章不再講解,不太懂的同學請看之前的文章《回調函數》。在之前講解回調函數中就使用串口作為示例,使用回調函數可以方便封裝通訊庫,晶元/模塊廠家的SDK和部分開源庫經常這樣做,這樣可以實現模塊間的解耦,模塊化編程。 這篇文章主要講 ...
  • 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是i.MXRT1xxx系列MCU時鐘相關功能引腳作用。 如果我們從一顆 MCU 晶元的引腳分類來看晶元功能,大概可以分為三大類:電源、時鐘、外設功能。作為嵌入式開發者,大部分時候關註得都是外設功能引腳,而對於時鐘相關引腳往往不太在意,其實 ...
  • Linux小白,可能描述的不規範,請見諒 事情經過 有一次我樹莓派由於某種原因導致桌面某個組件卡死,於是我就在跳出的“未響應”(類似windows的No Response視窗)點擊'End Process'後,桌面的菜單欄還在,但是圖標不見了。 這時我右鍵點擊桌面,發現右鍵菜單與之前截然不同(應該是 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...