LPC2148像往U盘拷贝文件一样更新用户程序

2019-10-12来源: eefocus关键字:LPC2148  U盘  拷贝文件  更新用户程序

在网上爬行了很久才找到一个介绍USBMEM_BOOTLOADER的且有源代码的论坛,用KEIL 编译后结果不能运行,后来才找到问题的根源:
//usbhw.c
void USB_Init (void) {
  PINSEL1 &= ~0xC000C000;
//PINSEL1 |=  0x40004000;  //这是原来的程序
  PINSEL1 |=  0x80004000;     /* Select USB Link, VBUS */

原来得改一下才能用到我的板子上面。

另外,原来的程序是在复位时检测P0.15是否为低来判断是进入用户程序,还是USB IAP程序,我针对我的板子改了一下,我用了两个按钮来控制它,当按下P0.21的按钮时运行用户程序,当按下P0.22的按钮时则运行USB IAP程序:

首先要在sbl_config.h中做一下修改:

#define USER_START_SECTOR 2   //用户程序起始扇区
#define MAX_USER_SECTOR 26    //最大扇区    LPC2146是 14,LPC2148是26

#define ISP_ENTRY_GPIO_REG 0xE0028000                  /* Port */
#define ISP_ENTRY_PIN21            21          /* User Code Pin  */ //这里原来是 15
#define ISP_ENTRY_PIN22            22          /* USB IAP Pin  */  //这个是增加的

然后把sbl_iap.c里面的相关内容修改一下:

void check_isp_entry_pin(void)
{
while(1)
  {
    if(!( (*(volatile unsigned *)ISP_ENTRY_GPIO_REG) & (0x1<        {
            execute_user_code(); break;
        }
        if(!( (*(volatile unsigned *)ISP_ENTRY_GPIO_REG) & (0x1<        {
         break;   // Enter ISP mode
        }
  }
}

现在就可以来实验一下了:
ourdev_433852.JPG 
usbmem程序的设置 


boot程序按照这个设置编译程序,要输出HEX文件,然后试用ISP工具将其下载到LPC2148中。


现在按一下复位按钮,按K1(P0.21)没有反应,因为现在还没有用户程序;按一下K2(P0.22),指示灯亮了,此时电脑会显示发现了新硬件:
ourdev_433853.JPG 
电脑中出现了一个可移动磁盘 
打开这个磁盘,会发现里面有一个文件是492K,
ourdev_433854.JPG 
得把这个文件删除掉才能拷贝入你自己的程序 
然后再编译用户程序,要把起始位置修改为0x2000;同时要输出BIN文件:(在user  run  写入fromelf --bin .FlashBlinky.axf -o .FlashBlinky.bin)把得到的BIN文件拷贝入空白的磁盘:
ourdev_433855.JPG 
拷入用户程序 
按一下复位键,再按一下K1,就开始运行流水灯程序了。

单片机源程序如下:

  1. /*----------------------------------------------------------------------------

  2. *      U S B  -  K e r n e l

  3. *----------------------------------------------------------------------------

  4. *      Name:    USBUSER.C

  5. *      Purpose: USB Custom User Module

  6. *      Version: V1.10

  7. *----------------------------------------------------------------------------

  8. *      This software is supplied "AS IS" without any warranties, express,

  9. *      implied or statutory, including but not limited to the implied

  10. *      warranties of fitness for purpose, satisfactory quality and

  11. *      noninfringement. Keil extends you a royalty-free right to reproduce

  12. *      and distribute executable files created using this software for use

  13. *      on Philips LPC2xxx microcontroller devices only. Nothing else gives

  14. *      you the right to use this software.

  15. *

  16. *      Copyright (c) 2005-2006 Keil Software.

  17. *---------------------------------------------------------------------------*/


  18. #include                         /* LPC214x definitions */


  19. #include "type.h"


  20. #include "usb.h"

  21. #include "usbcfg.h"

  22. #include "usbhw.h"

  23. #include "usbcore.h"

  24. #include "usbuser.h"

  25. #include "mscuser.h"


  26. #include "memory.h"



  27. /*

  28. *  USB Power Event Callback

  29. *   Called automatically on USB Power Event

  30. *    Parameter:       power: On(TRUE)/Off(FALSE)

  31. */


  32. #if USB_POWER_EVENT

  33. void USB_Power_Event (BOOL  power) {

  34. }

  35. #endif



  36. /*

  37. *  USB Reset Event Callback

  38. *   Called automatically on USB Reset Event

  39. */


  40. #if USB_RESET_EVENT

  41. void USB_Reset_Event (void) {

  42.   USB_ResetCore();

  43.   IOCLR1 = LED_CFG;                         /* Turn Off Cfg LED */

  44. }

  45. #endif



  46. /*

  47. *  USB Suspend Event Callback

  48. *   Called automatically on USB Suspend Event

  49. */


  50. #if USB_SUSPEND_EVENT

  51. void USB_Suspend_Event (void) {

  52.   IOSET1 = LED_SUSP;                        /* Turn On Suspend LED */

  53. }

  54. #endif



  55. /*

  56. *  USB Resume Event Callback

  57. *   Called automatically on USB Resume Event

  58. */


  59. #if USB_RESUME_EVENT

  60. void USB_Resume_Event (void) {

  61.   IOCLR1 = LED_SUSP;                        /* Turn Off Suspend LED */

  62. }

  63. #endif



  64. /*

  65. *  USB Remote Wakeup Event Callback

  66. *   Called automatically on USB Remote Wakeup Event

  67. */


  68. #if USB_WAKEUP_EVENT

  69. void USB_WakeUp_Event (void) {

  70. }

  71. #endif



  72. /*

  73. *  USB Start of Frame Event Callback

  74. *   Called automatically on USB Start of Frame Event

  75. */


  76. #if USB_SOF_EVENT

  77. void USB_SOF_Event (void) {

  78. }

  79. #endif



  80. /*

  81. *  USB Error Event Callback

  82. *   Called automatically on USB Error Event

  83. *    Parameter:       error: Error Code

  84. */


  85. #if USB_ERROR_EVENT

  86. void USB_Error_Event (DWORD error) {

  87. }

  88. #endif



  89. /*

  90. *  USB Set Configuration Event Callback

  91. *   Called automatically on USB Set Configuration Request

  92. */


  93. #if USB_CONFIGURE_EVENT

  94. void USB_Configure_Event (void) {


  95.   if (USB_Configuration) {                  /* Check if USB is configured */

  96.     IOSET1 = LED_CFG;                       /* Turn On Cfg LED */

  97.   } else {

  98.     IOCLR1 = LED_CFG;                       /* Turn Off Cfg LED */

  99.   }

  100. }

  101. #endif



  102. /*

  103. *  USB Set Interface Event Callback

  104. *   Called automatically on USB Set Interface Request

  105. */


  106. #if USB_INTERFACE_EVENT

  107. void USB_Interface_Event (void) {

  108. }

  109. #endif



  110. /*

  111. *  USB Set/Clear Feature Event Callback

  112. *   Called automatically on USB Set/Clear Feature Request

  113. */


  114. #if USB_FEATURE_EVENT

  115. void USB_Feature_Event (void) {

  116. }

  117. #endif



  118. #define P_EP(n) ((USB_EP_EVENT & (1 << (n))) ? USB_EndPoint##n : NULL)


  119. /* USB Endpoint Events Callback Pointers */

  120. void (* const USB_P_EP[16]) (DWORD event) = {

  121.   P_EP(0),

  122.   P_EP(1),

  123.   P_EP(2),

  124.   P_EP(3),

  125.   P_EP(4),

  126.   P_EP(5),

  127.   P_EP(6),

  128.   P_EP(7),

  129.   P_EP(8),

  130.   P_EP(9),

  131.   P_EP(10),

  132.   P_EP(11),

  133.   P_EP(12),

  134.   P_EP(13),

  135.   P_EP(14),

  136.   P_EP(15),

  137. };



  138. /*

  139. *  USB Endpoint 1 Event Callback

  140. *   Called automatically on USB Endpoint 1 Event

  141. *    Parameter:       event

  142. */


  143. void USB_EndPoint1 (DWORD event) {

  144. }



  145. /*

  146. *  USB Endpoint 2 Event Callback

  147. *   Called automatically on USB Endpoint 2 Event

  148. *    Parameter:       event

  149. */


  150. void USB_EndPoint2 (DWORD event) {


  151.   switch (event) {

  152.     case USB_EVT_OUT:

  153.       MSC_BulkOut();

  154.       break;

  155.     case USB_EVT_IN:

  156.       MSC_BulkIn();

  157.       break;

  158.   }

  159. }



  160. /*

  161. *  USB Endpoint 3 Event Callback

  162. *   Called automatically on USB Endpoint 3 Event

  163. *    Parameter:       event

  164. */


  165. void USB_EndPoint3 (DWORD event) {

  166. }



  167. /*

  168. *  USB Endpoint 4 Event Callback

  169. *   Called automatically on USB Endpoint 4 Event

  170. *    Parameter:       event

  171. */


  172. void USB_EndPoint4 (DWORD event) {

  173. }



  174. /*

  175. *  USB Endpoint 5 Event Callback

  176. *   Called automatically on USB Endpoint 5 Event

  177. *    Parameter:       event

  178. */


  179. void USB_EndPoint5 (DWORD event) {

  180. }



  181. /*

  182. *  USB Endpoint 6 Event Callback

  183. *   Called automatically on USB Endpoint 6 Event

  184. *    Parameter:       event

  185. */


  186. void USB_EndPoint6 (DWORD event) {

  187. }



  188. /*

  189. *  USB Endpoint 7 Event Callback

  190. *   Called automatically on USB Endpoint 7 Event

  191. *    Parameter:       event

  192. */


  193. void USB_EndPoint7 (DWORD event) {

  194. }



  195. /*

  196. *  USB Endpoint 8 Event Callback

  197. *   Called automatically on USB Endpoint 8 Event

  198. *    Parameter:       event

  199. */


  200. void USB_EndPoint8 (DWORD event) {

  201. }



  202. /*

  203. *  USB Endpoint 9 Event Callback

  204. *   Called automatically on USB Endpoint 9 Event

  205. * Parameter: event

[1] [2]
关键字:LPC2148  U盘  拷贝文件  更新用户程序 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic476947.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:LPC2000系列Proteus仿真+代码 菜鸟的ARM学习笔记
下一篇:LPC2000系列ARM芯片的电子琴的设计

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

调试LPC2300单片机时出现"error: L6236E
问题1描述:在将SmartARM2300单片机开发板的程序源码搬到keil,建立工程后,编译第一次遇到问题是“error:  #147-D: declaration is incompatible with "void CANIntPrg(void)__irq" (declared at line 185 of "canLPC2300CAN.h")”经查找解决方法时参考:armcc的编译器的C对ANSI C的关键字做了些扩展。比如__irq 是用来声明IRQ和FIQ中断处理函数用的,可以自动返回原来的现场。__asm用来嵌入汇编代码等。  __irq为一个标识,用来表示
发表于 2019-07-26
调试LPC2300单片机时出现
LPC54100 LPC54101 LPC54102 LPC541xx系列串口用法
LPC54100 LPC54101 LPC54102 LPC541xx系列串口用法(使用库,中断模式,无FIFO)//初始化函数void uart_init(baudRate){    UART_BAUD_T baud;    UART_CFG_T cfg;    //使能时钟    Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_FRG);    //配置波特率    //获取时钟频率    baud.c
发表于 2019-07-08
不浪费原有LPC设备上投资 Microchip商用eSPI至LPC桥接器问市
该器件可帮助工业计算开发人员在现有设备中集成eSPI标准,在实现最低开发成本的同时延长产品使用周期 随着工业计算行业从低引脚数(LPC)接口技术向增强型串行外设接口(eSPI)总线技术转型,在应用新标准时,现有设备的更新将会产生大量开发成本。为帮助开发人员在应用eSPI标准的同时保留原有巨资打造的LPC设备,Microchip Technology Inc.(美国微芯科技公司)宣布推出业界首款商用eSPI至LPC桥接器——ECE1200,可帮助开发人员利用原有LPC接头和外围设备在内部应用eSPI标准,将开发费用和风险降至最低。 因为工业计算设备需要大量的前期投入,因此产品的使用周期至关重要。EC
发表于 2019-05-29
不浪费原有LPC设备上投资 Microchip商用eSPI至LPC桥接器问市
arm力天电子 lpc2148流水灯驱动程序详解
一个破流水灯程序看了两天了,void WriteByte(unsigned char data)这部分还是没看懂,力天电子上面介绍说这部分三端口的数据输入,选出8位的串行数据。选择16,17,18,19四个控制位,主要跟电路图的连接有关,4块74HC595,组成32位(如图所示),从下往上依次是0~31为,图中写反了。因此到D13对应的引脚应该是16,D12对应的是17,D11对应的是18,D10对应的是19. 当16,17,18,19分别为低电平时二极管才能够导通发光。高电平时熄灭1#include <NXP/iolpc2148.h>2#define         
发表于 2019-05-20
arm力天电子 lpc2148流水灯驱动程序详解
lpc2148基于DS18B20的温度控制系统程序代码之dat=(j1)详解
;    //input8   //Delayn(1);9  if(DS_R()!=0)10     dat=1;11   else 12      dat=0;13   DelaynUs(50);    14   return (dat);15}//读一个字节数据 (读字节程序)16unsigned char tmpread(void)   //read a byte date17{18 
发表于 2019-05-20
arm力天电子 lpc2148 基于DS18b20的温度采集实验程序详解
1#include <NXP/iolpc2148.h>2#include <stdio.h>3#include "uart.h"//系统时钟4#define Fosc        12000000UL        //晶振时钟 【Hz】5#define Fcclk       (Fosc * 5)        //系统频率,必须为Fosc的整数倍(1~32),且<=60MHZ6#define Fcco 
发表于 2019-05-20
arm力天电子 lpc2148 基于DS18b20的温度采集实验程序详解
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved