阿哲
发表于: 2015-11-11 20:46:47 | 显示全部楼层

1.  简介

LPC11U6x是基于ARM Cortex-M0的低成本32位MCU系列产品,以高达50MHz的CPU频率工作。LPC11U6x支持高达256KB的闪存、4kB的EEPROM以及36kB的SRAM。

ARM Cortex M0+是一个易于使用的、高效节能的内核,采用两级流水线和快速单周期IO访问。LPC11U6x的补充外设包括一个DMA控制器、一个CRC引擎、一个带无晶振低速模式的全速USB设备控制器、两个I2C总线接口、多达5个USART、两个SSP接口、带有六种可配置多功能定时器的PWM/定时器子系统、实时时钟、一个12位ADC、温度传感器、功能可配置的IO端口以及最多80个通用I/O引脚。

在应用编程IAP允许在运行用户应用代码的同时操作片上闪存。位于BOOT ROM的IAP指令可以用来操作片上闪存或者是获得存储在片上ROM的某些信息。这可以包括:

•  现场升级固件

•  EEPROM的内容替换

•  数据存储


2.  闪存规格

LPC11U6x的片上闪存分组为扇区。闪存被分为24个4kB和5个32kB的扇区。每256字节的独立页面可以通过使用页擦除指令擦除。

23.jpg

图1. LPC11U6x闪存结构



跳转到指定楼层
阿哲
发表于: 2016-1-17 23:07:24 | 显示全部楼层

3.    EEPROM

LPC11U6x包含2 kB或者4 kB的片上可擦除字节以及可编程字节的EEPROM数据存储。EEPROM可以通过片上的引导加载程序软件使用IAP进行编程。


4.    IAP简介

4.1    IAP初始化

IAP程序位于引导ROM。IAP程序位于0x1FFF1FF0地址,并且它是thumb代码。要访问IAP程序,其入口点必须定义。对于 LPC11U6x,该地址是0x1FFF1FF1。

  1. 1    #define IAP_LOCATION 0x1FFF1FF1
复制代码

该IAP程序占用两个无符号32位整型数组,command_param和status_result作为输入参数。command_param是一个五个元素的数组,status_result是一个4个元素的数组。该数组可以如下定义:


  1. 2    unsigned int command_param[5];

  2. 3    unsigned int status_result[4];
复制代码

或者可以定义如下:


  1. 4    unsigned int * command_param;

  2. 5    unsigned int * status_result;

  3. 6    command_param = (unsigned int *) <address>

  4. 7    status_result = (unsigned int *) <address>
复制代码

4.2    IAP程序

表1.        IAP程序

IAP命令 编码
功能说明
注意事项
准备扇区的写操作 50 关闭指定的闪存扇区的写保护 该函数必须在执行“复制RAM到闪存”或者“擦除扇区”命令之前被调用。
制RAM到闪存 51 执行一个从RAM到闪存的写操作。 闪存扇区必须在内容可以写入之前准备好写操作。确保在复制过程中没有执行其他的闪存访问。源数据必须位于RAM中。
擦除扇区 52 擦除整个闪存扇区的内容。 闪存扇区必须在可以擦除时准备好写操作。确保在擦除过程中没有执行其他的闪存访问。
扇区查空 53 判断闪存扇区是否被擦除

4.3        IAP注意事项

IAP在运行过程中操作内存。因此,必须采取一定的预防措施来确保正常的操作。


4.3.1        中断

当使用IAP程序时,在擦除和写入操作时必须避免任何访问内存的操作。如果向量表中断位于闪存中,所有的中断必须在擦除和写入前被禁用。

LPC11U6x通过改变SYSMEMREMAP寄存器中的MAP位能重新映射中断向量表到RAM。这允许产生中断,即使是在擦除和写入操作的过程中。但是由于不能在此期间访问闪存,中断处理程序必须从RAM执行。因此,所有与中断处理程序相关的代码必须从闪存复制到RAM中。


4.3.2        RAM使用

IAP程序使用在片上RAM顶层部分的32个字节的空间用于执行代码,以及最多128个字节的堆栈空间。如果在应用程序中允许IAP内存编程,用户程序不应该使用此空间。此外,如果中断向量表被映射到SRAM中,存储器映射的底部512字节不应该使用。

回复

使用道具 举报

阿哲
发表于: 2016-1-20 21:18:07 | 显示全部楼层

5.        IAP示例项目和中断处理


5.1        软件设置

5.1.1        SRAM内存映射

演示程序的代码将中断向量重新定位到SRAM,并且使用IAP代码。这意味着,编译器必须进行配置以使得存储器底部的512字节和顶部的32字节不能被接触到。在Keil环境中, IRAM1部分应该设定为小于实际SRAM的大小,以防止编译器使用这些区域。

该SRAM起始地址是0x1000 0000。由于中断向量表使用SRAM底部的512字节,起始位置设置为0x1000 0200。LPC11U6x的SRAM大小为32kB。由于IAP使用SRAM顶部的32字节,这意味着可用的SRAM大小为32 KB - 32字节= 32736字节。由于512个字节也被用于中断向量表, SRAM的大小现在变为:

32768 – 32 – 512 = 32224 字节,即0x7DE0.

图2.png

图2.        Keil IROM和SRAM重映射

在LPCXpresso IDE中,通过改变MCU的设置实现相同的任务。

3.png

图 3.        LPCXpresso闪存和SRAM重映射

在IAR Embedded Workbench中,通过更改链接配置设置实现SRAM的重新映射。RAM地址设置为0x1000 0200,结束地址设置为0x1000 7FE0。

4.png

图  4.        IAR Embedded Workbench ROM和SRAM重新映射


5.1.2        中断重映射

在NXP的LPC11U6x上系统重映射寄存器SYSMEMREMAP选择异常向量是从引导ROM读取或是闪存、SRAM。默认情况下,闪存映射到地址0X0000 0000。当寄存器SYSMEMREMAP中的MAP位设置成0x0或者0x1,引导ROM或者RAM分别映射到存储器映射的底部512字节(地址0x0000 0000到0x0000 0200)。

5.png

图  5.        SYSMEMREMAP寄存器

因此,对于IAP过程的中断处理,用户代码应该将中断向量表从0x0000 0000复制到0x1000 0000,然后设置MAP位为0x1选择从RAM映射的异常向量。整个底部512字节闪存块应该复制到RAM中。

5.1.3        系统定时器中断

系统定时器用来在软件运行时创建一个周期性的中断。由于在IAP过程中,软件无法访问到闪存,系统定时器的中断处理程序应该重新定位到SRAM中。

6.png

图  6.        Keil中的SysTick中断处理程序设置

在LPCXpresso IDE中,系统定时器处理函数通过使用.data.ramfunc指令直接放置到SRAM中。

  1. 8        __attribute__ ((__section__(".data.ramfunc")))
  2. 9        void SysTick_Handler(void){
  3. 10        LPC_GPIO_PORT->NOT[2] = (1<<5);}
复制代码

在IAR Embedded Workbench中,系统定时器处理函数通过使用编译器指令ramfunc放置到SRAM中。     .

  1. 11        __ramfunc void SysTick_Handler(void){  12                LPC_GPIO_PORT->NOT[2] = (1<<5);}
复制代码

5.1.4        处理IAP过程中的中断

当IAP程序被调用时,LPC11U6x的闪存是无法访问的。这可以通过重新定位中断表到SRAM来解决。

中断向量表移动到SRAM。SYSMEMREMAP寄存器的MAP位设置成0x1,表示向量表位于SRAM中,而不是闪存中。

  1. 13        CopyInterruptToSRAM();        //remap interrupt vector to SRAM
  2. 14        LPC_SYSCON->SYSMEMREMAP = 0x1;        //change memory map
复制代码

通过使用函数”CopyInterruptToSRAM”将中断向量表复制到SRAM中。该函数调用硬件编码从闪存地址0x00复制到SRAM地址0x1000 0000。

7.png

图 7.        复制中断处理程序到SRAM

在EEPROM写入和读取过程中,必须禁用中断以便正确进行IAP操作。


5.2        硬件设置

IAP指令的输入参数‘CCLK’应该在千赫等级等于CPU的时钟频率。如果CCLK参数小于CPU的时钟,那闪存的操作有可能不稳定。如果CCLK参数高于CPU的时钟,闪存操作有可能慢比预期。如果CCLK不等于CPU时钟,闪存的可靠性不能得到保证。

带UART的LPC11U68万利开发板和Xpresso开发板用于实现演示代码。

8.png

图 8.        LPC11U68万利开发板

9.png

图 9.        LPC11U68 Xpresso开发板

10.png

图 10.  RS232串口线

将串口线连接到LPC11U68万利开发板和PC,并且运行代码。按照控制台的指令进行操作。LPC11U68的Xpresso开发板不支持UART连接。

11.png

图 11.  LPC11U68万利开发板上的UART和 调试器连接

对于Keil IDE使用ULINK调试器,对于LPCXpresso IDE使用LPC Link-2,以及对于IAR Embedded Workbench IDE可以使用Jlink。   

1234.png

图 12.  ULINK调试器  

13.png       

图 13.  LPC Link-2

14.png

图 14.  Segger J-link


5.3        应用示例

演示软件发送一个菜单系统到PC,通过UART连接,以9600波特率。演示软件演示了IAP调用:

•        EEPROM写入

•        EEPROM读取

•        读取器件的部分ID

•        读取启动代码的版本

•        擦除扇区

•        从RAM复制内容到闪存

•        验证在存储区位置的数据

•        擦除页

下图显示了在PC上使用Tera Term的 UART菜单显示。

15.png

图 15.  PC上的UART窗口

在万利开发板的IAR包中,UART方式没有实现。当IAP成功时,Led发光。

在LPC11U68的Xpresso开发板,板上的LED指示了IAP的状态。如果IAP成功,LED指示灯变成绿色。如果IAP失败变为红色。

16.png

图 16.  Xpresso开发板上的状态指示灯

回复

使用道具 举报

阿哲
发表于: 2016-1-20 21:18:43 | 显示全部楼层

6.        结论


本应用笔记提供了用于在LPC11U6x微控制器系列实现IAP的例程。 可用于LPC11U6x的IAP程序提供了一种简便的方法用于数据存储或程序更新。由于这些程序存储在片上ROM,用户应用程序的代码规模可以最小化。

有关IAP程序如何操作的其他详细信息,请参阅LPC11U6x的用户手册。

回复

使用道具 举报

阿哲
发表于: 2016-1-22 22:25:09 | 显示全部楼层

NXP AN11511_LPC11U6x在应用编程IAP应用笔记中文翻译文档:

AN11511_LPC11U6x在应用编程IAP应用笔记.pdf (1.01 MB, 下载次数: 14)

回复

使用道具 举报

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

本版积分规则



手机版|

GMT+8, 2024-11-8 06:07 , Processed in 0.060498 second(s), 7 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

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