MCU,传感器等嵌入式设备如何自动化测试

简介

在嵌入测试领域,自动化测试一直是一个难点。尤其对于MCU来说,由于外设众多且上位机(PC)无法直接模拟电信号来测试其外设,自动化测试的难度进一步增加。为解决这一问题,本文提供了一种基于上位机和辅助板(AUX BOARD)的测试方案,并以MCU测试为例

理论上该方案灵活变通后也可用于各传感器的自动化测试

上位机与辅助板通信

上位机通过串口将指令发送给辅助板,辅助板通过RTOS接收并解析。这是关键步骤。当MCU集成了RT-thread环境后,串口中会运行一个类似Linux的shell环境。

shell打印示例如下:

用户可以通过代码中的宏函数将特定指令导入到shell中。

MSH_CMD_EXPORT_ALIAS

例如:

MSH_CMD_EXPORT_ALIAS(i2c_test, i2c, cmd is for testing i2c) 

此示例代码包含三个参数:

  1. 函数指针
  2. shell中的命令
  3. 提示符

当串口接收到i2c命令后,将跳转到i2c_test函数执行。在该函数内,会创建一个线程来运行特定功能代码。

RT-thread的shell指令允许接收参数,函数指针也有两个固定参数:

void i2c_test(int argc, char *argv[]); 

这是上文提到的i2c指令对应的函数。argc是参数数量,argv是一个字符串数组。例如,串口接收到如下指令:

i2c --host master 

此时

argc=3argv[3] = {“i2c”, “--host”, “master”}

i2c_test函数中,通过判断接收到的参数,可以将串口中的信息反映到外设配置上。

示例代码

void i2c_test(int argc, char *argv[])
{
      rt_thread_t i2c_thread = RT_NULL;
          
     typedef struct {
        uint8_t index;
        char host[32];
        char speed[32];
        uint8_t address;
        uint8_t sumbus_en;
      }thread_i2c_param_t;

      thread_i2c_param_t *params;

      for (int i = 1; i < argc; i++) {
          if (strcmp(argv[i], "--index") == 0 && i + 1 < argc) {
            params->index = atoi(argv[i + 1]);
            i++;
           } 
         else if (strcmp(argv[i], "--host") == 0 && i + 1 < argc) {
            strncpy(params->host, argv[i + 1], sizeof(params->host) - 1);
            params->host[sizeof(params->host) - 1] = '\0';
            i++;
          }
        else if (strcmp(argv[i], "--speed") == 0 && i + 1 < argc) {
            strncpy(params->speed, argv[i + 1], sizeof(params->speed) - 1);
            params->speed[sizeof(params->speed) - 1] = '\0';
            i++;
          }
        else if (strcmp(argv[i], "--address") == 0 && i + 1 < argc) {
            params->address = atoi(argv[i + 1]);
            i++;
          }
        else if (strcmp(argv[i], "--sumbus_en") == 0 && i + 1 < argc) {
            params->sumbus_en = atoi(argv[i + 1]);
            i++;
        }
        }
      i2c_thread = rt_thread_create("i2c", start_i2c, params, 4096, 24, 10);
      if (i2c_thread != RT_NULL)
          {
             rt_thread_startup(i2c_thread);
          }
}

在上图所示的示例代码中,允许通过串口指定i2c的地址、主从身份、通信速率等配置,并将这些参数传递给i2c的初始化函数start_i2c。这样,可以非常灵活地通过串口动态配置辅助板运行的i2c设备。

需要特别提及的是“index”参数。本方案支持一块辅助板挂载多块待测板,只要辅助板的ip数量满足需求,并且树莓派接口中引出的引脚足够多,那么在辅助板内存未被完全占用之前,可以挂载任意数量的待测板。例如,开发板有4个I2C外设,可以将这4个I2C复用到不同的4组引脚上,然后通过index指定要使用哪个I2C设备,实现一对多的测试。

start_i2c函数中,根据RTOS传递的参数,实现相应的驱动逻辑。如果辅助板使用的是STM32,则使用其底层驱动实现I2C初始化,确保初始化后的功能符合需求。

硬件部分的连接情况

对于MCU来说,众多外设往往通过树莓派接口与外部交互。如果通过杜邦线连接辅助板与待测板,不仅可维护性差,而且容易因物理连接问题导致测试失败。因此,可以设计如下转接板来连接辅助板与待测板的树莓派接口。

设计流程大致如下:

  1. 明确辅助板与待测板树莓派接口的每个引脚功能。
  2. 连接测试时需要互联的引脚。

简易的原理图以及实物图如下所示

  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值