打印

STM8 eeprom问题严重--求解

[复制链接]
6663|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zouhaolin|  楼主 | 2009-12-31 00:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用STM207,写EEPROM时会导致CPU复位,,不知是何故,,

只要把串口通讯线接上,  一写EEPROM就会死机复位,,,.

拔掉好像不死,,,,怎么会这样,,,,哪位高人请指点指点
沙发
zhaoxinzxzx| | 2009-12-31 09:19 | 只看该作者
是否用了中断及看门狗?建议贴程序上来!

使用特权

评论回复
板凳
zouhaolin|  楼主 | 2009-12-31 12:55 | 只看该作者
是的,但是写前禁止中断还是不行,,关掉看门狗,则写EEPROM时程序死掉

使用特权

评论回复
地板
zouhaolin|  楼主 | 2009-12-31 12:56 | 只看该作者
void save_data(void)
{
        //TIM4_ITConfig(TIM4_IT_UPDATE, DISABLE);
        UART1_ITConfig(UART1_IT_TXE, DISABLE);
        UART1_ITConfig(UART1_IT_RXNE_OR, DISABLE);
        //UART1_ClearITPendingBit(UART1_IT_TXE);
        //UART1_ClearITPendingBit(UART1_IT_RXNE_OR);
       
        UART1_Cmd(DISABLE);
        delay_ms(10);
        GPIO_Init(GPIOA, GPIO_PIN_5|GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_FAST);
        GPIO_WriteHigh(GPIOA, GPIO_PIN_4);
        GPIO_WriteLow(GPIOA, GPIO_PIN_5);
        delay_ms(10);
        //TIM4_Cmd(DISABLE);
        //IWDG_ReloadCounter(); //喂狗
       
        //系统时间设置
        if(value_index >= 1000 && value_index < 2000)
        {
                switch(value_index-1000)
                {
                        case 25:
                                if(value_temp > 59) value_temp = 59; else if(value_temp < 0) value_temp = 0;
                                M41T0_ByteWrite(HEX_BCD((u8)value_temp), 0);
                                break;//秒
                               
                        case 26:   
                                if(value_temp > 59) value_temp = 59; else if(value_temp < 0) value_temp = 0;
                                M41T0_ByteWrite(HEX_BCD((u8)value_temp), 1);
                                break;//分
                                       
                        case 27:   
                                if(value_temp > 23) value_temp = 23; else if(value_temp < 0) value_temp = 0;
                                M41T0_ByteWrite(HEX_BCD((u8)value_temp), 2);
                                break;//时
                       
                        case 29:  //日
                                if(value_temp > 31) value_temp = 31; else if(value_temp < 1) value_temp = 1;
                                M41T0_ByteWrite(HEX_BCD((u8)value_temp), 4);
                                break;
                               
                        case 30:        //月
                                if(value_temp > 12) value_temp = 12; else if(value_temp < 1) value_temp = 1;
                                M41T0_ByteWrite(HEX_BCD((u8)value_temp), 5);
                                break;
                               
                        case 31:  //年
                                if(value_temp > 99) value_temp = 99; else if(value_temp < 10) value_temp = 10;
                                M41T0_ByteWrite(HEX_BCD((u8)value_temp), 6);
                                break;
                        default: return;
                }

        }
       
        else if(value_index >= 20 && value_index <= 48)  //可设参数,
        {
                if(value_temp > user_para_max[value_index-20]) value_temp = user_para_max[value_index-20];
                else if(value_temp < user_para_min[value_index-20]) value_temp = user_para_min[value_index-20];
               
                data.vw[value_index] = value_temp;
                write_u16(user_para_addr+(value_index-user_para_start_index)*2, value_temp);
        }
       
        else if(value_index >= 2000 && value_index < 3000) //检修参数
        {
                switch(value_index-2000)
                {
                        case device_check_start_index+0: //选择机头
                                        if(value_temp > comp_num) value_temp = comp_num; else if(value_temp < 0)value_temp = 0;
                                        data.vw[device_check_start_index] = value_temp;
                                        break;
                                       
                        case device_check_start_index+1: //冷冻设备
                        case device_check_start_index+2: //冷却设备
                                        if(value_temp > 1) value_temp = 1; else if(value_temp < 0) value_temp = 0;
                                        data.vw[value_index-2000] = value_temp;
                                        break;
                                       
                        default: break;
                }
        }
       
        else if(value_index >= 3000 && value_index < 4000)  //保存密码
        {
               
        }
       
        value_index = 0;
        //TIM4_Cmd(ENABLE);
        GPIO_Init(GPIOA, GPIO_PIN_5|GPIO_PIN_4, GPIO_MODE_IN_PU_NO_IT);
        //UART1_Cmd(ENABLE);
        delay_ms(10);
        UART1_Cmd(ENABLE);
        //TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
        UART1_ITConfig(UART1_IT_TXE, ENABLE);
        UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);
        IWDG_ReloadCounter(); //喂狗
       
}

使用特权

评论回复
5
zouhaolin|  楼主 | 2009-12-31 12:56 | 只看该作者
void write_u16(u32 addr, u16 dat)
{
        u16 i;
        if(addr <= 0x27f && addr % 2 == 0)
        {
                addr += EEPROM_START;               
                FLASH_ProgramByte(addr, (u8)(dat >> 8));
        //        for(i = 0; i < 1000; i++)IWDG_ReloadCounter(); //
                FLASH_ProgramByte(addr+1, (u8)(dat & 0xff));
        //        for(i = 0; i < 1000; i++)IWDG_ReloadCounter(); //
        }       
}

使用特权

评论回复
6
zouhaolin|  楼主 | 2009-12-31 12:57 | 只看该作者
**/
void target_init(void)
{
                /* Clock initialization */
    Init_Clock();
   
                //eeprom
                eeprom_init();
               
                /* I/O Port initialization */
    Init_GPIO();
    /* TIMER4 initialization for generic timebase */
    Init_TIM4();
       
                uart_init();
    /* Init I2C for communication with external eeprom on evalboard */
    Init_RTC();  //I2C for RTC
               
    /* Enable interrupts */
    enableInterrupts();
               
                /*Test if Reset occured*/
                Test_IWDGReset();
                /* IWDG Configuration */
                IWDG_Configuration();
}

使用特权

评论回复
7
zouhaolin|  楼主 | 2009-12-31 12:57 | 只看该作者
本帖最后由 zouhaolin 于 2009-12-31 13:01 编辑

TIM4 , UART1都有中断

问题估计是在串口部分,,只要不把串口线接上,就不会出现这种情况,,

可是关掉串口中断和时钟还是不行,情况有所好转,还是偶尔会出现

使用特权

评论回复
8
汉之云| | 2009-12-31 14:13 | 只看该作者
看门狗开了后在再次复位前是关不掉的

使用特权

评论回复
9
笑苍天| | 2009-12-31 14:57 | 只看该作者
看门狗看来和stm32的一样,一旦打开,就无法关闭。
有点讨厌,有些特殊应用无法实现。

使用特权

评论回复
10
香水城| | 2009-12-31 15:07 | 只看该作者
本帖最后由 香水城 于 2009-12-31 15:15 编辑
看门狗看来和stm32的一样,一旦打开,就无法关闭。
有点讨厌,有些特殊应用无法实现。
笑苍天 发表于 2009-12-31 14:57


设置看门狗的目的就是为了在发生意外时使系统能够自动恢复,如果看门狗能够被关闭,它的作用就会大打折扣。

如果看门狗能够被主动地关闭,就意味着也能被意外地关闭,本来设置看门狗是为了防范意外,现在意外情况也能杀死看门狗,这只狗不就成了摆设?

如果看门狗能够被关闭,谁能保证在看门狗被关闭期间不发生意外,如果在这个期间发生意外,你就没有机会再重新打开看门狗了。

LS能说说不能关闭看门狗时,哪些特殊应用无法实现?

使用特权

评论回复
11
笑苍天| | 2009-12-31 16:20 | 只看该作者
我睡眠时,不是被我期望的外部中断(如按键)唤醒,而是被狗狗叫醒。
当然我先复位,不开看门狗,再睡眠也是可以的。

使用特权

评论回复
12
hsbjb| | 2010-1-2 16:26 | 只看该作者
串口通讯使用中断发送吗

使用特权

评论回复
13
hd12| | 2013-2-1 10:22 | 只看该作者
本帖最后由 hd12 于 2013-2-1 10:30 编辑

你的问题找到原因没,我现在发现有一段程序连续写超过2个(包括2个)eeprom地址就必须喂狗,要不然就会看门狗复位,我的看门狗已经设定为1秒钟了。而其他地方连续写了8个地址都没不用喂狗,也不会导致看门狗复位。出问题的地方程序:
                     EnWriteEprom();
                    *(u8 *)( AddrTmp    ) = EpromBuf.Cnt0;// write cycle times 0
                    WaitFlash();

                    *(u8 *)( AddrTmp + 1) = EpromBuf.Cnt1;// write cycle times 1
                    WaitFlash();IWDG->KR = 0xAA; // 这里不喂狗的话就死机重启

                    *(u8 *)( AddrTmp + 2) = EpromBuf.Cnt2;// write cycle times 1
                    WaitFlash();

                    *(u8 *)( AddrTmp + 3) = EpromBuf.Dat;//  write data
                    WaitFlash();

                    EpromTimer = MinWriteEpromDelay; // start eprom write timer

                    DisWriteEprom(); // lock eprom

使用特权

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

本版积分规则

2

主题

12

帖子

1

粉丝