Project

General

Profile

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` にチェックをいれるだけです。 

 ![](AllocateConsoleForSemihostingAndSwo.png) 

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

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