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 (注意:逗号必须是英文的逗号)
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>
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中的串口调试:的更多相关文章
- MDK/Keil 中,J-Link调试查看变量值总是显示<not in scope>
转载请注明出处,谢谢. MDK/Keil 中,J-Link调试查看变量值总是显示<not in scope> 原因:编译器把代码优化掉了,直接导致在仿真中变量根本没有分配内存,也就无法查看 ...
- 【安富莱专题教程第5期】工程调试利器RTT实时数据传输组件,替代串口调试,速度飞快,可以在中断和多任务中随意调用
说明:1.串口作为经典的调试方式已经存在好多年了,缺点是需要一个专门的硬件接口.现在有了SEGGER的RTT(已经发布有几年了),无需占用系统额外的硬件资源,而且速度超快,是替代串口调试的绝佳方式.2 ...
- stm32中如何进行printf重定向用于串口调试输出
1 在main中包含stdio.h 文件 2 Target选项框里选Use MicroLib 选项 3 在main中添加UART1_Configuration()初始化的代码 Uart1初始化,voi ...
- KEIL中的一些细节
1.KEIL中的指针: 基于存储器的指针:数据类型 [指向存储区] *[ 指针存储区]指针变量 char xdata * px //px本身存在于自动分配的空间,一般位于data中,指向的内容位于x ...
- [STM32F10x] 使用printf函数进行串口调试问题
硬件:STM32F103C8T6 平台:Keil ARM-MDk V5.11 利用printf函数通过串口(USART)进行调试时遇到的一个问题: printf("Hello, Mini-M ...
- Modbus通讯协议学习 - 串口调试
概述 我们在做任何事情之前都需要获取很多 调试步骤: 1:485转换器连接硬件 2:485转换器上的USB接口连接电脑. 3:打开设备管理器 ->查看端口 4:打开串口调试工具,在串口配置的地方 ...
- android 串口调试
在usb调试过程中,都会选择串口查看log,更希望在串口中输入命令查看相关状态.但是一般情况下串口调试时 进程用户是shell,即使你在adb shell下是root用户. 暴力方法是在 adroid ...
- GeekPwn2015胸卡ESP8266 12E串口调试
相信今年参加GeekPwn活动的很多同学都获得了一枚GeekPwn的胸牌,为方便大家对胸牌进行一些调试和破解,这里分享一些关于这枚胸牌的一些信息 :)如发现文章之中有错误之处,欢迎大家斧正! 0×00 ...
- linux -- 串口调试总结
linux 串口输出调试 在某些情况下,需要同时对两台或多台Linux主机进行管理和操作.如果手头缺少足够多的键盘和显示器,那么通过一台机器的串口对其余主机进行控制不失为一种快捷.有效的方法. 下面就 ...
随机推荐
- 纯CSS绘制三角形(各种角度)
我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来. ...
- Concurrent inserts on MyISAM and the binary log
Recently I had an interesting surprise with concurrent inserts into a MyISAM table. The inserts were ...
- 生成n个数的全排列【递归、回溯】
下面讨论的是n个互不相同的数形成的不同排列的个数.毕竟,假如n个数当中有相同的数,那n!种排列当中肯定会有一些排列是重复的,这样就是一个不一样的问题了. /*===================== ...
- (object sender,EventArgs e)是什么?
object sender:发出事件的对象 EventArgs e:对象中的数据
- ActionContext详解
ActionContext ActionContext是Action的上下文,Struts2自动在其中保存了一些在Action执行过程中所需的对象,比如session, parameters, ...
- Jenkins初探
最近搞搞接口测试,Postman脚本搞好了,但是每次都要手动运行,是不是太low了?Yes,it is. 最近好多人都在用Jenkins搞自动化部署集成之类的,我也凑热闹搞一下. 前提: 1. 已经安 ...
- python数据类型之list
1.append:增加元素到列表尾部 L.append(object) -> None -- append object to end 2.clear:清空列表中所有元素 3.count:返回列 ...
- selenium+python自动化之pycharm
方法: 1.注册机界面,选择License serve.填入http://www.cnblogs.com/testdream/ 2.点击ok 3.注册界面选择:Activation coede 4.打 ...
- Struts2 Interceptors
Alias Interceptor : 别名拦截器 <action name="someAction" class="com.examples.SomeAction ...
- object-单例设计模式
1.什么是单例? 单例是一种数据共享的方法,其实就是等同于c语言中的全局变量.在整个程序生命周期内,该对象只有一份存在内存中,可以在多个对象之间共享数据 单例其实就相当于一个类只能有一个实 ...