感謝琳的出現,陪我度過開心的每一天。開心的日子總是過得很快,離上次寫博客已經快兩個月了。歷經一年半的陰雲密佈,終於迎來了久違的萬丈陽光,希望未來的歲月帶來的是更多美好甜蜜,開心認真過好每一天。
乘着週五晚上的空閒,寫點最近在搞的新單片機。今年十月份才量產的新片,網上資料還不是很完備,所以記錄下自己的調試心得,也爲後來者提供參考,儘量少走彎路。不多廢話,進入正題。本博客中的內容大多是最近在安富萊電子論壇上發的一些個人調試記錄的帖子轉過來的,網址是http://bbs.armfly.com/u.php。
對於IMX.RT1050芯片的介紹,網上已經有一些了,最近這款芯片這麼火的原因是600M的主頻,價格卻在3美元左右,性能和A7差不多。它的雙精度浮點運算單元,高速計算能力,剛好適合寫運動控制算法,所以公司開始投入人力搭建這款芯片的軟件平臺。本文只寫技術要點,所以一些基本的MDK和單片機知識都沒有提及。
這款單片機有好多種啓動方式,SD卡、SPI FLASH、並行NORFLASH、並行NANDFLASH、USB、串口等,下面主要介紹外掛FlexSPI flash加載調試的心得。在介紹這之前先說說CMSIS-DAP調試器的使用注意事項。
一、CMSIS-DAP調試注意事項
NXP官方的評估板,上電使用CMSIS-DAP調試工具調試官方例程helloword,發現CMSIS-DAP調試很不穩定,不斷摸索,終於找到原因。一定要認真看官方提供的手冊,在MIMXRT1050EVKHUG.pdf文檔中,有這麼一句話很重要,截圖如下:
畫紅框的這句話意思就是使用CMSIS-DAP在線調試時,一定要把板的boot啓動模式切換到串行boot模式 ,下圖是boot啓動模式的各種管腳配置:
如紅框中所示,把板上撥碼開關SW7-3和SW7-4跳成01,CMSIS-DAP調試時就穩定了。
二、CMSIS-DAP進入U盤模式把BIN文件燒錄到Hyper Flash方法
官方評估板集成了CMSIS-DAP調試工具,該調試工具有三個功能:虛擬串口、在線調試、U盤模式燒錄固件到HyperFlash。下面是使用U盤模式燒錄固件的方法:
(1)評估板boot模式切換到串行下載模式,即撥碼開關SW7-3和SW7-4配置成01;
(2)J27跳線帽跳到1-2腳,USB線供電後按下SW4按鍵,這樣PC上會出現一個U盤符;
(3)官方例程中的helloworld工程選擇
(4)編譯生成的hello_world.bin文件複製到剛纔的U盤中;
(5)把撥碼開關SW7-3和SW7-4配置成10,即boot使用HyperFlash啓動方式;
(6)按下SW3鍵復位整板,就可以運行helloworld程序了。
三、評估板下載到HyperFlash調試的方法
HyperFlash加載算法,MDK已經提供了,這裏使用官方例程中的Helloworld爲例,對MDK的詳細配置進行說明,調試器使用評估板自帶的CMSIS-DAP,具體方法如下:
(1)使用MDK5.23以上的版本打開官方例程,代碼路徑爲SDK_2.3.0_EVK-MIMXRT1050\boards\evkmimxrt1050\demo_apps\hello_world\mdk;
(2)選擇如下圖所示的工程進行編譯,這個工程就是燒錄到HyperFlash的工程:
(3)對DEBUG中的調試器及MDK加載到HyperFlash的算法進行配置,如下圖所示:
點擊Settiing進入調試器配置,下圖紅框中的配置很重要,如果選擇不對,會導致無法下載
下圖中的RAM大小配置成0x8000,這個是用來運行MDK集成的燒錄HyperFlash算法的,空間小了會導致運行失敗,切記
(4)配置MDK中的LOAD設置,如下圖所示:
Update Target before Debugging不能勾選,勾選之後無法進行DEBUG調試,後面會詳細介紹DEBUG調試方法;
(5)評估板上電,插上USB下載線,boot模式使用串口下載模式或者HyperFlash模式都可以,即配置撥碼開關SW7爲0101或0110,然後點擊LOAD按鈕就可以把代碼燒錄到HyperFlash中了;
(6)配置boot模式爲HyperFlash模式,復位評估板就可以在串口終端上看到hello world輸出了。現實是這裏還看不到終端輸出,因爲IVT還沒有燒錄到flash裏,後面介紹爲什麼要這麼做;
(7)保留第六步裏的boot模式,復位評估板,然後點擊DEBUG按鈕就可以在flash裏在線調試代碼了;
(8)想要flash裏的代碼運行起來,還必須燒錄IVT和512字節的加載頭,這個在開發手冊第八章有詳細的介紹,這裏我只簡單說下IVT每個字段的含義:
volatile const uint32_t_ivt[] __attribute__((at(0X60001000))) = {
boot_data數據格式如下:
(9)512字節的加載頭,好像是用來設置flash的一些運行參數的,具體在手冊8.6有詳細的介紹,這裏只貼上需要填充的數據
static const uint32_tboot_data[] __attribute__((at(0X60000000))) = {
(10)把上面兩段C代碼添加到helloworld.c文件裏一起編譯,就可以把整個程序鏡像燒錄到HyperFlash中了,到這裏復位評估板,就可以在串口終端上看到hello world了。
四、flashloader燒錄固件到hyperflash方法
flashloader最終燒錄用到的固件是SB格式的鏡像文件,下面介紹SB文件生成的方法:
(1)從NXP官網下載Flashloader_i.MXRT1050_1.0_GA.zip工具,可以直接從NXP官網下載Flashloader_i.MXRT1050_1.0_GA.zip
(2)解壓文件到當前目錄,在doc文件夾下放着關於flashloader的使用手冊,這裏我們直接看i.MX MCU Manufacturing User's Guide.pdf的7.2.1章節生成SB文件的部分;
(3)用MDK編譯器編譯出SREC格式的可執行文件,它是用於生成SB文件的原始固件,這裏我們以官方例程helloworld爲例,用MDK編譯出helloworld.srec固件,步驟如下:
1、打開官方例程中的helloworld工程,路徑如下SDK_2.3.0_EVK-MIMXRT1050\boards\evkmimxrt1050\demo_apps\hello_world\mdk;
2、選擇hello_world Flexspi_nor_release目標工程,如下圖所示:
3、用fromelf.exe方法生成helloworld.srec固件,SREC格式即常用的S19格式的可執行文件,直接在MDK裏配置,如下圖紅框所示:
fromelf.exe --m32combined --output "[email protected]" "#L"
(4)用flashloader裏的elftosb.exe工具把helloworld.srec固件生成helloworld.sb燒錄文件
1、在DOS命令窗口裏用\Flashloader_RT1050_1.0\Tools\elftosb\win\elftosb.exe工具把helloworld.srec文件生成helloworld.bin和helloworld_nopadding.bin兩個文件,生成過程中需要用到Flashloader_RT1050_1.0\Tools\bd_file\imx10xx\imx-flexspinor-normal-unsigned.bd文件,DOS窗 口中輸入的命令如下:
elftosb.exe -f imx -V -c ../../bd_file/imx10xx/imx-flexspinor-normal-unsigned.bd -o helloworld.bin ../../../../SDK_2.3.0_EVK-MIMXRT1050/boards/evkmimxrt1050/demo_apps/hello_world/mdk/flexspi_nor_release/hello_world.srec
在elftosb.exe所在的目錄下就會生成helloworld.bin和helloworld_nopadding.bin兩個文件,DOS命令截圖如下所示:
2、繼續用elftosb.exe工具把helloworld_nopadding.bin文件生成helloworld.sb文件,生成過程需要用到Flashloader_RT1050_1.0\Tools\bd_file\imx10xx\program_flexspinor_image_hyperflash.bd文件,DOS窗口中輸入的命令如下:
elftosb.exe -f kinetis -V -c ../../bd_file/imx10xx/program_flexspinor_image_hyperflash.bd -o helloworld.sb helloworld_nopadding.bin
在elftosb.exe所在的目錄下就會生成helloworld.sb文件,DOS命令截圖如下所示:
(5)燒錄helloworld.sb鏡像到hyperflash
1、評估板J1跳線帽跳到3/4,USB線接到J9,SW7撥碼開關設置爲串口下載模式0101,USB線通過USB HUB連接到PC機,打開Flashloader_RT1050_1.0\Tools\mfgtools-rel\MfgTool2.exe,看到如下所示界面:
2、把Flashloader_RT1050_1.0\Tools\elftosb\win\helloworld.sb拷貝到Flashloader_RT1050_1.0\Tools\mfgtools-rel\Profiles\MXRT105X\OS Firmware\目錄下,並把helloworld.sb名字改成boot_image.sb;
3、點擊MfgTool2.exe工具的start,開始燒錄,燒錄完成後如下圖所示:
(6)評估板J1跳線帽跳到5/6,USB線接到J28,SW7撥碼開關設置爲串口下載模式0110,從hyperflash啓動,PC上打開串口終端工具,會看到hello world字符串,說明燒錄成功。
五、non-xip固件生成步驟
官方評估板的代碼一般在hyperflash中直接執行,這種執行方式叫xip,但是hyperflash的運行速度相比於ITCM,還是慢了許多,所以有時候我們希望把固件存放在hyperflash中,但是啓動的時候把hyperflash中的固件拷貝到ITCM中再運行,以便提高代碼的執行速度,下面開始介紹固件生成步驟:
1、修改MDK/Linker中的分散加載文件的中斷向量地址,即MIMXRT1052xxxxx_ram.scf文件裏的地址修改後如下
#define m_interrupts_start 0x00002000
#define m_interrupts_size 0x00000400
#define m_text_start 0x00002400#define m_text_size 0x0001DC00
也就是把固件從0x2000地址開始加載,0~0x2000這段地址存放boot的控制信息。
2、MDK/Linker中Misc Controls添加 --entry=Reset_Handler,MDK默認生成的入口地址不是我們以爲的Reset_Handler,而是__main,初始化RW和ZI段數據等操作後,再跳轉到用戶定義的main函數。查看Reset_Handler源碼可知道,Reset_Handler依次設置了中斷向量表,調用SystemInit,之後再調用了__main,所以需要告知BOOT ROM需要從Reset_Handler開始運行。
3、用fromelf.exe方法生成*.srec固件,生成方法參看上文的第四章節。
4、用flashloader裏的elftosb.exe工具把*.srec固件生成*.sb燒錄文件,生成方法參看上文的第四章節。這裏生成的是non-xip,所以和第四章中使用的工具有不一樣的地方,這裏說明下:
(1)*.srec生成*.bin的時候使用的bd工具是imx-itcm-unsigned.bd,即固件最後是要在ITCM中運行的,由於默認的imx-itcm-unsigned.bd中的地址配置是imx板的,所以我們要打開這個文件,把裏面的內容修改爲如下地址,
options {
flags = 0x00;
startAddress = 0x0;
ivtOffset = 0x1000;
initialLoadSize = 0x2000;
}
那麼完整的命令格式是elftosb.exe -f imx -V -c ../../bd_file/imx10xx/imx-itcm-unsigned.bd -o interpolation.bin ../../../../../code/project/Objects/interpolation.srec,這樣就生成了interpolation.bin 和interpolation_nopadding.bin兩個文件
(2) *.bin文件生成*.sb文件,完整命令格式是elftosb.exe -f kinetis -V -c ../../bd_file/imx10xx/program_flexspinor_image_hyperflash.bd -o interpolation.sb interpolation_nopadding.bin
(3)把*.sb文件用MfgTool2.exe工具燒錄到hyperflash中,具體方法參看第四章。