keil中串口的虛擬調試信息在通過View-serial windows-#usart1/2/3/4/debug(printf)可以看到。當然也可以通過虛擬串口VSPD+串口調試助手在外部實現,方法如下:
虛擬 串口使用:步驟
1 下載虛擬串口軟件,虛擬2個連接的串口COMA/COMB,這兩個串口與PC機的真實物理串口沒關系。兩邊的設置相同
2 打開串口通訊助手,將A分配給串口通訊助手,則B就分配給下面的COMx
2 在MDK中輸入命令行或者將下面的做成debug.ini文件加載
MODE COMB baudrate, parity, databits, stopbits (注意:逗號必須是英文的逗號:settings PC's COM ports)
ASSIGN COMB < SnIN > SnOUT //COMB就是keil uvision的串口,根據單片機 的串口號來設置n(如果只有一個串口則n可省略)。
注意:這個在硬件仿真時不能用。
- The ASSIGN command cannot be used when debugging on target hardware.
- DIR VTREG列出可用的定義符號
The PC serial port (COM port) supports only up to 8 data bits. Therefore, it is impossible to generate more then 8 data bits, as it is possible on some microcontroller UART interfaces
2 printf的實現方法一(函數重定向):重寫fputc ()函數,用單片機的一個串口實現:
2.1 在mdk->option中選擇 Use MicroLIB
21.2 包含標准庫頭文件#include <stdio.h>,提前把單片機的串口程序調試好
2.3 重寫fput函數
/*
* 函數名: fputc
* 描述 :重定向 c 庫函數 printf 到 USART1
* 調用 :由 printf 調用
*/
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (unsigned char) ch);
// while (!(USART1->SR & USART_FLAG_TXE));
while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);
return (ch);
}
2.4用printf進行調用。
MDK中軟仿真下Debug (printf) Viewer
https://wenku.baidu.com/view/15f99562fc4ffe473268ab0a.html
工程中包含以下Simulation_debugPrinfView.c文件
/************************Simulation_debugPrinfView.c for M3*************************************/
#define DBG_PRINT 1
#if DBG_PRINT
#define Debug_Printf printf
#else
#define Debug_Printf
#endif
#include <string.h>
//#include <stdio.h>
typedef struct __FILE FILE; //與#include <stdio.h>二選一避免編譯報錯。
#define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n)))
#define ITM_Port16(n) (*((volatile unsigned short*)(0xE0000000+4*n)))
#define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n)))
#define DEMCR (*((volatile unsigned long *)(0xE000EDFC)))
#define TRCENA 0x01000000
struct __FILE { int handle; /* Add whatever needed */ };
typedef struct __FILE FILE;
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f)
{
if (DEMCR & TRCENA)
{
while (ITM_Port32(0) == 0);
ITM_Port8(0) = ch;
}
return(ch);
}
三 利用SWO+硬件調試器實現
MDK的debug(printf)使用:
1 仿真器設置:Debug頁面,選擇仿真器為Cortex-M/R J-Link/J-Trace, 並點擊仿真器選項邊上的setting選項,打開具體的設置窗口。
在打開的窗口中,切換到Trace頁面,選中Enable,並且設置Core Clock為14MHz,分頻選項為Core Clock/16。詳情如下:
2 重寫fputc()函數如下
struct __FILE { int handle; };
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f) {
ITM_SendChar(ch);
return(ch);
}
3 使能SWO輸出即調用函數
void setupSWO(void)
{
uint32_t *dwt_ctrl = (uint32_t *) 0xE0001000;
uint32_t *tpiu_prescaler = (uint32_t *) 0xE0040010;
uint32_t *tpiu_protocol = (uint32_t *) 0xE00400F0;
CMU->HFPERCLKEN0 |= CMU_HFPERCLKEN0_GPIO;
GPIO->ROUTE |= GPIO_ROUTE_SWOPEN;
#if defined(_EFM32_GIANT_FAMILY)
GPIO->ROUTE = (GPIO->ROUTE & ~(_GPIO_ROUTE_SWLOCATION_MASK)) | GPIO_ROUTE_SWLOCATION_LOC0;
GPIO->P[5].MODEL &= ~(_GPIO_P_MODEL_MODE2_MASK);
GPIO->P[5].MODEL |= GPIO_P_MODEL_MODE2_PUSHPULL;
#else
GPIO->ROUTE = (GPIO->ROUTE & ~(_GPIO_ROUTE_SWLOCATION_MASK)) | GPIO_ROUTE_SWLOCATION_LOC1;
GPIO->P[2].MODEH &= ~(_GPIO_P_MODEH_MODE15_MASK);
GPIO->P[2].MODEH |= GPIO_P_MODEH_MODE15_PUSHPULL;
#endif
CMU->OSCENCMD = CMU_OSCENCMD_AUXHFRCOEN;
while(!(CMU->STATUS & CMU_STATUS_AUXHFRCORDY));
CoreDebug->DHCSR |= 1;
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
*dwt_ctrl = 0x400113FF;
*tpiu_prescaler = 0xf;
*tpiu_protocol = 2;
ITM->LAR = 0xC5ACCE55;
ITM->TCR = 0x10009;
}
Pasted from <http://blog.sina.com.cn/s/blog_79b01f6601018ymr.html>
3包含頭文件#include <stdio.h>,並調用printf
4在debug中打開輸出仿真:View-serial-debug(printf)
Pasted from <http://blog.sina.com.cn/s/blog_79b01f6601018ymr.html>
Pasted from <http://blog.csdn.net/xiaolei05/article/details/8526021>
嵌入式軟件開發中的一個基本需求就是能通過終端來輸出調試信息,一般可通過2種方式實現:一種是使用串口線連接板上的UART和PC上的COM口,通過PC上的超級終端來查看調試信息;另一種則是采用半主機機制,但有可能不被所用的工具鏈支持。基於Cortex-M3核的軟件調試突破了這樣的限制,Cortex-M3內核提供了一個ITM(Instrumentation TraceMacrocell)接口,通過SWV(Serial Wire Viewer)可調試由SWO引腳接收到的ITM數據。ITM實現了32個通用的數據通道,基於這樣的實現,CMSIS規定用通道0作為終端來輸出調試信息,通道31用於操作系統的輸出調試(特權模式訪問)。在core_cm3.h中定義了ITM_SendChar()函數,因此可通過調用該函數來重寫fputc,以在應用程序中通過printf打印調試信息,並可通過ITM Viewer查看這些調試信息。有了這樣的實現,嵌入式軟件開發者就可以在不配置串口和使用終端調試軟件的情況下輸出調試信息,在一定程度上減少了工作量。
使用SWO來替代串口實現Printf打印功能:
STM32之類的Cortex芯片都支持SWO輸出,而我們用串口調試很多時候也只是使用TX輸出而已,完全可以把Printf的串口TX Retarget到SWO這個腳上,直接使用ST-Link就可以查看打印信息
1:速度快,ARM官方描述的速度:高性能數據速率 - 4 M 字節/秒 @ 50 MHz
2:不占用串口 ,其實如果你是用JTAG口的,改成SWD調試,一個腳都不會多占用.
3:因為速度快,所以基本上只需要用Block方式輸出,沒有中斷問題
4:還是因為是Block輸出,資源互斥的問題也一起被解決了
硬件條件:你得把芯片的SWO腳接到調試口上,按JTAG接線的話,這個默認已經接上了,不過很多人可能自己只用SWD的兩根線,這個就沒接
Pasted from <http://www.amobbs.com/thread-5541672-1-1.html>
semihost/ITM機制淺析以及使用JLINK通過ITM調試stm32單片機(轉)
-Pasted from <http://www.cnblogs.com/afeibfp/archive/2013/01/12/2857262.html>