色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          STM32掉電檢測+Flash存取

          作者: 時(shí)間:2016-11-17 來源:網(wǎng)絡(luò) 收藏
          STM32有PVD的掉電檢測功能,flash也可以直接存??;就動了用flash掉電保存參數(shù)的念頭。
          1、搞定Flash擦、寫函數(shù)。
          voidF_ErasePage(u32Page_Address)
          {
          U32tmp;
          while((FLASH->SR&FLASH_FLAG_BSY)==FLASH_FLAG_BSY)
          {//PutCnstStr2Usart1("waitingn");}
          FLASH->SR|=FLASH_FLAG_PGERR;
          FLASH->CR|=CR_PER_Set;
          FLASH->AR=Page_Address;
          FLASH->CR|=CR_STRT_Set;
          while((FLASH->SR&FLASH_FLAG_BSY)==FLASH_FLAG_BSY)
          {//PutCnstStr2Usart1("waitingn");}
          FLASH->CR&=~CR_PER_Set;//這個(gè)不能忘
          }
          voidFLASH_Program(u32Address,u16Data)
          {
          U32tmp;
          Fstart:
          if((FLASH->CR&CR_LOCK_Set)==CR_LOCK_Set)//如果寫被鎖死
          {
          FLASH->KEYR=FLASH_KEY1;
          FLASH->KEYR=FLASH_KEY2;
          //PutCnstStr2Usart1("Unclockn");
          }
          while((FLASH->SR&FLASH_FLAG_BSY)==FLASH_FLAG_BSY)
          {
          //PutCnstStr2Usart1("waitingn");
          }
          FLASH->CR|=CR_PG_Set;
          *(vu16*)Address=Data;
          FLASH->CR&=~CR_PG_Set;
          if((FLASH->SR&FLASH_FLAG_PGERR)==FLASH_FLAG_PGERR)
          {
          //PutCnstStr2Usart1("Noearasen");
          F_ErasePage(Address);
          gotoFstart;//竟然用了goto,咳咳^_^
          }
          }
          有了這兩個(gè)函數(shù)基本就行了,反正一次要擦一個(gè)page,全拿過來保存參數(shù)就行了,比較可靠。
          U16constflashdata[1024]__at(0x08001000);//因?yàn)閒lash一次能且只能寫16bit,另外訪問奇地址會出錯。
          還有不要忘了#include,絕對定位全靠它了。
          將要保存的參數(shù)放到一個(gè)結(jié)構(gòu)里面,每次上電復(fù)位的時(shí)候加載,需要存儲時(shí)寫入flash
          2、搞定掉電檢測

          voidPVD_Init(void)
          {
          NVIC_InitTypeDefNVIC_InitStruct;
          NVIC_InitStruct.NVIC_IRQChannel=PVD_IRQChannel;
          NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0x00;
          NVIC_InitStruct.NVIC_IRQChannelSubPriority=0x00;
          NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM3|
          RCC_APB1Periph_TIM4|RCC_APB1Periph_USART2|RCC_APB1Periph_PWR,ENABLE);//_PWR,ENABLE);//這個(gè)是必需的
          PWR->CR|=1<<4;//使能
          PWR->CR|=0xE0;//2.9V檢測
          NVIC_Init(&NVIC_InitStruct);//借用一下庫,允許中斷
          }
          寄存器設(shè)置有效,手動置相應(yīng)中斷標(biāo)志可進(jìn)入中斷
          3、聯(lián)合工作,失敗
          voidPVD_IRQHandler(void)
          {
          U16i;
          U32tmp;
          tmp=0x08001000;

          if((PWR->CSR&PWR_FLAG_PVDO)==PWR_FLAG_PVDO)//低于閾值(電壓回升也會中斷)
          {
          F_ErasePage(tmp);
          for(i=0;i<2000;i++)
          {
          FLASH_Program(tmp,i);
          tmp+=2;
          }
          }

          }
          分析:1、Vdda經(jīng)過LC濾波可能會比Vdd掉的慢,而據(jù)說stm32會因此產(chǎn)生檢測問題。2、電源回路電容量小,時(shí)間來不及。
          嘗試:從ATX電源上拆了一個(gè)1000uF的電容,接上,無改善。
          思考:把掉電檢測跟電源腳做在一起實(shí)在意義不大,一般情況下MCU的電源都是經(jīng)過LDO穩(wěn)壓的,掉電檢測使用專門的IO,可以用穩(wěn)壓器前的電壓用于檢測。
          由于目前還不能對電路板進(jìn)行破壞性改造,手頭也沒有示波器,可調(diào)電源,暫時(shí)放棄對此做進(jìn)一步的研究。
          套用某大人物的邏輯,這次嘗試是部分失敗


          關(guān)鍵詞: STM32掉電檢測Flash存

          評論


          技術(shù)專區(qū)

          關(guān)閉