DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5358|回复: 4
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2014-11-15 14:26:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
        Bootloader也可以说引导程序,就像window的boot程序一样的,主要负责引导跳转,实现多功能切换,这里我们也是用这个原理实现多功能跳转,因为我们既要实现更新,又要实现正常的应用跳转。要实现这两个功能,其实很简单,引导跳转和更新固件功能可以做在一起,通过免驱的hid实现,正常的话(这里我们要检测是否有按键按下,因为资源有限,我们设置P0.1短接,这里大家不要搞混了,这里的P0.1只在bootloader里用,不会和其他冲突的)直接跳转到应用固件部分,也就是真正的编程器固件部分。
     这里我们采用现成的bootloader程序修改,可以避免这块的调试测试的时间。具体你要理解怎么个运行原理,需要自己深究了,这里不做详解。

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

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

  4.         PCA0MD &= ~0x40;                    // Disable Watchdog timer
  5.         pTAdd = ApplicationAddress;
  6.         if(*pTAdd != 0xFFFF)  //检测用户空间是否有程序
  7.         {
  8.                 if(UpdataKeyDown() == 0)  //检测是否满足进入条件
  9.                 {
  10.                         U_Delay();
  11.                         Jump_To_Application = (pFunction) ApplicationAddress;                                                        //进入用户程序
  12.                         Jump_To_Application();
  13.                 }
  14.         }


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


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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏1 分享分享 支持支持 反对反对
沙发
发表于 2014-11-15 14:47:08 | 只看该作者
为了能够升级,Bootloader 是必不可少的, 这个教程很好
板凳
发表于 2015-1-11 21:25:07 | 只看该作者
c8051 的 usb Bootloader 也不好找. c8051 的usb还是提供lib.c8051什么事都的自己干. 用过st的库后,想象c8051真麻烦.
地板
发表于 2021-1-24 13:39:22 | 只看该作者
这个Bootloader用的sililab库么?
5#
发表于 2021-1-24 13:43:21 | 只看该作者
还不错 可以,和stm32类似
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-4-19 16:21 , 耗时 0.098093 秒, 24 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

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