CH32V307的新手使用方法

简介: 一篇文章教你如何使用CH32V307来开发一个简单的功能

前言

之前在沁恒微电子官网上申请了块互连型的单片机,芯片的型号是CH32V307,之前在论坛上看到他们说这一块单片机和stm32系列的单片机差不多,正好今天板子到了我试了一下,发现真的和stm32差不多。

很多没有接触过stm32单片机但是白嫖到板子的朋友可能不会用这块板子,所以我就写了一篇文章来给大家介绍一下这块板子如何使用并且能点亮其中的一个LED灯。

一、芯片的介绍

这个板子使用的是CH32V307VCT6芯片,这个是基于青稞32位RISC-V(基于精简指令集计算压力建立的开放指令机构)指令集及架构设计的工业级通用增强型MCU。

其实这个可以去它官网看一下的,这里就不介绍这些内容了,反正你就把它当作一块stm32的单片机就可以了。

二、MounRiver集成开发IDE

这个软件是这个板子配套的,使用这个软件写代码难度低,而且这个文件配套了关于这个板子的WCH-Link一键下载,这样就不用再去下载烧录软件了。

下载的链接:MounRiver Studio

下载完成之后解压文件夹,然后双击里面的安装文件,选择安装目标文件夹,剩下的就随便了,然后会自动打开这个软件的,打开后会进入一个welcome,可以直接关闭,关闭后的样子如下:

img

当然你们没有左边和下面的内容,这个是我刚才测试的。

1.新建工程

打开这个集成开发环境后我们就可以来创建一下工程了,首先在任务栏中选择File选项,然后再选择New,在这里面选择MounRiver Project,选择之后会出现下面的页面:

img

首先是为你的工程取一个名字,在Project Name中现在你这个工程的名字:

img

然后就是项目的保存路径了,这里如果你直接点是没有办法的,因为它启用的是默认的,所以需要将这个默认选项改变为自定义的:

img

首先先取消一下Use solution location这个选项,这样才可以选择自定义的目录,选择的自定义目录一定要记住必要有中文。

然后就开始选择你芯片的型号了,这里要看准你芯片的型号,因为它会将启动文件和所包含的库文件都创建出来:

img

选择完后就可以点击Finish了,然后就开始自动创建,创建完成后在左边就会出现刚才你创建的项目了:

img

这就是创建工程的办法。

2.工程目录

上面创建好工程后大家可能都不知道这些文件是什么东西,这里就给大家一个个的介绍一下。

2.1 Include

首先是Includes文件夹

img

这个是列出你这个工程中导入了哪一些文件或者文件夹。

2.2 Core

这个文件夹中是存放这个单片机的外设文件的

img

2.3 Debug

这个文件夹中是来存放测试使用的一些函数和延迟的,我大概看了一下,在这里面存放了滴答定时器的初始化、毫秒延迟、微秒延迟和串口通讯的函数。

img

2.4 Ld

这个文件存放了一个文件,这个文件应该是有关于启动文件的说明等内容的,我也不清楚,反正必要动

img

2.5 Peripheral

这个文件就是库函数所放置的文件夹了

img

2.6 Startup

这个文件夹是用来存放启动文件的文件夹的。

img

这里面都是汇编语言。

2.7 User

这个是我们写代码的地方,大家在这里面写代码即可

img

在这里面有一个main.c文件,这个就是主函数和我们写代码的地方了,我们的代码都在这里面进行书写

3.书写代码

知道了上面的工程目录后,我们就可以来书写代码了,首先打开main.c文件

img

在这里面会发现,为什么会有这么多东西,其实我们都可以不用管,就嘎嘎写就完事了。

那我们该如何写呢?如果你学过STM32,那这里基本上难不住你,我们要点一个LED等,首先我们先确定一下要点的LED灯在哪个引脚接着的,然后就打开这个端口的时钟,配置GPIO,然后点亮即可。

是不是蛮简单的,那我们就开始来吧。

首先看一下原理图

img

然后再看看它连接的引脚,我找了半天,发现这个板子的LED1和LED2连接到公头上的,我靠,这个是真的恶心

img

也就是说这里需要结一个条线,还好我这有很多,大家没有的话可以在pdd或者淘宝上买一扎跳线,公头,母头都来点,这里我用条线将LED1和PC1相连

img

这里我们就知道了,我们用PC1来控制LED灯的亮灭。

知道了后就可以开始写一下代码了,首先定义一个函数,在函数中首先先定义一个变量,这个变量是:GPIO_InitTypeDef类型的,这个变量是用来初始化引脚的

GPIO_InitTypeDef GPIO_InitStruct = {
   
   0};

然后打开GPIOC的时钟,这里GPIOC的时钟和STM32一样,都是在APB2的,我们直接就可以用打开APB2的方式来打开GPIOC的时钟:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

然后就开始配置GPIOC_1,配置方法和STM32的配置方法一模一样,端口的输出模式也一样,这里不过多解释:

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  // 这里设置为推挽输出方式
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;   // 设置GPIOC1
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;   // 设置输出速度为50MHz

然后就可以调用端口初始化函数进行初始化了:

GPIO_Init(GPIOC, &GPIO_InitStruct);

完整代码如下:

void MX_LED_Init(void){
   
   
    GPIO_InitTypeDef GPIO_InitStruct = {
   
   0};
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStruct);
}

然后在main函数中就可以调用这个函数来进行点灯了。

在main函数中首先需要先调用一下刚才创建的函数,然后在while循环中就可以开始点灯了:

int main(void)
{
   
   
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    SystemCoreClockUpdate();
    Delay_Init();
    MX_LED_Init();    // 刚才创建的函数
    // 下面的串口通讯,不用管
    USART_Printf_Init(115200);    
    printf("SystemClk:%d\r\n",SystemCoreClock);
    printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
    printf("This is printf example\r\n");
    // *****************************************
    while(1)
    {
   
   
        GPIO_WriteBit(GPIOC, GPIO_Pin_1, Bit_RESET);  // 点亮LED灯
    }
}

效果如下:

img

然后再灭了它:

int main(void)
{
   
   
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    SystemCoreClockUpdate();
    Delay_Init();
    MX_LED_Init();    // 刚才创建的函数
    // 下面的串口通讯,不用管
    USART_Printf_Init(115200);    
    printf("SystemClk:%d\r\n",SystemCoreClock);
    printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
    printf("This is printf example\r\n");
    // *****************************************
    while(1)
    {
   
   
        GPIO_WriteBit(GPIOC, GPIO_Pin_1, Bit_SET);  // 点亮LED灯
    }
}

img

感觉太单调了,给它来个闪烁吧:

int main(void)
{
   
   
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    SystemCoreClockUpdate();
    Delay_Init();
    MX_LED_Init();
    USART_Printf_Init(115200);    
    printf("SystemClk:%d\r\n",SystemCoreClock);
    printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
    printf("This is printf example\r\n");

    while(1)
    {
   
   
        GPIO_WriteBit(GPIOC, GPIO_Pin_1, Bit_RESET);
        Delay_Ms(500);
        GPIO_WriteBit(GPIOC, GPIO_Pin_1, Bit_SET);
        Delay_Ms(500);
    }
}

这个拍照拍不出效果,大家自己去搞一下就知道了。

4.烧录代码

写好代码后就需要将代码进行一下烧录进板子了,这里就需要知道一下如何将写好的代码烧录进板子中,首先需要将代码进行编译,编译按钮:

img

这三个按钮都是编译,但是编译的模式不一样,首先第一个按钮是编译修改过的文件,速度比较快。

第二个按钮是编译当前文件,就是当前你打开的文件,可以当调试当前文件中有没有问题。

第三个是将整个工程编译,我个人感觉太慢了,没必要。

编译完后我们就开始用单片机连接电脑,这里需要准备一条Type-C的通讯线,然后将这条线一端连接电脑,一端连接单片机

img

img

然后打开单片机,回到IDE,在IDE中找到这个按钮:

img

但是不能直接点,首先点击那个下箭头,点击Configuration,然后就到达这个页面了

img

在这个页面中有很多按钮,这里给大家一一介绍一下:

第一个大按钮

img

这个是查看你板子的读写是否被锁,如果没有被锁那会出现这样子的提示:

img

如果说你的板子是锁着的,那会出现下面的提示:

img

当你的板子被锁了,那就没有办法进行烧录程序,只能给它解锁。

第二个按钮

img

这个按钮就是将板子的读写给锁住。

第三个就是解锁板子:

img

然后到下面

img

这里是配置下载器的,一开始没有,你要确定你的板子进行开启,然后点击Query,这个就会搜索一下你的板子

img

然后其它的可以不用管了,点击Apply and Close就可以了,然后再点击那个东西即可,这样代码就会烧录就去。

img

出现这个就代表了烧录成功,如果你烧录出现这个情况:

img

这个情况就因为你的单片机锁着的没办法进行烧录。

总结

这块板子和STM32差不多,学会了STM32的标准库开发,基本上这个板子不会很难,只不过就是这个板子需要的外设比较多。

目录
相关文章
|
6天前
|
存储
学习printf的基本用法
学习printf的基本用法
|
6天前
|
算法 Java 测试技术
letcode的使用方法
letcode的使用方法
7 0
|
8月前
visualscope的使用方法
visualscope的使用方法
184 0
visualscope的使用方法
|
6天前
|
Go
Go命令行解析神器入门 - 10分钟上手flag包
Go命令行解析神器入门 - 10分钟上手flag包
52 0
|
10月前
|
Python
对新手来说,一句 Hello World 能有多少坑?
在编程届,有一个不成文的习惯:在教授/学习一门新语言时,会以输出“Hello World”作为第一个代码实例。
|
IDE Apache 开发工具
CH32V307V-EVT-R1 简单上手入门
〇、前言 运气不错,前几天在电子发烧友社区参加每日打卡活动搞到了第一块 RISC-V 的板子。虽然我不是特别熟悉 RISC-V 的相关知识,但既然板子到手了,总不能放着吃灰;所以,接下来会有一段时间,我会更新 RISC-V 的相关内容,以此促进自己来学习 RISC-V 的相关内容。 一、开发板展示以及介绍 首先,先来开个箱,板子长这样,板子非常 nice, 对于这块板子,我在立创商城找到了一份
160 0
|
移动开发 前端开发 JavaScript
|
测试技术
HTMLReport使用2 | HTMLReport使用方法详解
HTMLReport使用2 | HTMLReport使用方法详解
85 0
SkinMagic使用方法完美总结
一直以来总想为自己用VC6做的程序美容一下,于是便找到这款skinmagic,虽然网上有许多关于此软件的使用说明,但实际使用过程中总会遇到一些问题,经过反复摸索和总结,于是便有了此文,希望对您有所帮助。
memmove函数使用方法,案例,注意事项以及自制函数实现memmove函数
memmove函数使用方法,案例,注意事项以及自制函数实现memmove函数
123 0