【感芯科技MC3172开发板体验】MC3172开发板一种便捷的多线程开发新途径 - RISC-V MCU技术社区 - 电子技术论坛 - 广受欢迎的专业电子论坛
分享 收藏 返回

xcs101 关注 私信

【感芯科技MC3172开发板体验】MC3172开发板一种便捷的多线程开发新途径

开发板展示

经过一天的捣鼓,总算把MC3172并行多线程实时处理器的开发整明白了。

首先需要准备的开发环境如下:

  • 线程配置工具_V1

  • 开发板程序下载_v1.2

  • MounRiver Studio

    软件的安装就不说了,具体可以在官网找到相关说明。
    MC3172芯片资料合集稳定版 - - - 厦门感芯科技有限公司 (gxchip.cn)

    目前,遇到比较不顺手的是板载的下载器是用CH32V203做的GX_LINK,不过该下载器没有在线编程功能,也不支持虚拟串口,官方也没提供固件源码,用起来不是很方便。希望后面会进一步升级。

认识开发板,首先从引脚入手,选择我们想要的外设引脚进行连接,或者找到板载资源的相关引脚。

IO管脚图.jpg

这里借用@XMGroupe.大神的图,大家可以去看看他的帖子。[XMG助力国产]MC3172核心板管脚图美化版 / 感芯科技 / WhyCan Forum(哇酷开发者社区)

这里我通过点灯来验证环境的搭建是否正确。
image.png

打开原理图,找到板载LED的引脚PD8,一会要实现的就是对PD8的控制。

接下来使用MounRiver Studio打开工程,这里只能用官方提供的工程文件打开,MounRiver Studio是找不到这个芯片的。
image.png

我们找到thread_config.h,一会要用到线程配置工具_V1进行配置,上图是设置后的图。还没配置的兄弟可以先截图,和一会配置好后进行对比。
屏幕截图 2023-05-27 220429.png

这里我先配置4个进程,如图所示,至于设置的方案可以参考*附件:并行多线程处理器MC3172开发极简指南(1).pdf

点击生成代码就会看到左侧的数据变化。

然后我们就可以打开熟悉的main.c文件了
image.png

每个线程可以有一个main函数,到这里是不是能悟到多任务变成在这个单片机上的开发即将变得很容易。

没错,只要把前面的线程配置好,这里直接写任务程序就可以,不用担心任务之间的相互干扰,担任是指一个线程一个任务。

废话不多说,先讲下IO口 的配置程序

INTDEV_SET_CLK_RST(GPIOD_BASE_ADDR,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2));
GPIO_SET_OUTPUT_EN_VALUE(GPIOD_BASE_ADDR,(GPIO_PIN8),GPIO_SET_ENABLE);

INTDEV_SET_CLK_RST这个函数是用来启动外设的,一般修改第一个参数就可以,比如我这里用的是GPIOD口就写成GPIOD_BASE_ADDR,如果是GPIOA口就写成GPIOA_BASE_ADDR;其他两个参数是设置外设使用的时钟频率以及特权组,特权组是什么还没搞明白,希望有大神在下面指点迷津。

GPIO_SET_OUTPUT_EN_VALUE这个函数是用来将GPIO口输出使能的;

GPIO_SET_OUTPUT_PIN_TO_1(GPIOA_BASE_ADDR,(GPIO_PIN2|GPIO_PIN15|GPIO_PIN11));

这个函数用于把指定管脚输出 1,同时不影响其他管脚值。

函数 GPIO_SET_OUTPUT_PIN_TO_0 用于输出 0;

函数GPIO_SET_OUTPUT_PIN_INV 用于输出值取反。

另外还提供了GPIO_SET_OUTPUT_PIN_VALUE(GPIOA_BASE_ADDR,(GPIO_PIN3|GPIO_PIN12|GPIO_PIN5),0xabcd);用于把指定管脚输出特定值,注意值得每个 bit 对应 GPIO 的每个管脚,同时不影响未选择的管脚值

其他关于GPIO的函数还有读取的:

GPIO_GET_INPUT_VALUE_SAFE(GPIOA_BASE_ADDR);

GPIO_GET_INPUT_VALUE_FAST(GPIOA_BASE_ADDR);

具体内容用途开发指南就有这里就不继续说明了。
*附件:并行多线程处理器MC3172开发极简指南(2).pdf

下面我用一个闪烁的灯对比来让大家感受下多线程的区别,见下方视频。
代码1

void thread0_main(void)
{
    //PD8_LED引脚初始化
    INTDEV_SET_CLK_RST(GPIOD_BASE_ADDR,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2));
    GPIO_SET_OUTPUT_EN_VALUE(GPIOD_BASE_ADDR,(GPIO_PIN8),GPIO_SET_ENABLE);
    while(1){
        //user code section
        //GPIO_EXAMPLE(GPIOA_BASE_ADDR);

        //PD8_LED引脚反转
        GPIO_SET_OUTPUT_PIN_INV(GPIOD_BASE_ADDR,(GPIO_PIN8));
        for (u32 var = 0; var < 500000; ++var) {
                   NOP();
        }
    }
    thread_end();
}

代码2

void thread2_main(void)
{
    //PD8_LED引脚初始化
    INTDEV_SET_CLK_RST(GPIOD_BASE_ADDR,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2));
    GPIO_SET_OUTPUT_EN_VALUE(GPIOD_BASE_ADDR,(GPIO_PIN8),GPIO_SET_ENABLE);
    while(1){
        //user code section
        //GPIO_EXAMPLE(GPIOA_BASE_ADDR);

        //PD8_LED引脚反转
        GPIO_SET_OUTPUT_PIN_INV(GPIOD_BASE_ADDR,(GPIO_PIN8));
        //更改延时计数,减慢闪烁
        for (u32 var = 0; var < 5000000; ++var) {
                   NOP();
        }
    }
    thread_end();
}

下个月得去培训,等培训完在讲讲串口的那些事

代码演示

更多回帖

×
发帖