SerialWireDebug » History » Revision 4
Revision 3 (mole lord, 08/30/2020 08:48 AM) → Revision 4/11 (mole lord, 08/30/2020 02:04 PM)
# SerialWireDebug {{>toc}} この記事を書くにあたって [AN4989 STM32 microcontroller debug toolbox](https://www.st.com/resource/en/application_note/dm00354244-stm32-microcontroller-debug-toolbox-stmicroelectronics.pdf) を参考にしました。 CubeMXにおける、 System Core-SYS-Debug の設定のデフォルトは Disable です。 Disableであってもデバッグ実行はできる(J-Link化したから?)ようですが、誤ってユーザピンを割り当ててしまうのを防ぐためにも、CubeMX上で設定を行います。 ## CubeMX上での設定 1. iocファイルをダブルクリック 1. 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 Includes` と `USER CODE END Includes` の間に `#include <stdio.h>` を挿入します。 以下のソースをmain.cの USER CODE BEGIN 0 と USER CODE END 0 の間に挿入します。 ~~~ c 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近辺は以下のように直します。 ~~~ c /* 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 ~~~