基于Keil M0+内核的内部FLASH下载算法制作

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文件。

参考链接:

Flash Programming

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值