LPC1100处理器SD卡升级应用程序

发布者:温暖微笑最新更新时间:2016-07-14 来源: eefocus关键字:LPC1100  处理器  SD卡升级 手机看文章 扫描二维码
随时随地手机看文章
随着处理器的发展,IAP升级方式越来越受到欢迎。而IAP升级的方式也由很多,如:通过串口升级、GPRS远程升级、SD卡升级等等。这里详细介绍怎样使用SD卡升级应用程序的方法。

下面先介绍LPC1100处理器IAP的基础知识:

 1. LPC1100处理器(LPC1114)Flash分配:LPC1114一共有32K Flash,共分为8个扇区,每个扇区的大小为4K,具体如下:

 

LPC1100处理器SD卡升级应用程序(原创) - 我心永恒 - ARM-实践者

 

 

2.NXP的IAP命令都一样,一共有9条:

 

 

3.IAP命令是通过寄存器R0和R1进行参数传递的,R0传递参数,R1传递返回值:

 

LPC1100处理器SD卡升级应用程序(原创) - 我心永恒 - ARM-实践者

IAP功能应用:

 

1.定义IAP程序的入口地址

 

 

代码:

 

#define  IAP_ENTER_ADR 0x1FFF1FF1   /* IAP入口地址定义  */

 

 

 

2.定义参数

 

 

代码:

 

uint32  ParamIn[8];         /* IAP入口参数缓冲区            */
uint32  ParamOut[8];        /* IAP出口参数缓冲区            */

 

 

 

3.定义函数类型指针

 

 

代码:

 

void (*IAP_Entry)(uint32 *param_tab, uint32 *result_tab) =

(void(*)())IAP_ENTER_ADR; // 定义函数指针

 

 

 

4.注意事项:

 

①按照上面函数类型调用IAP函数即可,不过要注意函数的参数。

②由于在擦写操作期间,片上Flash存储器不可访问。IAP代码不能使用或禁止中断。

③Flash编程命令使用片上RAM顶端32字节,用户程序不能使用此空间。

IAP命令应用(代码来自周工):

 

1.准备写操作扇区

 

LPC1100处理器SD卡升级应用程序(原创) - 我心永恒 - ARM-实践者

 

 

 

代码:

 

/*****************************************************************************
** Function name:       SectorPrepare
** Descriptions:        IAP操作扇区选择,命令代码50
** input parameters:    sec1:           起始扇区
**                      sec2:           终止扇区
** output parameters:   ParamOut[0]:    IAP操作状态码,IAP返回值     
** Returned value:      ParamOut[0]:    IAP操作状态码,IAP返回值                     
*******************************************************************************/
uint32 SectorPrepare(uint8 sec1, uint8 sec2)
{  
    ParamIn[0] = IAP_Prepare;              /* 设置命令字         */
    ParamIn[1] = sec1;                          /* 设置参数            */
    ParamIn[2] = sec2;                            
    (*IAP_Entry)(ParamIn, ParamOut);  /* 调用IAP服务程序 */
   
    return (ParamOut[0]);                      /* 返回状态码        */
}

 

 

 

2.将RAM 内容复制到Flash

 

LPC1100处理器SD卡升级应用程序(原创) - 我心永恒 - ARM-实践者

 

 

 

代码:

 

 

/*******************************************************************************
** Function name:       RamToFlash
** Descriptions:        复制RAM的数据到FLASH,命令代码51
** input parameters:    dst:            目标地址,即FLASH起始地址。以512字节为分界
**                      src:            源地址,即RAM地址。地址必须字对齐
**                      no:             复制字节个数,为512/1024/4096/8192
** output parameters:   ParamOut[0]:    IAP操作状态码,IAP返回值     
** Returned value:      ParamOut[0]:    IAP操作状态码,IAP返回值                     
********************************************************************************/
uint32 RamToFlash(uint32 dst, uint32 src, uint32 no)
{  
    ParamIn[0] = IAP_RAMTOFLASH;      /* 设置命令字          */
    ParamIn[1] = dst;                                /* 设置参数             */
    ParamIn[2] = src;
    ParamIn[3] = no;
    ParamIn[4] = IAP_FCCLK;
    (*IAP_Entry)(ParamIn, ParamOut);    /* 调用IAP服务程序  */
    
    return (ParamOut[0]);                         /* 返回状态码          */
}

 

 

 

3.擦除扇区

 

LPC1100处理器SD卡升级应用程序(原创) - 我心永恒 - ARM-实践者

 

 

 

代码:

 

/*******************************************************************************
** Function name:       SectorErase
** Descriptions:        扇区擦除,命令代码52
** input parameters:    sec1            起始扇区
**                      sec2            终止扇区92
** output parameters:   ParamOut[0]:    IAP操作状态码,IAP返回值
** Returned value:      ParamOut[0]:    IAP操作状态码,IAP返回值                     
********************************************************************************/
uint32 SectorErase(uint8 sec1, uint8 sec2)
{  
    ParamIn[0] = IAP_ERASESECTOR;         /* 设置命令字         */
    ParamIn[1] = sec1;                                   /* 设置参数            */
    ParamIn[2] = sec2;
    ParamIn[3] = IAP_FCCLK;
    (*IAP_Entry)(ParamIn, ParamOut);          /* 调用IAP服务程序  */
   
    return (ParamOut[0]);                              /* 返回状态码          */
}

 

 

 

4.扇区查空

 

LPC1100处理器SD卡升级应用程序(原创) - 我心永恒 - ARM-实践者

代码:

 

/**********************************************************************************
** Function name:       BlankChk
** Descriptions:        扇区查空,命令代码53
** input parameters:    sec1:           起始扇区
**                      sec2:           终止扇区92
** output parameters:   ParamOut[0]:    IAP操作状态码,IAP返回值
** Returned value:      ParamOut[0]:    IAP操作状态码,IAP返回值                     
**********************************************************************************/
uint32 BlankChk(uint8 sec1, uint8 sec2)
{  
    ParamIn[0] = IAP_BLANKCHK;          /* 设置命令字         */
    ParamIn[1] = sec1;                            /* 设置参数            */
    ParamIn[2] = sec2;
    (*IAP_Entry)(ParamIn, ParamOut);    /* 调用IAP服务程序 */

    return (ParamOut[0]);                       /* 返回状态码         */
}

 

 

 

5.比较<地址1><地址2><字节数>

 

LPC1100处理器SD卡升级应用程序(原创) - 我心永恒 - ARM-实践者

 

 

 

代码:

 

/*******************************************************************************
** Function name:       DataCompare
** Descriptions:        校验数据,命令代码56
** input parameters:    dst:            目标地址,即RAM/FLASH起始地址。地址必须字对齐
**                      src:            源地址,即FLASH/RAM地址。地址必须字对齐
**                      no:             复制字节个数,必须能被4整除
** output parameters:   ParamOut[0]:    IAP操作状态码,IAP返回值
** Returned value:      ParamOut[0]:    IAP操作状态码,IAP返回值                     
********************************************************************************/
uint32 DataCompare(uint32 dst, uint32 src, uint32 no)
{  
    ParamIn[0] = IAP_COMPARE;             /* 设置命令字          */
    ParamIn[1] = dst;                                 /* 设置参数             */
    ParamIn[2] = src;
    ParamIn[3] = no;
    (*IAP_Entry)(ParamIn, ParamOut);     /* 调用IAP服务程序   */

    return (ParamOut[0]);                       /* 返回状态码              */
}

有上面的几个函数后,下面就可以根据需要编写SD卡升级函数了:

 

1.定义用户程序地址

 

 

代码:

 

#define APP_CODE_START_ADDR   0x00006000     // 用户程序起始地址

 

 

2.从SD卡中读写bin文件更新升级

 

从SD卡中升级程序很简单,从SD卡中打开升级文件,每次读取512自己,然后写入Flash,直到编写完成。

 

 

代码:

 

 

/**********************************************************************************
* FunctionName   : UCSDCardProgram()
* Description    : 从SD卡编程
* EntryParameter : fileName - 应用程序在SD卡中的名字, buf - 缓冲
* ReturnValue    : None
*********************************************************************************/
uint8 UCSDCardProgram(uint8 *fileName, uint8 *buf)
{
    uint32 addr = 0;
    FATFS fs;               /*Work area (file system object) for logical drive*/
    FIL file;               /*file objects*/
    UINT  br;               /*File R/W count*/
    FRESULT res;

 

    DisableIRQ();              // 禁止中断
    SectorPrepare(6, 6);    // 选择扇区     
    SectorErase(6, 6);        // 擦除扇区          
    EnableIRQ();               // 使能中断

 

    /*Register a work area for logical drive 0*/
    f_mount(0, &fs);

    /*Create file*/
    res = f_open(&file, (const TCHAR *)fileName, FA_OPEN_EXISTING|FA_READ);

    if(res != FR_OK)
    {
         return res;
    }
    else
   {
        while (1)
        {
             res = f_read(&file, buf, 512, &br);     // 读取数据

             DisableIRQ();
             SectorPrepare(6, 6);
             RamToFlash(APP_CODE_START_ADDR + addr, (uint32)buf, 512); // 写数据到FLASH
             EnableIRQ();
             addr += 512;

             if ((res != FR_OK) || (br < 512))
             {
                  break;
             }
         }
    }

    /*Close all files*/
    f_close(&file);      // 关闭文件,必须和f_open函数成对出现

    /*Unregister a work area before discard it*/
    f_mount(0, 0);

    return FR_OK;
}

 

 

 

3.主函数:

 

主函数实现按键扫描,如果有按键,进行SD卡升级,如果没有按键直接跳转到应用程序

 

 

代码:

 

/**********************************************************************************
* FunctionName   : main()
* Description    : 主函数
* EntryParameter : None
* ReturnValue    : None
*********************************************************************************/
int main(void) 

    void (*userProgram)() = (void (*)())OSInit;     // 函数指针 

    OSInit();                // 初始化系统

    while (1)
    {
         if (KeyGetValue())
         {
             UCSDCardProgram(\"LPC1114.bin\", SDBuf);
         }

         userProgram = (void (*)())(APP_CODE_START_ADDR + 1);
         (*userProgram)();                           // 启动程序  
    } 
}

 

 

 

到此IAP程序完成了,下面就是编写应用程序了。。。。。。。。。。。。。。。。。。。。。。

应用程序编写:

 

应用程序编写没有什么特殊的,只是需要注意几个地方的设置

 

1.设置编译地址:

 

LPC1100处理器SD卡升级应用程序(原创) - 我心永恒 - ARM-实践者

 

 

 

2.编译设置

 

LPC1100处理器SD卡升级应用程序(原创) - 我心永恒 - ARM-实践者

 

 

3.生存bin文件

 

LPC1100处理器SD卡升级应用程序(原创) - 我心永恒 - ARM-实践者

 

 

4.编写应用程序,并把bin文件存放SD卡中,运行IAP升级程序。


关键字:LPC1100  处理器  SD卡升级 引用地址:LPC1100处理器SD卡升级应用程序

上一篇:STM32F105 USB管脚Vbus的处理
下一篇:LPC11U14实现SD卡U盘

推荐阅读最新更新时间:2024-03-16 15:00

ARM:Intel手机处理器已落后我们一代
     泡泡网CPU频道3月2日 ARM CEO沃伦·伊斯特(Warren East)周三表示,Intel近日在移动世界大会(以下简称“MWC”)上展示的智能手机处理器远落后于ARM的产品。     伊斯特称,Intel CEO欧德宁(Paul Otellini)周一在MWC上展示的设备相当于一代或两代前的ARM解决方案。伊斯特称:“从技术的角度讲,Intel的智能手机解决方案好于以往,但与我们相比仍落后一代或两代。”     尽管如此,伊斯特表示,ARM仍认真对待Intel的来袭。他说:“因为我们在经营这项业务,而英特尔是全球最大的半导体公司,拥有大量的资源,先进的制造技术,优质的x86处理器,因此我们需要有所顾虑。”
[手机便携]
高通:iPhone 8面部识别不算啥 骁龙处理器很快支持
  北京时间8月15日晚间消息, 高通 公司今日表示,下一代 骁龙处理器 将支持红外3D感知技术,这意味着Android手机将很快拥有像iPhone 8一样的面部识别功能。下面就随手机便携小编一起来了解一下相关内容吧。   种种迹象表明,苹果公司将使用面部识别技术来取代Touch ID指纹传感器,成为iPhone 8解锁和Apple Pay身份验证方式。而且,该技术还可能成为iPhone 8的最大卖点之一。   但是,相比Android手机,iPhone 8的这种技术优势将是短暂的。 高通 今日表示,今年12月即将发布的下一代 骁龙处理器 也将支持类似的技术,甚至还要优于苹果的解决方案。    高通 称,下一代 骁龙处理器 的图
[手机便携]
TI推出医疗成像专用嵌入式处理器和模拟器件
  德州仪器 (TI) 宣布推出超过 15 款专用嵌入式处理器产品系列,能帮助医生与临床医师获得更快、更准确的诊断结果,同时还可帮助医疗成像设备制造商开发出新型医疗技术,提升现有产品的小型化与便携性。这些处理器主要面向各种医疗成像应用,其中包括超声波、CT、正电子发射断层成像 (PET)、核磁共振 (MRI)、数字 X 光、光学相干断层扫描 (OCT) 以及其它新近开发的医疗技术。这些处理器协同 TI 全系列通用与专用模拟产品不仅可实现完整的信号链解决方案,而且还可改善全球成百上千万人得到诊治速度与有效性。   更快捷、更准确的医疗服务   嵌入式数字信号处理器是灵活的可编程器件,可通过更新软件与算法实现现场升级。大专院校、程
[医疗电子]
攻300美元市场 博通推整合LTE处理器
    除Qualcomm针对中低价位手机导入LTE机能,Broadcom目前也公布旗下两款全新整合LTE机能的处理器产品,分别为双核心架构M320,以及四核心架构M340,前者预计将在2014年上半年间释出,后者则预计在下半年间提供,均支援Cat 4 150Mbps,并且对应FDD-LTE及TD-LTE。 根据Broadcom公布消息,预计将针对美金300元以下中低阶机种提供整合LTE机能的处理器产品,分别为双核心架构M320,以及四核心架构M340,前者将于2014年上半年间推出,而后者则将在下半年间提供。 连网规格部分,两者均对应Cat 4 150Mbps,分别可对应中国市场使用的FDD-LTE及TD-LTE,预期与Qua
[手机便携]
高通推64位骁龙610和615处理器
    北京时间2月25日凌晨消息,高通昨晚在2014年世界移动通信大会(MWC)上宣布推出Snapdragon 610和615处理器,这两种处理器均配备Cat4 LTE调制解调器,支持双卡双通(dual-SIM/dual active)和64位架构,其中Snapdragon 615配有8个ARMv8内核,而Snapdragon 610则配有4个ARMv8内核。   高通称,人们可能会认为更多的内核意味着耗电量更高,但事实上这两种处理器的情况则恰恰相反,原因是其内核以及Adreno 405 GPU均可选择性地开关。高通表示,这两种处理器的使用时间越长,就越能节省电池寿命,原因是其处理速度会不断加快,令片上系统SoC能更加轻而易举地回
[手机便携]
BSP-15宽带数字信号处理器及其应用
在多媒体信号处理领域,特别是视频处理方面,通常要求数字信号处理器具有针对多媒体应用的优化的内核结构和丰富的媒体接口,通用信号处理器在这方面性能得不到充分发挥,为此,美国Equator公司推出了BSP系列高速宽带数字信号处理器BSP系列。BSP-15是该系列中的一款,与MAP-CA反向兼容。BSP-15是专门以视频应用为中心而设计的高效DSP,以高度集成的单芯片满足了宽带产品的需要。在400MHz的时钟频率下,BSP-15处理能力为40 GOPS(每秒400亿次整数运算),处理速度相当于Pentium III的8.5倍,是同系列MAP-CA芯片的1.33倍,是其它解决方案的10倍以上。由于BSP-15核心功能是通过软件为高性能、大视
[单片机]
BSP-15宽带数字信号<font color='red'>处理器</font>及其应用
3万分弱爆 英特尔神秘处理器跑分破4万
    一直以来,移动智能设备处理器提供商无外乎高通、三星、英伟达、德州仪器等几家公司,不过除了高通之外,其它几家公司在近些年来都在走下坡路,市面上的高端 设备目前已经鲜见其它公司产品。这让高通处理器似乎大有统治智能手机设备 SOC 的趋势,就连三星自家旗舰 Galaxy S4 都抵挡不住高通处理器的诱惑,相继推出了 Snapdragon 600、800 的处理器版本。 不过,作为 PC 界老大地位的芯片制造商英特尔似乎并不甘示弱,在经历前几代移动处理器性能不是十分理想之后,近日,英特尔新一代 Bay Trail-T 处理器工程样机突然现身著名跑分测试软件安兔兔,大有将高通新品 Snapdragon 800 系列处理器斩杀于
[手机便携]
使用多个DS1267数字电位器和8051微处理器产生3线信号
DS1267为双通道数字电位器,具有串行“移位寄存器”型接口。移位寄存器有一个输入引脚,用于移入数据,还有一个输出引脚,在写入时将数据移出移位寄存器的最后一位。这样就可以将多个DS1267以菊花链方式连接在一起,并在同一串行总线上一起编程。本应用笔记通过电路示例和伪代码示例描述了如何实现此目的,展示了如何为任何微处理器开发代码。 介绍 Dallas Semiconductor的数字电位器DS1267非常适合需要数模转换器(DAC)的系统,或需要可编程偏置电流、电压或电阻而无需传统机械电位器人工干预的系统。DS1267在一个封装中提供两个数字电位器。独特的3线协议允许将其中多个芯片串联或并联放置。可选的堆叠配置允许芯片的两个8位
[单片机]
使用多个DS1267数字电位器和8051微<font color='red'>处理器</font>产生3线信号
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved