本帖最后由 圈圈7029 于 2015-1-6 12:50 编辑
下面内容主要讲PM+开发环境下 78K0/Kx upd78F0537自编程问题,对此内容不感兴趣的慎入,感谢上海格州电子FAE老吴提供的材料,现在整理如下:(在帖子底部有配合此文章的PM+工程文件)
一、固件升级函数介绍
fwr_u8 FlashWRStart(void); 功能:初始化自编程模块,使MCU 进入自编程模式。调用此函数前,必须先配 置好控制 FLMD0 的 IO 口工作模式。 入口参数:无 返回值:初始化成功返回TRUE,否则返回 FALSE。 void FlashWREnd(void); 功能:使 MCU 退出自编程状态。 入口参数:无 返回值:无 fwr_u8 EraseBootArea(void); 功能:擦除 boot1 区域(block4 ~ block7) 入口参数:无 返回值:如果擦除成功返回TRUE,失败返回 FALSE。 fwr_u8 EraseUserArea(void); 功能:擦除用户代码区域(用户代码区域由 flashwr.h 的配置设定) 入口参数:无 返回值:如果擦除成功返回TRUE,失败返回 FALSE。 fwr_u8 EraseFlashBlocks(fwr_u8 banknumber, fwr_u8 firstBlock,fwr_u8 lastBlock) 功能:擦除指定 bank 区域的指定 block。 入口参数:banknumberbank 号。 firstBlock 起始 block 号。 lastBlock 结束 block 号。 返回值:如果擦除成功返回TRUE,失败返回 FALSE。 fwr_u8 WriteDataToFlash(fwr_u8 banknumber, fwr_u16writeAddress,fwr_u8 *dat, fwr_u8 Count); 功能:写数据到指定的 FLASH 区域。 入口参数:banknumber bank 号。 writeAddress FLASH 地址。 *dat 数据直指。 Count 数据大小 。 返回值:如果写入成功返回TRUE,失败返回 FALSE。 备注:dat 数据直指必须是 4 的倍数,写入的数据大小也应该是 4 的倍数。 fwr_u8 BootSwap(void); 功能:交换启动区域代 码,此函数首先调用 EraseBootArea()函数擦除 boot 区域, 然后再把 CPU 地址 0 ~ 0xfff 的数据写到 0x1000 ~0x1fff 的空间。 入口参数:无 返回值:操作成功返回 TRUE,否则返回 FALSE。 fwr_u8 GetSwapFlag(void); 功能:读取 BOOT 交换标志。 入口参数:无 返回值:BOOT 交换标志置位返回 1 BOOT 交换标志未置位返回 2 读取 BOOT 交换标志失败返回 3 fwr_u8 ToggleBootSwapFlag(void); 功能:BOOT 交换函数。如果当前 BOOT 不交换,调用此函数后,BOOT 交换;如 果 BOOT 已经交换,调用此函数后, BOOT 不交换。 入口参数:无 返回值:操作成功返回 TRUE,否则返回 FALSE。 fwr_u16 GetFlashSum(fwr_u32 area, fwr_u32 eaddr); 功能:获取指定 Flash 区域的累加和。 入口参数:area 区域地址,必须是 BOOT_AREA 或者 FLASH_AREA eaddr 结束地址 返回值:返回指定 Flash 区域的累加和。 注:如果目标芯片有 bank 区域,此函数将耗费很长时间,在 UPD78F0537 中测 试,使用内部 8M 时钟,调用此函数花费大约 50s 时间。此函数酌情使用。
二、目标芯片配置
目标芯片信息在 flashwr.h 中配置,flashwr.h 中注释 USER CONFIG AREA 和 END USER CONFIG AREA 之间的内容是用户需要根据目标芯片实际情况修改的地 方,其他地方请不要修改。 FIRST_FLASH_BLOCK_C 用户代码区域起始 block,在 K0 系列咧,必须为 8 LAST_FLASH_BLOCK_C 用户代码区域结束 block BANK_COUNT 扩展 bank 数,如果没有扩展 bank,此值定义为 0 FIRST_BANK_BLOCK_B bank 区域起始 block FLMD0_CONTROL_PIN 控制 FLMD0 的 IO 口定义
三、升级 BOOT 说明 1. BOOT 交换功能 K0 系列单片机 BOOT 分成两个区域,一个区域为 0 ~ 0xfff(简称 BOOT0),另一个区域为 0x1000 ~ 0x1fff(简称 BOOT1),可以调用 ToggleBootSwapFlag()函数交换启动区域;当启动区域交换以后,启动区域变成 BOOT1;则 BOOT1 的地址被映射到 CPU 的地址 0,BOOT0 的地址被映射到 CPU 的地址 0x1000。
2. 更新 BOOT 更新 BOOT 时,先把新 BOOT 的代码写入 BOOT1,写入成功后,设置 BOOT区域交换,然后让看门狗复位。复位后,此时 BOOT 区域交换,BOOT1 的地址被映射到 CPU 的地址 0,CPU 始终是从 0 地址开始运行,由于 BOOT1 的地址被映射到了 CPU 的地址 0,所以 CPU 实际运行的是 BOOT1 的程序。程序启动时先判断 BOOT 交换标志是否置位 ,如果 BOOT 交换标志置位,则把 CPU 地址 0 ~ 0xfff的数据写到 CPU 地址 0x1000 ~ 0x1fff,然后解除 BOOT 交换,再让看门狗复位,完成 BOOT 的升级,升级流程如下图:
四、创建工作空间及 boot 工程 1. 创建工作空间 打开 PM+,File->New Workspace 出现如下图: 上图中新 建一个工 作空间, 并创建一个 工程,把 第一个创 建的工程命 名为 boot,表示创建一个 boot 工程;把上面选项填好后单击下一步。之后的选项可 以根据自己的实际情况设置,源文件可以创建工程后添加,创建工程完成后,出 现如下图:
2. 添加源文件 在源文件目录 Source File 点击右键,选择 Add Source Files 如下图: 注:添加源文件时,把选项文件也添加进来。 在源文件目录 Project Related File 点击右键,选择 Add Project Related File 添 加 dr 文件,如下图:
在出现的选择框中做如下设置才能选择 dr 文件,如下图: 注:如果需要添加库文件,则在添加 dr 文件选项里添加。
3. boot 工程设置 打开 Tool->Compiler Option.. Startup Routine 选项卡做如下设置: 为了支持双斜杠注释,在 Compiler Option 的 Extend 选项卡下做如下设置: 注:如果源文件和工程不在一个目录,还需设置 include 路径,如下图 打开 Tool->Compiler Option.. Preprocessor 选项卡做如下设置:
打开 Tool->Linker Options.. Output1 选项卡做如下设置: 打开 Tool->Linker Options.. Output2 选项卡做如下设置:
打开 Tool->Linker Options.. Others 选项卡做如下设置: 添加好文件、设置好的 boot 工程如下:
4. 创建用户工程 在工程组名处点击右键选择添加新工程,如下图: 出现的创建工程对话框做如下图配置:
设置好以后,点击下一步,之后的设置与创建 boot 工程一致。创建好工程 以后,按照 boot 添加文件的方法添加源文件。 注:用户程序不需要选项文件。
五、用户工程设置 设置之前,请选择 flash 工程做为当前激活的工程,当前激活的工程,工程 名前面的图标为紫色,非激活的工程为灰色; 在工程名点击右键,选择 Set as Active Project,即可激活工程,如下图: 打开 Tool->Compiler Option.. Memory Model 选项卡做如下设置: 做以上设置以后,Startup Routine 选项卡下的内容自动选为 Flash,如 下图: 打开 Tool->Linker Options.. Output1 选项卡做如下设置: 打开 Tool->Linker Options.. Output2 选项卡做如下设置: 打开 Tool->Linker Options.. Others 选项卡做如下设置: 如果要编译出分离的用户程序和 boot 程序代码,做如下设置 打开 Tool->Object Converter Options Output1 做如下设置: 如果源文件和工程文件不再一个目录,还需设置 include 路径,参考 boot 的 设置;如果代码中有双斜杠注释,还需设置允许双斜杠注释,参考 boot 的设置。 创建好的 boot 工程和用户工程界面如下: 注:在测试工程中,有一个自编程库文件 libf.lib 和一个 SELFLIBR.ASM 源文件,两 个功能一样,使用时使用其中之一即可。
带 bank 的 MCU 自升级注意事项: 1. 擦除 bank 区域时,每个 bank 的 block 号都是 32 至 47,与数据手册的 block 号有所区别。 2. 进入自编程后,bank 区域只能写,不能读。如果要打印 bank 区域的值,首先推出 自编程模式,然后才能正确读取 bank 区域的值。 配合的工程文件整理如下:
|