<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32Cube SWV實時跟蹤調試方法

冬至子 ? 來源:聊點嵌入式 ? 作者:聊點嵌入式 ? 2023-11-06 15:28 ? 次閱讀

之前的文章在講到調試的時候,一般都是大家熟悉的調試方法:通過打斷點,讓程序運行到某一個地方停下來,查看某些變量、寄存器等的狀態;單步運行,看程序的執行、跳轉是否跟預期一致;比較高級的是設置軟斷點,比如在讀寫某一個變量,或是某一變量值到達某種狀態時停下。這些方法有一個共同的特征,就是程序要停下來,讓我們觀察各種信息。

有沒有一種方法,程序在持續的運行,某些變量的值能夠持續的輸出給我們,甚至是通過圖表的形式給我們觀察,甚至是后期保存下來。這樣在某些情況下是更直觀的、更有效的一種調試方法。

這種方法當然是存在的,比如通常會利用單片機的某一個串口向外發送數據,再通過上位機串口調試軟件接收并顯示。除此之外,還有另一種方法,通過STM32系列單片機的SWV(Serial Wire Viewer)實時跟蹤技術來實現。

接下來我們通過一個簡單的例子,看看在CubeIDE下怎么通過單片機的SWV功能結合CubeIDE的ITM(Instrumentation Trace Macrocell)功能實現參數的實時跟蹤。需要說明的是,下面關于SWV實時跟蹤的功能介紹來源于CubeIDE的用戶手冊,覺得自己英文水平還行的可以直接去看手冊,更權威。

1. 端口配置

我們還是基于正點原子的F767開發板,在CubeMX里新建一個工程,具體設置見下圖。默認的Debug模式為JTAG,這里我們改為Trace Asynchronous Sw,調試模式改為SWD。這個時候PB3就會被使能,它的一個復用功能是SWO(Serial Wire Output),這個引腳配合SWD輸出實時跟蹤數據,也即實現了SWV功能。

圖片

2. 調試配置

用CubeIDE打開生成的工程,點擊菜單Run->Debug Configurations,新建一個調試配置文件,在調試器標簽頁里,接口選SWD,使能SWV,Core Clock處填內核實際運行頻率,這里是216 MHz。

圖片

接下來,連接開發板,進入調試模式。點擊菜單Window->Show View->SWV->SWV Trace Log,會在窗口下方打開SWV Trace Log標簽,如下圖。點擊Configure Trace圖標進行配置。

圖片

在配置窗口里我們使能PC Sampling,對內核PC(Program Counter)值進行采樣,分辨率16384 Cycles/sample的含義是每次采樣間隔16384個時鐘周期。這個值是默認的,考慮到SWO端口異步工作頻率為2 MHz,這個分辨率不能太小,否則數據量太大會造成堵塞。Timestamps必須被使能,好知道有事件發生了。后邊的預分頻值同樣與SWO數據量大小有關。

圖片

點擊SWV Trace Log標簽頁右方的Start Trace圖標,見下圖,并啟動調試,則會看到SWV Trace Log標簽頁會持續輸出PC Sample數據。

圖片

當然,除了輸出PC Sample數據之外,還可以配置輸出Configure Trace窗口里的各種事件發生的情況,也可以輸出某些變量值,甚至是把輸出的變量以圖表的形式輸出。具體配置方法可參考用戶手冊去研究。

3. 代碼利用printf重定向輸出消息

我們知道printf是C語言標準庫的函數,可以向屏幕打印字符串,嵌入式里一般被重定向到串口。在利用SWV進行調試時,我們可以把printf重定向到ITM的0通道,調試時,用戶代碼可以利用printf向外發送易讀的消息。

首先,Configure Trace里勾選0通道,見下圖。然后點擊CubeIDE菜單Window->Show View->SWV->SWV ITM Data Console,窗口下方會出現SWV ITM Data Console標簽頁,可以顯示ITM各通道輸出的信息。

圖片

接下來修改代碼,打開工程文件夾->Src->syscall.c文件,這個源文件里的函數配合C庫實現系統調用。找到_write函數,完成printf到ITM的重定向。修改如下:

__attribute__((weak)) int _write(int file, char *ptr, int len)
{
  int DataIdx;


  for (DataIdx = 0; DataIdx < len; DataIdx++)
  {
    //__io_putchar(*ptr++);
    ITM_SendChar(*ptr++);
  }
  return len;
}

當然,把注釋掉的那一行修改成串口發送的話,就能把printf重定向到串口。

在main.c的while循環里添加如下代碼:

while (1)
{
  HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);
  printf("LED0 is offn");
  HAL_Delay(500);
  HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);
  printf("LED0 is onn");
  printf("%dn",counter++);
}

重新編譯,進入調試模式,則可以在SWV ITM Data Console標簽頁里看到如下打印信息。

圖片

4. 小結

基于STM32Cube生態的SWV實時跟蹤調試方法就介紹到這里。需要說明的是,此方法在硬件上需要留出SWD接口和SWO引腳,正點原子STM32F767核心板上的SWD接口沒有引出SWO引腳,所以連接核心板的SWD無法用到SWV功能,需要通過ST-Link連接底板上的20針JTAG接口實現。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    30

    文章

    5141

    瀏覽量

    118055
  • STM32
    +關注

    關注

    2245

    文章

    10685

    瀏覽量

    349485
  • C語言
    +關注

    關注

    180

    文章

    7542

    瀏覽量

    131032
  • STM32單片機
    +關注

    關注

    58

    文章

    545

    瀏覽量

    58044
  • SWD
    SWD
    +關注

    關注

    1

    文章

    54

    瀏覽量

    11707
收藏 人收藏

    評論

    相關推薦

    stm32cube IDE配置方法

    stm32cube IDE配置方法stm32cube MX的方法一樣然后編譯,Project—Build all, 沒有錯誤警告后,開始下一步:下載程序其實就是利用
    發表于 01-10 07:49

    基于STM32Cube的時鐘樹配置

    本文檔內容介紹了基于STM32Cube的時鐘樹配置,以及使用操作步驟圖解。
    發表于 11-28 18:02 ?22次下載
    基于<b class='flag-5'>STM32Cube</b>的時鐘樹配置

    STM32Cube學習之一:點燈

    STM32Cube學習之一:點燈
    發表于 12-12 15:30 ?20次下載

    介紹STM32Cube的特點及應用

    2014年STM32 Roadshow:STM32Cube簡介
    的頭像 發表于 07-05 00:26 ?4885次閱讀

    使用STM32Cube輕松開發STM32

    STM32CubeSTM32開發更輕松
    的頭像 發表于 07-03 04:30 ?5370次閱讀

    STM32Cube到底包含哪些工具 ?

    STM32Cube到底包含哪些工具?
    的頭像 發表于 03-04 10:16 ?7993次閱讀

    STM32Cube介紹

    STM32Cube介紹
    發表于 12-08 15:51 ?19次下載
    <b class='flag-5'>STM32Cube</b>介紹

    X-CUBE-SBSFU STM32Cube 擴展包的集成指南

    X-CUBE-SBSFU STM32Cube 擴展包的集成指南
    發表于 11-21 17:07 ?0次下載
    X-<b class='flag-5'>CUBE</b>-SBSFU <b class='flag-5'>STM32Cube</b> 擴展包的集成指南

    UM1722_如何使用STM32Cube中的實時操作系統

    UM1722_如何使用STM32Cube中的實時操作系統
    發表于 11-22 19:16 ?2次下載
    UM1722_如何使用<b class='flag-5'>STM32Cube</b>中的<b class='flag-5'>實時</b>操作系統

    DB4638_STM32G0系列Azure?STM32Cube實時操作系統軟件擴展

    DB4638_STM32G0系列Azure?STM32Cube實時操作系統軟件擴展
    發表于 11-23 08:29 ?0次下載
    DB4638_<b class='flag-5'>STM32</b>G0系列Azure?<b class='flag-5'>STM32Cube</b>的<b class='flag-5'>實時</b>操作系統軟件擴展

    STM32Cube的X-CUBE-MEMS1擴展軟件中MotionCP實時攜帶位置庫入門

    電子發燒友網站提供《STM32Cube的X-CUBE-MEMS1擴展軟件中MotionCP實時攜帶位置庫入門.pdf》資料免費下載
    發表于 07-31 09:55 ?0次下載
    <b class='flag-5'>STM32Cube</b>的X-<b class='flag-5'>CUBE</b>-MEMS1擴展軟件中MotionCP<b class='flag-5'>實時</b>攜帶位置庫入門

    STM32Cube X-CUBE-MEMS1擴展的MotionGR實時手勢識別庫入門

    電子發燒友網站提供《STM32Cube X-CUBE-MEMS1擴展的MotionGR實時手勢識別庫入門.pdf》資料免費下載
    發表于 07-31 09:17 ?0次下載
    <b class='flag-5'>STM32Cube</b> X-<b class='flag-5'>CUBE</b>-MEMS1擴展的MotionGR<b class='flag-5'>實時</b>手勢識別庫入門

    STM32Cube在線培訓

    電子發燒友網站提供《STM32Cube在線培訓.pdf》資料免費下載
    發表于 08-01 14:23 ?2次下載
    <b class='flag-5'>STM32Cube</b>在線培訓

    始使用X-CUBE-SBSFU STM32Cube擴展包

    電子發燒友網站提供《始使用X-CUBE-SBSFU STM32Cube擴展包.pdf》資料免費下載
    發表于 08-01 09:22 ?0次下載
    始使用X-<b class='flag-5'>CUBE</b>-SBSFU <b class='flag-5'>STM32Cube</b>擴展包

    STM32Cube LL庫的巧妙之處

    STM32Cube LL庫的巧妙之處
    的頭像 發表于 09-27 16:26 ?1030次閱讀
    <b class='flag-5'>STM32Cube</b> LL庫的巧妙之處
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>