前言
逛发烧友社区时,在试用中心看到由厦门感芯科技推出的搭载MC3172芯片的开发板试用资格,然后就心动了,马上申请,通过后不久发烧友就安排了快递寄送(爱了),到手后直接找资料学习起来。
查阅信息
感芯科技第一款32 位 RISC 处理器** MC3172** ,业内首个64线程同步并行运行,线程资源可按需配置,共享代码段空间与数据段空间,硬件级响应,无需中断服务程序,无需实时操作系统。
基于RISC-V RV32IMC 指令集,100%单周期指令,最高200MHz主频,3.37coremark/MHz。
数据段与代码段共享128K字节SRAM,可按需配置为96K代码空间加32K数据空间,或64K代码空间加64K数据空间,或32K代码空间加96K数据空间,灵活应对各种应用场景。
拥有丰富片内外设:12个可配置通信接口,可按需配置为UASRT或SPI或USB或CAN总线形式,满足多通信端口需求;6个双缓冲24位计数器,可提供高精度PWM与输入捕捉;64个GPIO,可提供丰富的自定义控制接口。

实物图:


一、环境搭建及资料下载
1、IDE的下载和安装
因为芯片基于RISC-V RV32IMC 指令集,官方推荐用MounRiver StudioIDE进行开发(支持国货!)
这里直接选择Setup版本,因为有网友说社区版本可能会有些问题(玄学哈!)。

安装没什么说的,换路径,一路next。
IDE界面如图(感觉还不错):

PS:在help可以选择language。

2、MC3172资料
到手新的,未接触过的芯片,收集资料是很重要的,不然就有点无头苍蝇了。
感芯科技官方:MC3172芯片资料合集稳定版

二、线程资源分配及测试代码编写
1、工程模板介绍
解压官方的MC3172工程模板:

打开工程,如图:

文件介绍:
MC3172.h:
一个头文件,主要是类似寄存器地址及一些操作、参数的宏定义;

thread_config.h:
线程配置文件,由线程配置工具生成;

thread_start.c:
启动线程相关文件,根据thread_config.h配置启动线程;

MC3712.lds:
链接脚本,用于指定 ELF 格式目标文件的各个段的起始地址和大小,实现SRAM分配。链接脚本是用于控制可执行文件或共享库生成过程的文本文件。它指定了输入文件的排列顺序、如何将输出文件的各个部分放置到内存中,并定义符号、段的起始和结束地址等信息。

例程:GPIO_GPCOM_TIMER_Example.c

2、进行简单测试
首先进行线程资源的分配(按需):

进行线程资源分配后,会更新./MC3712文件夹下的thread_config.h和thread_start.c文件内容,实现线程分配。
设置了SRAM后,将会更新MC3712.lds这个链接脚本。

之后进行测试代码编写:
PS:本来以为板子上一个LED都没有的,所以就直接用逻辑分析仪去抓数据,后来发现是有LED的!


测试双线程:

////////////////////////////////////////////////////////////
void thread0_main(void)
{
INTDEV_SET_CLK_RST(GPIOD_BASE_ADDR,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2));//使能GPIOD的时钟
GPIO_SET_OUTPUT_EN_VALUE(GPIOD_BASE_ADDR,(GPIO_PIN8|GPIO_PIN10),GPIO_SET_ENABLE);//D8、10口输出使能
while(1){
//user code section
//GPIO_EXAMPLE(GPIOA_BASE_ADDR);
GPIO_SET_OUTPUT_PIN_INV(GPIOD_BASE_ADDR,GPIO_PIN8);//翻转D8电平
Delay();//延时
}
thread_end();
}
////////////////////////////////////////////////////////////
void thread1_main(void)
{
while(1){
//user code section
//GPCOM_UART_EXAMPLE(GPCOM8_BASE_ADDR);
GPIO_SET_OUTPUT_PIN_INV(GPIOD_BASE_ADDR,GPIO_PIN10);//翻转D10电平
Delay();//延时
}
thread_end();
}

3、问题解决
遇到个小问题:
报错:
Error:riscv-none-embed-gcc: not found
解决:添加路径
${eclipse_home}\toolchain\RISC-V Embedded GCC\bin

三、总结
首先感谢发烧友平台跟感芯科技两方提供的开发板评测体验机会,让我接触到了,新的芯片,有了不一样的体验。
对于MC3172芯片,给了我最大的感触,就是简单几步即可实现多线程,相比起RTOS的复杂配置(如:优先级、调度、资源分配等等),简易很多,开发门槛降低了,而且该有的外设都有,是一款很不错的产品。
当然,目前只是简单的测试项目,因为是第一次接触这一类的芯片,新的指令集、IDE,而且芯片手册不像是以往接触的哪些产品那般,按芯片寄存器进行说明的,所以有点不太习惯(吐槽一下注释有点少,得自己慢慢看)。但是有着开发经验,是很容易上手的。后续还有USART、CAN、PWM等等可以玩的,还是可以期待一下,再然后可以基于MC3172开展更多项目,可玩性还是很高的。