打印

STM32自由计数器的无法读取的问题

[复制链接]
3930|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zepanwucai|  楼主 | 2012-9-21 17:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在调试一个程序的时候想看看各个函数用时多少,于是用读取自由计数器并打印的方法来来查看时间,
可是发现下载进去后直接复位运行,出来的结果总是0,
而进入调试模式时,打印的值却是正确的,这让我非常困惑,求问是哪里出问题了呢?
调试的主要代码如下:

printf("%X\n",(*(u32 *)0xE0001000));//打印DWT控制寄存器值

(*(u32 *)0xE0001000)=0x40000001;//原来以为是控制寄存器设置问题,加的调试代码

printf("%X\n",(*(u32 *)0xE0001000));

while(1)

{


printf("%X",(*(u32 *)0xE0001004));//打印自由计数器计数值

Delay(300);

}

打印的结果却全是0,进入调试模式后却打印的都是正确结果。
沙发
airwill| | 2012-9-21 20:19 | 只看该作者
的确, 我也发现这个问题了, 今天特意看看资料, 终于弄明白了.
你读取的这个地址是属于 DEBUG 的空间.
看看手册是这么说的:
All the debug components exist on the internal Private Peripheral Bus (PPB) and can
be accessed using privileged code
我想应该就是说, 用户代码是不能访问这个地址的数据的.

使用特权

评论回复
板凳
zepanwucai|  楼主 | 2012-9-21 22:44 | 只看该作者
2# airwill 可是我一开始想到读这个值是参考UCOS里的用法,
UCOSIII里有个宏OS_TS_GET(),最终的定义就是那个寄存器的值,
而在UCOSIII运行时,调用该宏是可以获得正确的时间的,这是为什么呢?

使用特权

评论回复
地板
zepanwucai|  楼主 | 2012-9-21 23:10 | 只看该作者
找到原因了,手册上有个note: The TRCENA bit of the Debug Exception and Monitor Control Register must be set before you can use the DWT. See Debug Exception and Monitor Control Register on page 10-8.
就是说在使用DWT之前,要先置位“调试及监视器控制寄存器”DEMCR的跟踪系统使能位“TRCENA”。
修改后,经测试程序可用~

使用特权

评论回复
5
further_away| | 2013-3-15 16:23 | 只看该作者
使能了RTCENA位还是不行呢.
手册上说要ITM使能DWTENA位.但是ITM要能写还要先解锁.那个解锁的寄存器是哪个?

使用特权

评论回复
6
bygreencn| | 2014-3-20 10:25 | 只看该作者
分享下使用细节的代码吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

180

帖子

6

粉丝