沁恒单片机开发板开发

前言

之前在沁恒微电子官网上申请了块互连型的单片机,芯片的型号是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的标准库开发,基本上这个板子不会很难,只不过就是这个板子需要的外设比较多。

posted @ 2023-07-21 18:18  Lavender·edgar  阅读(614)  评论(0编辑  收藏  举报