i.MX RT1052是i.MX RT系列芯片,是由 NXP 半導體公司推出的跨界處理器芯片,該系列下又包括i.MX RT1020、i.MX RT1050及 i.MX RT1060等子系列芯片。所謂“跨界”,是指它自身的定位既非傳統(tǒng)的應用處理器也非傳統(tǒng)的微控制器。
傳統(tǒng)的應用處理器如手機主控芯片,它們通常采用 ARM 的 Cortex-A系列內(nèi)核,配合其芯片架構(gòu)使得芯片能實現(xiàn)更高頻率的運行。傳統(tǒng)的微控制器也稱為 MCU,它們通常采用ARM 的 Cortex-M 系列內(nèi)核,相對來說該內(nèi)核對中斷響應更快,所以具有良好的實時性,但其芯片架構(gòu)特別是集成片內(nèi)閃存帶來了生產(chǎn)技術(shù)限制和成本負擔,從而限制了其性能。而i.MX RT 系列芯片集成了兩者的優(yōu)點,它基于應用處理器的芯片架構(gòu),采用了微控制器的內(nèi)核 Cortex-M7,從而具有應用處理器的高性能及豐富的功能,又具備傳統(tǒng)微控制器的易用、實時及低功耗的特性。
野火的i.MX RT1052核心板搭載了i.MX RT1025DVL6A芯片,Cortex-M7內(nèi)核,主頻高達600M。130個IO全部引出。集成32MB SDRAM、128MB NAND FLASH、32MB QSPI FLASH、2Kb EEPROM、LCD-RGB565 FPC接口、1個SWD調(diào)試接口、1個uart 調(diào)試接口、1個電源LED、1個用戶LED、 一個復位按鍵、1個MODE按鍵、 1個WAKEUP按鍵 和1個Microusb接口等資源。芯片I0共130個, 均通過0.8mm的BTB接口在背面引出,包括SEMC總線,方便我們擴展各種模塊。
底板圖片如下:
裝在mini底板上的效果圖,哎,杰杰還是很羨慕Pro底板的,資源豐富。連LCD都能放在板子上,而我的LCD就只能通過排線弄出來。
看看火哥核心板的風騷走線:
頂層
底層
騷氣得一批,不過很多信號線都采用等長走線,保證了信號的穩(wěn)定性,這個值得點贊!!!
介紹一下i.MX RT1052芯片的性能優(yōu)點吧:
1. 無需片內(nèi)閃存
由于跨界處理器采用了應用處理器架構(gòu),具有大幅縮小的 SRAM 位單元,在跨界設計架構(gòu)中,SRAM可以配置為具有“零等待”單周期訪問的TCM,從而大幅提升系統(tǒng)性能。
2. 高性能
具備高密度片內(nèi) TCM 或緩存的跨界處理器的緩存未命中率可低至 1-2%,因此能夠提供明顯高于 MCU 的有效性能。
3. 低中斷延遲
在協(xié)調(diào)對內(nèi)部和外部硬件事件做出及時響應方面,中斷在嵌入式系統(tǒng)中發(fā)揮了重要作用。在與用戶交互的實時系統(tǒng)中,它們發(fā)揮的作用尤其重要,這是因為由用戶輸入觸發(fā)的外部事件需要 CPU 做出可靠的低延遲即時響應。跨界處理器采用 MCU 內(nèi)核構(gòu)建,因此即使它們采用應用處理器架構(gòu),也延續(xù)了低中斷延遲這一重要特性。跨界處理器的中斷延遲最低可達到 10-20ns,而應用處理器的延遲通常長達 1毫秒。
4. 高能效以及安全性。
下面來說說固件庫寫的工程吧,按照火哥一貫舒服的代碼風格
而且工程中含有不同版本的工程
正常來說,我們寫代碼不可能一次成功的,需要調(diào)試很久才出結(jié)果,可以通過ram_debug或者sdram_debug版本將程序快速加載到我們的開發(fā)板上的RT1052 芯片的內(nèi)部 RAM 中或者是板載的SDRAM 芯片中,實現(xiàn)快速調(diào)試代碼,但是RAM 空間小,適用于小程序調(diào)試,而板載的sdram則有32MB的空間,適用于大程序的調(diào)試。但是掉電則丟失這些程序,無法用在產(chǎn)品上,僅做調(diào)試用。
而下面兩個版本,則可以作為產(chǎn)品的最終代碼,將程序下載到NOR FLASH中,但是下載速度較慢,而且運行速度較SDRAM慢,杰杰猜測,我們或許應該可以將程序?qū)憺閮啥危诎l(fā)布產(chǎn)品的時候,從NOR FLASH啟動,運行NOR FLASH的第一段程序,將存在NOR FLASH的第二段程序加載到SDRAM中運行,直到掉電。這樣子就能提高速度了吧。
前面的前三個模式均采用低優(yōu)化等級(-O0)優(yōu)化,而_flexspi_nor_release版本則采用高優(yōu)化(-O3)等級,以便節(jié)約程序空間,提高運行效率。(杰杰吐槽:就是編譯有點久)。
溫馨提示:如果不用mdk看代碼的話,可以去掉“魔術(shù)棒”->Output -> Browse Information的√。然后可以使用source insight看代碼,方便很多,至少比mdk好多了。
下個代碼欣賞欣賞。
例程是移植了RT-Thread物聯(lián)網(wǎng)操作系統(tǒng)的(還是要支持一下國產(chǎn)的操作系統(tǒng)的),來看看源碼吧。
先介紹介紹RT-Thread物聯(lián)網(wǎng)操作系統(tǒng)(以下簡稱rtt),操作系統(tǒng)是輕量級的,利用很小的資源完成實時操作系統(tǒng)的工作。
這些就是rtt的一些文件,bsp就是一些板級相關(guān)的東西,components就是一些組件,看英文單詞都知道啦。然后就是src就是rtt的實現(xiàn)的源碼,include就是一些頭文件,而libcpu就是一些芯片的支持,tools就是一些rtt的工具,example還不會的別學嵌入式了。。。。。
看源碼確實是一個很輕量級的操作系統(tǒng),移植起來也是很簡單,重點是火哥已經(jīng)幫我們移植好啦,直接用吧,杰杰在學校rtt的過程中,發(fā)現(xiàn)跟一些操作系統(tǒng)還是有點不一樣的,他的啟動方式就在啟動文件已經(jīng)做好了。來看看:
在components.c中的148行
/* re-define main function */
int $Sub$$main(void)
{
rt_hw_interrupt_disable();
rtthread_startup();
return 0;
}
先關(guān)中斷,再做rtt的啟動
int rtthread_startup(void)
{
rt_hw_interrupt_disable();
/* board level initalization
* NOTE: please initialize heap inside board initialization.
*/
rt_hw_board_init();
/* show RT-Thread version */
rt_show_version();
/* timer system initialization */
rt_system_timer_init();
/* scheduler system initialization */
rt_system_scheduler_init();
#ifdef RT_USING_SIGNALS
/* signal system initialization */
rt_system_signal_init();
#endif
/* create init_thread */
rt_application_init();
/* timer thread initialization */
rt_system_timer_thread_init();
/* idle thread initialization */
rt_thread_idle_init();
/* start scheduler */
rt_system_scheduler_start();
/* never reach here */
return 0;
}
里面有一些函數(shù)是我們自己實現(xiàn)的,比如開發(fā)板初始化:rt_hw_board_init,
rtt還是有點好玩的,對外開放了main嘛!我們一般寫程序都在main.c中,所以,它又搞了個main_thread_entry線程(其實我更喜歡把這些稱作任務,不過都一樣啦,既然學了rtt,那就跟官方叫吧)
void main_thread_entry(void *parameter)
{
extern int main(void);
extern int $Super$$main(void);
/* RT-Thread components initialization */
rt_components_init();
/* invoke system main function */
#if defined (__CC_ARM)
$Super$$main(); /* for ARMCC. */
#elif defined(__ICCARM__) || defined(__GNUC__)
main();
#endif
}
這個函數(shù)是跳轉(zhuǎn)到我們的main.c中的main。下面才是真正實現(xiàn)我們的代碼的地方。
由于前面說了,rtt啟動的時候,會將開發(fā)板相關(guān)資源初始化,所以,我們自己的main就不需要再初始化了,直接開啟rtt的線程的創(chuàng)建與啟動。
lcd_thread = rt_thread_create("lcd",
lcd_thread_entry,
RT_NULL,
LCD_THREAD_STACK_SIZE,
LCD_THREAD_PRIORITY,
LCD_THREAD_TIMESLICE);
if (lcd_thread != RT_NULL) //創(chuàng)建成功
rt_thread_startup(lcd_thread); //啟動線程
else
return -1;
相關(guān)宏定義:
#define LCD_THREAD_PRIORITY 13 /* 優(yōu)先級,數(shù)值越大,優(yōu)先級越低 */
#define LCD_THREAD_STACK_SIZE 1024 /* 線程棧大小,單位為字節(jié) */
#define LCD_THREAD_TIMESLICE 5 /* 線程時間片,單位為tick */
然后就是lcd_thread_entry線程的實現(xiàn)了,這個自己定義就好啦。
既然是評測,當然得有性能的評測啦,一段使用(-O0)低級優(yōu)化的整形數(shù)計算,在野火i.MX RT1052板載的SDRAM上僅跑了21.487秒。在STM32H743上面跑了21.479秒(400M的工作頻率,打開CaChe(高速緩存)),而在stm32f103zet6上跑了9分57秒多。性能可見一斑了吧???如果不信可以自行測試,我可是等了幾分鐘就去刷牙了,回來還沒跑完。。。。。
測試代碼如下:(來源網(wǎng)絡的測試代碼)
void Calculate()
{
unsigned long x;
unsigned long a;
a=1;
for(x=0;x<4294967294;x++)
{
a=a+1;
}
}
i.MX RT1052
STM32H743
stm32f103zet6
在性能上面,i.MX RT1052,估計是一般mcu無法跨越的存在了,性能真的是超級強悍的。看文章的網(wǎng)友可能有疑問了,明明400M主頻的H7比1052快啊,在此杰杰回答一下,1052是在外部SDRAM上的程序,而H7在片內(nèi)內(nèi)存上,而且H7開了cache,能不快嗎,如果這點小程序在1052的片內(nèi)內(nèi)存上跑,絕對飛起。。。。。但是用上這么強的芯片,絕對不會只干這點小程序的活的,到時候跑GUI,你就發(fā)現(xiàn)速度了。
據(jù)火哥測試,i.MX RT1052的刷屏速度也很快,1366*768分辨率的屏幕可以達到52HZ,而1280*800的屏幕則達到了60HZ,70MHZ左右的VCLK時鐘,占用SDRAM的50%左右的數(shù)據(jù)吞吐量。
-
芯片
+關(guān)注
關(guān)注
455文章
50714瀏覽量
423138 -
應用處理器
+關(guān)注
關(guān)注
0文章
180瀏覽量
28300 -
核心板
+關(guān)注
關(guān)注
5文章
1008瀏覽量
29742 -
Cortex-M7
+關(guān)注
關(guān)注
0文章
20瀏覽量
9670
原文標題:傳說中的i.MX RT1052芯片,這塊板子讓它初漏猙獰
文章出處:【微信號:weixin21ic,微信公眾號:21ic電子網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論