STM32 的ITM、DWT功能实现

I.STM32 DWT时间戳功能实现
  1.m3、m4实测可用。
  2.精度:1/内核频率(s)。
  3.实现流程:
    a.先使能DWT外设,由内核调试寄存器DEM_CR的位24控制,写1使能。
    b.使能CYCCNT寄存器之前,先清0。
    c.使能CYCCNT寄存器,由DWT_CTRL的位0控制,写1使能。
  4.实现代码如下:

    

 1 //寄存器基地址
 2 #define    DWT_CR    *(uint32_t*)0xE0001000
 3 #define    DWT_CYCCNT    *(uint32_t*)0xE0001004
 4 #define    DEM_CR    *(uint32_t*)0xE000EDFC
 5
 6 //定义需使能位
 7 #define    DEM_CR_TRCENA    (1<<24)
 8 #define    DWT_CR_CYCCNTENA    (1<<0)
 9
10 //DWT init
11 void DWT_init(void)
12 {
13     DEM_CR |= (uint32_t)DEM_CR_TRCENA;
14     DWT_CYCCNT = (uint32_t)0u;
15     DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA;
16 }
17 //get DWT count
18 uint32_t DWT_TS_GET(void)
19 {
20     return((uint32_t)DWT_CYCCNT);
21 }

DWT

  5.使用场景:
    a.可用来实现延时功能。
    b.测量程序运行时间。
    c.。。。。。

II.STM32 ITM调试功能实现

  1.概念:ITM是一应用驱动的跟踪源,它支持printf类的调试手段来跟踪操作系统和应用事件,
  并发布判定的系统信息。ITM以包的形式发布跟踪信息。
  2.实际应用:当调试时需要打印出信息,而又不能占用串口时,ITM就派上用场了。
  3.m3、m4实测可用。
  4.配置步骤:
    a.配置TPIU并使能I/IO_TRACEN以使能TRACE的引脚
    b.向Trace Lock Access寄存器写入0xC5ACCE55,以允许写其他ITM寄存器
    c.向Trace Control寄存器写入0x00010005,使能TPIU的同步包并使能整个ITM功能,
    寄存器中的ATB ID为0x01
    d.向ITM Trace Enable寄存器写入0x01,以使能触发端口0
    e.向ITM Trace Privilege寄存器写入0x01,关闭对触发端口7:0的屏蔽
    f.把需要输出的值写入触发端口0寄存器,这个步骤可以通过软件完成(使用printf功能)
  5.注意事项:
    a.只能使用SWD方式调试
    b.需要使用到TRACESWO引脚,正常为PB3
  6.代码实现:

  

 1 int main(void)
 2 {
 3     int dat = 0;
 4
 5     DBGMCU->CR = 0x27;//使能TRACE的引脚
 6     ITM->LAR = 0xC5ACCE55;//允许写其他ITM寄存器
 7     ITM->TCR = 0x00010005; //使能TPIU的同步包并使能整个ITM功能
 8     ITM->TER = 0x01;//以使能触发端口0
 9     ITM->TPR = 0x01;//关闭对触发端口7:0的屏蔽
10     ITM_RxBuffer = 0x5AA55AA5;//如果不需要scanf功能可屏蔽掉
11
12     printf("input data");
13     for(;;)
14     {
15         scanf("%s",&dat);
16     if(dat)
17     {
18         ptintf("your input is %d\n",dat);
19         dat = 0;
20     }
21     }
22 }
23
24 //重定义printf功能
25 int fputc(int ch,FILE *f)
26 {
27     return ITM_SendChar(ch);
28 }
29 //重定义scanf功能
30 int fgetc(FILE *f)
31 {
32     while(ITM_CheckChar() != 1)   __NOP();
33     return (ITM_ReceiveChar());
34 }
35         

ITM

  7.功能窗口:

     可使用以下两种方式查看打印信息:
    a.使用keil debug功能。

    

    
    b.使用J-link SWO Viewer。

      打开J-link SWO Viewer工具,选择相应的芯片型号。

时间: 2024-10-28 20:02:21

STM32 的ITM、DWT功能实现的相关文章

[stm32] USART USART1收发功能工程

>_<!功能:PC端发送一个特定的字符:0x0d 0x0a,单片机则返回一句话,如图: >_<!知识: 1.复用功能I/O和调试配置(AFIO)  为了优化外设数目,可以把一些复用功能重新映射到其他引脚上.设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)(参见0节)实现引脚的重新映射.这时,复用功能不再映射到它们的原始分配上. 2.嵌套向量中断控制器(NVIC) l 43 个可屏蔽中断通道(不包含16 个Cortex-M3 的中断线):  l 16 个可编程的优先等级: 

新手入门--stm32将其他项目功能添加到已有项目

环境:keil4+stm32项目 已有项目名project 要添加功能项目名project2 实例场景:在project中添加project2中SD卡读写功能(带fatfs文件系统),也可以理解为将project2中已实现的带fatfs的SD卡读写模块移植到新项目project中. 步骤: 1.启动文件:在project2中的启动文件为startup_stm32f10x_hd.s(固件库版本V3.0.0),在project中启动文件为startup_stm32f10x_md.s(固件库版本V3.

stm32 DCMI接口CROP功能使用

最近使用stm32F407单片机通过摄像头采集图像进行处理,其中使用到DCMI接口CROP功能.但在网上找了很久,有用的资料不多,只能自己研究,特将自己的使用方法记录下来. 1.如何设置CROP. 定义: DCMI_CROPInitTypeDef DCMI_CROPInitStruct; 参数设置: DCMI_CROPInitStruct.DCMI_CaptureCount=Width;                         //capcnt DCMI_CROPInitStruct.D

【stm32】时钟树解析

有时候会突然忘了这个重要的时钟树,这里转载一个比较好的,以防忘记. STM32时钟系统 在STM32中,有五个时钟源,为HSI.HSE.LSI.LSE.PLL. ①HSI是高速内部时钟,RC振荡器,频率为8MHz. ②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz. ③LSI是低速内部时钟,RC振荡器,频率为40kHz. ④LSE是低速外部时钟,接频率为32.768kHz的石英晶体. ⑤PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2.HSE或

STM32的时钟树深入详解以及RCC配置

在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法 如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理: 1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空.2)对于少于100脚的产品,有2种接法:   2.1)OSC_IN和OSC_OUT分别通过10K电阻接地.此方法可提高EMC性能.   2.2)分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出'0'.此方法可以减小功耗并(相对上面2.1)节省2个外

STM32中的几个时钟SysTick、FCLK、SYSCLK、HCLK

用时钟源来产生时钟! 在STM32中,有五个时钟源,为HSI.HSE.LSI.LSE.PLL.①.HSI是高速内部时钟,RC振荡器,频率为8MHz.②.HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz.③.LSI是低速内部时钟,RC振荡器,频率为40kHz.④.LSE是低速外部时钟,接频率为32.768kHz的石英晶体.⑤.PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2.HSE或者HSE/2.倍频可选择为2~16倍,但是其输出频率最大不得超过7

[转] STM32各种时钟的区别

[原创]:http://m.oschina.net/blog/129357 我在原创的基础又从另一位博主处引用了一些内容. 时钟系统是处理器的核心,所以在学习STM32所有外设之前,认真学习时钟系统是必要的,有助于深入理解STM32.     下面是从网上找的一个STM32时钟框图,比<STM32中文参考手册>里面的是中途看起来清晰一些:         重要的时钟:   PLLCLK,SYSCLK,HCKL,PCLK1,PCLK2 之间的关系要弄清楚; 1.HSI:高速内部时钟信号 stm3

使用DWT来实现系统延时

DWT,全称是The Debug Watchpoint and Trace (DWT) unit,用于系统调试及跟踪,详细的介绍可以参考ARM官方文档:ARMv7-M Architecture Reference Manual.本文将使它来实现一个系统的延时功能. 1. 寄存器简单介绍 要实现延时的功能,总共涉及到三个寄存器:DEMCR .DWT_CTRL.DWT_CYCCNT,分别用于开启DWT功能.开启CYCCNT及获得系统时钟计数值. DEMCR 其官方手册说明如下,这里我们只需要关注其第

关于STM32时钟系统

初学STM32,感觉最蛋疼的是它的时钟系统,每次看到它的那个时钟树就有点晕,虽然看了很多这方面的资料,甚至也已经写过很多STM32的模块代码,做过一些小项目,但一直还是对这一块模模糊糊,似懂非懂,所以想把自己对它的一点点认识写出来,一步一步,直到完全搞通的那一天,(这些内容并非自己原创,只是想帮助自己理解) 在STM32中,有五个时钟源,为HSI.HSE.LSI.LSE.PLL. HSI是高速内部时钟,RC振荡器,频率为8MHz. HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频