找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3236|回复: 3
收起左侧

LPC1768单片机串口IAP升级实例源码

[复制链接]
ID:90762 发表于 2018-10-8 15:35 | 显示全部楼层 |阅读模式
LPC1768 IAP升级方法 实例  
测试说明:
    本实验通过串口0对开发板进行IAP升级,本工程为引导程序,将开发板上的USB转串口连接到电脑
    插上3.2寸彩屏模块,下载程序到开发板,彩屏显示按键功能:
    INTO键:擦除应用程序
    方向键 ok:进行IAP升级,等待串口接收应用程序
    方向键 down:运行应用程序
    方向键 up:显示菜单
   
    当按下ok键等待串口接收应用程序时,电脑通过超级终端发送预先编译好的应用程序(BIN)格式
    以1K Xmodem模式进行发送给开发板,开发板接收完成后显示 Updata Complete,按方向键down
    开始执行应用程序

单片机源程序如下:
  1. /*******************************************************************************
  2.   * Company: Wang Electronic Technology Co., Ltd.
  3.   ******************************************************************************
  4.   * 文件名称:main.c
  5.   * 功能说明:IAP引导程序
  6.   * 版    本:V1.1
  7.         * 作    者:jeansonm
  8. ********************************************************************************
  9.   * 文件名称:
  10.   * 功能说明:
  11.   * 版    本:
  12.         * 更新作者:        
  13.   * 日    期:
  14.         * 更新原因:
  15. ********************************************************************************/
  16. #include "LPC17xx.h"
  17. #include "lcd_bsp.h"
  18. #include "xmodem1k.h"
  19. #include "iap.h"
  20. #include <stdio.h>

  21. #define        IMG_START_SECTOR        0x00010000        /* Sector 16 应用程序地址 */
  22. #define        IMG_END_SECTOR                0x00037FFF        /* Sector 20 */


  23. /*        Function Prototype */
  24. static uint32_t load_image(uint8_t *data, uint16_t length);

  25. /*        Character array workspace for GLCD print functions */
  26. #define MAX_STRING_SIZE                50
  27. static uint8_t string[3][MAX_STRING_SIZE];
  28. static uint32_t received_data = 0;

  29. /*        State-machine variable to control application functionality */
  30. enum state_machine {
  31.         READY = 0,
  32.         MENU,
  33.         ERASE_FLASH,
  34.         FLASH_IMG,
  35.         SHOW
  36. };
  37. enum state_machine         cmd;

  38. /*********************************************************************************************************
  39. ** Function name:       JMP_Boot
  40. ** Descriptions:        跳转到应用程序
  41. ** input parameters:    address 应用程序地址
  42. ** output parameters:   无
  43. ** Returned value:      无
  44. *********************************************************************************************************/
  45. __asm void JMP_Boot( uint32_t address ){
  46.    LDR SP, [R0]                ;Load new stack pointer address
  47.    LDR PC, [R0, #4]        ;Load new program counter address
  48. }

  49. /*********************************************************************************************************
  50. ** Function name:       Boot
  51. ** Descriptions:        跳转到应用程序
  52. ** input parameters:    无
  53. ** output parameters:   无
  54. ** Returned value:      无
  55. *********************************************************************************************************/
  56. void Boot( void )
  57. {
  58.         SCB->VTOR = IMG_START_SECTOR & 0x1FFFFF80;        //修改中断向量表
  59.         JMP_Boot(IMG_START_SECTOR);
  60. }

  61. /*********************************************************************************************************
  62. ** Function name:       Screen_Fresh
  63. ** Descriptions:        刷新显示
  64. ** input parameters:    p 显示信息
  65. ** output parameters:   无
  66. ** Returned value:      无
  67. *********************************************************************************************************/
  68. void Screen_Fresh(char *p)
  69. {
  70.         LCD_Clear(Black);
  71.         LCD_DisplayString(0, 0,          "Application MENU");
  72.         LCD_DisplayString(0, 16,          "Press \"INT0\" to erase image");
  73.         LCD_DisplayString(0, 16*2, "Press \"UP\" to print menu");
  74.         LCD_DisplayString(0, 16*3, "Press \"CENTER\" to transfer image");
  75.         LCD_DisplayString(0, 16*4, "Press \"DOWN\" to display image");
  76.         LCD_DisplayString(0, 16*5, string[0]);
  77.         LCD_DisplayString(0, 16*6, string[1]);
  78.         LCD_DisplayString(0, 16*7, string[2]);
  79.         LCD_DisplayString(0, 16*9, p);
  80. }
  81. int main(void)
  82. {
  83.         uint32_t ints[4];

  84.         SystemClockUpdate();

  85.         LCD_BSP_Init();                                //LCD初始化
  86.         LCD_Clear(Black);
  87.         LCD_SetBackColor(Black);
  88.         LCD_SetTextColor(White);

  89.         cmd = MENU;
  90.         while(1)
  91.         {               
  92.                 switch(cmd)
  93.                 {
  94.                         case READY:                                
  95.                                 if                (!(LPC_GPIO2->FIOPIN & (1<<10)))/*        INT0 键 */
  96.                                 {
  97.                                         Screen_Fresh("Erasing Images...");
  98.                                         cmd = ERASE_FLASH;                                                
  99.                                 }
  100.                                 else if(!(LPC_GPIO1->FIOPIN & (1<<29)))/*        方向键 up 键 */
  101.                                 {
  102.                                         cmd = MENU;                                
  103.                                 }
  104.                                 else if(!(LPC_GPIO1->FIOPIN & (1<<25)))/*        方向键 ok 键 */
  105.                                 {
  106.                                         Screen_Fresh("Waiting for XMODEM Xfer...");
  107.                                         cmd = FLASH_IMG;
  108.                                 }
  109.                                 else if(!(LPC_GPIO1->FIOPIN & (1<<26)))/*        方向键 down 键 */
  110.                                 {
  111.                                         Screen_Fresh("Execute program");
  112.                                         cmd = SHOW;
  113.                                 }
  114.                                 break;

  115.                         case MENU:                                
  116.                                 /*        显示引导程序版本 */
  117.                                 if(u32IAP_ReadBootVersion (&ints[0], &ints[1]) == IAP_STA_CMD_SUCCESS)
  118.                                 {
  119.                                         snprintf((char *)string[0], MAX_STRING_SIZE, "Boot Code version %d.%d", ints[0], ints[1]);
  120.                                 }
  121.                         
  122.                                 /*        显示器件ID */
  123.                                 if(u32IAP_ReadPartID(&ints[0]) == IAP_STA_CMD_SUCCESS)
  124.                                 {
  125.                                         snprintf((char *)string[1], MAX_STRING_SIZE, "Part ID: %d (%#x)", ints[0], ints[0]);
  126.                                 }

  127.                                 /*        显示器件序列号 */
  128.                                 u32IAP_ReadSerialNumber(&ints[0], &ints[1], &ints[2], &ints[3]);
  129.                                 snprintf((char *)string[2], MAX_STRING_SIZE, "Serial #: %08X:%08X:%08X:%08X", ints[0], ints[1], ints[2], ints[3]);
  130.                                 Screen_Fresh("Menu");                                
  131.                                 cmd = READY;
  132.                                 break;

  133.                         case ERASE_FLASH:
  134.                                 /*        擦除存储区准备IAP升级  */
  135.                                 if ((u32IAP_PrepareSectors(16, 20) == IAP_STA_CMD_SUCCESS) &&
  136.                                     (u32IAP_EraseSectors  (16, 20) == IAP_STA_CMD_SUCCESS))
  137.                                         Screen_Fresh("Erase Done");
  138.                                 else
  139.                                         Screen_Fresh("Erase FAIL");                        
  140.                                 cmd = READY;
  141.                                 break;

  142.                         case FLASH_IMG:
  143.                                 /*        清空接收寄存器 */
  144.                                 received_data = 0;               

  145.                                 /* 更新APP程序 */
  146.                                 vXmodem1k_Client(&load_image);               
  147.                                 Screen_Fresh("Updata Complete");
  148.                                 cmd = READY;
  149.                                 break;
  150.                         case SHOW:
  151.                                 Boot();
  152.                                 cmd = READY;
  153.                                 break;
  154.                 }
  155.                
  156.         }
  157. }

  158. static uint32_t load_image(uint8_t *data, uint16_t length)
  159. {
  160.         if(length > 0){
  161.                
  162.                 /*        准备写扇区操作 */
  163.                 if(u32IAP_PrepareSectors(16, 20) == IAP_STA_CMD_SUCCESS)
  164.                 {                           
  165.                         /*        将RAM内容复制到Flash */
  166.                         if(u32IAP_CopyRAMToFlash(IMG_START_SECTOR + received_data, (uint32_t)data, length) == IAP_STA_CMD_SUCCESS)
  167.                         {                                
  168.                                 /*        比较复制内容 */
  169.                                 if(u32IAP_Compare(IMG_START_SECTOR + received_data, (uint32_t)data, length, 0) == IAP_STA_CMD_SUCCESS)
  170.                                 {
  171.                                         received_data +=  length;
  172.                                         return 1;
  173.                                 }
  174.                         }
  175.                 }
  176.                 /*        打印失败信息 */
  177.                 Screen_Fresh("FAIL (RESET & ERASE IMAGE)");
  178.                 return 0;
  179.         }
  180.         else
  181.                 return 0;
  182. }
复制代码

所有资料51hei提供下载:
LPC1768宝马开发板串口IAP升级实例.zip (112.42 KB, 下载次数: 50)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:985511 发表于 2021-12-1 18:02 | 显示全部楼层
此文及后面的资料很不错,刚好用上这个资料
回复

使用道具 举报

ID:624664 发表于 2019-10-15 19:51 | 显示全部楼层
来看看
回复

使用道具 举报

ID:589817 发表于 2019-8-22 09:54 | 显示全部楼层
资料很好
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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