[STM32F1] 在用户代码中读取 DEV_ID 出错

[复制链接]
1583|8
 楼主| truesix 发表于 2017-5-4 16:30 | 显示全部楼层 |阅读模式
参照 RM0008 章节 31.6,在地址 0xE0042000 上读取芯片的识别码。发现奇怪的问题:
1、        用JTAG下载固件,下载完毕后自动运行,在main函数开头就读取并打印出来,就可以得到正确值:DEV_ID=414,REV_ID=1003 。之后不管是发命令,还是RESET,都可以读取到正确值。
2、        用JTAG下载固件,下载完毕后自动运行,先打印一些别的设备信息,再读取,就会得到错误值:DEV_ID=307,REV_ID=0000  。之后不管是发命令,还是RESET,读取到的都是这个错误的值。
3、        如果关闭电源,冷启动,就只能读取到0。之后不管是发命令,还是RESET,都只能读取到0。
4、        在不能读取到正确值的情况下,点击Keil编译器上那个调试按键,在线调试,运行一下,就恢复正常了。

好神奇吧?手册上说,其实这个0xE0042000 是一个镜像寄存器。是不是说:如果不使用JTAG下载或调试,JTAG逻辑部分没有正常运作,导致这个镜像寄存器没有正确内容,可否这样理解?可否用别的地址读取到这个ID?
 楼主| truesix 发表于 2017-5-4 16:31 | 显示全部楼层
在QQ群上的一位网友用 F407 测试过,没有这个问题,都能读取到正确值。103 还没有别人测试过。
 楼主| truesix 发表于 2017-5-4 17:39 | 显示全部楼层
哎,自己顶一下吧。

用点老套的办法:跪求高手指点迷津。
 楼主| truesix 发表于 2017-5-5 10:03 | 显示全部楼层
sonicll 发表于 2017-5-5 13:56 | 显示全部楼层
本帖最后由 sonicll 于 2017-5-5 14:07 编辑

我在F103上测试了一下,跟你的结果类似,插着JTAG,能读到值;拔掉JTAG,只要板子不断电,读到的是同样的值;拔掉JTAG断电重启,读到的值全是0。估计就是楼主你理解的那样,JTAG不工作就不能读取正确内容。
 楼主| truesix 发表于 2017-5-5 14:52 | 显示全部楼层
sonicll 发表于 2017-5-5 13:56
我在F103上测试了一下,跟你的结果类似,插着JTAG,能读到值;拔掉JTAG,只要板子不断电,读到的是同样的值 ...

非常感谢。
uiint 发表于 2017-5-5 22:47 | 显示全部楼层
使用单步调试的数据呢
uiint 发表于 2017-5-5 22:59 | 显示全部楼层
这个寄存器都是固化的,应该问题不大吧
 楼主| truesix 发表于 2017-5-8 09:58 | 显示全部楼层
uiint 发表于 2017-5-5 22:59
这个寄存器都是固化的,应该问题不大吧

不太像是固化。QQ群有个哥们说可能是内存保护,问他具体是什么保护,他又不说了。再说F1没有MPU啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

15

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部