keil中的串口调试:

2023-05-16

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。详情如下:

 

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 使用keil软件添加.C文件和.H文件到工程

    使用keil软件添加 C文件和 H文件到工程 1 第一步 在所建工程的文件夹下的HARDWARE子文件夹下创建一个所要添加文件名称 xff0c 例如要添加led c和led h文件 xff0c 可以先在HARDWARE文件目录下创建一个命名
  • keil 5的软件仿真遇到的问题:error 65: access violation at 0x40021000 : no 'read' permission的解决办法

    我们有时候在用keil 5的软件仿真时会碰到这个问题 xff1a error 65 access violation at 0x40021000 no 39 read 39 permission 很纳闷 xff0c 硬件调试都对 xff0c
  • STC芯片在Keil中的添加与使用

    一 使用官方烧录工具 stc isp v6 88K exe在Keil中添加STC芯片 此烧录工具可在STC官网上下载 二 打开STC ISP软件 xff0c 选择右侧 Keil仿真设置 栏 三 选择 添加型号和头文件到Keil中 添加STC
  • STM32CubeIDE设置Flash烧录地址和大小(告别Keil魔术棒)

    STM32CubeIDE中设置Flash烧写地址和范围 在由Keil平台转到STM32CubeIDE平台过程中 我们熟悉的点开魔术棒进行相关烧录配置的方式已经不适用了 在STM32CubeIDE平台中我们需要通过修改文件的方式来实现 稍显麻
  • Keil 中出现“encountered an improper argument” 解决办法

    Keil 中出现 encountered an improper argument 解决办法 出现这种情况就是因为目录文件下带有中文路径 不要弄成中文路径就可以解决了
  • --- Error: User Command terminated, Exit-Code = 1解决办法

    使用keil MDK编译项目时 compiling编译通过 但是文件最后出现错误 Error User Command terminated Exit Code 1 经查阅资料 MDK需要fromelf exe文件生成 bin 那么在重新安
  • keil编译错误:ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED

    出现这个错误 很多网上都说是没注册成功导致的 注册成功的话会在keil的菜单栏 help gt about 里看到如下的显示 我的keil里about显示注册成功了 但还是出现错误提示 ERROR L250 CODE SIZE LIMIT
  • keil5 编辑栏一直是灰色

    无语了 气炸了 愤怒啊 查了一下 有很多 arm 和 c51 并存 不管他了 之前装了用完51 又装了arm 现在反而什么都用不了 打开license 发现过期了 重新破解 即可 注意音乐 大半夜吓死人 你以为这样就可以了 你就太天真了 网
  • 使用fromelf把axf文件转换成elf格式

    FROMELF用法 命令格式 fromelf options input file fromelf h即可打印出帮助信息 Product MDK Plus 5 29 Component ARM Compiler 5 06 update 6
  • STM32F4 DWT功能 实现程序运行时间精确测试

    时间戳相关寄存器定义 在Cortex M里面有一个外设叫DWT Data Watchpoint and Trace 该外设有一个32位的寄存器叫CYCCNT 它是一个向上的计数器 记录的是内核时钟运行的个数 最长能记录的时间为 10 74s
  • L6050U compile erro

    L6050U The code size of this image exceeds the maximum allowed for this version of the linker 原因 是 用的 是 EVb版本 需要 正版 才没有
  • Keil编程中Source Brower : "P17" is undefined!的问题

    博客原文 Keil编程中Source Brower P17 is undefined 的问题 在Keil新建工程中经常会遇到一个问题 去看某一个变量定义 然后跳转不过去 并提示Source Brower 某某 is undefined 在这
  • Keil最舒服的配色方案

    每次重装keil 都会重新配置下颜色 因为默认的颜色 看久了实在不太舒服 每次调到一个舒服的颜色 都要花不少时间 为了后面节省时间 现记录一下 如下就是我觉得还不错的配色方案 如果你觉得也还可以 可以接着往下看 一 进入配置 二 光标所在行
  • keil找不到device,怎么办?

    下载好的keil 准备调试程序 却发现这个问题 找不到我需要的芯片啊啊啊 头大 后面发现是缺少相应的pack 安装keil时 好像没有自动装上STM32系列芯片 所以得需要自己安装 百度一下 找一些资源 然后 把途中红色框住的 分别放在安装
  • C51简介及Keil的使用

    前言 此文档主要是针对有一定C C 编程基础 并打算用Keil从事C51开发的开发人员 C51涉及的知识比较多 但是入门基本的开发 还是容易的 C51简介 1 C51概念 C51继承于C语言 主要运行于51内核的单片机平台 单片机 单片微型
  • WIN10下各种软件字体模糊解决

    WIN10下uvision字体模糊解决 有时会出现软件模糊的情况 如图 解决方法很简单 重新打开工程我们就能发现字体已经变清晰了 该方法适用于解决大部分win10软件字体模糊的问题 而不仅是keil 有时会出现软件模糊的情况 如图 以我经常
  • [keil5] 中有关“TOOLS.INI-Section ‘[C51]‘ : missing ‘PATH‘ enty “错误

    在安装vdmagdi后 打开keil5 uVision5出现 gt gt gt TOOLS INI Section C51 missing PATH enty lt lt lt 错误 原因如下 双击运行vdmagdi exe文件 选择了AG
  • 错误:L6236E:没有部分与选择器匹配 - 没有部分是第一个/最后一个

    我是新来的ARM编程使用Keil Microvision V5 12编译器 我无法编译一个简单的程序集项目并出现此错误 Objects learn sct 7 error L6236E No section matches selector
  • 如何更改 FreeRTOS 中任务的最大可用堆大小?

    我通过以下方式在任务中创建元素列表 l dllist pvPortMalloc sizeof dllist dlllist 有 32 字节大 我的嵌入式系统有 60kB SRAM 所以我希望系统可以轻松处理我的 200 个元素列表 我发现在
  • UINT32_C 和 uint32_t 之间的区别

    据我所知后缀t in uint32 t denote t类型名称 但我想知道是什么C in UINT32 C有何不同 UINT32 C是一个定义整型常量的宏uint least32 t 例如 UINT32 C 123 Might expan

随机推荐

  • 联想服务器rd系列,联想ThinkServer RD550服务器首发评测

    IT168 评测 9月22日 xff0c 在 34 新云力量 联想企业级业务策略暨ThinkServer Gen5发布会 34 上 xff0c 联想正式发布了基于最新的英特尔至强E5 2600 v3系列处理器ThinkServer第五代产品
  • 6、镜像和容器

    文章目录 隐藏 开发者必备的 Docker 实践指南镜像与容器 本文是全系列中第8 10篇 xff1a 专题 Docker入门 Docker踩坑及个人学习汇总 获取Centos7安装Docker各种姿势 xff08 指定版本 xff09 T
  • 《Docker-在Windows上安装Docker桌面》

    文章目录 Windows上安装Docker桌面一 Docker Desktop下载二 Docker Desktop 安装三 下载并安装Linux内核更新程序包四 安装 Linux 分发五 配置docker的镜像加速器六 通过Linux分发版
  • stm32经典笔试题_stm32嵌入式试题

    第一章 为什么学习 STM32 STM32 是一系列以 ARM Cortex M 为内核的 32 位嵌入式微控制器 第二章 初识 STM32 库 1 什么是启动文件 xff1f 启动文件的作用是什么 xff1f 具体实现了哪些功能 xff1
  • imu相机标定_相机+imu标定

    官方上是跑在ros indigo上的 xff0c 但是实测用kinetic也没问题 xff0c 主要就是装依赖的时候改下名字 下面命令行里有写注释 1 工具箱 Kalibr 安装 安装依赖 sudo apt get install pyth
  • linux双系统如何选择顺序,双系统中怎么设置Ubuntu多系统的默认启动顺序?

    很多人在安装Linux系统 xff0c 如Fedora或Ubuntu等操作系统玩的时候 xff0c 一般还会保留一份Windows操作系统作为主用系统 xff0c 但是发现安装了Linux系统之后 xff0c 默认的启动菜单就变成了Linu
  • rpe matlab,Constant velocity range-parameterized EKF initialization

    The RPEKF is a special type of filter that can be initialized using angle only measurements that is azimuth and or eleva
  • 计算机与工作 生活的小论文,电脑与生活作文

    电脑与生活作文 在生活 工作和学习中 xff0c 大家或多或少都会接触过作文吧 xff0c 作文是人们把记忆中所存储的有关知识 经验和思想用书面形式表达出来的记叙方式 那要怎么写好作文呢 xff1f 以下是小编收集整理的电脑与生活作文 xf
  • gVim的字体和背景颜色设置

    电脑环境是XP xff0c 软件是gVim7 3 xff0c 安装在C盘的 Program Files 下 如何设置gVim的字体和背景颜色 xff1a C gt Program Files gt Vim gt vimrc文件 xff0c
  • xlight ftp linux,Xlight FTP Server

    Xlight FTP Server的功能按钮都是中文的 xff0c 国内用户可以轻易地创建新的服务器 xff0c 并且能够为同一台计算机的多个端口创建各自的虚拟服务器 此外 xff0c 它还具有用户虚拟目录 xff0c 每个用户的虚拟目录都
  • 参数控制c语言代码走向,C语言可变参数完全解读

    本文转自 xff1a http www cnblogs com wangyonghui archive 2010 07 12 1776068 html 一 是什么 我们学习C语言时最经常使用printf 函数 xff0c 但我们很少了解其原
  • VHDL计算机硬件能直接执行吗,第5章 VHDL程序结构.ppt

    第5章 VHDL程序结构 VHDL 数字系统设计 第5章 VHDL程序结构 VHDL语言的特点 xff1a VHDL语言具有很强的电路描述和建模能力 xff0c 能从多个层次对数字系统进行建模和描述 xff0c 从而大大简化了硬件设计任务
  • opencv双目标定原理_双目视觉原理及流程概述

    击上方 新机器视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 双目原理 双目视觉是利用视差原理的一种视觉方法 如图所示为空间中一点P在左右相机中的成像点Pleft 61 Xleft Yleft xf
  • java怎么写算法_用Java写算法之一:冒泡排序

    从这篇文章开始 xff0c 我会陆陆续续将我所能用Java实现的算法在这里简单做个梳理 xff0c 也算温故而知新吧 受个人水平和时间限制 xff0c 可能会有错漏 xff0c 欢迎各位批评指正 那么 xff0c 就从冒泡排序开始 显然 x
  • docker显示linux桌面,怎样在桌面上安装 Docker CE?

    按照这些简单的步骤在你的 Linux Mac 或 Windows 桌面上安装 Docker CE 在上一篇文章中 xff0c 我们学习了容器世界的一些基本术语 当我们运行命令并在后续文章中使用其中一些术语时 xff0c 这些背景信息将会派上
  • 信号量-邮箱-消息队列的区别

    为什么要用 xff1a 任务间的通信可以通过全局变量或者信号量来完成 全局变量虽然可以承载通信的内容 xff0c 但是接收方无法意识到信息的到达 xff0c 除非发送方向接收方发送一个信号量 xff0c 或者接收方不断该全局变量 xff1b
  • 乱码大全(二) (转)

    乱码大全 二 转 64 more 64 2 XxencodeXML namespace prefix 61 o ns 61 34 urn schemas microsoft com Office office 34 gt 提到Uuencod
  • 成都麻将胡牌算法

    四川麻将胡牌算法 xff08 不支持风 花牌 xff09 支持缺一门 七小对 xff0c 正常胡牌 xff0c 带杠 感谢 华仔 对我的代码提出了宝贵的意见 xff0c 华仔很适合做测试啊 xff01 xff01 include lt st
  • linux lvm 扩容磁盘,Linux LVM磁盘空间扩容的新方法

    导读 传统LVM扩容方法需要增加PV磁盘 xff0c 扩容多次后 xff0c 服务器的磁盘数量会越来越多 xff0c 容易增加日后维护存储和磁盘布局的难度 当服务器是虚拟机 xff0c 或者使用SAN NAS存储的物理机时 xff0c 由于
  • keil中的串口调试:

    keil中串口的虚拟调试信息在通过View serial windows usart1 2 3 4 debug printf 可以看到 当然也可以通过虚拟串口VSPD 43 串口调试助手在外部实现 xff0c 方法如下 xff1a 虚拟 串