7685|11

65

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM8eeprom问题严重--求解 [复制链接]

我用STM207,写EEPROM时会导致CPU复位,,不知是何故,,

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

拔掉好像不死,,,,怎么会这样,,,,哪位高人请指点指点
此帖出自stm32/stm8论坛

最新回复

                                 串口通讯使用中断发送吗  详情 回复 发表于 2010-1-2 16:26
点赞 关注
 

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
                                 是否用了中断及看门狗?建议贴程序上来!
此帖出自stm32/stm8论坛
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
                                 是的,但是写前禁止中断还是不行,,关掉看门狗,则写EEPROM时程序死掉
此帖出自stm32/stm8论坛
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
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(); //喂狗
       
}
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

5
 
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(); //
        }       
}
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

6
 
**/
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();
}
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

7
 


TIM4 , UART1都有中断

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

可是关掉串口中断和时钟还是不行,情况有所好转,还是偶尔会出现
此帖出自stm32/stm8论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

8
 
                                 看门狗开了后在再次复位前是关不掉的
此帖出自stm32/stm8论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

9
 
看门狗看来和stm32的一样,一旦打开,就无法关闭。
有点讨厌,有些特殊应用无法实现。
此帖出自stm32/stm8论坛
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

10
 
看门狗看来和stm32的一样,一旦打开,就无法关闭。
有点讨厌,有些特殊应用无法实现。
设置看门狗的目的就是为了在发生意外时使系统能够自动恢复,如果看门狗能够被关闭,它的作用就会大打折扣。

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

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

LS能说说不能关闭看门狗时,哪些特殊应用无法实现?
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 
我睡眠时,不是被我期望的外部中断(如按键)唤醒,而是被狗狗叫醒。
当然我先复位,不开看门狗,再睡眠也是可以的。
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

12
 
                                 串口通讯使用中断发送吗
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表