搜索
bottom↓
回复: 2

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

[复制链接]

出0入0汤圆

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

  21.                    FlashModifyInt(SegD,0x02,CorrectIndex);
  22.                    LEDBlink(5);
  23.                    LEDBlink(5);
  24.                    LEDBlink(5);
  25.                    LEDBlink(5);
  26.                    FactoryModeFlag = 0;        //exit factory mode
  27.                    P1IES |= BIT5;                //change Pin1.5 interrupt trigger mode to falling edge
  28.            }
  29.     }
  30.     LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
  31. }
复制代码



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

  7. #ifndef FLASHOPERATION_H_
  8. #define FLASHOPERATION_H_
  9. /*************************************
  10. * msp430G2553 has 4 data segments, there are
  11. * 64 bytes in every data segment. there are
  12. * 256 byte in all
  13. * D:0x1000--------0x003F
  14. * C:0x1040--------0x107F
  15. * B:0x1080--------0x10BF
  16. * A:0x10C0--------0x10FF
  17. ****************************************/
  18. #define SegA         0x010C0
  19. #define SegB         0x01080
  20. #define SegC         0x01040
  21. #define SegD         0x01000
  22. #define SegSize                64
  23. void FlashInit(void)                //flash初始化
  24. {
  25.         FCTL2 = FWKEY + FSSEL_2 + FN1;        //选择SMCLK作为时钟源,二分频
  26. }

  27. void FlashCheckBusy(void)        //flash检测忙
  28. {
  29.         while(BUSY == (FCTL3 & BUSY));        //检测是否忙
  30. }

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

  40.         return;
  41. }

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

  51.         return;
  52. }
  53. char FlashReadChar(unsigned int addr)        //flash读字节
  54. {
  55.         char rdata;
  56.         rdata = *(char*)addr;        //read content of address addr

  57.         return rdata;
  58. }
  59. void FlashWriteWord(unsigned addr,unsigned int wdata)        //flash写字
  60. {
  61.         _DINT();                //disable sum interrupt
  62.         FlashCheckBusy();        //if flash is busy, then wait
  63.         FCTL3 = FWKEY;                //unlock
  64.         FCTL1 = FWKEY + WRT;        //enable write
  65.         *((unsigned int *)addr) = wdata;        //write wdata to addr
  66.         FCTL1 = FWKEY;         //disable write
  67.         FCTL3 = FWKEY + LOCK;        //lock
  68. }

  69. void FlashWriteInt(unsigned addr,int wdata)        //flash write signed int
  70. {
  71.         _DINT();                //disable sum interrupt
  72.         FlashCheckBusy();        //if flash is busy, then wait
  73.         FCTL3 = FWKEY;                //unlock
  74.         FCTL1 = FWKEY + WRT;        //enable write
  75.         *((unsigned int *)addr) = wdata;        //write wdata to addr
  76.         FCTL1 = FWKEY;         //disable write
  77.         FCTL3 = FWKEY + LOCK;        //lock
  78. }

  79. unsigned int FlashReadWord(unsigned addr)        //flash读字
  80. {
  81.         unsigned int rdata;
  82.         rdata = *(unsigned int *)addr;                //read content of addr

  83.         return rdata;
  84. }

  85. int FlashReadInt(unsigned addr)                        //flash read signed int
  86. {
  87.         int rdata;
  88.         rdata = *(int *)addr;

  89.         return rdata;
  90. }
  91. void FlashModifyChar(unsigned int SegX,char AddrNum,char wdata)        //flash修改字节
  92. {
  93.         char i, TempArray[SegSize];
  94.         for(i=0;i<SegSize;i++)
  95.         {
  96.                 TempArray[i] = *(unsigned int *)(SegX + i);
  97.         }
  98.         TempArray[AddrNum] = wdata;                //write wdata to one item in the array
  99.         FlashErase(SegX);                //erase segment
  100.         FCTL3 = FWKEY;        //unlock
  101.         FCTL1 = FWKEY + WRT;        //prepare write
  102.         for(i=0;i<SegSize;i++)
  103.         {
  104.                 *(unsigned int *)(SegX + i) = TempArray[i];
  105.         }

  106.         FCTL1 = FWKEY;        //disable write
  107.         FCTL3 = FWKEY + LOCK;                //lock
  108. }

  109. //read address = AddrNum*2 + SegX; eg:if AddrNum=0x02 then real address = 1004
  110. void FlashModifyInt(unsigned int SegX,char AddrNum,int wdata)        //flash修改int,zhb add this function 2013-10-09
  111. {
  112.         char i;
  113.         int TempArray[SegSize/2];
  114.         for(i=0;i<(SegSize/2);i++)
  115.         {
  116.                 TempArray[i] = *(unsigned int *)(SegX + i*2);
  117.         }
  118.         TempArray[AddrNum] = wdata;                //write wdata to one item in the array
  119.         FlashErase(SegX);                //erase segment
  120.         FCTL3 = FWKEY;        //unlock
  121.         FCTL1 = FWKEY + WRT;        //prepare write
  122.         for(i=0;i<SegSize/2;i++)
  123.         {
  124.                 *(unsigned int *)(SegX + i*2) = TempArray[i];
  125.         }

  126.         FCTL1 = FWKEY;        //disable write
  127.         FCTL3 = FWKEY + LOCK;                //lock

  128.         _EINT();                //Enable interrupt
  129. }

  130. void FlashBurstWrite(unsigned int SegX,int *pStr)        //flash批量写
  131. {
  132.         int i;
  133.         FlashErase(SegX);        //erase segment
  134.         FCTL3 = FWKEY;                //unlock
  135.         FCTL1 = FWKEY + WRT;                //enable write
  136.         for(i=0;i<2*sizeof(pStr);i++)
  137.         {
  138.                 *(unsigned char *)(SegX + i) = *(pStr + i);
  139.         }
  140.         FCTL1 = FWKEY;                //disable write
  141.         FCTL3 = FWKEY + LOCK;        //lock
  142. }


  143. #endif /* FLASHOPERATION_H_ */
复制代码



先谢谢各位了。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2014-1-14 16:31:21 | 显示全部楼层
不想看代码,430进入中断服务函数后自动关总中断,所以如果是是在中断服务函数内调用写flash函数,就不需要再关总中断了

出0入0汤圆

 楼主| 发表于 2014-1-15 11:56:09 | 显示全部楼层
dalarang 发表于 2014-1-14 16:31
不想看代码,430进入中断服务函数后自动关总中断,所以如果是是在中断服务函数内调用写flash函数,就不需要 ...

谢谢啊,贴代码目的不是让帮忙排错,是给比我还初级的人参考(代码俺在launchpad上调试过了的)。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 20:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表