使用ITM機制實現(xiàn)調(diào)試stm32單片機,實現(xiàn)printf與scanf。
1. ITM簡介
ITM機制是一種調(diào)試機制,是新一代調(diào)試方式,在這之前,有一種比較出名的調(diào)試方式,稱為半主機(semihosting)方式。
在pc上編寫過C語言的人都知道,printf可以向控制臺輸出,scanf可以從控制臺獲取輸入,這里的printf/scanf都是標(biāo)準(zhǔn)庫函數(shù),利用操作系統(tǒng)的這些函數(shù),我們可以很方便的調(diào)試程序。在嵌入式設(shè)備上(如stm32單片機平臺上)開發(fā)工具(如MDK/IAR)也都提供了標(biāo)準(zhǔn)庫函,自然也提供了printf/scanf函數(shù),那么這些函數(shù)是否可以使用呢? 問題來了,printf向哪里輸出呢?并且大部分情況下,也沒有鍵盤,又如何使用scanf實現(xiàn)輸入呢?
我們都知道,嵌入式設(shè)備一般的使用仿真器,如常見Jlink/ulink,可以實現(xiàn)燒錄,單步,下斷點,查看變量,等等。仿真器將PC機和單片機連接器來。聰明的設(shè)計者們就在考慮是否可以借助仿真器,使得單片機可以借助PC機的屏幕以及PC機的鍵盤實現(xiàn)printf的輸出和scanf的按鍵獲取。
也就是說,如下的hello,world程序
#include int main() { //硬件初始化 //.... printf("hello, world"); for(;;); } 這個程序燒錄到單片機中后,仿真器連接接單片機與PC,開始在線調(diào)試后,那么這個程序會將"Hello, world"輸出到PC機上,在開發(fā)工具(MDK/IAR等)的某個窗口中顯示。 這就相當(dāng)于,單片機借助了PC機的顯示/輸入設(shè)備實現(xiàn)了自己的輸出/輸入。這種方式無疑可以方便程序開發(fā)者調(diào)試。 這種機制有多種實現(xiàn)方式,比較著名的就是semihosting(半主機機制)和ITM機制。 ITM是ARM在推出semihosting之后推出的新一代調(diào)試機制。現(xiàn)在我們來嘗試一下這種方式調(diào)試。 2. stm32使用ITM調(diào)試 MCU:stm32f207VG 仿真器:Jlink V8 IDE:MDK4.50 2.1 硬件連接 ITM機制要求使用SWD方式接口,并需要連接SWO線,一般的四線SWD方式(VCC SDCLK,SDIO,GND)是不行的。標(biāo)準(zhǔn)的20針JTAG接口是可以的,只需要在MDK里設(shè)置使用SWD接口即可。 2.2 添加重定向文件 將下面的文件保存成任意C文件,并添加到工程中。這里對這個文件簡單說明一下,要知道我們的程序是在單片機上運行的,為什么printf可以輸出到MDK窗口里去呢?這是因為 標(biāo)準(zhǔn)庫中的printf實際上調(diào)用 fputc實現(xiàn)輸出,所以我們需要自己編寫一個fputc函數(shù),這個函數(shù)會借助ITM(類似于USART)提供的寄存器,實現(xiàn)數(shù)據(jù)的發(fā)送,仿真器會收到這些數(shù)據(jù),并發(fā)往PC機。 實際上,如果你的單片機和一塊LCD連接,那么你只需要重新實現(xiàn)fputc函數(shù),并向LCD上輸出即可,那么你調(diào)用printf時就會輸出到LCD上了。這中機制,就是所謂的重定向機制。 #include #define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n))) #define ITM_Port16(n) (*((volatile unsigned short*)(0xE0000000+4*n))) #define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n))) #define DEMCR (*((volatile unsigned long *)(0xE000EDFC))) #define TRCENA 0x01000000 struct __FILE { int handle; /* Add whatever you need here */ }; FILE __stdout; FILE __stdin; int fputc(int ch, FILE *f) { if (DEMCR & TRCENA) { while (ITM_Port32(0) == 0); ITM_Port8(0) = ch; } return(ch); } 2.2 配置JLINK的初始化配置文件 將下面文件放置在你的工程下,并取任意名稱,這里筆者取名為 STM32DBG.ini /******************************************************************************/ /* STM32DBG.INI: STM32 Debugger Initialization File */ /******************************************************************************/ // <<< Use Configuration Wizard in Context Menu >>> // /******************************************************************************/ /* This file is part of the uVision/ARM development tools. */ /* Copyright (c) 2005-2007 Keil Software. All rights reserved. */ /* This software may only be used under the terms of a valid, current, */ /* end user licence from KEIL for a compatible version of KEIL software */ /* development tools. Nothing else gives you the right to use this software. */ /******************************************************************************/ FUNC void DebugSetup (void) { // // // // // // // <0=> Asynchronous // <1=> Synchronous: TRACEDATA Size 1 // <2=> Synchronous: TRACEDATA Size 2 // <3=> Synchronous: TRACEDATA Size 4 // // // // // // // // _WDWORD(0xE0042004, 0x00000027); // DBGMCU_CR _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register } DebugSetup(); // Debugger Setup 這里對這個文件做簡單的解釋, WDWORD(0xE0042004, 0x00000027); // DBGMCU_CR 這一句表示想 0xE0042004地址處寫入 0x000000027,這個寄存器是各個位表示的含義在注釋中給出了詳細(xì)的解釋。 0x27即表示 BIT0 DBG_SLEEP BIT1 DBG_STOP BIT2 DBG_STANDBY BIT5 TRACE_IOEN 注意,要使用ITM機制,必須要打開BIT5。 打開MDK工程,按照下圖修改。 2.3 MDK中對JLINK的配置 下圖中注意兩點 1). 這里的CoreClock是120M,因為筆者使用的是stm32F207VG這款芯片,并且時鐘配置為120M,所以這里填入120M,如果你使用stm32F10x,時鐘配置成72M,那么這里需要填入72M。即需要跟實際情況保持一致。 2). 最后一定要將 0處打勾,并將其他bit位上的勾去掉,最好與此圖保持一致,除CoreClock外。 2.4 燒錄程序,并啟動調(diào)試。可以看到,筆者在程序源碼中插入了一句printf語句輸出,然后按照下圖,就可以看到程序的輸出了。 3. 綜合版本使用scanf和printf 3.1 添加retarget文件 將如下代碼保存成retarget.c,然后加入到工程中。 #pragma import(__use_no_semihosting_swi) struct __FILE { int handle; /* Add whatever you need here */ }; FILE __stdout; FILE __stdin; int fputc(int ch, FILE *f) { return ITM_SendChar(ch); } volatile int32_t ITM_RxBuffer; int fgetc(FILE *f) { while (ITM_CheckChar() != 1) __NOP(); return (ITM_ReceiveChar()); } int ferror(FILE *f) { /* Your implementation of ferror */ return EOF; } void _ttywrch(int c) { fputc(c, 0); } int __backspace() { return 0; } void _sys_exit(int return_code) { label: goto label; /* endless loop */ } 3.2 編譯運行 編譯,燒錄,運行,打開Debug (printf) viewer,就可以看到輸入,參看下圖 這里對retarget.c文件做幾點說明. 1). 上面的代碼實際是在X:KeilARMStartupRetarget.c上修改而成的,scanf依賴的函數(shù)共有兩個,fgetc和__backspace都需要實現(xiàn),如果缺少__backespace函數(shù),則scanf胡無法從Debug Viewer Dialog 窗口獲取輸入。另外上面提供的代碼只是個demo,用于演示效果,用于生產(chǎn)時應(yīng)該處理的更完善一些。見參考文獻(xiàn)[1] 2). 函數(shù)ITM_SendChar,ITM_CheckChar,ITM_ReceiveChar在庫文件CMSISIncludecore_cm3.h中。 3) 查看函數(shù)的符號引用關(guān)系,可以通過生成詳細(xì)的map文件來查看。命令行增加 --verbose --list rtt.map選項即可生成名為rtt.map的文件。 4. ITM與RTT結(jié)合(待實現(xiàn)) grissiom 寫道: 忽然想到,或許可以把這個半主機做成 device,然后 rt_console_set_device("semi") 就可以直接用半主機做 finsh/rt_kprintf 了…… 不知可行不可行…… prife: ITM的接收不知道是否支持中斷,目前接收字符使用是輪詢方式。如果是中斷才有意義。這樣可以把ITM設(shè)備做成一個 rtt 的device了,讓finsh跑在 Debug printf Viewer窗口上。以后只要接一個jtag/SWD口就可以調(diào)試了,不用再接串口線了 參考文獻(xiàn) [1] MDK help. Indirect semihosting C library function dependencies [2] MDK help ARM Development Tools. Debugger Adapter User's Guides J-Link/J-Trace User's Guide Libraries and Floating Point Support Referencee Libraries and Floating Point Support Guide Linker Reference Guide
上一篇:用Eclipse開發(fā)stm32(GNU ARM Eclipse Plug-in)(編碼+編譯+下載+調(diào)試)
下一篇:如何通過stm32驅(qū)動電源檢測芯片cs5463
推薦閱讀
史海拾趣
Aptiv公司在電子行業(yè)中以其領(lǐng)先的技術(shù)實力著稱。早在1995年,公司便成立了自動駕駛研究實驗室,開始探索自動駕駛技術(shù)的可能性。經(jīng)過多年的研發(fā)與試驗,Aptiv在自動駕駛領(lǐng)域取得了顯著的突破。2004年,公司首次在內(nèi)華達(dá)州成功測試了自動駕駛汽車,獲得了州政府的批準(zhǔn),這標(biāo)志著Aptiv在自動駕駛技術(shù)上邁出了堅實的步伐。此后,Aptiv不斷推動自動駕駛技術(shù)的商業(yè)化進(jìn)程,為全球汽車行業(yè)帶來了新的發(fā)展機遇。
作為一家致力于環(huán)保和可持續(xù)發(fā)展的企業(yè),EiKO始終關(guān)注照明產(chǎn)品對環(huán)境的影響。公司積極推廣LED等高效、節(jié)能、環(huán)保的照明產(chǎn)品,并不斷優(yōu)化產(chǎn)品設(shè)計和生產(chǎn)過程,降低能耗和排放。
此外,EiKO還積極參與各種環(huán)保活動和公益事業(yè),如支持綠色照明項目、參與節(jié)能減排宣傳等。通過這些舉措,EiKO不僅為客戶提供了更加優(yōu)質(zhì)、環(huán)保的照明產(chǎn)品,也為推動整個照明行業(yè)的可持續(xù)發(fā)展做出了積極貢獻(xiàn)。
隨著智能家居和物聯(lián)網(wǎng)技術(shù)的興起,EiKO開始積極探索智能照明系統(tǒng)的研發(fā)與應(yīng)用。公司投入大量研發(fā)資源,將傳統(tǒng)照明產(chǎn)品與智能控制技術(shù)相結(jié)合,推出了具有遠(yuǎn)程控制、定時開關(guān)、色溫調(diào)節(jié)等功能的智能照明系統(tǒng)。
這些智能照明系統(tǒng)不僅提高了用戶的使用體驗,還為用戶帶來了更加便捷和智能的生活方式。例如,用戶可以通過手機APP遠(yuǎn)程控制家中的照明設(shè)備,實現(xiàn)定時開關(guān)和色溫調(diào)節(jié)等功能;同時,智能照明系統(tǒng)還可以與智能家居系統(tǒng)相連接,實現(xiàn)與其他智能設(shè)備的聯(lián)動控制。
為了提升在電子材料領(lǐng)域的競爭力,F(xiàn)reeport Resources積極尋求國際合作,與多家國際知名電子材料生產(chǎn)商和研究機構(gòu)建立了戰(zhàn)略伙伴關(guān)系。通過技術(shù)引進(jìn)和聯(lián)合研發(fā),公司成功掌握了先進(jìn)的電子材料提純和加工技術(shù),大幅提高了產(chǎn)品的質(zhì)量和性能。同時,國際合作也幫助Freeport Resources打開了國際市場,其產(chǎn)品遠(yuǎn)銷全球多個國家和地區(qū),進(jìn)一步鞏固了其在電子材料市場的地位。
面對日益復(fù)雜多變的電子市場環(huán)境,ANOVA公司始終保持著清醒的頭腦和敏銳的洞察力。無論是疫情帶來的供應(yīng)鏈挑戰(zhàn),還是技術(shù)更新?lián)Q代帶來的競爭壓力,ANOVA都能迅速應(yīng)對,不斷調(diào)整策略,確保公司的穩(wěn)健發(fā)展。同時,ANOVA也積極展望未來,不斷探索新的業(yè)務(wù)領(lǐng)域和技術(shù)方向,以期在電子行業(yè)中繼續(xù)保持領(lǐng)先地位。
這五個故事只是ANOVA公司發(fā)展過程中的冰山一角,但它們足以展現(xiàn)出ANOVA公司如何在電子行業(yè)中逐步崛起,成為一支不可忽視的力量。ANOVA以其卓越的技術(shù)實力、全球化的布局和緊密的合作伙伴關(guān)系,不斷推動著電子行業(yè)的發(fā)展和進(jìn)步。
中移物聯(lián)網(wǎng)在智能終端產(chǎn)品的創(chuàng)新方面也取得了顯著成果。公司設(shè)計并生產(chǎn)了物聯(lián)網(wǎng)專用模組和芯片,打造了智能組網(wǎng)、智能安防、智能家居、智能穿戴等行業(yè)終端。這些產(chǎn)品在市場上受到了廣泛歡迎,特別是在智能家居和智能穿戴領(lǐng)域,中移物聯(lián)網(wǎng)的產(chǎn)品憑借其高性能和穩(wěn)定性,贏得了眾多消費者的青睞。
樓宇對講系統(tǒng)是在各單元口安裝防盜門,由小區(qū)總控中心的管理員總機、樓宇出入口的對講主機、電控鎖、閉門器及用戶家中的可視對講分機通過專用網(wǎng)絡(luò)組成,以實現(xiàn)訪客與住戶對講。住戶可遙控開啟防盜門,各單元梯口訪客通過對講主機呼叫住戶,對方同意 ...… 查看全部問答∨ |
目錄 ARM\\Linux設(shè)備驅(qū)動程序第三版2·6中文.chm::/ch03s02.html]3.2. 主次編號[/url] 。。。。。。。。。。。。。。。。。。。。。。。 [ 本帖最后由 yuandayuan6999 于 2010-4-30 18:25 編輯 ]… 查看全部問答∨ |
[轉(zhuǎn)]同軸電纜視頻傳輸技術(shù)原理與實際應(yīng)用 同軸電纜視頻傳輸技術(shù)原理與實際應(yīng)用 同軸電纜是一種超寬帶傳輸介質(zhì),從直流到微波都可以傳輸。同軸傳輸?shù)睦碚摶A(chǔ)是電磁場理論,與一般電工電路理論有重要區(qū)別。如電纜連接采用芯線、屏蔽網(wǎng)分別焊接、扭接,又如用“三通”做視頻信號分配等,這從 ...… 查看全部問答∨ |
|
這里的PWM信號為何用與非門之后信號而不用PWM信號直接倒相,還有個問題,與非門電路在識別PWM信號時不管占空比是否都會認(rèn)為那一路是高電平。… 查看全部問答∨ |
|
買了塊麗臺9540的板子,想用430和它進(jìn)行通信,這個是一上電啟動了就從串口輸出數(shù)據(jù)么?還是要通過430輸入一些指令給GPS然后才會有數(shù)據(jù)輸出呢?怎么樣才能實現(xiàn)互相通信啊?… 查看全部問答∨ |
有沒有人知道HalAssignSlotResources這個函數(shù)的功能是什么嗎? HalAssignSlotResources函數(shù)的功能是什么? HalAssignSlotResources(IN PUNICODE_STRING RegistryPath, IN PUNICODE_STRING DriverClas ...… 查看全部問答∨ |
1)信號線及控制線應(yīng)選用屏蔽線,這樣對防止干擾有利。當(dāng)線路較長時,例如距離躍100 m,導(dǎo)線截面應(yīng)放大些。信號線及控制線不要與動力線放置在同一電纜溝或橋架中,以免相互干擾,最好穿管放置,這樣更合適。2)傳輸信號以選用電流信號為主,因電流 ...… 查看全部問答∨ |
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 英飛凌微控制器:以全新實惠套件和強大開發(fā)環(huán)境為開發(fā)者提供支持
- iTOP-i.MX6開發(fā)板設(shè)備數(shù)驅(qū)動Menuconfig的用法
- 迅為IMX6ULL開發(fā)板Qt for Android搭建開發(fā)環(huán)境
- 迅為i.MX8M mini開發(fā)板Windots QT系統(tǒng)開發(fā)環(huán)境搭建
- 迅為IMX8MM開發(fā)板Yocto系統(tǒng)使用Gstarwmra(一)
- 迅為IMX8M mini開發(fā)板Linix系統(tǒng)修改默認(rèn)屏幕
- iTOP-4412開發(fā)板支持4G以上文件系統(tǒng)擴展
- 迅為IMX8MM開發(fā)板Yocto系統(tǒng)設(shè)置開機自啟動
- 迅為IMX6Q開發(fā)板 Buildroot文件系統(tǒng)mqtt測試
- 什么是PID算法?一文帶你深度理解PID算法
- 控制無刷直流電動機以應(yīng)對新挑戰(zhàn)
- 汽車加熱器的工作原理和功能
- 限位開關(guān)的工作原理是什么?如何判斷限位開關(guān)的正負(fù)極
- 什么是限位開關(guān)?限位開關(guān)有哪些實際應(yīng)用
- 中國超導(dǎo)量子計算機“本源悟空”已在多項生物醫(yī)藥領(lǐng)域應(yīng)用
- 限位開關(guān)如何接線?如何判斷限位開關(guān)的好壞
- 拆解7kW的家用汽車充電樁:工程設(shè)計很復(fù)雜
- 具身智能,融資太瘋狂了
- 攜全系列駕駛助力方案首秀上海車展,Mobileye以人工智能創(chuàng)新推動輔助駕駛平權(quán)
- 打卡最后一周,解鎖TI汽車解決方案。解鎖的數(shù)量決定獎品的質(zhì)量!
- 下載有禮|是德科技:測試設(shè)備如何影響產(chǎn)品質(zhì)量調(diào)研報告
- 溫故而知新——開關(guān)電源經(jīng)典課程學(xué)習(xí)
- 下載《TI MCU與無線連接技術(shù)研討會講座實錄》抽獎贏好禮!
- 芯(E)幣兌換Nucleo擴展板:讓你的Nucleo變身成pyboard
- 美信基礎(chǔ)模擬IC APP下載 助力您創(chuàng)新模擬設(shè)計!評論、搶樓全有禮!
- 英飛凌BMS解決方案,為電動汽車和儲能系統(tǒng)保駕護(hù)航!
- 我給Xilinx資源中心做貢獻(xiàn)
- 北京亦莊“芯”貢獻(xiàn):首尾呼應(yīng)環(huán)環(huán)相連 開發(fā)區(qū)IC產(chǎn)業(yè)質(zhì)變
- 中芯國際宣布二零一八年第一季度網(wǎng)上會議
- 華夏芯CEO:應(yīng)避開專利壁壘 尋求新興優(yōu)勢領(lǐng)域“換道超車”
- “紅色半導(dǎo)體”快來了
- 我國研制出國際領(lǐng)先水平的5G通信芯片內(nèi)核
- 三星獲透明智能手機實用新型專利
- 爆款預(yù)定 Redmi Note 10解密:5G手機千元價位
- 三星Galaxy Buds Live聯(lián)名FILA推出定制版
- 華為超級快充GaN雙口充電器開啟預(yù)訂,已兼容多種協(xié)議
- 蘋果研究怎樣加強未來二維碼Apple Pay交易的安全性