标题:
LPC1768单片机串口IAP升级实例源码
[打印本页]
作者:
liu100m
时间:
2018-10-8 15:35
标题:
LPC1768单片机串口IAP升级实例源码
LPC1768 IAP升级方法 实例
测试说明:
本实验通过串口0对开发板进行IAP升级,本工程为引导程序,将开发板上的USB转串口连接到电脑
插上3.2寸彩屏模块,下载程序到开发板,彩屏显示按键功能:
INTO键:擦除应用程序
方向键 ok:进行IAP升级,等待串口接收应用程序
方向键 down:运行应用程序
方向键 up:显示菜单
当按下ok键等待串口接收应用程序时,电脑通过超级终端发送预先编译好的应用程序(BIN)格式
以1K Xmodem模式进行发送给开发板,开发板接收完成后显示 Updata Complete,按方向键down
开始执行应用程序
单片机源程序如下:
/*******************************************************************************
* Company: Wang Electronic Technology Co., Ltd.
******************************************************************************
* 文件名称:main.c
* 功能说明:IAP引导程序
* 版 本:V1.1
* 作 者:jeansonm
********************************************************************************
* 文件名称:
* 功能说明:
* 版 本:
* 更新作者:
* 日 期:
* 更新原因:
********************************************************************************/
#include "LPC17xx.h"
#include "lcd_bsp.h"
#include "xmodem1k.h"
#include "iap.h"
#include <stdio.h>
#define IMG_START_SECTOR 0x00010000 /* Sector 16 应用程序地址 */
#define IMG_END_SECTOR 0x00037FFF /* Sector 20 */
/* Function Prototype */
static uint32_t load_image(uint8_t *data, uint16_t length);
/* Character array workspace for GLCD print functions */
#define MAX_STRING_SIZE 50
static uint8_t string[3][MAX_STRING_SIZE];
static uint32_t received_data = 0;
/* State-machine variable to control application functionality */
enum state_machine {
READY = 0,
MENU,
ERASE_FLASH,
FLASH_IMG,
SHOW
};
enum state_machine cmd;
/*********************************************************************************************************
** Function name: JMP_Boot
** Descriptions: 跳转到应用程序
** input parameters: address 应用程序地址
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
__asm void JMP_Boot( uint32_t address ){
LDR SP, [R0] ;Load new stack pointer address
LDR PC, [R0, #4] ;Load new program counter address
}
/*********************************************************************************************************
** Function name: Boot
** Descriptions: 跳转到应用程序
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void Boot( void )
{
SCB->VTOR = IMG_START_SECTOR & 0x1FFFFF80; //修改中断向量表
JMP_Boot(IMG_START_SECTOR);
}
/*********************************************************************************************************
** Function name: Screen_Fresh
** Descriptions: 刷新显示
** input parameters: p 显示信息
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void Screen_Fresh(char *p)
{
LCD_Clear(Black);
LCD_DisplayString(0, 0, "Application MENU");
LCD_DisplayString(0, 16, "Press \"INT0\" to erase image");
LCD_DisplayString(0, 16*2, "Press \"UP\" to print menu");
LCD_DisplayString(0, 16*3, "Press \"CENTER\" to transfer image");
LCD_DisplayString(0, 16*4, "Press \"DOWN\" to display image");
LCD_DisplayString(0, 16*5, string[0]);
LCD_DisplayString(0, 16*6, string[1]);
LCD_DisplayString(0, 16*7, string[2]);
LCD_DisplayString(0, 16*9, p);
}
int main(void)
{
uint32_t ints[4];
SystemClockUpdate();
LCD_BSP_Init(); //LCD初始化
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
cmd = MENU;
while(1)
{
switch(cmd)
{
case READY:
if (!(LPC_GPIO2->FIOPIN & (1<<10)))/* INT0 键 */
{
Screen_Fresh("Erasing Images...");
cmd = ERASE_FLASH;
}
else if(!(LPC_GPIO1->FIOPIN & (1<<29)))/* 方向键 up 键 */
{
cmd = MENU;
}
else if(!(LPC_GPIO1->FIOPIN & (1<<25)))/* 方向键 ok 键 */
{
Screen_Fresh("Waiting for XMODEM Xfer...");
cmd = FLASH_IMG;
}
else if(!(LPC_GPIO1->FIOPIN & (1<<26)))/* 方向键 down 键 */
{
Screen_Fresh("Execute program");
cmd = SHOW;
}
break;
case MENU:
/* 显示引导程序版本 */
if(u32IAP_ReadBootVersion (&ints[0], &ints[1]) == IAP_STA_CMD_SUCCESS)
{
snprintf((char *)string[0], MAX_STRING_SIZE, "Boot Code version %d.%d", ints[0], ints[1]);
}
/* 显示器件ID */
if(u32IAP_ReadPartID(&ints[0]) == IAP_STA_CMD_SUCCESS)
{
snprintf((char *)string[1], MAX_STRING_SIZE, "Part ID: %d (%#x)", ints[0], ints[0]);
}
/* 显示器件序列号 */
u32IAP_ReadSerialNumber(&ints[0], &ints[1], &ints[2], &ints[3]);
snprintf((char *)string[2], MAX_STRING_SIZE, "Serial #: %08X:%08X:%08X:%08X", ints[0], ints[1], ints[2], ints[3]);
Screen_Fresh("Menu");
cmd = READY;
break;
case ERASE_FLASH:
/* 擦除存储区准备IAP升级 */
if ((u32IAP_PrepareSectors(16, 20) == IAP_STA_CMD_SUCCESS) &&
(u32IAP_EraseSectors (16, 20) == IAP_STA_CMD_SUCCESS))
Screen_Fresh("Erase Done");
else
Screen_Fresh("Erase FAIL");
cmd = READY;
break;
case FLASH_IMG:
/* 清空接收寄存器 */
received_data = 0;
/* 更新APP程序 */
vXmodem1k_Client(&load_image);
Screen_Fresh("Updata Complete");
cmd = READY;
break;
case SHOW:
Boot();
cmd = READY;
break;
}
}
}
static uint32_t load_image(uint8_t *data, uint16_t length)
{
if(length > 0){
/* 准备写扇区操作 */
if(u32IAP_PrepareSectors(16, 20) == IAP_STA_CMD_SUCCESS)
{
/* 将RAM内容复制到Flash */
if(u32IAP_CopyRAMToFlash(IMG_START_SECTOR + received_data, (uint32_t)data, length) == IAP_STA_CMD_SUCCESS)
{
/* 比较复制内容 */
if(u32IAP_Compare(IMG_START_SECTOR + received_data, (uint32_t)data, length, 0) == IAP_STA_CMD_SUCCESS)
{
received_data += length;
return 1;
}
}
}
/* 打印失败信息 */
Screen_Fresh("FAIL (RESET & ERASE IMAGE)");
return 0;
}
else
return 0;
}
复制代码
所有资料51hei提供下载:
LPC1768宝马开发板串口IAP升级实例.zip
(112.42 KB, 下载次数: 65)
2018-10-8 15:33 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
Raywang89
时间:
2019-8-22 09:54
资料很好
作者:
咩米秒
时间:
2019-10-15 19:51
来看看
作者:
cqyan_1
时间:
2021-12-1 18:02
此文及后面的资料很不错,刚好用上这个资料
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1