在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32掉電檢測(cè)+Flash存取

            STM32掉電檢測(cè)+Flash存取

            作者: 時(shí)間:2016-11-17 來(lái)源:網(wǎng)絡(luò) 收藏
            STM32有PVD的掉電檢測(cè)功能,flash也可以直接存取;就動(dòng)了用flash掉電保存參數(shù)的念頭。
            1、搞定Flash擦、寫(xiě)函數(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)//如果寫(xiě)被鎖死
            {
            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,全拿過(guò)來(lái)保存參數(shù)就行了,比較可靠。
            U16constflashdata[1024]__at(0x08001000);//因?yàn)閒lash一次能且只能寫(xiě)16bit,另外訪問(wèn)奇地址會(huì)出錯(cuò)。
            還有不要忘了#include,絕對(duì)定位全靠它了。
            將要保存的參數(shù)放到一個(gè)結(jié)構(gòu)里面,每次上電復(fù)位的時(shí)候加載,需要存儲(chǔ)時(shí)寫(xiě)入flash
            2、搞定掉電檢測(cè)

            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檢測(cè)
            NVIC_Init(&NVIC_InitStruct);//借用一下庫(kù),允許中斷
            }
            寄存器設(shè)置有效,手動(dòng)置相應(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)//低于閾值(電壓回升也會(huì)中斷)
            {
            F_ErasePage(tmp);
            for(i=0;i<2000;i++)
            {
            FLASH_Program(tmp,i);
            tmp+=2;
            }
            }

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


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

            評(píng)論


            技術(shù)專(zhuān)區(qū)

            關(guān)閉