Project

General

Profile

Actions

SerialWireDebug » History » Revision 4

« Previous | Revision 4/11 (diff) | Next »
mole lord, 08/30/2020 02:04 PM


SerialWireDebug

この記事を書くにあたって AN4989 STM32 microcontroller debug toolbox を参考にしました。

CubeMXにおける、 System Core-SYS-Debug の設定のデフォルトは Disable です。
Disableであってもデバッグ実行はできる(J-Link化したから?)ようですが、誤ってユーザピンを割り当ててしまうのを防ぐためにも、CubeMX上で設定を行います。

CubeMX上での設定

  1. iocファイルをダブルクリック
  2. System Core-SYS の Debug を Trace Asynchronous Sw に直します
    • TCK TMS SYS_JTDO-SWO のピンが割り当て済みの状態になります

Serial Wire でなく Trace Asynchronous Sw にするのは、SWOを使ってデバッグ出力を行いたいからです。

ソースの書き換え

AN4989 STM32 microcontroller debug toolbox の 7.3 Printf via SWO/SWV に、SW4STM32向けの記述があるので、それに倣います。
なお、__io_putchar()をmain.cでないソースに配置する場合は、main.hをincludeすればITM_SendChar()の型をコンパイラに教えることができます。

main.cを書き換えてSWOからprintf()する手順

main.cを開き、 USER CODE BEGIN IncludesUSER CODE END Includes の間に #include <stdio.h> を挿入します。

以下のソースをmain.cの USER CODE BEGIN 0 と USER CODE END 0 の間に挿入します。

int
__io_putchar(int ch)
{
    ITM_SendChar(ch);
    return ch;
}

int
_write(int file, char *ptr, int len)
{
    int i;
    for (i = 0; i < len; i++)
    {
        __io_putchar(*ptr++);
    }
    return len;
}

USER CODE BEGIN WHILE近辺は以下のように直します。

/* USER CODE BEGIN WHILE */
while (1)
{
  static int32_t count = 0;
  HAL_GPIO_TogglePin(LD1_GPIO_Port, LD1_Pin);
  printf("loop %ld\n", count++);
  HAL_Delay(500);
  /* USER CODE END WHILE */

MCU Eclipse上での設定

Debug Configurations で、 □Allocate console for semihosting and SWO にチェックをいれるだけです。

プログラムを実行すると、Eclipse上のConsoleに以下のように表示が行われます。

SEGGER J-Link GDB Server V6.70a - Terminal output channel
loop 0
loop 1
loop 2
loop 3


累計表示回数:162

Updated by mole lord 3 months ago · 4 revisions