一个超级实用的单片机调试组件!

发布者:MysticalGlow最新更新时间:2023-09-12 来源: elecfans关键字:单片机  调试组件  arm 手机看文章 扫描二维码
随时随地手机看文章

DWT跟踪组件

跟踪组件:数据观察点与跟踪(DWT)

DWT 中有剩余的计数器,它们典型地用于程序代码的“性能速写”(profiling)。通过编程它们,就可以让它们在计数器溢出时发出事件(以跟踪数据包的形式)。

最典型地,就是使用 CYCCNT寄存器来测量执行某个任务所花的周期数,这也可以用作时间基准相关的目的(操作系统中统计 CPU使用率可以用到它)。

Cortex-M中的DWT

在Cortex-M里面有一个外设叫DWT(Data Watchpoint and Trace),是用于系统调试及跟踪。

它有一个32位的寄存器叫CYCCNT,它是一个向上的计数器,记录的是内核时钟运行的个数,内核时钟跳动一次,该计数器就加1,精度非常高,如果内核时钟是72M,那精度就是1/72M = 14ns,而程序的运行时间都是微秒级别的,所以14ns的精度是远远够的。

最长能记录的时间为:59.65s。计算方法为2的32次方/72000000。

当CYCCNT溢出之后,会清0重新开始向上计数。

使用方法

要实现延时的功能,总共涉及到三个寄存器:DEMCR 、DWT_CTRL、DWT_CYCCNT,分别用于开启DWT功能、开启CYCCNT及获得系统时钟计数值。

DEMCR

想要使能DWT外设,需要由另外的内核调试寄存器DEMCR的位24控制,写1使能(划重点啦,要考试!!)。DEMCR的地址是0xE000 EDFC



关于DWT_CYCCNT

使能DWT_CYCCNT寄存器之前,先清0。让我们看看DWT_CYCCNT的基地址,从ARM-Cortex-M手册中可以看到其基地址是0xE000 1004,复位默认值是0,而且它的类型是可读可写的,我们往0xE000 1004这个地址写0就将DWT_CYCCNT清0了。

关于CYCCNTENA

CYCCNTENA Enable the CYCCNT counter. If not enabled, the counter does not count and no event is generated for PS sampling or CYCCNTENA. In normal use, the debugger must initialize the CYCCNT counter to 0.

它是DWT控制寄存器的第一位,写1使能,则启用CYCCNT计数器,否则CYCCNT计数器将不会工作。

【https://developer.arm.com/documentation/ddi0337/e/system-debug/dwt/summary-and-description-of-the-dwt-registers?lang=en】

综上所述

想要使用DWT的CYCCNT步骤:

  1. 先使能DWT外设,这个由另外内核调试寄存器DEMCR的位24控制,写1使能

  2. 使能CYCCNT寄存器之前,先清0。

  3. 使能CYCCNT寄存器,这个由DWT的CYCCNTENA 控制,也就是DWT控制寄存器的位0控制,写1使能

寄存器定义:

//0xE000EDFC DEMCR RW Debug Exception and Monitor Control Register.  

//使能DWT模块的功能位

#define DEMCR           ( *(unsigned int *)0xE000EDFC )  

#define TRCENA          ( 0x01 << 24) // DEMCR的DWT使能位  

  

//0xE0001000 DWT_CTRL RW The Debug Watchpoint and Trace (DWT) unit  

//使能CYCCNT计数器开始计数

#define DWT_CTRL        ( *(unsigned int *)0xE0001000 )  

#define CYCCNTENA       ( 0x01 << 0 ) // DWT的SYCCNT使能位

 

//0xE0001004 DWT_CYCCNT RW Cycle Count register,   

//CYCCNT计数器的内部值(32位无符号)

#define DWT_CYCCNT      ( *(unsigned int *)0xE0001004) //显示或设置处理器的周期计数值  

用法示例:


vvolatile unsigned int *DWT_CYCCNT  ;

volatile unsigned int *DWT_CONTROL ;

volatile unsigned int *SCB_DEMCR   ;

 

void reset_timer(){

    DWT_CYCCNT   = (int *)0xE0001004; //address of the register

    DWT_CONTROL  = (int *)0xE0001000; //address of the register

    SCB_DEMCR    = (int *)0xE000EDFC; //address of the register

    *SCB_DEMCR   = *SCB_DEMCR | 0x01000000;

    *DWT_CYCCNT  = 0; // reset the counter

    *DWT_CONTROL = 0; 

}

 

void start_timer(){

    *DWT_CONTROL = *DWT_CONTROL | 1 ; // enable the counter

}

 

void stop_timer(){

    *DWT_CONTROL = *DWT_CONTROL | 0 ; // disable the counter    

}

 

unsigned int getCycles(){

    return *DWT_CYCCNT;

}

 

main(){

    ....

    reset_timer(); //reset timer

    start_timer(); //start timer

    //Code to profile

    ...

    myFunction();

    ...

    stop_timer(); //stop timer

    numCycles = getCycles(); //read number of cycles 

    ...

}

示例2:


#define start_timer()    *((volatile uint32_t*)0xE0001000) = 0x40000001  // Enable CYCCNT register

#define stop_timer()   *((volatile uint32_t*)0xE0001000) = 0x40000000  // Disable CYCCNT register

#define get_timer()   *((volatile uint32_t*)0xE0001004)               // Get value from CYCCNT register

 

/***********

* How to use:

*       uint32_t it1, it2;      // start and stop flag                                            

        start_timer();          // start the timer.

        it1 = get_timer();      // store current cycle-count in a local

        // do something

        it2 = get_timer() - it1;    // Derive the cycle-count difference

        stop_timer();               // If timer is not needed any more, stop

print_int(it2);                 // Display the difference

****/

示例3:


#define  DWT_CR      *(uint32_t *)0xE0001000

 

#define  DWT_CYCCNT  *(uint32_t *)0xE0001004

 

#define  DEM_CR      *(uint32_t *)0xE000EDFC

 

#define  DEM_CR_TRCENA                  (1 << 24)

 

#define  DWT_CR_CYCCNTENA                (1 <<  0)

 

/* 初始化时间戳 */

 

void CPU_TS_TmrInit(void)

 

{

 

        /* 使能DWT外设 */

        DEM_CR |= (uint32_t)DEM_CR_TRCENA;               

 

        /* DWT CYCCNT寄存器计数清0 */

        DWT_CYCCNT = (uint32_t)0u;

       

 

        /* 使能Cortex-M3 DWT CYCCNT寄存器 */

        DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA;

 

}

 

uint32_t OS_TS_GET(void)

{       

 

        return ((uint32_t)DWT_CYCCNT);

 

}


关键字:单片机  调试组件  arm 引用地址:一个超级实用的单片机调试组件!

上一篇:为什么有的MCU外接24MHz晶振不能去掉
下一篇:一文详解Arm Cortex-M处理器指令集

推荐阅读最新更新时间:2024-11-09 10:21

ARM架构下添加系统调用(与32位x86区别)
在这两种架构下添加系统调用的步骤是类似的,简要地比较一下,以2.6.28.6内核为例。 1.在内核源码相应位置(如sys.c或其他与这个函数联系紧密的文件)添加新的内核函数作为系统调用,形如 asmlinkage long sys_foo(void) { } 2.加入系统调用表。ARM架构存放于/arch/arm/kernel/call.S中,形如CALL(sys_foo);x86架构放于/arch/x86/kernel/syscall_table_32.S中,形如.long sys_foo。 3.定义系统调用号。ARM架构存放于/arch/arm/include/asm/unistd.h中,形如 #defin
[单片机]
利用磁阻传感器和AT89C52单片机实现机器人玩具控制系统的设计
芯片,只完成与通信、运算等有关的主要操作,在没有操作时,由运行于其上的操作系统uClinux来维护。对于所有与EZ328的核心运算、控制、通信、操作无关的外围设备的维护和控制都通过一块AT89C52来完成,它与EZ328的底层通信协议为同步串口协议(SPI),在AT89C52中由软件来实现。C52包含的部件主要是A/D转换器,键盘接口,电机驱动模块。硬件结构电路图如下图1: 图1 1 磁阻传感器及其详细采集过程 1.1 磁阻传感器HMC1022简介 利用磁路中磁阻的变化,将被测量变化转换成交流电压变化的传感器。它的机构是四臂的惠斯通电桥,将磁场转化为差动输出的电压,可以检测低至85微高斯的磁场信号,这种低成本的传感器相比传
[单片机]
利用磁阻传感器和AT89C52<font color='red'>单片机</font>实现机器人玩具控制系统的设计
51单片机对音频驱鼠器的设计
引言 长期以来,老鼠对家庭牛活、农业生产等造成很大困扰。然而,现存的机械法、化学药物法以及生物防治等,都存在着比较明显的缺点。机械灭鼠的缺陷体现在,当受到过这种器械伤害之后,老鼠会对这种器械保持很深的记忆,避免伤害再次发生。对于化学药物的长期使用,不仅会造成环境污染,甚至对人体也存在一定的危害。而对于生物防治,其控制力度难以把握,故而效果不太理想。所以,需要一种更加科学、环保而有效的产品来实现驱鼠功能。市面上现存的电子驱鼠产品电路设计复杂,成本较高,因此,基于51式单片机的音频驱鼠器应运而生。 1 音频驱鼠器的总体设计 驱鼠器的设计总体分为四个模块,即电源模块、感应模块、控制模块和音频模块。电源模块为整个系统提供+5V的直流电
[单片机]
51<font color='red'>单片机</font>对音频驱鼠器的设计
单片机AT89C51--6.数码管显示(含动态,静态)
1. 数码管显示原理 a为共阴极,b为共阳极 2. 静态与动态显示 静态显示 每个数码管的选段必须接入一个8位的数据线来保持显示字形码。当输入一次字形码后显示字形可以一直保持,直到输入新的字形码为止。 动态显示 将所有数码管的段选并联在一起,由位选控制,控制那个数码管有效。亮的数码管采用动态扫描方式。轮流向各位数码管送出字形码和对应位选,利用发光管的余晖和人肉眼的残留,使人们感觉数码管都在显示 3. 74HC573锁存器的工作原理 锁存器的作用:把数据输入端与输出端进行隔离或连接 OE端需要接地,才能让输出口Q有高低电平的转换 LE脚高,输出端Q随输入端D的数据变化而变化 LE脚低,输出端Q数据保持不变
[单片机]
<font color='red'>单片机</font>AT89C51--6.数码管显示(含动态,静态)
分享一些单片机汇编语言常见的语法和程序错误
一、汇编软件汇编失败原因分析 这里采用Keil C51软件包中的宏汇编器A51作为编绎器,单片机的汇编语言编写时要注意一定的语法,详细介绍可以参考相关参考书,语法错误会造成汇编失败,常见的汇编错误如下: 1. 标号重复:常见于复制、粘贴程序时忘记修改标号,造成出现多个相同的标号,标号是不允许重复的。 2.标点符号以全角方式输入:汇编程序要求标点符号为半角方式,否则汇编失败。可以在输入:,;时切换到半角方式,或者在大写状态输入标点符号,这也是很容易犯而且不容易发觉的错误。 3.数值#FFH 前遗漏0:根据要求应该在a~f前加0,写成#0FFH 4.字母O和数字0搞混:有时候这两个字看上去完全相同,要注意哦~~ 5.标号后边遗漏 :
[单片机]
分享一些<font color='red'>单片机</font>汇编语言常见的语法和程序错误
车规MCU之设计失效模式和影响分析(DFMEA)详解
失效模式和影响分析(DFMEA,Design Failure Mode and Effects Analysis)在汽车工业中扮演着非常重要的角色。在汽车设计和制造过程中,DFMEA被广泛应用于识别和管理潜在的设计失效模式,以及评估这些失效模式对汽车性能、安全性和可靠性的影响。通过对设计和制造过程中可能存在的问题进行系统性的分析和评估,DFMEA有助于降低汽车制造过程中的风险,提高汽车的质量和可靠性。 DFMEA作为一种系统性的方法论,旨在识别、评估和优先考虑产品设计中潜在的失效模式。DFMEA是汽车IATF-16949(PPAP)和ISO-26262(流程)标准的强制要求,在的产品设计和研发中,了解并认真实施DFMEA是车规MC
[嵌入式]
车规<font color='red'>MCU</font>之设计失效模式和影响分析(DFMEA)详解
AT89C52单片机与PC机之间的无线数据传输设计
在一些特殊的应用场合,单片机通信不能采用有线数据传输方式,而需要采用短距离的无线数据传输方式。短距离的无线传输具有抗干扰能力强、可靠性高、安全性好、受地理条件限制少、安装灵活等优点,可以利用单片机和专用无线传输芯片实现简单的短距离无线传输方案,硬件部分包括单片机端和PC机端,实现单片机和PC机间的数据传输。 主要器件: 1、 单片机端:AT89C52单片机芯片,用于控制无线模块的发射和接受;PTR2000无线数据传输模块,使用了433MHz IGM频段,是真正的单片UHF无线收发一体芯片,可以和单片机的串口直接相连。 2、 PC端:PTR2000无线数据传输模块;TTL电平转换RS-232电平芯片MAX202。 试验流程图
[单片机]
AT89C52<font color='red'>单片机</font>与PC机之间的无线数据传输设计
【GD32 MCU 入门教程】GD32 MCU 常见外设介绍(14)RTC 模块介绍
GD32 MCU内部提供了一个RTC(实时时钟)模块,通过RTC可以实现日历时钟、闹钟等功能。RTC也可以用于深度睡眠或待机模式的低功耗唤醒。不同系列的GD32 MCU在RTC设计和功能上有所区别,总体可以分为三大系列: (1)F10x、F30x、E10x系列RTC功能基本相同,后文简称0x系列。 (2)F1x0、F3x0、E23x系列RTC功能基本相同,后文简称x0系列。 (3)F405、F407、F450系列RTC功能基本相同,后文简称4xx系列。后文会对0x系列、x0系列、4xx系列的RTC模块分别进行介绍,简单介绍RTC的工作原理、配置使用方法。 14.1.GD32 RTC 外设简介 0x 系列 RTC 0x系列RTC整体
[单片机]
【GD32 <font color='red'>MCU</font> 入门教程】GD32 <font color='red'>MCU</font> 常见外设介绍(14)RTC 模块介绍

推荐帖子

请问一个设备的IRP能发到另外一台机器的设备上吗?
例如,我在本机的设备上接收到一个READ的IRP,我想把它发到另外一台机的设备上,让这个设备完成再返回结果。请大家帮帮忙,给个方向也好啊请问一个设备的IRP能发到另外一台机器的设备上吗?关键是如何发?一定要用TDI来传输吗?如何传输?调用另一个设备的驱动,调用内核读函数。
zxinqiao 嵌入式系统
ATtiny85迷你小提琴
设计和制造迷你小提琴是一种有趣的DIY,可以尝试从头开始构建自己的微控制器开发板。电路原理图电路原理图非常简单。ATtiny85控制两个LED和一个压电蜂鸣器,我还添加了一个用于在歌曲之间切换的按钮。整个电路由3.7V锂电池供电。我希望使PCB尽可能小,以便能够将其用作徽章,因此使用了MLF-20封装微控制器。作为一项附加功能,将小提琴的琴弦连接到微控制器的模拟输入,以便实际上能够通过用导电材料触摸琴弦来演奏小提琴。完整说明参见:https://w
dcexpert DIY/开源硬件专区
放大电路频率响应的基本概念
1、放大电路的频率响应放大电路的频率响应可直接由放大电路的放大倍数与频率的关系来描述,即上式中——电压放大倍数的幅值与频率的函数关系,称为幅频响应;——放大倍数的相位与频率的函数关系称为相频响应。两者综合起来可全面表征放大电路的频率响应。2、RC耦合放大器的幅频特性RC耦合放大器的幅频特性曲线如图所示。我们将全频域分为三个频区:中频区、高频区、低频区。中频区:在一个较宽的频率范围内
qinkaiabc 模拟电子
自动调谐算法对线缆、热电制冷器、温度阶跃有何要求?
吉时利2510-AT型温度控制源表有哪些方法与技术应用在自动调谐算法中?对线缆、热电制冷器、温度阶跃有何要求呢?线缆对于每个传感引线来说,最大传感引线电阻是1Ω。力引线(forcelead)电阻最大值是0.1Ω。如果引线电阻高于这个最大值,可能造成PID环路不稳定,或者出现明显错误的电压限制指数(Vlim)。这个警告似乎是错误的,因为在温度控制下的输出电压降低于Vlim,但增加的引线IR压降意味着:在距
Jack_ma 测试/测量
g组 电阻桥测电流(简化版)
本帖最后由paulhyde于2014-9-1503:33编辑电阻桥测电流(简化版)g组电阻桥测电流(简化版)本帖最后由paulhyde于2014-9-1503:33编辑又是这个东西
奋斗了 电子竞赛
TI三相维也纳PFC解决方案介绍
TI三相维也纳PFC主要应用在电动汽车的充电器中,所以首先看一下,电动汽车充电器,典型分类和拓扑结构。维也纳整流器是一种流行的有源PFC拓扑结构。具有以下特点:固有的三电平开关,减少电感器尺寸要求,降低开关频率损耗,在输出电压的一半处应力开关,低电磁干扰。这里用TI的TIDM-1000:PFC3PHVIENNA系统做介绍,先看一下这个系统的整体介绍。维也纳整流器设计思想,如下图所示,再看一下,维也纳整流器设计的基本模块,详见下图。
alan000345 模拟与混合信号
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved