首頁 > 評測 > 【AT-START-F437測評】性能強者雅特力AT32F437試用和性能評測
【AT-START-F437測評】性能強者雅特力AT32F437試用和性能評測
- [導讀]
- 本帖最后由 Geralt 于 2023-2-2 10:42 編輯 #技術(shù)資源# #申請原創(chuàng)# 性能強者雅特力AT32F437試用和性能評測 本文首發(fā)于21ic,轉(zhuǎn)載請保留原始連接和作者ID。 前言 在這次本次21ic的雅特力開發(fā)板評測
本帖最后由 Geralt 于 2023-2-2 10:42 編輯
#技術(shù)資源# #申請原創(chuàng)#
性能強者雅特力AT32F437試用和性能評測
本文首發(fā)于21ic,轉(zhuǎn)載請保留原始連接和作者ID。
前言
在這次本次21ic的雅特力開發(fā)板評測活動中,我很榮幸的申請到了AT-START-F437這款開發(fā)板。作為一個業(yè)余電子愛好者,我一直對高性能通用MCU有著濃厚的興趣?上У氖,該領(lǐng)域之前大多被國外廠商所把控。但隨著這兩年局勢的變化和國內(nèi)相關(guān)產(chǎn)業(yè)的發(fā)展,越來越多的國產(chǎn)MCU廠商開始涉足此領(lǐng)域并推出了相應(yīng)的產(chǎn)品。而本文的主角,AT-START-F437開發(fā)板的核心雅特力AT32F437便是其中的代表之一。
根據(jù)官方的數(shù)據(jù)表。AT32F437的核心為帶有單精度浮點運算單元和DSP指令集的的Cortex-M4內(nèi)核,擁有最高288MHz的主頻、4032KB的Flash和512KB SRAM。除此之外,該型號還支持通過外擴SDRAM/NAND/QSPI-FLASH/QSPI-PSRAM等常見存儲器。本次到手的AT-START-F437開發(fā)板搭載的MCU的具體型號為AT32F437ZMT7,是AT32F437產(chǎn)品線中最高端的型號。
開發(fā)板板載的資源除了常見的LED燈和按鍵和GPIO排針外,還帶有3個USB接口(一個HOST兩個OTG,其中HOST和OTG1使用同一外設(shè))、一個RJ-45以太網(wǎng)接口和PHY、還有一顆QSPI-Flash,對于START開發(fā)板的定位來說還算夠用。開發(fā)板自帶了AT-Link,可以支持程序的下載、調(diào)試以及串口通訊,十分方便。不過這里還是想吐槽一下,都202x年了,咱就不能把AT-LINK的USB接口換成TYPE-C的嘛。。。。。
點燈:開發(fā)環(huán)境的建立和GPIO速度測試
上手一款MCU,最好的方式就是“點燈”了。作為嵌入式領(lǐng)域的“Hello World”,通過點燈不僅可以快速熟悉MCU的基本開發(fā)流程、而且可以幫助我們評估一款MCU資料的豐富程度和開發(fā)的難易程度。
在傳統(tǒng)的印象里,資料是國產(chǎn)MCU最大的短板。具體表現(xiàn)有官網(wǎng)難用、資料難找、文檔不全/錯誤多、中文文檔偏少、缺乏例程,外設(shè)庫不完善,開發(fā)流程復雜等等等等。令人感到驚喜的是,雅特力在這方面做得相當不錯。官網(wǎng)非常好用,通過頂部的導航欄就可以快速找到對應(yīng)的產(chǎn)品線:然后在產(chǎn)品的主頁上就可以把所有的相關(guān)文檔、庫和工具一并下載下來,**沒有多級隱藏菜單,不需要會員**。
雅特力的MCU除了傳統(tǒng)的MDK開發(fā)方式外,也自行開發(fā)了基于Eclipse平臺的專用IDEAT32 IDE,這在國產(chǎn)品牌中也是比較少見的,自行開發(fā)IDE可以針對自己產(chǎn)品的特點對開發(fā)環(huán)境進行深度定制,這也是研發(fā)實力的一種體現(xiàn)。
目前AT32-IDE的完成度還是很高的,通過File->New C Project,我們可以很輕松的基于內(nèi)置的項目模板來創(chuàng)建一個AT32F437的項目,默認的代碼已經(jīng)完成了MCU的基本初始化,并且提供了基于START開發(fā)板的點燈代碼,這倒是省事兒了。
將開發(fā)板連接至PC,點擊IDE上的編譯按鈕,等待編譯結(jié)束后點擊下載,就可以把代碼下載到開發(fā)板上了,整個過程非常流暢。
代碼運行效果:
基本的點燈完成了,來測試一下AT32F437通過寄存器控制GPIO的最大翻轉(zhuǎn)速度,也就是GPIO的軟件翻轉(zhuǎn)速度。大多數(shù)情況下,我們并沒有單純使用軟件代碼來高頻翻轉(zhuǎn)GPIO的需求。但在某些場合,比如需要模擬某些MCU不支持的物理協(xié)議時,GPIO的軟件翻轉(zhuǎn)速度就很重要了。在絕大多數(shù)型號的MCU上,GPIO的軟件翻轉(zhuǎn)速率都遠遠低于使用外設(shè)(如SPI或者TIMER)時的翻轉(zhuǎn)速率。這其中最鼎鼎大名的就是STM32H750,雖然擁有高達480MHz的主頻和125MHz的GPIO物理速度,但是通過GPIO寄存器控制電平反轉(zhuǎn)時,其翻轉(zhuǎn)速率只有16~20MHz,不到主頻的1/24,表現(xiàn)十分糟糕。讓我們來看看AT32F437的表現(xiàn)如何。
測試選用的GPIO為PE2, 初始化和測試代碼如下:
- gpio_init_type gpio_init_struct;
- /* enable the led clock */
- crm_periph_clock_enable(CRM_GPIOE_PERIPH_CLOCK, TRUE);
- /* set default parameter */
- gpio_default_para_init(&gpio_init_struct);
- /* configure the led gpio */
- gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
- gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
- gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
- gpio_init_struct.gpio_pins = GPIO_PINS_2;
- gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
- gpio_init(GPIOE, &gpio_init_struct);
- for(;;)
- {
- GPIOE->scr = GPIO_PINS_2;
- GPIOE->clr = GPIO_PINS_2;
- }
通過示波器在PE2引腳測得結(jié)果如下:
72MHz的軟件速度,達到了主頻288MHz的1/4,平均2個周期翻轉(zhuǎn)一次(這個周期包含了循環(huán)消耗的指令周期),可以說是非常優(yōu)秀的成績了。
跑分:CoreMark的移植
CoreMark是一個專為嵌入式處理器設(shè)計的性能基準測試軟件,它內(nèi)部包含了一套全面的性能測試案例,是嵌入式領(lǐng)域性能測試的事實標準之一。CoreMark以代碼形式分發(fā),我們可以下載之后將其加入工程中編譯并運行。運行之后,CoreMark會生成一個分數(shù),使用這個分數(shù)可以直觀的進行性能的對比,方面我們了解不同處理器或者編譯器之間的性能差距。
在AT32-IDE進行CoreMark的移植是相當簡單的,首先我們需要保證串口打印功能正常,這里我們可以直接調(diào)用IDE為我們自動生成的開發(fā)板初始化函數(shù):
- uart_print_init(115200);
CoreMark的打印輸出需要浮點支持,我們在項目的build setting中將其開啟:
接著我們在用戶代碼文件夾下新建“CoreMark”文件夾,將CoreMark代碼復制進去:
CoreMark的運行需要一個時間基準,我們初始化TIMER1,生成一個以1毫秒為單位的時間基準:
TIMER初始化部分
- /* enable tmr1 clock */
- crm_periph_clock_enable(CRM_TMR1_PERIPH_CLOCK, TRUE);
- /* tmr1 configuration */
- /* time base configuration */
- tmr_base_init(TMR1, 999, 288 - 1);
- tmr_cnt_dir_set(TMR1, TMR_COUNT_UP);
- /* overflow interrupt enable */
- tmr_interrupt_enable(TMR1, TMR_OVF_INT, TRUE);
- /* tmr1 hall interrupt nvic init */
- nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
- nvic_irq_enable(TMR1_OVF_TMR10_IRQn, 1, 0);
- /* enable tmr1 */
- tmr_counter_enable(TMR1, TRUE);
時間基準相關(guān)函數(shù)
- volatile uint32_t uwTick = 0;
- uint32_t HAL_GetTick(){
- return uwTick;
- }
- /**
- * <a href="home.php?mod=space&uid=247401" target="_blank">@brief</a> this function handles timer1 overflow handler.
- * @param none
- * @retval none
- */
- void TMR1_OVF_TMR10_IRQHandler(void) {
- if (tmr_flag_get(TMR1, TMR_OVF_FLAG) == SET) {
- uwTick++;
- tmr_flag_clear(TMR1, TMR_OVF_FLAG);
- }
- }
修改CoreMark的core_portme.c中的相關(guān)代碼,添加我們的時間基準
- /* Function : start_time
- This function will be called right before starting the timed portion of the benchmark.
- Implementation may be capturing a system timer (as implemented in the example code)
- or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0.
- */
- void start_time(void) {
- Tick = HAL_GetTick();
- }
- /* Function : stop_time
- This function will be called right after ending the timed portion of the benchmark.
- Implementation may be capturing a system timer (as implemented in the example code)
- or other system parameters - e.g. reading the current value of cpu cycles counter.
- */
- void stop_time(void) {
- }
- /* Function : get_time
- Return an abstract "ticks" number that signifies time on the system.
- Actual value returned may be cpu cycles, milliseconds or any other value,
- as long as it can be converted to seconds by <time_in_secs>.
- This methodology is taken to accomodate any hardware or simulated platform.
- The sample implementation returns millisecs by default,
- and the resolution is controlled by <TIMER_RES_DIVIDER>
- */
- CORE_TICKS get_time(void) {
- CORE_TICKS elapsed = (CORE_TICKS)(HAL_GetTick()-Tick);
- return elapsed;
- }
- /* Function : time_in_secs
- Convert the value returned by get_time to seconds.
- The <secs_ret> type is used to accomodate systems with no support for floating point.
- Default implementation implemented by the EE_TICKS_PER_SEC macro above.
- */
- secs_ret time_in_secs(CORE_TICKS ticks) {
- secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC;
- return retval;
- }
因為我們已經(jīng)自行完成了硬件的初始化,此處根據(jù)需要修改portable_init即可
- extern crm_clocks_freq_type crm_clocks_freq_struct;
- /* Function : portable_init
- Target specific initialization code
- Test for some common mistakes.
- */
- void portable_init(core_portable *p, int *argc, char *argv[])
- {
- ee_printf("CoreMark run on AT32F437ZMT7 <a href="home.php?mod=space&uid=72445" target="_blank">@</a> %luHz\r\n", crm_clocks_freq_struct.sclk_freq);
- if (sizeof(ee_ptr_int) != sizeof(ee_u8*)) {
- ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\r\n");
- }
- if (sizeof(ee_u32) != 4) {
- ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\r\n");
- }
- p->portable_id = 1;
- }
最后,在main函數(shù)中調(diào)用CoreMark的主函數(shù):
- CoreMark_Main(0, 0);
編譯,下載,運行,通過串口監(jiān)視器,我們可以得到最終跑分:
在AT32-IDE默認的GCC編譯器下,AT32F437跑出了715分的分數(shù),介于STM32U575和STM32F756之間:
這已經(jīng)是一個相當恐怖的分數(shù)了,要知道STM32F756可是Coretex-M7內(nèi)核,還帶有L1-Cache的高性能跨界型MCU,而且分數(shù)還是使用IAR編譯器跑出來的。如果使用同樣的GCC編譯器,那么F756分數(shù)也就700~800分左右。AT32F437居然用不帶cache的M4內(nèi)核逼近了M7內(nèi)核的分數(shù),性能可以說是非常強悍了。
結(jié)語
AT32F437的性能強悍,配置也非常豐富,已經(jīng)足以支撐類似HMI之類的應(yīng)用場景。因為資料豐富,所以可玩性很強。配套的IDE用起來也很方便。之后,我會嘗試移植一些圖形庫如LVGL進來,到時再與大家分享。
附件為移植好的CoreMark工程。
AT32F437ZM-Blink.zip (513.13 KB)
-
- 本文系21ic原創(chuàng),未經(jīng)許可禁止轉(zhuǎn)載!
網(wǎng)友評論
- 聯(lián)系人:巧克力娃娃
- 郵箱:board@21ic.com
- 我要投稿
-
歡迎入駐,開放投稿
-
人均百萬?英偉達中國員工收入曝光! 2024-08-29
-
《黑神話:悟空》玩家硬盤升級攻略:提升游戲體驗,暢享3A大作 2024-08-29
-
數(shù)睿數(shù)據(jù)參加《系統(tǒng)與軟件工程 低代碼開發(fā)平臺通用技術(shù)要求》國家標準編制 2024-08-29
- NRF52810藍牙數(shù)字耳機找人定制
預算:¥30005天前
- 125KW模塊式PCS軟硬件外包開發(fā)
預算:¥1100000015小時前
- 12V汽車啟動電源項目BMS設(shè)計
預算:¥50000023小時前
- 數(shù)據(jù)可視化軟件 開發(fā)
預算:¥5000023小時前
- PLC項目調(diào)試修改
預算:¥100001天前
- 起動電機控制器開發(fā)
預算:¥1100001天前