本帖最后由 gbbfbaa 于 2016-6-21 21:59 编辑
ChipON单片机的bootloader设计
导读
Bootloader是单片机上电启动执行的一段小程序。也称作固件,通过这段程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬环境带到一个合适的状态,以便最终调用用户应用程序准备好正确的环境。本文基于ChipON芯片flash自写功能,方便用户应用程序的升级和更新设计bootloader。
ChipON KF8F4156芯片环境分析
◆哈弗结构RISC CPU
◆复位向量地址0x0000
◆高优先级中断0x0004,低优先级中断0x0014
◆1K的Ram、8K Flash空间,地址0x0800-0x1FDF地址支持Flash自写
◆支持UART/I2C/SPI多种通信
◆编程工具ChipON自主的IDE和PRO,支持汇编和C方式
图1
从资料来说明几个重要的地方,首先我分析下Flash,从Flash的结构来看,用户的程序只能被存放在0800H—1FDFH这个范围,否则无法进行Bootloader的更新,并且必须将0004H和0014H中断向量映射到用户程序区。并且Bootloader也必须存放在0000H—07FFH地址。并且程序需要将该区域地址全部填满,如果程序没有那么大,必须使用NOP指令将其全部填满,这样C编译器才不会将用户的程序分配到该区域中来。
如果用户熟悉了ChipON的IDE环境,可以体会到这个ChipON自主的工具还是有很多可圈可点的地方。但是C编译器是不能指定地址进行Flash分配的。所以为了将BootLoader能够存到0000H—07FFFH范围,我们需要使用汇编编译器进行设计Bootloader,将项目生成的xxxx.o文件放到C项目中进行链接的方式编译。
程序设计
在程序设计前,我们先整理下思路,观察下C编译的工作。
我们先建立一个最简单的KF8F4156 C项目
图2
图3
图4
在配置位需要注意的地方,Flash自写保护需要关闭,否则Flash无法进行自写操作。
项目建立后,系统自动生成了三个函数,分别是main函数和fun0和fun1两个中断入口函数。构建编译完成后这个最简单的项目,我们打开项目的Test.lst文件查看如图5
图5
图6
系统自动生成了两个函数,对着地址去查看函数内容,发现该两个函数都是芯片自身信息和编译使用。所以我们在写汇编时候需要注意到这个两个函数的操作。
在熟悉了C编译器的工作模式后,我们可以开始讨论我们的BootLoader设计思路了。首先我们需要建立一个汇编项目来设计我们的BootLoader主程序。
图7
汇编的前面地址存放,必须按照图7中的格式。然后我们进行程序逻辑分析。
1、 声明几个外部函数,_MAIN_FUN、_int_fun0、_int_fun1、这三个函数分别为用户主函数和用户中断入口运行函数,_startup、_sdcc_gsinit_startup这两个函数为C编译器自动生成的函数,初始化芯片的环境和信息。在汇编里我们在初始化时当做外部函数引用调用。
2、 编写一个串口字符串流通信发送函数
3、 编写一个串口字符串流接收函数
4、 编写一个Flash自写函数
5、 编写一个Flash读取函数
6、 规定串口通信的数据帧的格式和内容
7、 如果只是在BootLoader中使用的变量在RAM区中定义尽量使用EUQ指令,这样C编译会释放掉该地址继续使用,否则RAM区会使用浪费
8、 BootLoader和用户程序共同使用的Ram使用伪指令res进行分配。
流程图
图8
程序设计
程序我们介绍下几个较为关键的地方,首先是汇编程序外部函数声明
图9
我们需要在汇编代码中声明的几个外部函数如上图9.此外我们还需要对照C项目程序中中断的出入栈进行汇编设计,和变量的定义。
图10
从图10中看出,0000H-0014H全部被汇编代码填满,并且进行了中断保护,这个参考C项目lst文件中的操作。
图11
中断的出栈道也是参考C项目中lst文件程序,所有使用的变量名字都一模一样。我们就需要将这些变量分配好地址,这是用户需要使用到得变量,所以我们使用RES进行地址分配,如下图12.
图12
当程序设计OK后,我们将汇编项目生成的xxxx.o文件使用库的方式提供给C项目。进行链接编译。当然我们在C项目中需要定义汇编中使用的三个外部函数如图13。
图13
到此我们就可以按照自己的习惯写我们的用户函数了。至于怎么进入bootLoader,每一个设计者都可以拥有自己的设计方式。只要让程序复位开始运行即可。
结束语
8位单片机很多没有自己固定的bootloader,为了方便程序的更新和其他一些需求,需要电子工程根据芯片的特性设计程序更新的机制,本文根据ChipON功夫系列芯片KF8F4156自带的芯片FLASH自写功能提出的一种应用,希望可以读者提供一种思路。 |