[KF8F] 基于KF8F4156 BootLoder的使用说明

[复制链接]
166|9
 楼主 | 2019-1-30 16:22 | 显示全部楼层 |阅读模式
        本文介绍了基于ChipON单片机KF8F4156 BootLoder的使用。BootLoder 是单片机上电启动首先运行的一段程序。通过这段程序可以对芯片进行相应的初始化,使芯片在运行用户程序前达到一个合适的状态。本文介绍的 BootLoder 主要实现从串口接收用户程序,在 BootLoder 运行的同时实现对用户程序在flash 区的自写,自写完成后自动跳转执行用户程序,目的是为用户提供远程更新程序的功能。

 楼主 | 2019-1-30 16:22 | 显示全部楼层
1、ChipON单片机KF8F4156 芯片介绍
◎复位向量地址 0x0000。
◎共有两个中断向量,高优先级入口地址为 0x0004,低优先级入口地址为0x0014。
◎8K的flash 空间,其中 0x800 – 0x1FDF 区间支持自写功能。
 楼主 | 2019-1-30 16:23 | 显示全部楼层
2、BootLoder 设计说明
◎KF8F4156 flash 0x0800–0x1FDF(共6K)区间支持自写功能,0x0000-0x07FF区域不支持自写功能,所以,我们的 BootLoder 应该存放在 0x0000-0x07FF区间,而用户程序应该存放在 0x0800–0x1FDF区间。
◎芯片上电后运行BootLoder,BootLoder 从串口接收到数据并完成第一帧数据自写后,就在0x1FC0- 0x1FDF区间写上 0x99的标志,当6K的Flash自写区全部写完后会自动覆盖0x99标志,如果自写6K Flash的过程中因外部原因(如掉电、串口异常),从而未能全部更新6K Flash,0x99标志不会被擦除,当芯片重新运行后,BootLoder 如果检测到0x99标志的存在,会一直循环执行BootLoder,等待用户程序的更新。如果检测不到0x99 标志的存在,则会自动跳转到用户程序执行。
当芯片运行用户程序后,如果希望从用户程序跳转到BootLoder执行,只需要芯片复位◎重新运行即可,在提供的例程里是通过打开看门狗并且不执行喂狗操作,并且对Application_Into_BootLoder 变量置1,约18ms(常规默认)后芯片自动执行复位操作。此时BootLoder 除了判断是否有0x99标志,还要判断 Application_Into_BootLoder 标志是否为1(优先),如果为1,等待串口内容接收,如果约3秒钟内串口没有接收到数据,则跳转到用户程序执行,如果有接收到数据,则进行Flash自写操作。
◎混合编译BootLoder 已经占用了 main 程序入口,并且两个中断入口程序不在Flash 自写区,因此这三个函数在 BootLoder 中已做重新映射,即在用户程序里,主函数入口为MAIN_FUN (相当于main 函数的功能),两级中断的入口分别为 int_fun0和int_fun1。
◎BootLoder通过串口接收数据时,需上位机发送字符串 ”ChipON Bootloader?”并追加回车字符(0x0A)和字符串结尾 (0x00),共 20个字符。BootLoder 设备识别会发送字符串"ChipON Bootloader Start 0x800 0x1FDF",跟回车字符和字符串结尾字符。上位机解析编程代码段信息。随后上位机开始发送用户程序数据,每次发送32个字的数据外加一个字节的长度数据和一个字节长度的CRC,总共66个字节。数据长度为第一个字节,然后是64个字节的用户数据,最后一个字节是CRC,CRC采样基本累加方式。32个字的数据每次先发送高字节,再发送低字节。上位机每发送一次(66个字节)数据后,等待接收”ChipON Get OK! ” 接一个回车然后是字符串结束标志0x00(注意字符串有空格),如果收到不是该字符串则重发数据,上位机发送数据帧格式如表1。如果接收校验和失败,设备输出”data err!!”跟结束标志0x0A,0x00。如果发送超过可自写范围,设备输出“full now!” 跟结束标志0x0A,0x00。
表1
数据长度(0x20)        数据(32个字)        CRC(累加校验)
 楼主 | 2019-1-30 16:23 | 显示全部楼层
3、bootLoder使用操作步骤
步骤1:在提供的模板中编写完应用程序后,从用户程序跳转到Bootloader 前需对变量Application_Into_BootLoder 进行 置 1,提供的模板程序如图4所示,其中Application_Into_BootLoder 变量是和BootLoder进行交互的,用户不能更改其变量名。
MAIN_FUN、int_fun0、int_fun1是 BootLoder 重新映射的函数,用户不能更改其函数名,MAIN_FUN 相当于用户的main 函数功能,int_fun0 为高优先级中断入口,int_fun1为低优先级中断入口。另外需注意一点,由于硬件堆栈的原因,用户程序嵌套不要超过13层。
需要注意的需要将Application_Into_BootLoder进行volatile修饰,避免被优化置标志识别。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主 | 2019-1-30 16:24 | 显示全部楼层
步骤2:把 BootLoder 项目中Release 下的 bootloder.o (如图1)文件拷贝到当前项目工程的Release 目下(如图2)。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主 | 2019-1-30 16:25 | 显示全部楼层
步骤3
编写完用户程序,选中项目名称并点击右键,选择“属性”,在弹出的属性对话框里选择“C/C++ 构建”,在下拉选项中选择 “设置”,然后在右边选项框里选择 “C Project Linker Release”选项,在方框里填写连接文件名“bootloder.o”,然后点击“应用”,再点击“确定”即可,如图3所示。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主 | 2019-1-30 16:25 | 显示全部楼层
步骤4
选中项目名称并点击右键,选择“构建项目”,对程序进行编译,编译通过后即可下载运行应用程序。
步骤 5
当用户程序运行起来后,如果希望更新用户程序,则需要让芯片复位重新跑到BootLoder运行,在此可以使用打开看门狗的方式对单片机进行复位,程序如图5所示。当按键S3按下时即可回到BootLoder,BootLoder下 P12口输出高电平,相应LED点亮(如图6)说明程序已经成功跳转到了BootLoder运行。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主 | 2019-1-30 16:25 | 显示全部楼层
步骤 6
当程序跳转到BootLoder后,即可通过上位机向单片机串口发送更新的程序,如图7所示,当完成程序更新后,相应LED即进行闪烁(更新的程序中有LED闪烁功能),如图8所示,至此即完成了程序的更新。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2019-2-21 17:30 | 显示全部楼层
| 2019-3-29 16:29 | 显示全部楼层
现在的产品,在资源允许的情况下,一般都会加上BootLoader,升级时会方便很多
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

快速回复 返回顶部 返回列表