打印
[STM32F1]

flash模拟ee遇到数据出错。

[复制链接]
1574|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
taijing33|  楼主 | 2016-11-11 20:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的产品是主机通过485和48个分机通讯。分机地址1-48,设置后存储在flash模拟的ee里,这种方式我在st系列的100和103都用过以前没有发现问题,
这次客户在现场 由于接线错误,造成24V开关电源电压异常,结果我的所有48个分机设置的地址全部变成1(1是程序默认值),就是由于接线错误造成,数据出错,这种问题在我公司
以前从来没有出现过,我也是现在只有这么认为是电压问题导致数据出错,
我的分机供电是主机的24V开关电源给分机供电,分机是24V---34063(5V)---1117-3.3(3.3V)给单片机。现在48个分机同时数据出错(就是变成了默认数据),
各位大侠 有谁遇到这样情况么?
单片机是stm32F100C8t6,
我现在做的实验是,用3.3V无规律的给单片机通断电也没有发现数据错误或者异常。。。
真不知道这次客户的4个分机到底怎么了?

下面是我的写入函数:
void FLASH_write(void)//дÈëÊý¾Ý
{
        uint16_t number;
        uint32_t  Address = 0x00;
        uint8_t  *p;

        volatile FLASH_Status FLASHStatus = FLASH_COMPLETE;
        FLASH_UnlockBank1();
        FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
        while (FLASH_ErasePage(BANK1_WRITE_START_ADDR)!= FLASH_COMPLETE);
        Address = BANK1_WRITE_START_ADDR;
       
        set_data.crc = crc_cal((unsigned char *)&set_data, sizeof(set_data)-2);
        p=(void *)&set_data;
        number=512;
        while ((number--) && (FLASHStatus == FLASH_COMPLETE))
        {
                FLASHStatus = FLASH_ProgramHalfWord(Address,*p );
                Address = Address +2;
                p++;
                //        DelayMs(1);
                //        IWDG_Feed();
        }

        FLASH_LockBank1();
        buzz_delay=2;
}



//下面是读取数据函数

void FLASH_deal(void)//¶ÁÈ¡
{
        uint16_t number,i;
        uint32_t  Address = 0x00;
        uint8_t  *p;
        volatile FLASH_Status FLASHStatus = FLASH_COMPLETE;
        Address = BANK1_WRITE_START_ADDR;
        p=(void *)&set_data;
        number=512;
        while (number--)
        {

                *p=*(vu16*) Address;
                p++;
                Address = Address +2;
        }

   if((crc_cal((unsigned char *)&set_data, sizeof(set_data)-2) != set_data.crc))

        {


               

                set_data.keyword_1 = 0;
                set_data.keyword_2 = 0;
                set_data.keyword_3 = 0;
                set_data.keyword_4 = 0;
    set_data.num_of_tantou=6;
                set_data.printer = 1;
                set_data.bat = 1;
          set_data.net_addr = 0xe0;
          set_data.cur_addr_24c256 = 0;
                set_data.full_24c256 = 0;
                FLASH_write();
        }


}





沙发
dongnanxibei| | 2016-11-12 13:16 | 只看该作者
能否再调回去正确的值

使用特权

评论回复
板凳
dongnanxibei| | 2016-11-12 13:17 | 只看该作者
如果只是存储的地址出了问题那么程序有问题吗,程序怎么没有被抹掉

使用特权

评论回复
地板
mmuuss586| | 2016-11-12 13:34 | 只看该作者
如果是电源不稳定,那也不会你所有的从机地址都出问题了;
我们以前做用其它MCU,确实存在FALSH数据丢失的情况,再烧程序就好了;
但也是偶然的;

使用特权

评论回复
5
taijing33|  楼主 | 2016-11-12 14:16 | 只看该作者
mmuuss586 发表于 2016-11-12 13:34
如果是电源不稳定,那也不会你所有的从机地址都出问题了;
我们以前做用其它MCU,确实存在FALSH数据丢失的 ...

我所有的从机都用一个开关电源。

使用特权

评论回复
6
taijing33|  楼主 | 2016-11-12 14:17 | 只看该作者
dongnanxibei 发表于 2016-11-12 13:16
能否再调回去正确的值

可以调回调回原来的值

使用特权

评论回复
7
dongnanxibei| | 2016-11-12 14:37 | 只看该作者
如果设备不是非常多,可以搞拨码开关作为地址吗。

使用特权

评论回复
8
dongnanxibei| | 2016-11-12 14:38 | 只看该作者
有7连发的,还有12连发的拨码开关,应该够用,只要你有充足的IO。

使用特权

评论回复
9
taijing33|  楼主 | 2016-11-12 15:39 | 只看该作者
dongnanxibei 发表于 2016-11-12 14:38
有7连发的,还有12连发的拨码开关,应该够用,只要你有充足的IO。

那就另当别论了

使用特权

评论回复
10
mmuuss586| | 2016-11-12 17:02 | 只看该作者
taijing33 发表于 2016-11-12 14:16
我所有的从机都用一个开关电源。

那也不会影响全部啊,再说你程序也没丢;

就和打雷一样,一打雷很多设备就坏了,但一般不会全坏;

使用特权

评论回复
11
zhanzr21| | 2016-11-12 17:14 | 只看该作者
这个只有单独作实验测试了,
我的看法就是不要节省EEPROM, 功耗,价格,体积都不大, 稳定性也比内部Flash强很多(内部Flash标称10000次,EEPROM随便上20W次) 再加上调程序的精力时间 ...个人观点仅供参考

使用特权

评论回复
12
taijing33|  楼主 | 2016-11-12 20:36 | 只看该作者
mmuuss586 发表于 2016-11-12 17:02
那也不会影响全部啊,再说你程序也没丢;

就和打雷一样,一打雷很多设备就坏了,但一般不会全坏; ...

我的就是这么奇怪。因为我的主机带着48个分机一个也不能通讯了,因为所有的地址都变成1了。

使用特权

评论回复
13
taijing33|  楼主 | 2016-11-12 20:38 | 只看该作者
zhanzr21 发表于 2016-11-12 17:14
这个只有单独作实验测试了,
我的看法就是不要节省EEPROM, 功耗,价格,体积都不大, 稳定性也比内部Flash强很 ...

stm32 单片机没有内部EE。因为我的产品 上电后一般不断电,整个寿命周期内,用到的读写EE不超过10次。

使用特权

评论回复
14
zhanzr21| | 2016-11-12 20:48 | 只看该作者
taijing33 发表于 2016-11-12 20:38
stm32 单片机没有内部EE。因为我的产品 上电后一般不断电,整个寿命周期内,用到的读写EE不超过10次。 ...

数据多吗, 如果不多,空间有多余的, 一个page放一组数据, 要写就erase再写, 费点空间, 赚点省心. 省得你调这个模拟EEPROM的程序.

个人观点仅供参考.

使用特权

评论回复
15
zhanzr21| | 2016-11-12 20:53 | 只看该作者
其实数据读写不频繁也可以加一个外接EE的, 很多设备都这样的, 比如网卡一般都有EEPROM放MAC, 整个周期也不怎么改的. SOT23-5的那种EEPROM, 体积很小, 容量小的话价格很低.

个人观点仅供参考.

使用特权

评论回复
16
taijing33|  楼主 | 2016-11-12 22:14 | 只看该作者
zhanzr21 发表于 2016-11-12 20:53
其实数据读写不频繁也可以加一个外接EE的, 很多设备都这样的, 比如网卡一般都有EEPROM放MAC, 整个周期也不 ...

我想知道这次出错是因为什么原因

使用特权

评论回复
17
zhanzr21| | 2016-11-12 22:22 | 只看该作者
期待这个研究结果!

使用特权

评论回复
18
taijing33|  楼主 | 2016-11-21 15:40 | 只看该作者
现在也无结果、

使用特权

评论回复
19
taijing33|  楼主 | 2016-12-28 11:11 | 只看该作者
以后干脆不用内部EE了

使用特权

评论回复
20
Rangar| | 2016-12-28 21:52 | 只看该作者
确实存在FALSH数据丢失的情况

使用特权

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

本版积分规则

163

主题

365

帖子

3

粉丝