1、创建下载算法的软件工程
keil官方给了下载算法制作的模板,在keil的packs路径下,按照下图路径找到名为NewDevice.uvprojx 的工程,复制一份到自定义目录,打开工程。
2、选择芯片型号,我这里用的是杰发AC78013的单片机,内核使用的M0+,因此选择M0+即可。
2、打开FlashDev.c文件,文件内只有个结构体,依次填入相应参数
FLASH_DRV_VERS, // 版本号
"AC7801x_128K_MJ", // 名称
ONCHIP, // 这里下载到内部Flash上,因此选片上下载
0x08000000, //Flash的起始地址
0x00020000, // Flash的总大小 (128kB)
2048, // 页大小
0, // Reserved, must be 0
0xFF, // 默认填充0xff
100, // 页编程超时时间,100 ms
3000, // 扇区擦除超时时间 3000 ms
// Specify Size and Address of Sectors
0x000800, 0x000000, // 扇区大小一起扇区相对起始地址 2kB (64 Sectors)
3、打开FlashPrg.c文件,看到以下注释,前四个是必选的,后面几个可选,根据需要来实现。
4、导入写Flash使用的库函数和依赖文件
5、分别实现相关函数,更多函数使用参考下面链接:Algorithm Functions
int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {
EFLASH_StatusType statusRes = EFLASH_UnlockCtrl();
if(statusRes == EFLASH_STATUS_SUCCESS){
return 0;
}else {
return 1;
}
}
int UnInit (unsigned long fnc) {
EFLASH_LockCtrl();
return (0); // Finished without Errors
}
int EraseChip (void) {
EFLASH_StatusType statusRes;
statusRes = EFLASH_MassErase();
if(statusRes != EFLASH_STATUS_SUCCESS)
{
return 1;
}
statusRes = EFLASH_MassEraseVerify();
if(statusRes != EFLASH_STATUS_SUCCESS)
{
return 1;
}
return (0); // Finished without Errors
}
int EraseSector (unsigned long adr) {
EFLASH_StatusType statusRes;
statusRes = EFLASH_PageErase(adr);
if(statusRes != EFLASH_STATUS_SUCCESS)
{
return 1;
}
statusRes = EFLASH_PageEraseVerify(adr);
if(statusRes != EFLASH_STATUS_SUCCESS)
{
return 1;
}
return (0); // Finished without Errors
}
int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {
EFLASH_StatusType statusRes;
sz = (sz+3)&~3;
if(adr&0x03){
return 1;
}
if(sz>2048){
return 1;
}
statusRes = EFLASH_PageProgram(adr,(uint32_t*)buf,(sz/4));
if(statusRes != EFLASH_STATUS_SUCCESS)
{
return 1;
}
return (0); // Finished without Errors
}
unsigned long Verify(unsigned long adr, unsigned long sz, unsigned char *buf)
{
unsigned long i,verify_size=0;
unsigned long *pFlash = (unsigned long *)adr;
unsigned long *pBuff = (unsigned long *)buf;
sz = (sz+3)&~3;
for(i=0;i<(sz/4);i++)
{
if(*pFlash != *pBuff){
return adr;
}
pFlash++;
pBuff++;
verify_size+=4;
}
return adr+verify_size;
}
6、编译工程后可见已生成FLM文件。
参考链接: