前言

本人在抖音上有刷到过可以免费申请CH32开发板(自己付邮费),由于工作上用的大多都是GD32以及STM32,CH32之前也有听闻但没实操过,看了一下产品介绍,cortex-m系列的感觉没有像尝试的但是他家RISC-V 系列的还是挺吸引人的,因为从价格上对比他的丰富外设还是蛮厉害的(支持国产!!!!!!!!),于是申请了一个CH32V307RCT6的开发板来玩玩。

样品申请

直接去官网进行,里面有按高校申请或者按公司申请,自己填完信息慢慢等待就行,应该是会有销售工程联系你。

材料准备

  • GD32V307RCT6开发板
  • WCH-LINK
  • typec数据线

在这里插入图片描述

环境搭建

直接去官网上喜提大礼包
找到你自己芯片的系列以及型号
在这里插入图片描述
我这里是CH32V307RCT6
在这里插入图片描述
点进去之后一直往下翻找到开发资料
在这里插入图片描述
第一个是原理图资料
第二个是相关例程
第三个是开发软件
选择下载按钮
在这里插入图片描述
我这里直接下载的是MRS2,两者区别我还没去针对了解过,现在了比较新的

在这里插入图片描述
下载完了之后直接双击安装程序就行了,更改安装路径后一路next就行
在这里插入图片描述

例程创建

小插曲

当下载完这个压缩包之后
在这里插入图片描述
我发下那里面你有好多官方例程
在这里插入图片描述
就直接拿了个freertos的例子用mounriver studio 打开了,也没注意直接点了编译结果报错了,具体原因是好多文件没找到,我仔细看了一下,发现连光放的固件库都没有,奇了怪了,于是我在这个压缩包里面你找了半天都没有找到,然后去官网上也没有专门的下载包。后来经过查阅这个mounriver studio 自带生成例程就包含全部的文件了
点击file 新建一个项目就行
在这里插入图片描述
这边会生成一个可编译下载的完整工程,单独跑这个或者把之前工程缺德文件自行添加进去就完事了(这里就不做演示了)

汉化

如果想汉化 直接点击help----->language---->简体中文就行了
在这里插入图片描述
这里个人建议还是用英文的吧(以后不是所有软件IDEA都能汉化的而且在linux环境下如果把终端都汉化了,其实有些报错你复制去谷歌的话,反而英文的报错能够更加精准的找到)纯看个人喜好!!!

例程编译下载

官方自己送了单独的烧录器但是我看开发板上自带了烧录器,所以直接接typec数据线就行,电脑上wch-link驱动在安装mounrRiver Studio就下载了,会自动识别成功。

确认能识别到芯片

点击tool选择烧录器WCH-LINK
在这里插入图片描述
直接点击get就能看到连接成功了
在这里插入图片描述
确保你的例程能编译没问题就嫩下载了
在这里插入图片描述

源码

就用例程测一下led灯

/********************************** (C) COPYRIGHT *******************************
* File Name          : main.c
* Author             : WCH
* Version            : V1.0.0
* Date               : 2021/06/06
* Description        : Main program body.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for 
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/

/*
 *@Note
 *task1 and task2 alternate printing
 */

#include "debug.h"
#include "FreeRTOS.h"
#include "task.h"

/* Global define */
#define TASK1_TASK_PRIO     5
#define TASK1_STK_SIZE      256
#define TASK2_TASK_PRIO     5
#define TASK2_STK_SIZE      256

/* Global Variable */
TaskHandle_t Task1Task_Handler;
TaskHandle_t Task2Task_Handler;


/*********************************************************************
 * @fn      GPIO_Toggle_INIT
 *
 * @brief   Initializes GPIOA.0/1
 *
 * @return  none
 */
void GPIO_Toggle_INIT(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure={0};

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}


/*********************************************************************
 * @fn      task1_task
 *
 * @brief   task1 program.
 *
 * @param  *pvParameters - Parameters point of task1
 *
 * @return  none
 */
void task1_task(void *pvParameters)
{
    while(1)
    {
        printf("task1 entry\r\n");
        GPIO_SetBits(GPIOA, GPIO_Pin_0);
        vTaskDelay(250);
        GPIO_ResetBits(GPIOA, GPIO_Pin_0);
        vTaskDelay(250);
    }
}

/*********************************************************************
 * @fn      task2_task
 *
 * @brief   task2 program.
 *
 * @param  *pvParameters - Parameters point of task2
 *
 * @return  none
 */
void task2_task(void *pvParameters)
{
    while(1)
    {
        printf("task2 entry\r\n");
        GPIO_ResetBits(GPIOA, GPIO_Pin_1);
        vTaskDelay(500);
        GPIO_SetBits(GPIOA, GPIO_Pin_1);
        vTaskDelay(500);
    }
}

/*********************************************************************
 * @fn      main
 *
 * @brief   Main program.
 *
 * @return  none
 */
int main(void)
{

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	SystemCoreClockUpdate();
	Delay_Init();
	USART_Printf_Init(115200);
		
	printf("SystemClk:%d\r\n",SystemCoreClock);
	printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
	printf("FreeRTOS Kernel Version:%s\r\n",tskKERNEL_VERSION_NUMBER);

	GPIO_Toggle_INIT();
	/* create two task */
    xTaskCreate((TaskFunction_t )task2_task,
                        (const char*    )"task2",
                        (uint16_t       )TASK2_STK_SIZE,
                        (void*          )NULL,
                        (UBaseType_t    )TASK2_TASK_PRIO,
                        (TaskHandle_t*  )&Task2Task_Handler);

    xTaskCreate((TaskFunction_t )task1_task,
                    (const char*    )"task1",
                    (uint16_t       )TASK1_STK_SIZE,
                    (void*          )NULL,
                    (UBaseType_t    )TASK1_TASK_PRIO,
                    (TaskHandle_t*  )&Task1Task_Handler);
    vTaskStartScheduler();

	while(1)
	{
	    printf("shouldn't run at here!!\n");
	}
}

实验结果

理论上是两个灯闪烁(LED1 LED2),结果我烧录后一点反应没有,按了复位键也没有,怀疑是不是这个例程的gpio和我的板子上的对不上,于是去看了下原理图
在这里插入图片描述
在这里插入图片描述
原来这两个灯都是空接没有直接引到芯片的引脚上。

解决办法

自己拿杜邦线引一下就完事了
在这里插入图片描述
这里没接串口想要验证串口可自行尝试!

总结

个人感觉环境安装巨容易没啥坑队小白都很友好(后期还是要在clion上搞出来毕竟clion太香了),感觉那个官方例程包里面有些文件没有应该提示下,可能也是我自己没找到。总之 点灯成功 准备吃灰!!!!!!看着他的网口还是很有搞头的!!!!

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐