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 (注意:逗号必须是英文的逗号)

ASSIGN COMB < SnIN > SnOUT    //COMB就是keil uvision的串口,根据单片机 的串口号来设置n(如果只有一个串口则n可省略)。

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

三 利用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>

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

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>

keil中的串口调试:的更多相关文章

  1. MDK/Keil 中,J-Link调试查看变量值总是显示<not in scope>

    转载请注明出处,谢谢. MDK/Keil 中,J-Link调试查看变量值总是显示<not in scope> 原因:编译器把代码优化掉了,直接导致在仿真中变量根本没有分配内存,也就无法查看 ...

  2. 【安富莱专题教程第5期】工程调试利器RTT实时数据传输组件,替代串口调试,速度飞快,可以在中断和多任务中随意调用

    说明:1.串口作为经典的调试方式已经存在好多年了,缺点是需要一个专门的硬件接口.现在有了SEGGER的RTT(已经发布有几年了),无需占用系统额外的硬件资源,而且速度超快,是替代串口调试的绝佳方式.2 ...

  3. stm32中如何进行printf重定向用于串口调试输出

    1 在main中包含stdio.h 文件 2 Target选项框里选Use MicroLib 选项 3 在main中添加UART1_Configuration()初始化的代码 Uart1初始化,voi ...

  4. KEIL中的一些细节

    1.KEIL中的指针: 基于存储器的指针:数据类型 [指向存储区]  *[ 指针存储区]指针变量 char xdata * px //px本身存在于自动分配的空间,一般位于data中,指向的内容位于x ...

  5. [STM32F10x] 使用printf函数进行串口调试问题

    硬件:STM32F103C8T6 平台:Keil ARM-MDk V5.11 利用printf函数通过串口(USART)进行调试时遇到的一个问题: printf("Hello, Mini-M ...

  6. Modbus通讯协议学习 - 串口调试

    概述 我们在做任何事情之前都需要获取很多 调试步骤: 1:485转换器连接硬件 2:485转换器上的USB接口连接电脑. 3:打开设备管理器 ->查看端口 4:打开串口调试工具,在串口配置的地方 ...

  7. android 串口调试

    在usb调试过程中,都会选择串口查看log,更希望在串口中输入命令查看相关状态.但是一般情况下串口调试时 进程用户是shell,即使你在adb shell下是root用户. 暴力方法是在 adroid ...

  8. GeekPwn2015胸卡ESP8266 12E串口调试

    相信今年参加GeekPwn活动的很多同学都获得了一枚GeekPwn的胸牌,为方便大家对胸牌进行一些调试和破解,这里分享一些关于这枚胸牌的一些信息 :)如发现文章之中有错误之处,欢迎大家斧正! 0×00 ...

  9. linux -- 串口调试总结

    linux 串口输出调试 在某些情况下,需要同时对两台或多台Linux主机进行管理和操作.如果手头缺少足够多的键盘和显示器,那么通过一台机器的串口对其余主机进行控制不失为一种快捷.有效的方法. 下面就 ...

随机推荐

  1. 黑马程序员——JAVA基础之函数,重载,内存结构

      ------- android培训.java培训.期待与您交流! ---------- 函数: 什么是函数? • 函数就是定义在类中的具有特定功能的一段独立小程序. • 函数也称为方法. 函数的格 ...

  2. 磁盘与目录的容量[转自vbird]

    磁盘与目录的容量 现在我们知道磁盘的整体数据是在 superblock 区块中,但是每个各别文件的容量则在 inode 当中记载的. 那在文字接口底下该如何叫出这几个数据呢?底下就让我们来谈一谈这两个 ...

  3. 【转】IOS学习笔记29—提示框第三方库之MBProgressHUD

    原文网址:http://blog.csdn.net/ryantang03/article/details/7877120 MBProgressHUD是一个开源项目,实现了很多种样式的提示框,使用上简单 ...

  4. -bash: crontab: command not found(转)

    操作步骤 1. 确认crontab是否安装: 执行 crontab 命令如果报 command not found,就表明没有安装 2. 安装 crontab 执行 yum install -y vi ...

  5. DDD, MVC & Entity Framework

    https://digitalpolis.co.uk/software-thoughts/ddd-mvc-entity-framework/ Data Points - Coding for Doma ...

  6. Python-requests之POST Data的json问题

    代码如下: import json import requests r = requests.post(url, data = {"a": json.dumps({"b& ...

  7. 主成分分析(PCA)

    主成分分析(principal component analysis)是一种常见的数据降维方法,其目的是在"信息"损失较小的前提下,将高维的数据转换到低维,从而减小计算量.PCA的 ...

  8. 浅拷贝,深拷贝---ios

    #import <Foundation/Foundation.h> @interface Father : NSObject <NSCopying,NSMutableCopying& ...

  9. unity, collider/trigger on children

    参考:http://answers.unity3d.com/questions/410711/trigger-in-child-object-calls-ontriggerenter-in-pa.ht ...

  10. unity, Animation crossfade需要两动画在时间上确实有交叠

    unity现在播动画都用Animator了,但公司的老项用的还是Animation,今天遇到一个bug,是两个动画的衔接处不连贯. 最后发现是由于A动画已经播完之后B动画才开始播,而且还用了cross ...