keil中的串口调试:

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.4printf进行调用。

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+硬件调试器实现

MDKdebug(printf)使用:

1 仿真器设置:Debug页面,选择仿真器为Cortex-M/R J-Link/J-Trace, 并点击仿真器选项边上的setting选项,打开具体的设置窗口。

在打开的窗口中,切换到Trace页面,选中Enable,并且设置Core Clock为14MHz,分频选项为Core Clock/16。详情如下:

Machine generated alternative text: Cortex iLink/iTrace Target Driver Setup
Debu)Rast Download I
Trace Settings
__i4.MHz
Trace Port r Instruction race
Serial Wire Output - UART/Nd r PC Sampling _________
swo Prescaler: ji 02C1 6 z]
Prescaler F Periodic Period: J <Disabled>
F on Data RJW Sample
Clock:

 

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

4debug中打开输出仿真:View-serial-debug(printf)

 

Pasted from <http://blog.sina.com.cn/s/blog_79b01f6601018ymr.html>

 

Keil调试技术 (用 SWO 功能替代 printf

 

Pasted from <http://blog.csdn.net/xiaolei05/article/details/8526021>

 

 

嵌入式软件开发中的一个基本需求就是能通过终端来输出调试信息,一般可通过2种方式实现:一种是使用串口线连接板上的UARTPC上的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

 

原文地址:https://www.cnblogs.com/jieruishu/p/4074732.html