我這次主要測試了TextArea,界面按鍵響應、動態圖形【dynamicgraph】、模擬時鐘【Analog Clock】、進度條顯示以及軟件上添加虛擬函數的實現。涉及的界面有下面幾個:【僅為測試,界面美丑略過】
第一個要注意的地方。
我使用的IDE是STM32CubeIDE。當我在相應hpp頭文件里添加虛擬函數聲明時,需要在IDE環境里專門對該頭文件做個save操作,不然在cpp函數里寫好相應函數后編譯時總提示沒有做函數聲明。 舉個例子說下,比方我要在Screen1View.cpp寫一個IncDuty()函數。
我們需在其對應的頭文件里加上虛擬函數的聲明。在頭文件里添加了該虛擬函數聲明后,需要手動對該文件做個SAVE操作【File菜單下選擇Save】,否則老是編譯出錯,提示函數無聲明,即像下面提示:
但別的cpp文件修改后倒不用單獨做save操作,直接編譯即可。這個地方因為要操作的文件較多,我多次忘記,直到編譯提醒才知道。【不知該問題是否跟IDE有關?我沒測試別的IDE。反正提醒下吧。】
第2個要注意的地方,我這里通過TouchGFXdesigner的文本區域控件【textarea】顯示STM32的某通道ADC轉換值,用到了浮點。
剛開始我用的是這個函數:
Unicode::snprintf(textArea1Buffer,TEXTAREA1_SIZE, '%f',AdcResult);
結果總是出不來,但當我將AdcResult改為整型變量,通過%d可以顯示正確結果。先懷疑過IDE方面浮點功能相關配置,經檢查沒問題。后來到TouchGFX在線服務站點搜索snprintf才有新的發現,如下圖所示:
看來我的函數用錯了,使用浮點有另外一個輸出函數,即:
Unicode::snprintfFloat(textArea1Buffer, TEXTAREA1_SIZE,'%2.4f', AdcResult);
第3個要注意的地方,也是跟上面textarea輸出顯示有關的問題。
在它的屬性那里有個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個頁面內容及功能是沒有問題的。
上一篇:基于STM32單片機的搖頭風扇設計
下一篇:STM32 Step-by-Step如何加快開發速度
推薦閱讀最新更新時間:2025-06-30 14:32




設計資源 培訓 開發板 精華推薦
- 使用 MaxLinear, Inc 的 SPX385AN-1.2/TR 的參考設計
- LTC4089,通用鋰離子電池充電器可在僅 2cm2 的面積內從 USB 和 6V 至 36V 輸入供電
- LTC3425 的典型應用 - 5A、8MHz、4 相同步升壓型 DC/DC 轉換器
- LT1934ES6 3.3V降壓轉換器典型應用電路
- 使用 Analog Devices 的 LT1764AEFE-1.5 的參考設計
- EVAL-ADUC7039QSPZ,用于汽車系統的 ADUC7039 集成精密電池傳感器的評估板
- ADP1612-BL1-EVZ,用于 ADP1612 升壓轉換器的空白評估板
- DI-132 - 1.75W高效率線性充電器替代品
- 使用 MaxLinear, Inc 的 XRP7618IGB-F 的參考設計
- 基于STM32的貪吃蛇游戲設計(程序、PCB)
- 納祥科技2W 24位數字功放NX4920,可用于AI語音播報、WIFI播放器
- 常用解調器的定義和工作原理
- 從性能與網絡傳輸出發,講講鐵威馬MAX系列為什么一騎絕塵
- 惠普選中Hailo下一代人工智能加速器,革新零售業與酒店業運營模式
- 跨國商務溝通困局破解之道:時空壺 W4Pro 全場景應用解析
- 從矢量降噪到雙向同傳,時空壺 W4Pro 如何重構 AI 同傳技術標準?
- LoRa+NB-IoT雙模融合,地下車庫信號盲區電梯場景等的冗余通信
- LoRa與UWB的“定位之戰”,成本敏感場景高精度需求的場景切割
- 時空壺X1再升級:引領AI同傳新時代,革新演講翻譯體驗
- ARXML 規則下 ECU 總線通訊與 ADTF 測試方案