32单片机bootloader程序
一,单片机为什么要使用bootloader
1、使用bootloader的好处
1) 程序隔离:可以同时存在多个程序,只要flash空间够大,或者通过外挂flash,可以实现多个程序共存,在多个程序之间切换使用。
2)方便程序升级和后期维护:多个程序相互独立运行,可以在一个程序对另一个程序更新,普通单片机程序只能通过isp或者jtag、swd等调试接口实现程序烧录。而使用bootloader程序则可以通过usart、485、can、iic、spi、sd、4g、wifi卡等等任意可以实现数据传输的通信方式进行设备ota升级,也不必必须依赖烧录器。
2、不建议使用bootloader的原因
1)占用flash空间:多一个程序必然会多占一部分flash空间。
2)增加程序烧录的步骤:项目量产时出厂烧录程序会不太方便。
void flash_program(uint32_t addr,uint8_t *data,uint16_t size)
{
uint32_t prog_addr = (uint32_t)addr;
uint8_t * data_addr = data;
uint16_t i,j;
uint16_t pages;
uint16_t pg_idx = 0;
uint16_t wr_size = size;
uint32_t * pdata;
uint32_t * pobj = (uint32_t *)fmc_tmp_page;
if(size == 0){
return;
}else if(size < FMC_PAGE_SIZE-prog_addr%FMC_PAGE_SIZE){
pages = 1;
}else{
pages = 1+(size-prog_addr%FMC_PAGE_SIZE+FMC_PAGE_SIZE-1)/FMC_PAGE_SIZE;
}
/* unlock the flash program/erase controller */
fmc_unlock();
/* clear all pending flags */
fmc_flag_clear(FMC_FLAG_BANK0_END);
fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
for(i=0;i<pages;i++){
pg_idx = prog_addr%FMC_PAGE_SIZE;
prog_addr = prog_addr/FMC_PAGE_SIZE*FMC_PAGE_SIZE;
pdata = (uint32_t*)prog_addr;
wr_size = FMC_PAGE_SIZE-pg_idx<size?FMC_PAGE_SIZE-pg_idx:size;
size -= wr_size;
for(j=0;j<FMC_PAGE_SIZE/4;j++){
pobj[j]=*pdata;
pdata++;
}
for(j=pg_idx;j<wr_size+pg_idx;j++){
fmc_tmp_page[j]=*(data_addr);
data_addr++;
}
fmc_page_erase(prog_addr);
/* clear all pending flags */
fmc_flag_clear(FMC_FLAG_BANK0_END);
fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
/* program flash */
for(j=0;j<FMC_PAGE_SIZE/4;j++){
fmc_word_program(prog_addr+j*4, pobj[j]);
fmc_flag_clear(FMC_FLAG_BANK0_END);
fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
}
prog_addr += FMC_PAGE_SIZE;
}
/* lock the main FMC after the erase operation */
fmc_lock();
}
原文地址:https://blog.csdn.net/yuxipro/article/details/140696309
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!