网络知识 娱乐 感芯MC3172开发板入门(一)

感芯MC3172开发板入门(一)

文章目录

  • 前言
  • 1. 目的
  • 2. 资料说明
  • 3. 实验
    • 3.1 测试GPIO功能
    • 3.2 uart测试
    • 3.3 体验多线程并行
  • 4. 反思和体验
  • 后续

前言

前段时间,在群里看到MC3172芯片,具有硬件多线程实现的功能,也就是说如果使用了这款芯片,那么就可以摆脱单片机那种RTOS的线程调度问题,不用考虑资源占用问题。

重点是这款芯片还可以免费申请,我也挺好奇如何实现的,就去申请体验了一下,4天左右就寄到了,到了周末正好可以玩一下。

1. 目的

  1. 尝试一下这种硬件多线程开发模式体验如何?
  2. 最好能深入理解一下这个硬件多线程的实现机制。
  3. 紧跟潮流,不落伍。

2. 资料说明

官网资料: 感芯科技

将开发资料全部下载即可,按照说明将软件进行安装。

下载好后,打开软件包里的demo工程,如下图目录:
在这里插入图片描述
接下来对main函数进行操作,实现简单的功能。

3. 实验

3.1 测试GPIO功能

目前此款芯片还处于研发初期,外设较少,所以这里简单的进行演示。

将GPIO_GPCOM_TIMER_Example.c文件中的GPIO操作进行复制,稍作改变,实现一个对GPIO的读取和输出。
代码如下:

// gpio测试,gpio_sel为任意一个gpio组,其值在MC3172.h中定义
void GPIO_TEST(u32 gpio_sel)
{
	// 使能对应的时钟
    INTDEV_SET_CLK_RST(gpio_sel,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2));

	// 设置pin7为输出,pin11为输入
    GPIO_SET_OUTPUT_EN_VALUE(gpio_sel,(GPIO_PIN7),GPIO_SET_ENABLE);
    GPIO_SET_INPUT_EN_VALUE(gpio_sel,(GPIO_PIN11),GPIO_SET_ENABLE);

	// 这里先输出高电平看一下现象
    GPIO_SET_OUTPUT_PIN_TO_1(gpio_sel,(GPIO_PIN7));

    while(1)  {
    	// 读取这组的GPIO电平值
        u16 rx_data;
        rx_data=GPIO_GET_INPUT_VALUE_SAFE(gpio_sel);
		
		// 延时
        for (u32 var = 0; var < 5000; ++var) {
            NOP();
        }

		// 判断pin11引脚电平高低,如果高电平,则PIN7输出高电平;反之,输出低电平
        if(rx_data & (1<<11))
        {
            GPIO_SET_OUTPUT_PIN_TO_1(gpio_sel,(GPIO_PIN7));
        }
        else
        {
            GPIO_SET_OUTPUT_PIN_TO_0(gpio_sel,(GPIO_PIN7));
        }
        
		// 延时
        for (u32 var = 0; var < 5000; ++var) {
            NOP();
        }
    }
}

// 在线程中调用这个“任务”
void thread0_main(void)
{
    while(1){
        GPIO_TEST(GPIOD_BASE_ADDR);
    }
    thread_end();
}

实验现象: PIN7跟随PIN11的电平高低进行变化。

3.2 uart测试

同理,对uart进行测试,
代码如下:

// 此函数是将对应GPCOM口的P2作为RX,P3作为TX;具体选择那个GPCOM口,可以在头文件中定位
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));
    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 
                      ));

    GPCOM_SET_COM_MODE(gpcom_sel,GPCOM_UART_MODE);

	// 设置波特率为115200
    GPCOM_SET_COM_SPEED(gpcom_sel,12000000,115200);

    GPCOM_SET_OVERRIDE_GPIO(gpcom_sel, ( 
            GPCOM_P2_OVERRIDE_GPIO|GPCOM_P2_INPUT_ENABLE | 
            GPCOM_P3_OVERRIDE_GPIO 
                                              ));
#ifdef TEST_ONLY_UART_TX
	// 如果定义了这个宏,会一直输出0x31
    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);
    while(1) {
         if(rx_data_rp!=(GPCOM_GET_RX_WP(gpcom_sel))){
              rx_data=GPCOM_GET_RX_DATA(gpcom_sel,rx_data_rp);
              GPCOM_PUSH_TX_DATA(gpcom_sel,rx_data);
              rx_data_rp++;
              rx_data_rp&=0x0f;
         }
    }
#endif
}

// 注意:这里是thread1,thread0可以保持不动,相当于有2个任务在执行!
void thread1_main(void)
{
    while(1){
        GPCOM_UART_EXAMPLE(GPCOM4_BASE_ADDR); // 选择PB2,PB3,可看手册或者下图所示;
    }
    thread_end();
}

下图可以看出,将GPCOM4的基地址写入,就是PB2,PB3;当然也可以按照需求进行更改(这里的GPCOM可以选择任意功能):
在这里插入图片描述

3.3 体验多线程并行

一种很简单的方法,就是再来一组GPIO进行3.1的测试,如果按照以前单片机的开发模式,在线程1死等时,是无法执行其他线程的,这里就可以进行实现:
代码如下:

// 只添加这部分
void thread2_main(void)
{
    while(1){
    	// 添加PA7,PA11作为另一个测试,然后将PA11和PD11进行短接,然后拉低拉高即可
        GPIO_TEST(GPIOA_BASE_ADDR);
    }
    thread_end();
}

现象:PA7和PD7会同时拉高拉低,可以使用过万用表或者逻辑分析仪进行测试。

4. 反思和体验

这款芯片如果价格下来,绝对可以打败大部分现在的MCU的。

他更容易进行任务级别的应用开发,而不用考虑多线程之间的调度问题。也不像裸机开发一样到处设置标志位。

后续

后续还会继续研究其功能,看看有没有项目可以运行在上面。

未完待续…