STM32 TouchGFX部分控件功能测试

发布时间:2024-08-22  

我这次主要测试了TextArea,界面按键响应、动态图形【dynamicgraph】、模拟时钟【Analog Clock】、进度条显示以及软件上添加虚拟函数的实现。涉及的界面有下面几个:【仅为测试,界面美丑略过】

ab1931b0-21c6-11ed-ba43-dac502259ad0.png

ab44a8ea-21c6-11ed-ba43-dac502259ad0.png

ab67a76e-21c6-11ed-ba43-dac502259ad0.png

ab8642c8-21c6-11ed-ba43-dac502259ad0.png

第一个要注意的地方。

我使用的IDE是STM32CubeIDE。当我在相应hpp头文件里添加虚拟函数声明时,需要在IDE环境里专门对该头文件做个save操作,不然在cpp函数里写好相应函数后编译时总提示没有做函数声明。 举个例子说下,比方我要在Screen1View.cpp写一个IncDuty()函数。

abad5de0-21c6-11ed-ba43-dac502259ad0.png

我们需在其对应的头文件里加上虚拟函数的声明。在头文件里添加了该虚拟函数声明后,需要手动对该文件做个SAVE操作【File菜单下选择Save】,否则老是编译出错,提示函数无声明,即像下面提示:

abd27080-21c6-11ed-ba43-dac502259ad0.png

但别的cpp文件修改后倒不用单独做save操作,直接编译即可。这个地方因为要操作的文件较多,我多次忘记,直到编译提醒才知道。【不知该问题是否跟IDE有关?我没测试别的IDE。反正提醒下吧。】

第2个要注意的地方,我这里通过TouchGFXdesigner的文本区域控件【textarea】显示STM32的某通道ADC转换值,用到了浮点。

abf32d84-21c6-11ed-ba43-dac502259ad0.png

刚开始我用的是这个函数:

Unicode::snprintf(textArea1Buffer,TEXTAREA1_SIZE, '%f',AdcResult);

结果总是出不来,但当我将AdcResult改为整型变量,通过%d可以显示正确结果。先怀疑过IDE方面浮点功能相关配置,经检查没问题。后来到TouchGFX在线服务站点搜索snprintf才有新的发现,如下图所示:

ac121ca8-21c6-11ed-ba43-dac502259ad0.png

看来我的函数用错了,使用浮点有另外一个输出函数,即:

Unicode::snprintfFloat(textArea1Buffer, TEXTAREA1_SIZE,'%2.4f', AdcResult);

第3个要注意的地方,也是跟上面textarea输出显示有关的问题。

ac2d8218-21c6-11ed-ba43-dac502259ad0.png

在它的属性那里有个Auto-size的选项,勾选与不勾选的实现代码是不一样的。一般为了简单点,可以不做勾选,自己手动拉个合适大小的框来显示字符及数据。比方还是以上面显示ADC输出电压值为例,其实现代码如下:

void Screen2View:: DispAdcValue()

{

Unicode::snprintfFloat(textArea1Buffer,TEXTAREA1_SIZE,'%2.4f', AdcResult);

//textArea1.resizeToCurrentText();

//memset(textArea1Buffer,'�',strlen(....));

textArea1.invalidate();

}

如果说你希望勾选,你的代码就将上面的屏蔽语句加上即可,有兴趣可以自行试试。

再就是那个动态图形显示那个地方,显示的点数及修改样点值的频率都是可以调整的。我这里是让它动态显示一路PWM输出的方波,为了实现它,我在这个地方做了些来回调试才实现比较好的效果。

另外,我在组织模拟时钟代码时遇到的一个小问题。我用到Model::Tick里的modelListener功能。

有个地方本来应该是view.UpdateClock(hours,minutes,seconds);我看库里面绝大部分单词的首字母都是大写的,我就惯性地将view的首字母写成大写V了,编译没有直接提示出错,但就是结果出不来。这里各种API函数很多,初次使用者对他们都较陌生,这种比较隐蔽的问题难免会碰上。

我顺便把测试中用到的几个跟GUI这边有关的函数实现代码也贴过来,供有需要的人参考。

modelListener->UpdateClock(sTime.Hours,sTime.Minutes,sTime.Seconds);

analogClock1.setTime24Hour(sTime1.Hours,sTime1.Minutes,sTime1.Seconds);

void Screen2View:: DispAdcValue()//基于textarea控件固定宽度显示数据

{

//Unicode::snprintf(textArea1Buffer, TEXTAREA1_SIZE,'%d?u?s?', AdcResult);

Unicode::snprintfFloat(textArea1Buffer,TEXTAREA1_SIZE, '%2.4f', AdcResult);

//textArea1.resizeToCurrentText();

//memset(textArea1Buffer,'�',…..);

textArea1.invalidate();

}

void Screen3View::UpdateCnt() //For progress Bar

{

if (UpdateCNT> 2000) {UpdateCNT = 0;}

//UpdateCNT comesfrom Timer Interrupt

textProgress1.setValue(UpdateCNT);

circleProgress1.setValue(UpdateCNT);

imageProgress1.setValue(UpdateCNT);

}

voidScreen1View::IncDuty() //For TIM3-CH1

{

CCRValue+=100;

if (CCRValue > 50000)

{

TIM3->CCR1 = 50000;

}

else

{

TIM3->CCR1 = CCRValue;

}

}

voidScreen1View::DecDuty()//For TIM3-CH1

{

CCRValue-=100;

if (CCRValue <0000)

{

CCRValue = 0 ;

TIM3->CCR1 = 000;

}

else

{

TIM3->CCR1 = CCRValue;

}

}

voidScreen1View:: ModifyGraph() //forDynamic grahph

{

uint16_t temp;

temp = GPIOB->IDR & 0x0010;

if (temp==0)

{

dynamicGraph1.addDataPoint(0);

// dynamicGraph1.invalidate();

}

else

{

dynamicGraph1.addDataPoint(99);

// dynamicGraph1.invalidate();

}

}

最后补充下,当我加入第4个页面屏的内容时,电脑上模拟下还行,基于STM32F429开发板已经没法正常稳定运行了,毕竟资源有限。当然,不同的人设计4个页面所涉及的内容及任务数可能大相径庭,可能的结果这里不好说绝对。不过,我的测试过程中运行上文中提到的前3个页面内容及功能是没有问题的。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>