STM32兩種輸出除錯資訊的方法

2021-08-25 17:03:43 字數 1965 閱讀 9249

方式一:基於segger的rtt方式,可直接使用jlink連線到目標板即可看到除錯資訊。

優點:速度很快,即使是在中斷中呼叫也沒有問題,在帶系統的程式中也不需要開啟臨界保護;

缺點:需要加入兩個segger提供的.c檔案及標頭檔案,不能輸出中文和浮點(原因可能是會降低速度);

硬體連線:jlink的swdio引腳必須和目標板連線,其它按照標準使用即可。

需要的兩個.c檔案可在jlink驅動安裝目錄d:\segger\jlink_v634c\samples\rtt中找到(我的安裝到d盤驅動版本為634c,根據自己的實際情況找)

可看到裡面有乙個壓縮包,解壓後將segger_rtt.c、segger_rtt.h、segger_rtt_conf.h、segger_rtt_printf.c拷貝到自己的工程目錄下,然後將標頭檔案包含進工程即可

在使用的地方標頭檔案加上#include "segger_rtt.h"

便可呼叫segger_rtt_printf();函式輸出除錯資訊到jlink rtt_viewer了

這個軟體是安裝好jlink驅動就有的,裡面還有其它軟體也可以檢視除錯資訊,可使用的函式也不止這乙個,可參考segger官方文件自行實現。

方式二:使用stm32的串列埠輸出除錯資訊。

優點:可以輸出中文及浮點數;

缺點:需要占用乙個串列埠資源,不適合在中斷中呼叫,帶系統後呼叫的地方也需要加臨界保護;

硬體連線:將微控制器串列埠接到乙個usb轉串列埠用上位機即可觀察資料。

需要在mdk中開啟使用微庫選項(也可不用,但需要自己實現重定向的一些東西)

在有勾勾的地方勾上就行了

在程式中需要將printf函式重定向到串列埠

/*重定向 printf 到串列埠*/

int fputc(int ch, file *f)

uart1_senddata();函式自行實現,就是串列埠1傳送資料。

這裡提供一種輸出可控的方式:

/*用於控制輸出除錯資訊*/

#define printf_debug 1u

#if (printf_debug > 0u)

#define use_rtt_printf 1u

#if (use_rtt_printf > 0u)

#include "segger_rtt.h"

/*基於 segger_rtt 不能輸出浮點,中文,等一些特殊字元(優點速度快可在中斷中呼叫)*/

#define printf_dbg(...) \

dowhile(0);

#define printf(...) \

segger_rtt_printf(0,__va_args__);

#else

/*使用串列埠格式化到 printf 輸出*/

#define printf_dbg(...) \

dowhile(0);

#define printf(...) \

printf(__va_args__);

#endif

#else

#define printf_dbg(...)

#define printf(...)

#endif

需要檢視除錯資訊時只需要開啟巨集printf_debug即可。

STM32的J Link除錯使用RTT輸出除錯資訊

關於stm32f1微控制器使用rtt列印日誌的速度比串列埠列印要快,而且基本上和串列埠的printf函式類似,所以在使用的時候也是很方便的。他的優點 1.不占用串列埠 2.列印速度快對cpu的執行影響小 使用步驟是 1.在工程裡面加入rtt的4 個檔案 2.包含標頭檔案 include segger...

STM32 SysTick兩種定時設計

方案1 void systick init void void delay 10us io u32 ntime void timingdelay decrement void void systick handler void 該方案每10us進一次中斷,進一次中斷timingdelay就減1,所以...

STM32 四種輸入輸出模式。

stm32的四種輸入方式 1 上拉輸入 gpio mode ipu 上拉輸入就是訊號進入晶元後加了乙個上拉電阻,再經過施密特觸發器轉換成0 1訊號,讀取此時的引腳電平為高電平 2 下拉輸入 gpio mode ipd 下拉輸入就是訊號進入 晶元後加了乙個下拉電阻,再經過施密特觸發器轉換成0 1訊號,...