Thông thường muốn debug dữ liệu với STM32 ta sẽ thêm đoạn code khai báo UART, sau đó dùng một modul nào đó(như PL2303/CP2102) để kết nối với 2 chân TX RX thì mới show data ra terminal được, tuy nhiên có một cách khác để các bạn có thể in dữ liệu ngay trong keil C luôn là dùng SWO, hôm nay mình sẽ làm tổng hợp cơ bản để các bạn có thể  sử dụng chức năng này để debug

Chuẩn bị

  • Kit STM32F407 discovery
  • KeilC v5 và CubeMX

Sử dụng SWO

Theo tài liệu [1] thì bên trong STM32 sẽ có một khối gọi là ITM, khối này có thể được dùng để gửi dữ liệu từ MCU ra ngoài thông qua chân SWO nhờ đó mà chúng ta có thể dùng nó để print data với hàm printf  trong quá trình debug của Keil C.

Cách thức này khá giống với việc sử dụng USART, nhưng tiện lợi hơn là không phải sử dụng thêm các dây nối cũng như là PC terminal

Cấu hình SWO

Trước tiên chúng ta cần tạo một project đơn giản với CubeMX và Keil C

CubeMX

Bước 1: Tạo project trong CubeMX bằng cách chọn Menu > File > New Project, chọn STM32F4 > STM32F407

Bước 2: Cấu hình RCC và SYS như hình

Bước 3: Cấu hình Clock

Bước 4: Cấu hình project detail để gen code

Bước 5: Gen code (Ctrl+Shift+G)

Keil C

Mở Keil C sau khi gen code xong lên sau đó

Bước 1: Thêm thư viện stdio.h để đảm bảo printf hoạt động

/* USER CODE BEGIN Includes */
#include<stdio.h>
/* USER CODE END Includes */

Bước 2: Add structure

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
struct __FILE
{
  int handle;
  /* Whatever you require here. If the only file you are using is */
  /* standard output using printf() for debugging, no file handling */
  /* is required. */
};
/* USER CODE END PFP */

Bước 3: Thêm function fputc để gửi byte thông qua ITM

* USER CODE BEGIN 4 */
/*send text over SWV*/
int fputc(int ch, FILE *f) {
    ITM_SendChar(ch);//send method for SWV
    return(ch);
}
/* USER CODE END 4 */

Bước 4: Cấu hình trong Keil C

  • Mở target option (alt + f7)
  • Chọn ST-Link debugger
  • Chọn nút Settings
  • Set SW trong thẻ Debug
  • Chuyển sang thẻ Trace Tab và chọn như hình
  • Check vào phần Trace Enable
  • Set clock là 168 Mhz (cùng với clock đã cấu hình trong CubeMX)
  • Check ITM Stimulus Port 0
  • Chọn nút OK

Bước 5: Thêm phần sau vào chương trình chính

while (1)
{
 
/* USER CODE END WHILE */
 
/* USER CODE BEGIN 3 */
      printf("test text \n");
      HAL_Delay(200);
}
/* USER CODE END 3 */

Bước 6: Compile và nạp chương trình xuống, sau đó chọn debug và mở Debug(printf) Viewer

Kết quả

Sau khi ấn vào debug sẽ có kết quả như hình bên dưới

Project cụ thể các bạn có thể tham khảo tại Github SWO

Tạm kết

Vậy là mình đã thực hiện được các bước cơ bản để debug và hiển thị thông tin với SWO dùng printf trong Keil C, cách này giúp ta tiết kiệm được bao nhiêu phần cứng cũng như dây nối, còn ứng dụng cụ thể của nó vào trong dự án như thế nào xin hẹn các bạn ở bài tiếp theo.