Sử dụng SWO để debug thông tin từ STM32
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.