嵌入式软件专题一:Flash驱动

现在的单片机一般都支持BootLoader功能,就是程序在线刷写功能。实际上,就是需要同过Flash驱动,将程序代码写入单片机相应的地址空间当中。

Flash驱动实际上并不复杂,最近我又刚移植NXP S32系统的BootLoader程序,针对Flash驱动这一块主要就是这几个函数:

初始化函数void flash_init();

擦除函数void flash_erase_sector(uint32_t addr) ;

写函数void flash_program_data(uint32_t addr, uint8_t *pdata, uint32_t byte_size) ;

读函数void RdFlash(uint32_t addr,unsigned char *buf,unsigned char num) ;

初始化函数在程序一开始的时候调用就可以了,就是用来实例化驱动对象的;擦除函数需要在写入数据之前调用,这是由Flash的存储特性决定的,要不然写数据就会 错;写函数需要注意一次写入字节的个数,比如在NXP S32系列中,Flash是采用8字节整体写入的,你写不满8个字节,驱动在执行的过程中就会 错,导致写不成功,因此需要对其在调用过程中打个补丁,

remainder = (DiagMFRcvBytesIndex-2)%FEATURE_FLS_PF_BLOCK_WRITE_UNIT_SIZE;

if (remainder == 0)

{

flash_program_data(DLAddr,DiagMFRcvBuf2,DiagMFRcvBytesIndex-2);

}

else

{

for (i=0;i<(FEATURE_FLS_PF_BLOCK_WRITE_UNIT_SIZE-remainder);i++)

{

DiagMFRcvBuf2[DiagMFRcvBytesIndex-2+i] = 0xff;

}

flash_program_data(DLAddr,DiagMFRcvBuf2,DiagMFRcvBytesIndex-2+(FEATURE_FLS_PF_BLOCK_WRITE_UNIT_SIZE-remainder));

}

计算一下余数,把不足的字节数补齐,凑满8的倍数,在写入就可以了;读函数其实并不需要专门的底层驱动函数,对于单片机来讲,基本上就是读自己的内存空间,这部分代码基本上是可以直接移植过来的,不需要做修改。

void RdFlash(uint32_t addr,unsigned char *buf,unsigned char num)

{

uint32_t *p;

p = (uint32_t *)addr;

while(num!=0)

{

*buf = *p;

buf++;

num–;

*buf = (*p)>>8;

buf++;

num–;

*buf = (*p)>>16;

buf++;

num–;

*buf = (*p)>>24;

buf++;

num–;

p++;

}

}

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年1月1日
下一篇 2021年1月1日

相关推荐