新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > ATMEGE32在bootloader區(qū)對Flash進行讀寫操作

        ATMEGE32在bootloader區(qū)對Flash進行讀寫操作

        作者: 時間:2016-11-27 來源:網(wǎng)絡(luò) 收藏
        注明:本程序采用官方的boot庫函數(shù)進行實驗,開發(fā)環(huán)境是 atmelstudio6( avrstudio6 )。
        官方提供了bootloader相關(guān)的寫入擦除函數(shù)。
        主函數(shù)如下:
        int main(void)
        {
        USARTInit(115200);
        for (int i=0;i<256;i++)
        {//此處數(shù)據(jù)均為00010203形式
        if ((i&3)==0)
        {
        databuff.databuff8[i]=0;
        }
        else if ((i&3)==1)
        {
        databuff.databuff8[i]=1;
        }
        else if ((i&3)==2)
        {
        databuff.databuff8[i]=2;
        }
        else if ((i&3)==3)
        {
        databuff.databuff8[i]=3;
        }
        }
        address = 0;
        boot_write_one_page();
        for (int i=0;i<256;i++)
        {//此處數(shù)據(jù)均為00ff00ff形式
        if (i&1)
        {
        databuff.databuff8[i]=0XFF;
        }
        else
        {
        databuff.databuff8[i]=0;
        }
        }
        address += 256;
        boot_write_one_page();
        address = 0;
        boot_check_flash();
        address += 256;
        boot_check_flash();
        while(1);
        }
        下面是寫入一頁的程序:
        void boot_write_one_page(void)
        {
        int i;
        DataUnionByte TempData;
        boot_page_erase(address);// 擦除一頁
        boot_spm_busy_wait();// 等待擦除完成
        for (i=0;i
        {
        TempData.databuff8[0]=databuff.databuff8[i];
        TempData.databuff8[1]=databuff.databuff8[i+1];
        boot_page_fill_safe(i,TempData.databuff16);
        }
        boot_page_write_safe(address);
        boot_rww_enable_safe();
        }
        unsigned int read_program_memory (unsigned int adr ,unsigned char cmd)
        {
        asm("movw r30, r24");//復(fù)制地址到z寄存器
        asm("SBRC r22, 0");
        asm("STS 0x37, r22");//r22->0x37(SPMCR)
        asm("LPM r24, Z+");
        asm("LPM r25, Z");//獲取返回數(shù)據(jù)
        asm("ret");
        }
        下面是對flash數(shù)據(jù)進行讀取并串口打印的函數(shù)
        void boot_check_flash(void)
        {
        DataUnionByte TempData;
        for (int i=0;i<128;i+=2)
        {
        TempData.databuff16 = read_program_memory(address+i,0x00);
        USARTTransmit(TempData.databuff8[0]);
        USARTTransmit(TempData.databuff8[1]);
        }
        }
        運行結(jié)果如下:



        評論


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

        關(guān)閉
        主站蜘蛛池模板: 吉安县| 汝州市| 广昌县| 林芝县| 柳州市| 玉屏| 井冈山市| 无锡市| 龙山县| 玛曲县| 凤阳县| 灵璧县| 卢湾区| 沂水县| 东阿县| 石台县| 武川县| 图们市| 临海市| 林甸县| 兴安盟| 昌图县| 贵南县| 沙湾县| 普安县| 罗田县| 房山区| 简阳市| 勃利县| 尚志市| 安陆市| 天镇县| 梁平县| 临沂市| 甘洛县| 长阳| 扎兰屯市| 项城市| 措美县| 达孜县| 无极县|