首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >皮层m7时钟周期计数的测量

皮层m7时钟周期计数的测量
EN

Stack Overflow用户
提问于 2016-07-13 15:24:59
回答 2查看 3.9K关注 0票数 9

我一直在测量皮质m4上的时钟周期计数,现在我想在皮质m7上这样做。我使用的板是STM32F746ZG。

对于m4,所有操作都是这样的:

代码语言:javascript
复制
volatile unsigned int *DWT_CYCCNT;
volatile unsigned int *DWT_CONTROL;
volatile unsigned int *SCB_DEMCR;

void reset_cnt(){
    DWT_CYCCNT   = (volatile unsigned int *)0xE0001004; //address of the register
    DWT_CONTROL  = (volatile unsigned int *)0xE0001000; //address of the register
    SCB_DEMCR    = (volatile unsigned int *)0xE000EDFC; //address of the register
    *SCB_DEMCR   = *SCB_DEMCR | 0x01000000;
    *DWT_CYCCNT  = 0; // reset the counter
    *DWT_CONTROL = 0; 
}

void start_cnt(){
    *DWT_CONTROL = *DWT_CONTROL | 0x00000001 ; // enable the counter
}

void stop_cnt(){
     *DWT_CONTROL = *DWT_CONTROL & 0xFFFFFFFE ; // disable the counter    
}

unsigned int getCycles(){
    return *DWT_CYCCNT;
}

问题是,当我在DWT_CTRL上运行并且保持0x40000000,而不是更改为0x40000001时,m7寄存器不会被更改,因此循环计数总是为零。从我在其他文章中看到的情况来看,您似乎需要将FP_LAR寄存器设置为0xC5ACCE55,以便能够更改DWT_CTRL。

我添加了这些定义(在下面尝试了两个FP_LAR_PTR地址):

代码语言:javascript
复制
#define FP_LAR_PTR ((volatile unsigned int *) 0xe0000fb0) //according to reference
//#define FP_LAR_PTR ((volatile unsigned int *) 0xe0002fb0) //according to guy on the internet
// Lock Status Register lock status bit
#define DWT_LSR_SLK_Pos                1
#define DWT_LSR_SLK_Msk                (1UL << DWT_LSR_SLK_Pos)
// Lock Status Register lock availability bit
#define DWT_LSR_SLI_Pos                0
#define DWT_LSR_SLI_Msk                (1UL << DWT_LSR_SLI_Pos)
// Lock Access key, common for all
#define DWT_LAR_KEY                    0xC5ACCE55

这一职能:

代码语言:javascript
复制
void dwt_access_enable(unsigned int ena){
    volatile unsigned int *LSR;
    LSR = (volatile unsigned int *) 0xe0000fb4;
    uint32_t lsr = *LSR;;
    //printf("LSR: %.8X - SLI MASK: %.8X\n", lsr, DWT_LSR_SLI_Msk);

    if ((lsr & DWT_LSR_SLI_Msk) != 0) {
        if (ena) {
            //printf("LSR: %.8X - SLKMASK: %.8X\n", lsr, DWT_LSR_SLK_Msk);
            if ((lsr & DWT_LSR_SLK_Msk) != 0) {    //locked: access need unlock
                *FP_LAR_PTR = DWT_LAR_KEY;
                printf("FP_LAR directly after change: 0x%.8X\n", *FP_LAR_PTR);
            }
        } else {
            if ((lsr & DWT_LSR_SLK_Msk) == 0) {   //unlocked
                *FP_LAR_PTR = 0;
                 //printf("FP_LAR directly after change: 0x%.8X\n", *FP_LAR_PTR);
            }
        }
    }
}

当我调用未注释的打印时,我得到了0xC5ACCE55,但是当我在函数返回后打印它时,我得到了0x00000000,我不知道为什么。我是在正确的轨道上,还是完全错了?

编辑:我认为这也是很好的提到,我已经尝试了没有所有额外的代码在函数中,只是试图改变LAR寄存器。

布尔古斯塔夫

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-13 19:59:22

再看一遍这些文档,我现在对手臂TRM中的错误或复制粘贴错误产生了难以置信的怀疑。0xe0000fb0作为ITM_LAR、DWT_LAR和FP_LSR的地址(以及*_LSR的等效地址)。由于所有其他ITM寄存器都在第0xe0000000页中,所以看起来很像谁负责Cortex-M7文档的这一部分,获取了Cortex-M4寄存器定义,将新的LAR和LSR添加到ITM页面,然后将它们复制到更新名称的DWT和FPB页面中,但忽略了更新地址。

我敢打赌我的晚餐是你无意中打开了ITM_LAR (或真正的FP_LAR),而DWT_LAR实际上是在0xe0001fb0。

编著

有人欠某人一顿晚餐。

代码语言:javascript
复制
hexstring(GET32(0xE0001FB4));
hexstring(GET32(0xE0001000));
hexstring(GET32(0xE0001004));
hexstring(GET32(0xE0001004));

PUT32(0xE000EDFC,0x01000000);

hexstring(GET32(0xE0001FB4));
hexstring(GET32(0xE0001000));
hexstring(GET32(0xE0001004));
hexstring(GET32(0xE0001004));

PUT32(0xE0001000,0x40000001);

hexstring(GET32(0xE0001FB4));
hexstring(GET32(0xE0001000));
hexstring(GET32(0xE0001004));
hexstring(GET32(0xE0001004));

PUT32(0xE0001FB0,0xC5ACCE55);
PUT32(0xE0001000,0x40000001);

hexstring(GET32(0xE0001FB4));
hexstring(GET32(0xE0001000));
hexstring(GET32(0xE0001004));
hexstring(GET32(0xE0001004));

输出

代码语言:javascript
复制
00000000
00000000
00000000
00000000
00000003
40000000
00000000
00000000
00000003
40000000
00000000
00000000
00000001
40000001
0000774F
0000B311

TRM中的表看起来很有趣,其他文档显示将0xFB0和0xFB4添加到基中,Cortex-M7的DWT的其余部分为0xE0001xxx,实际上,LAR和LSR似乎吃了0xE0001FB0和0xE0001FB4。

票数 4
EN

Stack Overflow用户

发布于 2016-07-14 08:26:21

我建议不要在将自己的注册定义定义为CMSIS的一部分时创建它们--这样做需要文档和您对它的解释都是正确的。在这种情况下,文档看起来确实是不正确的,但是CMSIS头是正确的。自动验证CMSIS头要比验证文档是正确的容易得多,所以每次我都会信任CMSIS。

我不知道寄存器FP_LAR可能指什么,但是您的地址分配指的是ITM_LAR,但更有可能的是您打算使用Cortex-M4所缺少的DWT_LAR

尽管我建议您相信它,CMSIS4.00没有为DWT_LSR/SWT_LAR定义掩码,但我相信它们与相应的ITM掩码相同。

还要注意的是,LAR是一个只写的寄存器-任何读取它的尝试都是毫无意义的。

使用CMSIS的代码如下:

代码语言:javascript
复制
#include "core_cm7.h"  // Applies to all Cortex-M7

void reset_cnt()
{
    CoreDebug->DEMCR |= 0x01000000;
    DWT->CYCCNT = 0; // reset the counter
    DWT->CTRL = 0; 
}

void start_cnt()
{
    DWT->CTRL |= 0x00000001 ; // enable the counter
}

void stop_cnt()
{
     DWT->CTRL &= 0xFFFFFFFE ; // disable the counter    
}

unsigned int getCycles()
{
    return DWT->CYCCNT ;
}

// Not defined in CMSIS 4.00 headers - check if defined
// to allow for possible correction in later versions
#if !defined DWT_LSR_Present_Msk 
    #define DWT_LSR_Present_Msk ITM_LSR_Present_Msk
#endif
#if !defined DWT_LSR_Access_Msk 
    #define DWT_LSR_Access_Msk ITM_LSR_Access_Msk
#endif
#define DWT_LAR_KEY 0xC5ACCE55

void dwt_access_enable( unsigned ena )
{
    uint32_t lsr = DWT->LSR;;

    if( (lsr & DWT_LSR_Present_Msk) != 0 ) 
    {
        if( ena ) 
        {
            if ((lsr & DWT_LSR_Access_Msk) != 0) //locked: access need unlock
            {    
                DWT->LAR = DWT_LAR_KEY;
            }
        } 
        else 
        {
            if ((lsr & DWT_LSR_Access_Msk) == 0) //unlocked
            {   
                DWT->LAR = 0;
            }
        }
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38355831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档