新聞中心

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

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

作者: 時(shí)間:2016-11-27 來(lái)源:網(wǎng)絡(luò) 收藏
注明:本程序采用官方的boot庫(kù)函數(shù)進(jìn)行實(shí)驗(yàn),開(kāi)發(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);
}
下面是寫入一頁(yè)的程序:
void boot_write_one_page(void)
{
int i;
DataUnionByte TempData;
boot_page_erase(address);// 擦除一頁(yè)
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");//獲取返回?cái)?shù)據(jù)
asm("ret");
}
下面是對(duì)flash數(shù)據(jù)進(jìn)行讀取并串口打印的函數(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]);
}
}
運(yùn)行結(jié)果如下:



評(píng)論


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

關(guān)閉