打印
[技术问答]

M0516LD进欠压中断写data flash,写不进去,什么原因?

[复制链接]
1256|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bingkaiok|  楼主 | 2017-2-6 16:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
要求很简单:上5v电读data flash,可以读出上次写入的值(现在是3),触发外中断,值加加,显示4,之后断电再上电,应该显示4,但为什么还是显3?在外中断里写
data flash断电可以保存(不接电池),一样的语句在欠压中断里写data flash为什么存不了(写不进去),欠压值设4.5v,vcc接法拉电容,还特意接钮扣电池试验,断5v几秒后再拆电池还是存不了,看了下手册,还是想不明白,是没这功能还是要做特别的操作,求前辈们指点,谢谢帮助!
代码也是拿别人的例程改的,不知问题出在哪里?

#define   PAGE_SIZE               512
#define   DATAFLASH_START_ADDRESS        0x0001F000     //data flash开始固定地址   
#define DATAFLASH_SIZE          0x00001000

static char s_p32=0;                    
UINT8   buf[32]={0};     
static char a2=1;   

VOID BODInit(UINT32 unVoltage)                 //BOD初始化
{
  PROTECT_REG                                 //解锁
        (
                switch(unVoltage)                    /* 欠压检测门槛电压 电压选择 */
                {
                    case 4500:BODCR|=3<<1;               //  设欠压值为4.5V,
                                  break;
                    case 3800:BODCR|=2<<1;               
                                  break;
                    case 2700:BODCR|=1<<1;               
                                  break;                                                  
                    case 2200:BODCR|=0<<1;               
                                  break;
                          default:break;                                                         
                }
   
                BODCR|=1<<4;             //电压上升或下降到欠压值,该位置1,写1清0
                BODCR|=0x01;              // BOD欠压检测使能                     
                )
  /*   BOD中断使能 */
        NMI_SEL=0x01;                     
        NVIC_ISER |= BOD_OUT_INT;               
}

/////////////////////////////              
INT32 main(VOID)
{
                P3_IMD&=~(1<<2);    //设P3.2工作于边沿触发中断功能      
                P3_IEN|=(1<<2);     //使能P3.2低电平或下降沿触发的中断  
       
                    Delayms(1000);            
      
                  BODInit(4500);              //   BOD 初始化 低于或高于4.5V进入掉电中断
                        
            NVIC_ISER|=(1<<2);        //使能2号中断EINT0   P3.2  

               FMC_Read(DATAFLASH_START_ADDRESS,  buf,  1);          //  读片内data flash       
                       
                s_p32 = buf[0];
while(1)
         {       
         while(a2)
            {       
                                 shuma_xianshi(buf[0]);    //显示函数                                       
                  }
         }
}

//////////////////////////////////////////////
VOID BOD_IRQHandler(VOID)
{
         STATIC BOOL IsBod=FALSE;               
   if(BODCR & (1<<6))      
         {
                  if(!IsBod)              
                        {
                                 IsBod=TRUE;                                            

                                a2=0;

                                  P2_DOUT|=(0xff<<0);         //P2输出高电平,关闭数码管显示
                                 P0_DOUT|=(0xff<<0);         //P0输出高电平,关闭数码管显示
                       
                              memset(buf,s_p32,1);
            
                                  FMC_Erase(DATAFLASH_START_ADDRESS);      //擦除指定地址页       
         
                                  FMC_Write(DATAFLASH_START_ADDRESS,   buf,  1);          //FMC执行写操作   
         
                                  P4_DOUT&=~(1<<0);           //P4.0输出低电平
                                        }       
         }
         else
         {
                  if(IsBod)   
                        {
                                 IsBod=FALSE;
                         
                                  a2=1;       
                       
                                  P4_DOUT&=~(1<<1);     //P4.1输出低电平                                
                        }
         }
             BODCR|=1<<4;          //写1清除欠压中断标志  
        }

////////////////////////////////////////////////////////////
void EINT0_IRQHandler()        //P3.2外部中断0服务函数
{
        s_p32++;  
             if(s_p32>250)
                                {
                                        s_p32 =0;      //归0,从头来
                                }               
                    buf[0]=s_p32;
               
                //        memset(buf,s_p32,1);   
                 //           FMC_Erase(DATAFLASH_START_ADDRESS);        //擦除指定地址页
                 //       FMC_Write(DATAFLASH_START_ADDRESS,   buf,  1);          //FMC执行写操                          
                 
                     P3_ISRC|=(1<<2);                                            //写1清除P3.2中断标志
}

沙发
稳稳の幸福| | 2017-2-6 16:53 | 只看该作者
欠压后是不是真的掉电了?电压不足?

使用特权

评论回复
板凳
bingkaiok|  楼主 | 2017-2-6 19:20 | 只看该作者
稳稳の幸福 发表于 2017-2-6 16:53
欠压后是不是真的掉电了?电压不足?

断5V后看到指示灯亮,确定进入欠压中断,几秒后再拆3v电池也写不进去,觉得很怪?

使用特权

评论回复
地板
643757107| | 2017-2-6 20:48 | 只看该作者
没试过这种情况,不知道欠压后是不是就需要重新初始化?

使用特权

评论回复
5
mintspring| | 2017-2-7 13:25 | 只看该作者
欠压中断里面可以控制GPIO点亮LED吗

使用特权

评论回复
6
bingkaiok|  楼主 | 2017-2-7 17:35 | 只看该作者
mintspring 发表于 2017-2-7 13:25
欠压中断里面可以控制GPIO点亮LED吗

欠压中断里可以操作IO口,可以写24C02,不能关外中断,也不能关欠压中断,也不能再设欠压值,是不是跟启动文件有关系,小弟学才不佳,请大家有空一起研究下

使用特权

评论回复
7
huangcunxiake| | 2017-2-7 21:48 | 只看该作者
这个应用真心没研究过,坐等高人给讲课。

使用特权

评论回复
8
huangcunxiake| | 2017-2-7 22:01 | 只看该作者
我觉得写入后最好直接读出确认写入了再结束。

使用特权

评论回复
9
bingkaiok|  楼主 | 2017-2-8 12:23 | 只看该作者
huangcunxiake 发表于 2017-2-7 22:01
我觉得写入后最好直接读出确认写入了再结束。

谢谢提醒,之前就试过,在欠压中断里写入新值,还做了1ms延时,再读出还是原值3,写入没效果。前辈们都很忙,耐心等待民间高手有空救援,耐心等待官方人士有空解析。

使用特权

评论回复
10
zhuotuzi| | 2017-2-8 14:42 | 只看该作者
这个写DF在欠压下没法写?重新上电后可以吧

使用特权

评论回复
11
bingkaiok|  楼主 | 2017-2-8 20:08 | 只看该作者
zhuotuzi 发表于 2017-2-8 14:42
这个写DF在欠压下没法写?重新上电后可以吧

谢谢提醒,意思是没这功能吗?

使用特权

评论回复
12
zhuotuzi| | 2017-2-11 10:31 | 只看该作者
bingkaiok 发表于 2017-2-8 20:08
谢谢提醒,意思是没这功能吗?

应该是。

使用特权

评论回复
13
yiyigirl2014| | 2017-2-14 14:27 | 只看该作者
原来欠压的时候是不能操作这些的,这些需要电量比大。

使用特权

评论回复
14
zhuomuniao110| | 2017-2-14 16:55 | 只看该作者
做这个程序的目的是什么,统计多少次的欠压复位了?如果是想采集电压源或者某个电压的稳定性,不建议这么做,可以做个ADC采集,低于多少的时候记录,否则丢弃。

使用特权

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

本版积分规则

5

主题

74

帖子

0

粉丝