dql2016 发表于 2024-11-1 21:12

【STM32H7S78-DK】测评+TouchGFX显示曲线

本帖最后由 dql2016 于 2024-11-4 20:16 编辑

<p>TouchGFX带有丰富的曲线控件,十分方便展示数据动态过程,通过曲线的高速刷新显示,也能体现STM32H7S78强大的图形性能。如下图,选中动态曲线控件,添加到屏幕中:</p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

<p>动态曲线行为选择向左滚动刷新,点数100,数据范围0~3300,ADC采集模拟电压的范围:</p>

<div style="text-align: center;"></div>

<p>打开水平、垂直分割线的显示:</p>

<p>&nbsp;</p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

<p>再添加一个文本显示区域用于显示实时数据:</p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

<p>文本显示采用通配符形式&lt;value&gt;,这样在程序中能够动态的更新显示内容:</p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

<p>添加wildcard,添加初始显示值和缓存大小:</p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

<p>同样的方法再添加几个文本显示区,adc用于显示ADC实时采集电压,rms用于显示采集1024点计算的均方根值,time用于显示计算rms值消耗的时间,RMS计算采样CMSIS-DSP库,这样评估STM32H7S78的DSP性能:</p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

<p>通过TouchGFX官网资料可以知道TouchGFX使用的是MVP框架,在MVP框架中所有数据仅能保存在称为 Model 的类对象中,Presenter是视图(View)与Model之间的纽带,View只能通过Presenter来读取数据。MVP框架所有需要保存的数据必须再Model 的类对象。View不能直接读写Model中的数据,必须得通过Presenter来操作,所以先要在Presenter中实现对数据的读写,在ScreenPresenter.hpp中添加读写函数。</p>

<p>在Model.cpp tick中添加模拟产生正弦曲线数据:</p>

<pre>
<code class="language-cpp">void Model::tick()
{
    static uint32_t cnt = 0;
    static time_t raw_time = 1671459593;
    ++cnt;
    if (cnt % 60 == 0)
    { /* Simple counter increase */
      ++raw_time;
    }
    if (raw_time != last_time)
    {
      last_time = raw_time;
      current_dt = *gmtime(&amp;raw_time); /* Simple gmtime calculation */

      /* Notify active presenter */
      modelListener-&gt;notifyNewDateTime(&amp;current_dt);
    }
    {
      double temp;

      //if (cnt % 2 == 0)
      {
            /* Calculate temperature manually */
            temp = 0;
            for (size_t i = 1; i &lt;= this-&gt;sinus_count; i += 2)
            {
                temp += sin(2.0 * 3.1415 * (20 * i) * cnt * 20) * (48 / i) + (i == 1 ? 50 : 0);
            }
            temp=temp*10+500;
            modelListener-&gt;notifyNewTemp((float)temp);
      }
    }
}</code></pre>

<p>在Screen1Presenter.cpp中添加实现:</p>

<pre>
<code class="language-cpp">void
Screen1Presenter::notifyNewTemp(float temp) {
    view.setTemp(temp);
}</code></pre>

<p>在Screen1View.cpp中添加刷新数据到曲线,更新文本显示:</p>

<pre>
<code class="language-cpp">void Screen1View::setTemp(float temp)
{
        dynamicGraph1.addDataPoint((int)temp);//更新曲线点数据

        Unicode::snprintfFloat(textArea1Buffer, TEXTAREA1_SIZE, "%2.3f", float(12.556));
        textArea1.invalidate();//更新文本显示区1

        Unicode::snprintfFloat(textArea2Buffer, TEXTAREA2_SIZE, "%2.1f", float(12.5));
        textArea2.invalidate();//更新文本显示区2

        Unicode::snprintf(textArea3Buffer, TEXTAREA3_SIZE, "%d", 123);
        textArea3.invalidate();//更新文本显示区3
}</code></pre>

<div style="text-align: center;"></div>

<p>效果:</p>

<p>9e1a9d54f0856446dce6e68d43db7dd3<br />
&nbsp;</p>

<p>文本显示区是问号,有没有懂的大佬指点一下,这是啥情况?</p>

dql2016 发表于 2024-11-4 20:30

<p>版本是TouchGFX 4.24.1 Designer</p>
页: [1]
查看完整版本: 【STM32H7S78-DK】测评+TouchGFX显示曲线