Eurasia32 发表于 2022-7-31 00:06

[国民技术N32WB452测评]三.硬件触控调试及DVP采集图像

本帖最后由 Eurasia32 于 2022-7-31 00:06 编辑

<ol>
        <li>TSC(触摸传感器控制)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;
        <ol>
                <li>N32WB452所带TSC支持电容式触控功能,最大支持18通道,各通道课单独使能。在该开发板上带有四个触控按键,为TSC Channel 16-19,分别对应PC10-12和PD2。&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</li>
                <li>在开发板所附SDK中提供了底层驱动,用户开发时只需关注顶层函数的调用与实现即可。</li>
                <li>触控的主要实现流程如下:
                <ol>
                        <li>定义并实现回调函数(tsc_alg_isr_callback())</li>
                        <li>使用tsc_alg_need_sramsize()函数获取SRAM资源大小以及BUF</li>
                        <li>定义并实现初始化函数,其中包括TIMER,通道列表等的初始化,以及tsc_alg_init()函数与tsc_alg_start()函数的调用</li>
                        <li>当有触摸时调用回调函数,实现其中定义功能</li>
                </ol>
                </li>
                <li>运行例程: \examples\TSC\TSC_Lib_demo
                <ol>
                        <li>回调函数实现:
                        <pre>
<code>int32_t tsc_alg_isr_callback(tsc_alg_type type, uint32_t event, uint32_t chn, uint32_t value)
{
//    uint32_t wakeup_type;
    uint8_t cnt = 0;

    if (type == TSC_ALG_BUTTON_TYPE)
    {
      if (event == TSC_PRESS_KEY_NORMAL) {//正常按键操作
            for (cnt = 0; cnt &lt; 4; cnt++)
            {
                if (chn == gtsc_list.chn)
                {
                  log_debug("Key [%x] press %d\r\n", gtsc_list.chn, value);
                  if (value)
                  {
                        GPIO_SetBits(LedPort,LedPin);
                  }
                  else
                  {
                        GPIO_ResetBits(LedPort,LedPin);
                  }
                }
            }
      }
    }
    return TSC_SUCCESS;
}</code></pre>
                        &nbsp;</li>
                        <li>初始化函数定义及实现(包括获取sram大小):
                        <pre>
<code>int32_t app_touch_init(void)
{
    int32_t ret;
    uint32_t totals_chn, size;
    TSC_AlgInitTypeDef TSC_AlgStructure = {0};

    //获取总通道数
    totals_chn = sizeof(gtsc_list) / sizeof(gtsc_list);

    //打印触控算法版本
    log_info("tsc version = %s.\r\n", tsc_alg_get_version());

    //判断通道数所需要的SRAM资源是否足够
    size = tsc_alg_need_sramsize(totals_chn);
    if(!size)
    {
      log_error("Get ram size error!\r\n");
      return TSC_SOURCE_NOT_ENOUGH_ERR;
    }
    else if(sizeof(TscKey.sram) &lt; size)
    {
      log_error("Sram is too small,(%d)chn need ram %d,but support size is %d\r\n",totals_chn, size, sizeof(TscKey.sram));
      return TSC_SOURCE_NOT_ENOUGH_ERR;
    }
    else
    {
      log_info("tsc_alg_need_sramsize ok:size=%d\r\n",size);
    }

    //初始化触控模块及BUF
    TSC_AlgStructure.TIMx               = TIM2;
    TSC_AlgStructure.DMAyChx            = DMA1_CH5;
    TSC_AlgStructure.DMARemapEnable   = 1;
    TSC_AlgStructure.pTScChannelList    = (TSC_AlgInitThreValue*)gtsc_list;
    TSC_AlgStructure.AutoCalibrateTimer = 1000;                //覆盖物的自动校准时间1000ms
    TSC_AlgStructure.ResistDisturbLev   = TSC_RESIST_DIS_LEV0; //抗干扰等级。装配成品后建议加亚克力,并配置为TSC_RESIST_DIS_LEV1
    TSC_AlgStructure.pTscSramAddr       = (uint8_t*)(TscKey.sram);
    TSC_AlgStructure.TscSramSize      = sizeof(TscKey.sram);
#ifdef THRE_TOUCHDATA_DEBUG //监控模式下设定log缓存空间
    TSC_AlgStructure.LogBuf             = (uint16_t*)(TscKey.LogBuf);
    TSC_AlgStructure.LogBufSize         = sizeof(TscKey.LogBuf) / sizeof(TscKey.LogBuf);
#endif
    TSC_AlgStructure.Stop2Data             = (uint8_t *)gTscStop2Data;
    TSC_AlgStructure.Stop2DataSize         = sizeof(gTscStop2Data);
    ret                                 = tsc_alg_init(&amp;TSC_AlgStructure);
    if (ret != TSC_SUCCESS)
    {
      log_error( "tsc_alg_init errcode = %x.\r\n", ret);
      return ret;
    } else {
      log_info("tsc_alg_init ok.\r\n");
    }

    //启动触控开始工作
    ret = tsc_alg_start();
    if (ret != TSC_SUCCESS)
    {
      log_error( "errcode = %x.\r\n", ret);
      return ret;
    }
    else
    {
      log_info("tsc_alg_start ok.\r\n");
    }

    return ret;
}</code></pre>

                        <p>&nbsp;</p>
                        </li>
                        <li>编译并运行后,从串口调试助手可以看到运行结果,同时观察开发板上LED亮灭情况可以得知对应关系如下:T3-D1,T4-D10,T5-D11,T6-D12,串口助手情况如下图:
                        <p style=""></p>

                        <p style=""></p>

                        <p style="">由此看出该例程运行正常。</p>

                        <p>&nbsp;</p>
                        </li>
                </ol>
                </li>
        </ol>
        </li>
        <li>DVP
        <ol>
                <li style="">该开发板提供了一个DVP接口,可以用于外接摄像头。</li>
                <li style="">例程: \examples\DVP\Camera
                <ol>
                        <li>
                        <p style="">该例程实现了驱动GC0803摄像头并通过DMA控制器传输读取数据,由于手头暂时没有LCD屏幕,故仅观察串口调试助手,正常工作时每隔约1s会将采集一次摄像头数据并输出提示信息。</p>

                        <p style="">编译并运行后,打开串口调试助手,可以看到如下界面:</p>

                        <p style=""> &nbsp;</p>

                        <p style="">说明摄像头运行正常。</p>
                        </li>
                </ol>
                </li>
        </ol>
        </li>
        <li>总结</li>
</ol>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本次测试共测试了该开发板的TSC与DVP,均成功地运行了相关例程,下次测试将主要着眼于通过LCD显示DVP采集图片,并使用触控功能实现控制输出图像色彩等功能。&nbsp; &nbsp;</p>

<p>&nbsp;</p>

<ul>
</ul>

Jacktang 发表于 2022-7-31 07:28

<p>开发板提供有DVP接口,挂个外接摄像头不错</p>

<p>&nbsp;</p>
页: [1]
查看完整版本: [国民技术N32WB452测评]三.硬件触控调试及DVP采集图像