F072的uid读到内存,过段时间会变化,为什么会这样

2019-12-19 18:07发布

void Get_ChipID(void)
{
//         F103       
//                CPU_ID[0]=CPU_ID[0] = *(__IO uint32_t *)(0X1FFFF7F0); // 高字节
//                CPU_ID[1]=CPU_ID[1] = *(__IO uint32_t *)(0X1FFFF7EC); //
//                CPU_ID[2]=CPU_ID[2] = *(__IO uint32_t *)(0X1FFFF7E8); // 低字节

//        F0       
                CPU_ID[0] = *(__IO uint32_t *)(0X1FFFF7b4); // 高字节
                CPU_ID[1] = *(__IO uint32_t *)(0x1ffff7b0); //
                CPU_ID[2] = *(__IO uint32_t *)(0x1ffff7ac); // 低字节
}

我的系统一上电就把 UID读到内存变量数组uint32_t CPU_ID[3],因为软件要用这个作为识别,之前的代码都是上电就读一次,以前都不会有问题。最近不知为什么,发现内存变量数组 CPU_ID[3] 中的数据会变化,导致识别失败。uint32_t CPU_ID[3] 是全局变量,程序中不修改的,为啥会变?我在办公室测试的时候都正常,没有发现错误。可是板子现场用着就不行,我开始也不信,去了几次现场调试代码,真的发现 CPU_ID[]变化了,导致识别失败。但是有些板子又不会,现场电柜有变频器,但是离的挺远啊。电源是电柜中的开关电源接24V过来,板子离变频器有20米左右,还有跟电柜有RS485通讯。开始我以为是开关电源不行,但是单独接他们的开关电源我的板子就正常。。。
如果是变频器干扰,为啥之前的板子不会,这是第二批板子。。。
现在临时在需要识别UID的时候重新读取UID放到uint32_t CPU_ID[3]内存变量数组中,今天下午接电柜测试就可以正常识别了。如果在识别前取消重新读取,发现又识别不了,UID 变化了。真是想不懂啊,郁闷。。。
大家遇到变量的数据变化这种情况不?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
yerrmin
1楼-- · 2019-12-19 21:32
十有八九是程序有BUG,数组越界、堆栈溢出都有可能吧,不过UID直接读的速度和在RAM里一样,为啥还要缓存呢,多此一举啊
yy625
2楼-- · 2019-12-19 23:48
 精彩回答 2  元偷偷看……
dswkl11
3楼-- · 2019-12-20 02:25
yerrmin 发表于 2018-4-24 23:39
十有八九是程序有BUG,数组越界、堆栈溢出都有可能吧,不过UID直接读的速度和在RAM里一样,为啥还要缓存呢 ...

数组越界、堆栈溢出?  但是我办公室测试UID一直正常啊,所以一直都没有发现这个问题。如果 数组越界、堆栈溢出 怎么办公室测试的时候发现不了CPU_ID[]数据变化了呢。同一个板子,同一个程序,装在现场就不行,如果接上我带的电源就可以,真搞不懂啊。。。如果是 数组越界,堆栈溢出 该怎么查找啊
yun009
4楼-- · 2019-12-20 07:33
emc测过了没有
CoolBird007
5楼-- · 2019-12-20 09:28
这个现象我在调试时也经常会遇到,原因未明。你最好把调试口都固定一个电平,上拉或下拉试试。
tomzbj
6楼-- · 2019-12-20 10:24
直接改成宏行么
#define CPU_ID_0  *(__IO uint32_t *)(0X1FFFF7F0); // 高字节
#define CPU_ID_1  *(__IO uint32_t *)(0X1FFFF7EC); //
#define CPU_ID_2 *(__IO uint32_t *)(0X1FFFF7E8); // 低字节

一周热门 更多>