皮爱了西 发表于 2014-1-14 10:11:39

【求助】flash写入屏蔽中断的问题

msp430在操作flash时一般都需要先屏蔽中断,确保flash的写入过程不被打断,现在俺有个不明白的问题是,如果将flash操作的函数放到某个中断服务函数里,是不是就不需要做这个处理了,俺的理解是msp430在进入某个中断服务函数后会自动屏蔽其他的中断,这样就相当于保证了flash写入过程的持续性。不知道俺理解的对不对。比如放到下面的中断函数中,是不是FlashErase和FlashModifyInt函数中就不需要增加_DINT()操作了。
#pragma vector=PORT1_VECTOR
__interrupt void Port1()
{
   //以下为参考处理程序,不使用的端口应当删除其对于中断源的判断。
        if((P1IFG&BIT5) ==BIT5)
    {
         //处理P1IN.5中断
         P1IFG &= ~BIT5; //清除中断标志
         //以下填充用户代码
         if(FactoryModeFlag==0)
         {
                 CorrectIndex = 0;
                 FlashErase(SegD);        //when entry factory mode,erase SegC;
                 LEDBlink(50);
                 LEDBlink(50);
                 FactoryModeFlag = 1;        //entry factory mode
                 P1IES &= ~BIT5;                //change Pin1.5 interrupt trigger mode to rising edge
         }
         else
         {

                 FlashModifyInt(SegD,0x02,CorrectIndex);
                 LEDBlink(5);
                 LEDBlink(5);
                 LEDBlink(5);
                 LEDBlink(5);
                 FactoryModeFlag = 0;        //exit factory mode
                 P1IES |= BIT5;                //change Pin1.5 interrupt trigger mode to falling edge
         }
    }
    LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}


下面是俺参照资料连抄带改搞了个flash操作的函数:
/*
* FlashOperation.h
*
*Created on: 2013-9-16
*      Author: zhanghaibo1
*/

#ifndef FLASHOPERATION_H_
#define FLASHOPERATION_H_
/*************************************
* msp430G2553 has 4 data segments, there are
* 64 bytes in every data segment. there are
* 256 byte in all
* D:0x1000--------0x003F
* C:0x1040--------0x107F
* B:0x1080--------0x10BF
* A:0x10C0--------0x10FF
****************************************/
#define SegA         0x010C0
#define SegB         0x01080
#define SegC         0x01040
#define SegD         0x01000
#define SegSize                64
void FlashInit(void)                //flash初始化
{
        FCTL2 = FWKEY + FSSEL_2 + FN1;        //选择SMCLK作为时钟源,二分频
}

void FlashCheckBusy(void)        //flash检测忙
{
        while(BUSY == (FCTL3 & BUSY));        //检测是否忙
}

void FlashErase(int SegX)        //flash段擦除
{
        _DINT();
        FlashCheckBusy();        //check flash is busy or not
        FCTL3 = FWKEY;                //lock=0 means unlock
        FCTL1 = FWKEY + ERASE;        //enable segment erase
        *((int *)SegX) = 0x00;        //erase segment--write null
        FlashCheckBusy();                //flash is busy?
        FCTL3 = FWKEY | LOCK;        //Lock

        return;
}

void FlashWriteChar(unsigned int addr,char wdata)                //falsh写字节
{
        _DINT();                //disable sum interrupt
        FlashCheckBusy();        //check if flash is busy
        FCTL3 = FWKEY;                //Unlock
        FCTL1 = FWKEY + WRT;        //Enable write
        *((unsigned char *)addr) = wdata;        //write wdata to address of addr
        FCTL1 = FWKEY;                //disable write
        FCTL3 = FWKEY + LOCK;                //lock

        return;
}
char FlashReadChar(unsigned int addr)        //flash读字节
{
        char rdata;
        rdata = *(char*)addr;        //read content of address addr

        return rdata;
}
void FlashWriteWord(unsigned addr,unsigned int wdata)        //flash写字
{
        _DINT();                //disable sum interrupt
        FlashCheckBusy();        //if flash is busy, then wait
        FCTL3 = FWKEY;                //unlock
        FCTL1 = FWKEY + WRT;        //enable write
        *((unsigned int *)addr) = wdata;        //write wdata to addr
        FCTL1 = FWKEY;         //disable write
        FCTL3 = FWKEY + LOCK;        //lock
}

void FlashWriteInt(unsigned addr,int wdata)        //flash write signed int
{
        _DINT();                //disable sum interrupt
        FlashCheckBusy();        //if flash is busy, then wait
        FCTL3 = FWKEY;                //unlock
        FCTL1 = FWKEY + WRT;        //enable write
        *((unsigned int *)addr) = wdata;        //write wdata to addr
        FCTL1 = FWKEY;         //disable write
        FCTL3 = FWKEY + LOCK;        //lock
}

unsigned int FlashReadWord(unsigned addr)        //flash读字
{
        unsigned int rdata;
        rdata = *(unsigned int *)addr;                //read content of addr

        return rdata;
}

int FlashReadInt(unsigned addr)                        //flash read signed int
{
        int rdata;
        rdata = *(int *)addr;

        return rdata;
}
void FlashModifyChar(unsigned int SegX,char AddrNum,char wdata)        //flash修改字节
{
        char i, TempArray;
        for(i=0;i<SegSize;i++)
        {
                TempArray = *(unsigned int *)(SegX + i);
        }
        TempArray = wdata;                //write wdata to one item in the array
        FlashErase(SegX);                //erase segment
        FCTL3 = FWKEY;        //unlock
        FCTL1 = FWKEY + WRT;        //prepare write
        for(i=0;i<SegSize;i++)
        {
                *(unsigned int *)(SegX + i) = TempArray;
        }

        FCTL1 = FWKEY;        //disable write
        FCTL3 = FWKEY + LOCK;                //lock
}

//read address = AddrNum*2 + SegX; eg:if AddrNum=0x02 then real address = 1004
void FlashModifyInt(unsigned int SegX,char AddrNum,int wdata)        //flash修改int,zhb add this function 2013-10-09
{
        char i;
        int TempArray;
        for(i=0;i<(SegSize/2);i++)
        {
                TempArray = *(unsigned int *)(SegX + i*2);
        }
        TempArray = wdata;                //write wdata to one item in the array
        FlashErase(SegX);                //erase segment
        FCTL3 = FWKEY;        //unlock
        FCTL1 = FWKEY + WRT;        //prepare write
        for(i=0;i<SegSize/2;i++)
        {
                *(unsigned int *)(SegX + i*2) = TempArray;
        }

        FCTL1 = FWKEY;        //disable write
        FCTL3 = FWKEY + LOCK;                //lock

        _EINT();                //Enable interrupt
}

void FlashBurstWrite(unsigned int SegX,int *pStr)        //flash批量写
{
        int i;
        FlashErase(SegX);        //erase segment
        FCTL3 = FWKEY;                //unlock
        FCTL1 = FWKEY + WRT;                //enable write
        for(i=0;i<2*sizeof(pStr);i++)
        {
                *(unsigned char *)(SegX + i) = *(pStr + i);
        }
        FCTL1 = FWKEY;                //disable write
        FCTL3 = FWKEY + LOCK;        //lock
}


#endif /* FLASHOPERATION_H_ */



先谢谢各位了。

dalarang 发表于 2014-1-14 16:31:21

不想看代码,430进入中断服务函数后自动关总中断,所以如果是是在中断服务函数内调用写flash函数,就不需要再关总中断了

皮爱了西 发表于 2014-1-15 11:56:09

dalarang 发表于 2014-1-14 16:31
不想看代码,430进入中断服务函数后自动关总中断,所以如果是是在中断服务函数内调用写flash函数,就不需要 ...

谢谢啊,贴代码目的不是让帮忙排错,是给比我还初级的人参考(代码俺在launchpad上调试过了的)。
页: [1]
查看完整版本: 【求助】flash写入屏蔽中断的问题