【感芯科技MC3172开发板体验】点灯大师点个灯+UART通讯 - RISC-V MCU技术社区 - 电子技术论坛 - 广受欢迎的专业电子论坛
分享 收藏 返回

郑喜伟 关注 私信

【感芯科技MC3172开发板体验】点灯大师点个灯+UART通讯

一、线程资源分配

使用线程配置工具_V1.exe分配各线程的运行速度和栈空间

最大主频1/4,最小主频1/1024;
image.png

如图128K BYTE存储空间分了代码存储器和数据存储器各64K;

时钟源选择外部无源晶振;(开发板自带48M晶振,即主频48M)

开启了线程0、1、2、3共4各线程,每个线程占1/4主频,即运行速度12M,线程栈空间都分配128bytes.然后点击生成代码。生成thread_config.h、MC3172.lds两个文件,

二、MounRiver Studio 下载安装

MounRiver Studio 下载地址:

http://www.mounriver.com/download

三、MounRiver Studio 工程,

开发资料里有建好的工程,我就直接用了,就没有再创建工程。

四、个人代码编写。

在./USER_CODE/main.c里对应的 threadn_main 函数中实现自己的代码

我配置了0、1、2、3四个线程。但是我只用了0、1这两个线程。

参考GPIO_GPCOM_TIMER_Example.c调用各个外设和接口。

thread0_main 里实现对LED1来个闪烁,点灯大师开始点灯。

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_PIN_15_8),GPIO_SET_ENABLE); //使能GPIO输出
    while(1){
        GPIO_SET_OUTPUT_PIN_INV(GPIOD_BASE_ADDR,GPIO_PIN8); //翻转GPIO输出值
        for (u32 var = 0; var < 12000000; ++var) {
                   NOP();  //延时   线程频率12M,一次NOP停止线程一个机器周期。
               }

        //user code section
        //GPIO_EXAMPLE(GPIOA_BASE_ADDR);
    }
    thread_end();
}

上述代码实现1S翻转一次 PD8; 查看原理图可以得知LED 接到PD8;

thread1_main来玩玩UART,在GPIO_GPCOM_TIMER_Example.c里面有现成的UART例子 GPCOM_UART_EXAMPLE,就直接调用了,懒得自己写了,

void GPCOM_UART_EXAMPLE(u32 gpcom_sel)
{
    INTDEV_SET_CLK_RST(gpcom_sel,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV4));  //启动外设

    GPCOM_SET_IN_PORT(gpcom_sel,(GPCOM_RXD_IS_P2));  //设置P2为输入
    GPCOM_SET_OUT_PORT(gpcom_sel,( \\
            GPCOM_P0_OUTPUT_DISABLE|GPCOM_P3_OUTPUT_ENABLE|GPCOM_P2_OUTPUT_DISABLE|GPCOM_P1_OUTPUT_DISABLE| \\
            GPCOM_P0_IS_HIGH       |GPCOM_P3_IS_TXD       |GPCOM_P2_IS_HIGH       |GPCOM_P1_IS_HIGH \\
                      ));  //设置P3输出引脚

    GPCOM_SET_COM_MODE(gpcom_sel,GPCOM_UART_MODE);  //设置工作模式

    GPCOM_SET_COM_SPEED(gpcom_sel,12000000,115200);  // 设置波特率   刚好线程频率12M

    GPCOM_SET_OVERRIDE_GPIO(gpcom_sel, ( \\
            GPCOM_P2_OVERRIDE_GPIO|GPCOM_P2_INPUT_ENABLE | \\
            GPCOM_P3_OVERRIDE_GPIO \\
                                              )); //设置串口映射GPIO
#ifdef TEST_ONLY_UART_TX
    while(1){
        while(GPCOM_TX_FIFO_FULL(gpcom_sel));
        for (u32 var = 0; var < 90; ++var) {
            NOP();
        }
        GPCOM_PUSH_TX_DATA(gpcom_sel,0x31);
    }

#else
    u8 rx_data_rp=0;
    u8 rx_data=0;
    rx_data_rp=GPCOM_GET_RX_WP(gpcom_sel);  //读取RX
    while(1) {
         if(rx_data_rp!=(GPCOM_GET_RX_WP(gpcom_sel))){
              rx_data=GPCOM_GET_RX_DATA(gpcom_sel,rx_data_rp);  //读取RX
              GPCOM_PUSH_TX_DATA(gpcom_sel,rx_data);  //TX发送
              rx_data_rp++;
              rx_data_rp&=0x0f;
         }
    }
#endif
}

void thread1_main(void)
{
    GPCOM_UART_EXAMPLE(GPCOM3_BASE_ADDR);
    while(1){
        //user code section
        //GPCOM_UART_EXAMPLE(GPCOM8_BASE_ADDR);
    }
    thread_end();
}

如上代码所示,配置了UART COM3,把COM_P2设为RX,COM3_P3设为TX;代码实现的功能是把输入的内容原封不动的丢回去。

查看感芯MC3172手册_V1.11得知:

COM3_P2----------PA14

COM3_P3----------PA15
image.png

查看IO排序图得知开发板 PA14,PA15,GND的位置。

接线:

PA14-----接-----串口模块TX

PA15-----接-----串口模块RX

GND-----接-----串口模块GND

交叉接法。
image.png

接上串口模块,用串口助手调试。
3d0f147e4292c34116d8c3a7b933434.jpg
625d1834be402548df9cce9254307f0.png

如上图,串口助手发啥,模块就回啥,好的,UART调试成功了。

试用很成功!

MC3172是一款很棒的MCU,业内首个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,可提供丰富的自定义控制

接口。

更多回帖

×
发帖