打印
[STM32F1]

flash模拟ee遇到数据出错。

[复制链接]
1728|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();
        }


}





沙发
taijing33|  楼主 | 2016-11-12 14:16 | 显示全部楼层
mmuuss586 发表于 2016-11-12 13:34
如果是电源不稳定,那也不会你所有的从机地址都出问题了;
我们以前做用其它MCU,确实存在FALSH数据丢失的 ...

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

使用特权

评论回复
板凳
taijing33|  楼主 | 2016-11-12 14:17 | 显示全部楼层
dongnanxibei 发表于 2016-11-12 13:16
能否再调回去正确的值

可以调回调回原来的值

使用特权

评论回复
地板
taijing33|  楼主 | 2016-11-12 15:39 | 显示全部楼层
dongnanxibei 发表于 2016-11-12 14:38
有7连发的,还有12连发的拨码开关,应该够用,只要你有充足的IO。

那就另当别论了

使用特权

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

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

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

使用特权

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

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

使用特权

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

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

使用特权

评论回复
8
taijing33|  楼主 | 2016-11-21 15:40 | 显示全部楼层
现在也无结果、

使用特权

评论回复
9
taijing33|  楼主 | 2016-12-28 11:11 | 显示全部楼层
以后干脆不用内部EE了

使用特权

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

本版积分规则

162

主题

364

帖子

3

粉丝