查看完整版本: uuprog开发教程:Bootloader应用讲解1

liyf 发表于 2014-11-15 14:26:23

uuprog开发教程:Bootloader应用讲解1

      Bootloader也可以说引导程序,就像window的boot程序一样的,主要负责引导跳转,实现多功能切换,这里我们也是用这个原理实现多功能跳转,因为我们既要实现更新,又要实现正常的应用跳转。要实现这两个功能,其实很简单,引导跳转和更新固件功能可以做在一起,通过免驱的hid实现,正常的话(这里我们要检测是否有按键按下,因为资源有限,我们设置P0.1短接,这里大家不要搞混了,这里的P0.1只在bootloader里用,不会和其他冲突的)直接跳转到应用固件部分,也就是真正的编程器固件部分。
   这里我们采用现成的bootloader程序修改,可以避免这块的调试测试的时间。具体你要理解怎么个运行原理,需要自己深究了,这里不做详解。

这个是主程序,其实很简单的,就是个检测按键是否按下,然后跳转相应的地址函数。
sbit UPDATAKEY = P0^1;

定义p0.1作为升级按键,这里我们没有用按键,采用短接插针的方式,为了方便正好又放到了isp座那里,这也算是取巧的设计了。
void main(void)
{
        unsigned int code *pTAdd;

        PCA0MD &= ~0x40;                  // Disable Watchdog timer
        pTAdd = ApplicationAddress;
        if(*pTAdd != 0xFFFF)//检测用户空间是否有程序
        {
                if(UpdataKeyDown() == 0)//检测是否满足进入条件
                {
                        U_Delay();
                        Jump_To_Application = (pFunction) ApplicationAddress;                                                        //进入用户程序
                        Jump_To_Application();
                }
        }


        EnterBoot();
}
判断是否要跳到用户区,这里采用定义外部函数指针的方式
extern pFunction Jump_To_Application;
这里我们定义的用户区地址在哪呢,这个也是大家最关心的。我们为了预算以后的bootloader可能要实现其他功能,所以规划了10k的空间,这么算来我们的应用要在10k以后,那就是10240之后,十六进制就是0x2800h。
#ifndef ApplicationAddress
#define ApplicationAddress 0x2800
typedefvoid (*pFunction)(void);
为了和其他的hid设备区分,我们还得自定义个vip和pid
code u_device_descriptor U_DeviceDesc =
{
   18,                  // bLength
   0x01,                // bDescriptorType
   0x1001,            // bcdUSB
   0x00,                // bDeviceClass
   0x00,                // bDeviceSubClass
   0x00,                // bDeviceProtocol
   U_EP0_PACKET_SIZE,   // bMaxPacketSize0
   0xc410,            // idVendor
   0x984e,            // idProduct
   0x0100,            // bcdDevice
   0x01,                // iManufacturer
   0x02,                // iProduct
   0x00,                // iSerialNumber
   0x01               // bNumConfigurations
}; //end of DeviceDesc
然后再自定义一些版权信息,方便区分


准备好这些,你就可以编译,烧写进你的340了

shangdawei 发表于 2014-11-15 14:47:08

为了能够升级,Bootloader 是必不可少的, 这个教程很好

bywqdq 发表于 2015-1-11 21:25:07

c8051 的 usb Bootloader 也不好找. c8051 的usb还是提供lib.c8051什么事都的自己干. 用过st的库后,想象c8051真麻烦.

wlecust06 发表于 2021-1-24 13:39:22

这个Bootloader用的sililab库么?

wlecust06 发表于 2021-1-24 13:43:21

还不错 可以,和stm32类似

365969365 发表于 2024-6-1 22:23:55


谢谢楼主感谢无私分享

yiqiuccc 发表于 2024-8-17 14:28:57

挣点银子用

2024幸福有你 发表于 2024-10-27 23:34:27

感谢分享!
页: [1]
查看完整版本: uuprog开发教程:Bootloader应用讲解1