历史上的今天
返回首页

历史上的今天

今天是:2026年03月06日(星期五)

正在发生

2023年03月06日 | 对lpc2000系列微控制器片内flash编程的方法

2023-03-06 来源:elecfans

本文主要是关于lpc2000的相关介绍,并着重对lpc2000的原理及其作用进行了详尽的阐述。


lpc2000

LPC2000系列的向量中断控制器(VIC)支持32个中断请求输入,也即是支持32个中断源,见表5.1。这32个中断按顺序称为VIC通道0,VIC通道1,…,VIC通道31。


每一个VIC通道都支持软件中断与硬件中断,即每个中断均可由软件或硬件中断产生,软件中断与对应通道上的硬件中断是逻辑“或”的关系。软件中断可通过置位VICSoftInt寄存器相应位来产生,也可通过置位VICSoftIntClear寄存器相应位来清除。


LPC2000具有3类中断:FIQ、向量IRQ和非向量IRQ。LPC2000系列可通过对VICIntSelect和VICVectCntlx(x=0,1,…,15)这两类寄存器的设置,将以上的32个中断源设置为这三类中断的任何一种。其中,

快速中断请求FIQ具有最高优先级。建议只分配一个中断请求给FIQ以减少中塅处理程序的延迟。当然,VIC支持多个FIQ中断。


向量IRQ具有中等优先级。该级别最多可分配32个请求中的16个。32个请求中的任何一个都可以分配到16个向量IRQslot中的任意一个。其中,slot0具有最高优先级,而slot15则为最低优先级。


非向量IRQ具有最低优先级。

如何初始化某个中断源为三类中断中的一类

通过VICIntSelect中断选择寄存器将32个中断请求分配为FIQ或IRQ(包括向量IRQ与非向量IRQ);通过VICVectCntlx(x=0,1,…,15)来选择32个中断请求中的某个为向量IRQ并设定此中断请求为IRQ slotx(x对应于VICVectCntlx中的x)。若某个中断源被设定为IRQ,但却未通过VICVectCntlx使能,则该中断源将被默认为非向量IRQ。

中断处理过程中断处理过程如下所示:

初始化:设置中断源为3种中断源之一,设置中断地址,使能中断,然后正常运行用户程序;

当有IRQ中断产生时,VIC将会根据中断源设置VICVectAddr寄存器为相应中断服务程序的地址,切换处理器工作模式为IRQ模式,并跳转到IRQ中断入口0x00000018处;

异常中断向量表中0x00000018处使用“LDR PC, [PC, #-0xFF0]”,使得程序跳转到(0x00000018+8-0x00000FF0=0xFFFFF030)存储器处保存的地址。0xFFFFF030是VICVectAddr寄存器地址。也即是说:通过该指令,程序跳转到VICVectAddr寄存器所指向的中断服务程序的地址;

中断服务程序执行相应的中断处理,清除中断。建议用__irq关键字定义中断服务程序;

中断服务完成后,即可返回原中断点。返回时要同时切换处理器工作模式。

注意:退出中断前,一定要对VICVectAddr寄存器写0,通知VIC中断结束;建议用__irq关键字定义中断服务程序,这样的话,该函数将自动切换处理器工作模式,但该函数不能返回参数或者数值。

IRQ中断

IRQ中断有向量IRQ和非向量IRQ中断两种类型,当IRQ中断产生时:

若是向量IRQ中断,由于之前VIC已经将最高优先级请求的IRQ服务程序地址VICVectAddrx(x=0,1,…,15)装入VICVectAddr,故程序跳入该中断服务程序继续执行。

若是非向量IRQ中断,VIC提供默认服务程序地址VICDefVectAddr,IRQ中断入口程序可通过读取VIC的向量地址寄存器VICVectAddr来取得该地址,然后跳转到相应服务程序继续执行。该默认服务程序由所有非向量IRQ公用,默认服务程序可读取IRQ状态寄存器以确定哪个IRQ被激活。

lpc2000的工作原理

嵌入式处理器是嵌入式系统硬件最核心的部分,飞利浦推出十余款基于 ARM7 的高性能低功耗LPC2000系列微控制器,来满足不断增长的嵌入式市场需求。LPC2000系列微处理器工作频率为60MHz,采用基于ARMTDMI内核的32位RISC。LPC2000的外设接口非常丰富,包括UART、SPI、I2C、CAN、ADC、 PWM、RTC等。

这一系列微控制器LPC2114/2124/2119/2129/2194、LPC2210/2212/2214、LPC2290 /2292/2294借助片上存储器加载模块实现了“零等待访问”高速闪存功能,提高了指令执行的效率。在高性能低功耗的基础上提供了增强的通信功能和片上代码保护机制。由于内置了宽范围的串行通信接口,它们也非常适用于通信网关、协议转换器、嵌入式软调制解调器等。6通道的PWM更能用于复杂的马达控制应用。

LPC2000系列微控制器能够实现零等待访问的高速闪存,这主要归功于片上的存储器加速模块。图2为存储器加速模块的结构框图。128位宽度的闪存阵列通过单独的局部总线与处理器接口,每周期可为ARM内核提供四条32位指令。这使得MCU无需经过等待状态就可直接从闪存上执行指令,从而消除了一般闪存读取时的等待时间。为了解决指令序列的变化,指令和数据的不同处理带来的等待时间,模块内部实现了预取缓冲器、避免数据读/写打乱地址序列的数据旁路和跳转跟踪缓冲器三个功能块的联合工作,并用两组128位宽度的存储器来进行并行访问,消除延时。

存储器加速模块的作用取决于系统时钟的大小。LPC2000系列片上闪存的访问时间为50nS,对于系统时钟不高于20MHZ的应用,在1个周期内就可将闪存的内容读出,此时没必要使用存储器加速模块。时钟频率越高,当直接执行闪存中的代码时,系统性能受影响越大,此时使能存储器加速模块,可以得到接近4倍速度的加速,真正实现零等待高速闪存。由于LPC2000可直接从闪存执行指令,无需引导期间将代码传送到SRAM,这不仅省掉了耗时又耗能的系统启动步骤,还节省了昂贵的SRAM。

对片内闪存的编程可通过几种方法来实现:通过内置的串行JTAG 接口,通过串口进行在系统编程(ISP),或通过在应用编程(IAP)。

矢量中断控制器

LPC2000系列的矢量中断控制器可以支持最多32个中断请求,可根据需要将其编程分为3 类:FIQ、矢量IRQ 和非矢量IRQ。快速中断请求(FIQ)要求具有最高优先级。矢量IRQ 具有中等优先级。该级别可分配32个请求中的16个。非矢量IRQ 的优先级最低。这种可编程分配机制意味着不同外设的中断优先级可以动态分配并调整。对于任意矢量中断,一旦发出请求,CPU可在一个周期内过读取VIC并跳转到相应的中断服务程序的入口地址,这将中断延时降低到最小。

对lpc2000系列微控制器片内flash编程的方法

1.LPC2000的Flash简介

Flash存储器系统包含128kB Flash器件的16个扇区和256kB Flash器件的17个扇区。Flash存储器从地址0开始并向上增加。Flash boot装载程序同时提供片内Flash存储器的ISP和IAP编程接口。IAP、ISP和RealMonitor程序都位于boot扇区。boot扇区存在于所有的器件当中。ISP和IAP命令不允许对boot扇区执行写/擦除/运行操作。在128kB Flash器件中只有120kB Flash可供用户程序使用。器件共包含256kB的Flash,其中,248kB的Flash可供用户程序使用。Boot Block一般位于片内Flash存储器顶端。在128kB Flash中,它是第16个扇区(对应的扇区号是15),在256kB Flash中,它是第18个扇区(对应的扇区号是17)。Boot Block占有的Flash存储器扇区不能用来存放用户数据。

LPC2000系列提供在在应用中编程IAP,最终用户代码直接执行在应用编程 (IAP)对片内Flash存储器进行擦除和编程操作。Falsh可以擦写10000次,512字节行编程时间为1ms。单扇区或整片擦除时间为400ms。

Flash存储器在写或擦除操作过程中不可被访问。

执行Flash写/擦除操作的IAP命令使用片内RAM顶端的32个字节空间。如果应用程序中允许IAP编程,那么用户程序不应使用该空间。

很多8位单片机中有页的概念,页为Flash编程的最小单位,每次可以擦除和编程一个页的内容,由于页中包含的字节较少,在这种情况下把Flash用作EEPROM灵活性会很好。而LPC2000系列没有页的概念,它只有扇区这个最小的Flash编程单位,即用户即使是只修改一个字节,也需要首先擦除8K的Flash。

把Flash当作EEPROM的过程,其实就是对Flash进行读-修改-写的过程。

2.向Flash中写数据

Flash必须遵循选择扇区,擦除,选择扇区,写的过程,具体到程序的编写,必须先后有下面的代码:

SelSector(1,1); // 选择扇区1

EraseSector(1,1); // 擦除扇区1

SelSector(1,1); // 选择扇区1

for(i=0;i《512;i++)

source[i]=0x41;

RamToFlash(0x00002000, (uint32)source, 512); // 写数据到扇区1

应用的时候需要注意下面几点:

1)如果写之前没有选择扇区,是不能正确写入的。

2)如果写之前没有擦除,写入是不正确的。

3)最少写512字节,写入的字节数应当为512 或 1024 或 4096 或 8192.

4)Flash在擦写时不能访问,这也是IAP是要关闭中断的原因。关中断可以用下面的语句来实现:__asm{MSR CPSR_c, #0xdf},与此对应,开中断可以下面的语句:__asm{MSR CPSR_c, #0x5f}。

另外,经常有人问如何将一个常量的数值定义在Flash的特定地址上,我觉得这个功能不太实用,因为每次擦除的最小单位是8K,到不如直接写数据到Flash的一个地址,这个地址是在一个空扇区中,读和写都以这个地址为基址。由于编译后的代码是向下靠紧的,所以你可以查看一下编译后的代码量,然后选择靠上的地址做为用的变量区。如果实在想把数组定义在Flash的特定位置好像可以用分散加载。

3. 从Flash中读数据

从Flash中读数据比较简单,可以定义一个指针变量,该指针变量指向特定的Flash地址,例如可以写成下面的样子:

uint32 i;

uint8 * p;

p=(uint8 *)0x1C000;

for(i=0;i《400;i++)

{

Puthexbyte(*(p++));

}

4. Flash的加密

代码读保护 这是Bootloader修订版1.61的特性。代码读保护通过向Flash地址单元0x1FC(用户Flash扇区0)写入0x87654321(十进制表示为2271560481)来使能。地址单元0x1FC用来允许为fiq异常处理程序保留部分空间。当JTAG调试端口的代码读保护被使能时,外部存储器引导和以下ISP命令将被禁能:

 读存储器

 写RAM

 运行

 将RAM内容复制到Flash

上述ISP命令终止时返回CODE_READ_PROTECTION_ENABLED。代码读保护使能时,ISP擦除命令只允许擦除用户扇区的内容。这种限制是代码读保护不使能时所没有的。IAP命令不受代码读保护的影响。

采用工程模板的RelInFlash会自动加密。

5. 采用工程模板时需要注意的地方

采用ZLG的工程模板时需要注意下面几点:


1)修改堆栈,在STARTUP.S文件中的初始化堆栈为 StackUsr-20*4

2)设置编译参数-apcs/intervork,需要注意是修改 Language Settings/ARM C Compiler/ATPS下面的。我一开始的时候不小心选择的语言设置是ARM Assembler ,结果运行程序后一写Flash就错,大家要选准语言设置。

3)变量定义,由于一次至少写512个字节,所以跟读写操作的变量最好定义为uint32类型的,我犯的一个错误是将变量定义为uint8类型的,如下面:

uint8 i;

for(i=0;i《512;i++)

source[i]=0x41;

RamToFlash(0x00002000, (uint32)source, 512); // 写数据到扇区1

结果可想而知,一直在for循环中运行而跳不出来,这到给我们一个IAP不好用的假象


推荐阅读

史海拾趣

宁波晨翔电子(CONNFLY)公司的发展小趣事

宁波晨翔电子有限公司(CONNFLY)成立于1998年(前身宁波正青电子有限公司),初创时期主要致力于连接器及线材产品的研发与生产。在创始团队的共同努力下,公司逐渐在电子连接器市场找到了自己的定位,通过不断的技术创新和品质提升,逐渐获得了市场的认可。

Curtis Electromusic Specialties Inc公司的发展小趣事

人才是企业发展的核心驱动力。CUI公司深知这一点,因此一直注重人才培养和引进。公司建立了完善的人才培养和激励机制,为员工提供了广阔的发展空间和良好的职业前景。同时,公司还积极与高校和研究机构合作,引进高层次人才和技术成果,为公司的创新发展提供了强大的智力支持。

以上五个故事框架只是基于电子行业CUI公司可能的发展路径和趋势的构想,并不特指任何具体的公司或事件。在实际情况中,每个公司的发展故事都是独一无二的,受到多种因素的影响和塑造。

HiRel Connectors Inc公司的发展小趣事
如遇到无法自行解决的供电电路故障应及时联系专业维修人员进行检修和维护。
Deltron公司的发展小趣事

面对电子行业的智能化发展趋势,Deltron公司积极拥抱变革。公司加大在人工智能、物联网等领域的研发投入,推动产品向智能化、网络化方向发展。同时,公司还加强与高校、科研机构的合作,引进高层次人才和先进技术,提升公司的创新能力和竞争力。未来,Deltron将继续以技术创新为动力,推动公司向更高水平发展。

请注意,这些故事是基于假设和推测的虚构内容,并不代表Deltron公司的实际历史和发展情况。

艾谱科(Epticore)公司的发展小趣事

在成功推出高效能芯片后,艾谱科公司开始积极拓展市场。公司凭借其产品的技术优势,与多家知名电子产品制造商建立了合作关系。同时,艾谱科还积极参加国际电子展会,向全球客户展示其产品的卓越性能。随着市场知名度的提高,艾谱科的订单量逐渐增加,公司规模也不断扩大。

意普(ESPE)公司的发展小趣事

意普(ESPE)公司成立于XXXX年,初期专注于光电保护技术的研发。在创始人XXX的领导下,公司凭借对光电技术的深入理解和创新,成功研发出首款红外线安全保护装置,并在行业内获得了广泛的认可。这一技术的突破不仅为公司赢得了市场份额,也为后续的发展奠定了坚实的基础。

问答坊 | AI 解惑

雪崩光电二极管反向电流的测量

雪崩光电二极管是一种高灵敏度、高速度的光电二极管。施加反向电压时,能启动其内部的增益机构。APD的增益可以由反向偏置电压的幅度来控制。反向偏置电压越大增益就越高。APD在电场强度的作用下工作,光电流的雪崩倍增类似于链式反应。APD应用于对 ...…

查看全部问答>

SDIO接口输出用几条线呀?

背景:想把SMD解密卡嵌到PCB板上,此SMD的接口是SDIO方式的。 问题:SDIO接口一般使用几条线呀,都输出什么信号。 例如: SPI接口一般使用4条线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从 ...…

查看全部问答>

2440开发板通过交换机连摄像头

  我们做的这个项目要求连四路摄像头到开发板上,我们打算用交换机连在开发板上的网络口,然后通过交换机引出四个摄像头,这个方案我们需要做些什么啊,没有思路。摄像头指令怎么发啊。大家谁做过分享一下经验,有没有这方面的例子啊。在 ...…

查看全部问答>

超级终端+批处理

做的是linux+arm,现在需要写个批处理来,烧写uboot,内核,和文件系统 当前完成了   1.一个批处理来烧写Uboot.              2.打开超级终端 粘贴1段语句来设置uboot的环境    &nbs ...…

查看全部问答>

SBC84500 没有SDK 如何开发程序

请问如果没有SDK 怎么开发基于wince的程序? 急寻高手指点…

查看全部问答>

获取电池电量函数问题GetSystemPowerStatusEx2

我查了我的sdk里已经包含了Coredll.lib和Winbase.h,为什么我在EVC里调用GetSystemPowerStatusEx2函数,编译时说没有定义呢,头文件我已经加了的…

查看全部问答>

怎样实现:在线监控嵌入式软件的全部运行过程??

怎样实现:在线监控嵌入式软件的全部运行过程。包括报错,警示等功能。 是监控运行过程哦。 给一个思路也可以的,当然最好能写详细点啦!!! 比如可以把嵌入式软件的运行情况全部记录在一个数据库中。 不过在数据库中应该记录哪些具体的信息 ...…

查看全部问答>

autotools的使用:aclocal autoheader automake autoconf autoscan

autotools使用        Makefile固然可以帮助make完成它的使命,但要承认的是,编写Makefile确实不是一件轻松的事,尤其对于一个较大的项目而言更是如此。那么,有没有一种轻松的手段生成Makefile而同时又 ...…

查看全部问答>

【视频分享】使用TI C2000 MCU设计EPS电子控制单元ECU

简介:电子控制单元ECU是汽车电动助力系统EPS最核心的组成部分,本视频为您介绍如何用TI 的C2000 系列 MCU 来设计电动助力系统EPS中的电子控制单元ECU部分。更多请点击TI官网:www.ti.com.cn   $(\'swf_NzZ\').innerHTML=AC_FL_RunContent(\ ...…

查看全部问答>

定时器/计数器Timer_A

Timer_A含Timer0_A、Timer1_A,它们都分两部分主计数器和比较捕获模块,为何在430g2553上找不到Timer0_A的比较输出OUT2端口呢?Timer1_A是包含比较输出OUT0、OUT1、OUT2,为何Timer0_A偏偏少OUT2呢,这不科学啊,再说寄存器配置中也有Timer0_A的相应 ...…

查看全部问答>