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上での設定¶
- iocファイルをダブルクリック
- 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 の間に挿入します。
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
累計表示回数:327
Updated by mole lord 6 months ago · 4 revisions