2024年3月7日发(作者:郎泽洋)
LPC3250采用ARM926EJ-S内核,运行频率可高达208MHz;
支持矢量浮点协处理器;
32kB 指令高速缓存和32kB 数据高速缓存;
高达256kB 的内部SRAM(IRAM);
可选择从不同的外部设备中启动:NAND Flash、SPI 存储器、USB、UART 或静态存储器;
多层 AHB 系统为每个AHB 主机单独提供总线,包括CPU 的指令总线和数据总线、DMA 控制器的两条数据总线和USB 控制器的另一条总线,两条数据总线一条用于LCD、
另一条用于以太网MAC。一般情况下没有仲裁延迟,除非出现2 个主机同时访问同一个从机的情况。
DDR 和SDR SDRAM 以及静态设备的外部存储器控制器;
2 个NAND Flash 控制器。一个支持单级NAND Flash 器件,另一个支持多级NANDFlash 器件;
1 个主机中断控制器(MIC)和2 个从机中断控制器(SIC),支持74 个中断源;
1 个8 路通用AHB DMA 控制器(GPDMA),可与SD 卡端口、高速UART、I2S
端口和SPI 接口一同使用,来实现存储器到存储器之间的传输;
串行接口:
-带有特定 DMA 控制器的10/100 以太网MAC;
-USB 接口支持设备、主机(遵循OHCI)或On-The-Go(OTG),带有相关的DMA 控制器,由特定的PLL 来提供所需的48MHz USB 时钟;
-4 个标准UART,带有小数波特率发生器和64 字节FIFO,其中一个标准的UART支持IrDA;
-3 个其它的高速UART,在13MHz 的主振荡器作用下可支持高达921,600bps的板内通信;所有高速UART 都提供64 字节FIFO;
-2 个SPI 控制器;
-2 个SSP 控制器;
-2 个独立的主机I2C 接口,具有标准开漏管脚。I2C 总线接口支持单主机、从机和多主机的I2C 配置;
-2 个I2S 接口,每个具有独立的输入(RX)和输出(TX)通道。每个通道可在3个管脚上独立操作,或输入和输出通道可使用4 个管脚和1 个共用的时钟;
其它外设:
-LCD 控制器支持STN 和TFT 面板,带有特定的DMA 控制器。可编程的显示分辨率高达1024×768;
-加密数字(SD)存储卡接口,遵循SD 存储卡规范版本1.01;
-通用输入、输出和I/O 管脚,包括12 个通用输入管脚、24 个通用输出管脚和51个通用I/O 管脚;
-10 位、400kHz 的A/D 转换器,带3 个管脚的输入多路复用。或者,A/D 转换器可用作触屏控制器;
LPC3250内置16KB ROM程序,从以下4个源引导:UART5,SSP0(SPI模式),EMC 静态CS0存储器,NAND FLASH。从这4个源加载程序代码到内部IRAM.
当BOOT运行时,它保留IRAM的0X0000 E000 到0X0000 FFFF为堆栈,变量和其它软件功能。如果用户程序代码超过56KB,Boot加载以后将使IRAM保留空间受到破坏,发生错误。但EMC Boot不受此56KB的限制。
Boot程序开始读SERVICE_N输入脚,(GPI_01).若为0,程序作为一个服务Boot。传送到IRAM的代码将作为一个二次程序。若为1,BOOT将照例执行到正常引导模式。
正常引导模式开始于检测SSP0的SPI存储器引导表。如果成功,代码将copy到执行区IRAM。PC跳到代码块的首地址。软件控制权交给传送的代码。如果SPI引导失败,Boot将检测EMC的CS0静态存储器,若代码有效,存储器被配置,Bootloader跳到0XE000 0004开始执行。若EMC代码无效,Bootloader检测NAND FLASH代码是否存在,若存在,传送一个代码块到IRAM,并且跳到首地址,软件控制权交给代码。
SPI引导模式:
Bootloader首先从SPI存储器读一个32bit的确认字和32bit的下载数据长度。若确认字无效或数据长度是0XFFFF FFFF或0X0,就意味着SPI存储 器没有连接或引导代码无效。则SPI引导失败并继续下一个引导器件。
若有效,Bootloader从SPI存取器读并copy所有的数据到IRAM的0X0地址。软后Bootloader设置BOOT_MAP寄存器为1并跳到0X0地址执行加载代码。
注意:Bootloader不检查下载代码长度。一个超过56KB的代码存储到IRAM将引起不可预测的错误。
确认字:0X13579BDF
SPI FLASH/EEPROM 数据格式:
-----地址---------------------内容-----
1 0XDF
2 0X9B
3 0X57
4 0X13
5 数据长度字节0
6 数据长度字节1
7 数据长度字节2
8 数据长度字节3
9 数据字节0
.. 数据字节1
.. ..
数据长度+7 最后一个数据字节(数据长度)
EMC 静态存储引导:
Bootloader首先读SPI1_DATIN脚的值,并把它写到EMCStaticConfig0 寄存器的PB位。然后Bootloader在地址0XE000 0000读存储器宽度配置位(MW)确定存储器宽度。如果没有有效的存储器宽度,EMC 引导失败Bootloader继续下一个boot引导。否则,Bootloader写存储器宽度值到EMCStaticConfig0寄存器,然后Bootloader检查0x0地址的确认字,如果无效,EMC引导失败Bootloader继续尝试下一个引导。否则,Bootloader设置BOOT_MAP为1,并跳转到0XE000 0004 开始执行代码。
EMC 静态存储器CS0数据格式
地址 存储内容
0xE000 0000 0x13579BDm[1]
0xE000 0004 Word 0
0xE000 0008 Word 1
... ...
... Last Word in EMC memory
m表示存储器宽度,(nn位没有用,应当设为0)
m内容 存储器宽度
nn00 8-bit
nn01 16-bit
nn10 32-bit
nn11 Reserved
NAND FLASH 引导步骤
经过认证的NAND Flash器件:
制造商 器件名 容量 IO宽度 制造厂代码 器件代码 地址周期 使用0X30命令
SAMSUNG K9F5608Q0B 256 Mbit 8 bit ECh 35h 3 no
SAMSUNG K9K1208Q0C 512 Mbit 8 bit ECh 36h 4 no
SAMSUNG K9F1208Q0C 512 Mbit 8 bit ECh 36h 4 no
SAMSUNG K9F1G08Q0C 1Gbit 8 bit ECh A1h 4 Yes
SAMSUNG K9F2G08Q0C 2Gbit 8 bit ECh AAh 5 Yes
从NAND Flash引导时,boot代码需要找出有多少页要拷贝,和NAND Flash的型号。NAND Flash的第一块或第二块的第一页包含有代码的工作信息。Bootloader试图通过读器件ID识别NANDFlash 器件.如果上表的器件被连接,Bootloader将进入传输数据从NANDFlash器件到IRAM.如果读ID命令未能识别NAND FLASH器件,Bootloader将继续查询并试图测定是否有一个有效的ICR在NANDFLASH,并用有效的ICR计算出配置信息。
引导代码读出配置为16位的MLC NAND Flash控制器第一页。这意味着只有第一个字节如word0,2,4...包含Bootloader需要的数据。
LPC3250 memory map
==================================================
EMC_CS3 0XE300 0000 TO 0XE3FF FFFF
--------------------------------------------------
EMC_CS2 0XE200 0000 TO 0XE2FF FFFF
--------------------------------------------------
EMC_CS1 0XE100 0000 TO 0XE1FF FFFF
--------------------------------------------------
EMC_CS0 0XE000 0000 TO 0XE0FF FFFF
==================================================
EMC_DYSC1 0XA000 0000 TO 0XBFFF FFFF
--------------------------------------------------
EMC_DYSC0 0X8000 0000 TO 0X9FFF FFFF
==================================================
IROM 0X0C00 0000 TO 0X0FFF FFFF
--------------------------------------------------
IRAM 0X0800 0000 TO 0X0BFF FFFF
--------------------------------------------------
dummy space for DMA 0X0400 0000 TO 0X07FF FFFF
--------------------------------------------------
IROM OR IRAM 0X0000 0000 TO 0X03FF FFFF
Boot Map control register (BOOT_MAP - 0x4000 4014) 复位后,位0为0,IROM 映射到地址0.
LPC3250的引导过程:
1. 上电复位,从地址0X0开始运行,(所有的ARM都是这个模式)LPC3250在0地址IROM存储器。16KB。在IROM中是一段内部引导程序。完成上述的引导过程。
2. 我们选择的是NAND引导方式。程序代码存储在NAND flash中。对NAND FLASH 分区,从0到1是一段kickstart 引导代码。从2到20是一段S1L引导代码。20以后才是应用程序。因为内部IROM的boot程序只能引导很小的一段代码到内存执行。S1L的功能比较多,程序比较大,boot不能引导起来。所以只能在这里存放一个轻量级的kickstart。
3. 内部IROM先加载kickstart,然后由kickstart加载S1L到内部IRAM执行。S1L的功能比较丰富,驱动起SD卡,SDRAM,串口,NAND FLASH,SPI口等外部设备。
4. S1L在启动过程中可以通过串口监控启动过程。没有加载用户程序之前,按任意键就会进入命令行模式。通过help 命令可以显示S1L的所有命令。
5. S1L在延时以后加载用户程序到外部SDRAM,然后关闭外设时钟,并把PC指针跳转到0X80000000处。需要注意的是S1L在跳转之前,关闭了所有不用的外设时钟,在应用程序中如果要使用这个外设,必须打开时钟。否则就会驱动不成功。
6. 用户程序开始运行,初始化之前必须要做的一件事就是拷贝向量表。因为ARM体系规定所有的异常向量都是要跳转到从0x0开始的一段地址空间。LPC3250引导以后,会由bootloader程序把内部IRAM 从地址0X08000000映射到0x0处。用户程序需要把SDRAM的0x80000000开始的16个字的代码拷贝到0x08000000地址处。
CODE32
AREA vectors,CODE,READONLY
ENTRY
reset ;/* 中断向量表 */
start
IF :DEF: OUT_CHIP
DCD SNorFlahMW_16
ENDIF
LDR PC, resetAddr
LDR PC, undefinedAddr
LDR PC, swiAddr
LDR PC, prefetchAddr
LDR PC, dataAbortAddr
IF :DEF: IN_RAM
DCD |Image$$ROM_EXEC$$Length| + |Image$$IRAM$$Length|
ELSE
DCD 0
ENDIF
LDR PC, irqAddr
LDR PC, fiqAddr
resetAddr DCD resetInit
undefinedAddr DCD undefined
swiAddr DCD softwareInterruptAdd
prefetchAddr DCD prefetchAbort
dataAbortAddr DCD dataAbort
nouse DCD 0
irqAddr DCD irqHandler
fiqAddr DCD fiqHandler
//#ifndef __IN_RAM
INT8U i;
INT32U *cp1,*cp2;
cp1 = (INT32U*)reset;
// #ifdef __OUT_CHIP
// cp1 ++;
// #endif
cp2 = (INT32U*)0x08000000;
for(i=0;i<16;i++)
{
*cp2++ = *cp1++; //copy expression
}
如何烧写引导程序
1. 用一根平行串口线连接板子到PC机。
2. 在PC机上运行
3. 选择串口后点击“打开串口”按键。
4.
5. 点击“装载Bootloader”按键,程序会弹出对话框,按照说明短接跳线,点击确定
6.
7. 复位开发板或者重新上电。
8. 点击“一键更新Boot“,按照提示短接跳线,点击确定
9. 复位开发板,稍等一会会提示成功。
10. 至此,kickstart和S1L就烧写到FLASH 中。重新启动板子,会在串口输出提示信息。
如何烧写用户程序
烧写用户程序,需要先烧写引导程序kickstart和S1L。
1. 启动Tera Term串口监控程序,其它串口监控程序如DNX,SSCOM,超级终端也可以,但是不能从串口下载程序。
2. 连接板子的串口到PC机,给板子上电
3.
4. 串口会输出黑色部分的信息
5. 按任意键会出现命令提示符,
6. 首先擦除NAND FLASH 输入erase 20 200 1 ,20是开始地址,200是要擦除的BLOCK个数,1是参数
7. 输入load term raw 0x80000000 , raw是数据格式,0x80000000是加载地址。然后点击File – send file…弹出对话框选择二进制文件开始传送
8.
9. 传送完毕后要按alt + b 键返回命令行模式。
10. 输入nsave命令,保存传送的文件到nand flash
11. 输入aboot flash raw 0x80000000 ,设置自动引导参数
12. 复位,执行程序。
2024年3月7日发(作者:郎泽洋)
LPC3250采用ARM926EJ-S内核,运行频率可高达208MHz;
支持矢量浮点协处理器;
32kB 指令高速缓存和32kB 数据高速缓存;
高达256kB 的内部SRAM(IRAM);
可选择从不同的外部设备中启动:NAND Flash、SPI 存储器、USB、UART 或静态存储器;
多层 AHB 系统为每个AHB 主机单独提供总线,包括CPU 的指令总线和数据总线、DMA 控制器的两条数据总线和USB 控制器的另一条总线,两条数据总线一条用于LCD、
另一条用于以太网MAC。一般情况下没有仲裁延迟,除非出现2 个主机同时访问同一个从机的情况。
DDR 和SDR SDRAM 以及静态设备的外部存储器控制器;
2 个NAND Flash 控制器。一个支持单级NAND Flash 器件,另一个支持多级NANDFlash 器件;
1 个主机中断控制器(MIC)和2 个从机中断控制器(SIC),支持74 个中断源;
1 个8 路通用AHB DMA 控制器(GPDMA),可与SD 卡端口、高速UART、I2S
端口和SPI 接口一同使用,来实现存储器到存储器之间的传输;
串行接口:
-带有特定 DMA 控制器的10/100 以太网MAC;
-USB 接口支持设备、主机(遵循OHCI)或On-The-Go(OTG),带有相关的DMA 控制器,由特定的PLL 来提供所需的48MHz USB 时钟;
-4 个标准UART,带有小数波特率发生器和64 字节FIFO,其中一个标准的UART支持IrDA;
-3 个其它的高速UART,在13MHz 的主振荡器作用下可支持高达921,600bps的板内通信;所有高速UART 都提供64 字节FIFO;
-2 个SPI 控制器;
-2 个SSP 控制器;
-2 个独立的主机I2C 接口,具有标准开漏管脚。I2C 总线接口支持单主机、从机和多主机的I2C 配置;
-2 个I2S 接口,每个具有独立的输入(RX)和输出(TX)通道。每个通道可在3个管脚上独立操作,或输入和输出通道可使用4 个管脚和1 个共用的时钟;
其它外设:
-LCD 控制器支持STN 和TFT 面板,带有特定的DMA 控制器。可编程的显示分辨率高达1024×768;
-加密数字(SD)存储卡接口,遵循SD 存储卡规范版本1.01;
-通用输入、输出和I/O 管脚,包括12 个通用输入管脚、24 个通用输出管脚和51个通用I/O 管脚;
-10 位、400kHz 的A/D 转换器,带3 个管脚的输入多路复用。或者,A/D 转换器可用作触屏控制器;
LPC3250内置16KB ROM程序,从以下4个源引导:UART5,SSP0(SPI模式),EMC 静态CS0存储器,NAND FLASH。从这4个源加载程序代码到内部IRAM.
当BOOT运行时,它保留IRAM的0X0000 E000 到0X0000 FFFF为堆栈,变量和其它软件功能。如果用户程序代码超过56KB,Boot加载以后将使IRAM保留空间受到破坏,发生错误。但EMC Boot不受此56KB的限制。
Boot程序开始读SERVICE_N输入脚,(GPI_01).若为0,程序作为一个服务Boot。传送到IRAM的代码将作为一个二次程序。若为1,BOOT将照例执行到正常引导模式。
正常引导模式开始于检测SSP0的SPI存储器引导表。如果成功,代码将copy到执行区IRAM。PC跳到代码块的首地址。软件控制权交给传送的代码。如果SPI引导失败,Boot将检测EMC的CS0静态存储器,若代码有效,存储器被配置,Bootloader跳到0XE000 0004开始执行。若EMC代码无效,Bootloader检测NAND FLASH代码是否存在,若存在,传送一个代码块到IRAM,并且跳到首地址,软件控制权交给代码。
SPI引导模式:
Bootloader首先从SPI存储器读一个32bit的确认字和32bit的下载数据长度。若确认字无效或数据长度是0XFFFF FFFF或0X0,就意味着SPI存储 器没有连接或引导代码无效。则SPI引导失败并继续下一个引导器件。
若有效,Bootloader从SPI存取器读并copy所有的数据到IRAM的0X0地址。软后Bootloader设置BOOT_MAP寄存器为1并跳到0X0地址执行加载代码。
注意:Bootloader不检查下载代码长度。一个超过56KB的代码存储到IRAM将引起不可预测的错误。
确认字:0X13579BDF
SPI FLASH/EEPROM 数据格式:
-----地址---------------------内容-----
1 0XDF
2 0X9B
3 0X57
4 0X13
5 数据长度字节0
6 数据长度字节1
7 数据长度字节2
8 数据长度字节3
9 数据字节0
.. 数据字节1
.. ..
数据长度+7 最后一个数据字节(数据长度)
EMC 静态存储引导:
Bootloader首先读SPI1_DATIN脚的值,并把它写到EMCStaticConfig0 寄存器的PB位。然后Bootloader在地址0XE000 0000读存储器宽度配置位(MW)确定存储器宽度。如果没有有效的存储器宽度,EMC 引导失败Bootloader继续下一个boot引导。否则,Bootloader写存储器宽度值到EMCStaticConfig0寄存器,然后Bootloader检查0x0地址的确认字,如果无效,EMC引导失败Bootloader继续尝试下一个引导。否则,Bootloader设置BOOT_MAP为1,并跳转到0XE000 0004 开始执行代码。
EMC 静态存储器CS0数据格式
地址 存储内容
0xE000 0000 0x13579BDm[1]
0xE000 0004 Word 0
0xE000 0008 Word 1
... ...
... Last Word in EMC memory
m表示存储器宽度,(nn位没有用,应当设为0)
m内容 存储器宽度
nn00 8-bit
nn01 16-bit
nn10 32-bit
nn11 Reserved
NAND FLASH 引导步骤
经过认证的NAND Flash器件:
制造商 器件名 容量 IO宽度 制造厂代码 器件代码 地址周期 使用0X30命令
SAMSUNG K9F5608Q0B 256 Mbit 8 bit ECh 35h 3 no
SAMSUNG K9K1208Q0C 512 Mbit 8 bit ECh 36h 4 no
SAMSUNG K9F1208Q0C 512 Mbit 8 bit ECh 36h 4 no
SAMSUNG K9F1G08Q0C 1Gbit 8 bit ECh A1h 4 Yes
SAMSUNG K9F2G08Q0C 2Gbit 8 bit ECh AAh 5 Yes
从NAND Flash引导时,boot代码需要找出有多少页要拷贝,和NAND Flash的型号。NAND Flash的第一块或第二块的第一页包含有代码的工作信息。Bootloader试图通过读器件ID识别NANDFlash 器件.如果上表的器件被连接,Bootloader将进入传输数据从NANDFlash器件到IRAM.如果读ID命令未能识别NAND FLASH器件,Bootloader将继续查询并试图测定是否有一个有效的ICR在NANDFLASH,并用有效的ICR计算出配置信息。
引导代码读出配置为16位的MLC NAND Flash控制器第一页。这意味着只有第一个字节如word0,2,4...包含Bootloader需要的数据。
LPC3250 memory map
==================================================
EMC_CS3 0XE300 0000 TO 0XE3FF FFFF
--------------------------------------------------
EMC_CS2 0XE200 0000 TO 0XE2FF FFFF
--------------------------------------------------
EMC_CS1 0XE100 0000 TO 0XE1FF FFFF
--------------------------------------------------
EMC_CS0 0XE000 0000 TO 0XE0FF FFFF
==================================================
EMC_DYSC1 0XA000 0000 TO 0XBFFF FFFF
--------------------------------------------------
EMC_DYSC0 0X8000 0000 TO 0X9FFF FFFF
==================================================
IROM 0X0C00 0000 TO 0X0FFF FFFF
--------------------------------------------------
IRAM 0X0800 0000 TO 0X0BFF FFFF
--------------------------------------------------
dummy space for DMA 0X0400 0000 TO 0X07FF FFFF
--------------------------------------------------
IROM OR IRAM 0X0000 0000 TO 0X03FF FFFF
Boot Map control register (BOOT_MAP - 0x4000 4014) 复位后,位0为0,IROM 映射到地址0.
LPC3250的引导过程:
1. 上电复位,从地址0X0开始运行,(所有的ARM都是这个模式)LPC3250在0地址IROM存储器。16KB。在IROM中是一段内部引导程序。完成上述的引导过程。
2. 我们选择的是NAND引导方式。程序代码存储在NAND flash中。对NAND FLASH 分区,从0到1是一段kickstart 引导代码。从2到20是一段S1L引导代码。20以后才是应用程序。因为内部IROM的boot程序只能引导很小的一段代码到内存执行。S1L的功能比较多,程序比较大,boot不能引导起来。所以只能在这里存放一个轻量级的kickstart。
3. 内部IROM先加载kickstart,然后由kickstart加载S1L到内部IRAM执行。S1L的功能比较丰富,驱动起SD卡,SDRAM,串口,NAND FLASH,SPI口等外部设备。
4. S1L在启动过程中可以通过串口监控启动过程。没有加载用户程序之前,按任意键就会进入命令行模式。通过help 命令可以显示S1L的所有命令。
5. S1L在延时以后加载用户程序到外部SDRAM,然后关闭外设时钟,并把PC指针跳转到0X80000000处。需要注意的是S1L在跳转之前,关闭了所有不用的外设时钟,在应用程序中如果要使用这个外设,必须打开时钟。否则就会驱动不成功。
6. 用户程序开始运行,初始化之前必须要做的一件事就是拷贝向量表。因为ARM体系规定所有的异常向量都是要跳转到从0x0开始的一段地址空间。LPC3250引导以后,会由bootloader程序把内部IRAM 从地址0X08000000映射到0x0处。用户程序需要把SDRAM的0x80000000开始的16个字的代码拷贝到0x08000000地址处。
CODE32
AREA vectors,CODE,READONLY
ENTRY
reset ;/* 中断向量表 */
start
IF :DEF: OUT_CHIP
DCD SNorFlahMW_16
ENDIF
LDR PC, resetAddr
LDR PC, undefinedAddr
LDR PC, swiAddr
LDR PC, prefetchAddr
LDR PC, dataAbortAddr
IF :DEF: IN_RAM
DCD |Image$$ROM_EXEC$$Length| + |Image$$IRAM$$Length|
ELSE
DCD 0
ENDIF
LDR PC, irqAddr
LDR PC, fiqAddr
resetAddr DCD resetInit
undefinedAddr DCD undefined
swiAddr DCD softwareInterruptAdd
prefetchAddr DCD prefetchAbort
dataAbortAddr DCD dataAbort
nouse DCD 0
irqAddr DCD irqHandler
fiqAddr DCD fiqHandler
//#ifndef __IN_RAM
INT8U i;
INT32U *cp1,*cp2;
cp1 = (INT32U*)reset;
// #ifdef __OUT_CHIP
// cp1 ++;
// #endif
cp2 = (INT32U*)0x08000000;
for(i=0;i<16;i++)
{
*cp2++ = *cp1++; //copy expression
}
如何烧写引导程序
1. 用一根平行串口线连接板子到PC机。
2. 在PC机上运行
3. 选择串口后点击“打开串口”按键。
4.
5. 点击“装载Bootloader”按键,程序会弹出对话框,按照说明短接跳线,点击确定
6.
7. 复位开发板或者重新上电。
8. 点击“一键更新Boot“,按照提示短接跳线,点击确定
9. 复位开发板,稍等一会会提示成功。
10. 至此,kickstart和S1L就烧写到FLASH 中。重新启动板子,会在串口输出提示信息。
如何烧写用户程序
烧写用户程序,需要先烧写引导程序kickstart和S1L。
1. 启动Tera Term串口监控程序,其它串口监控程序如DNX,SSCOM,超级终端也可以,但是不能从串口下载程序。
2. 连接板子的串口到PC机,给板子上电
3.
4. 串口会输出黑色部分的信息
5. 按任意键会出现命令提示符,
6. 首先擦除NAND FLASH 输入erase 20 200 1 ,20是开始地址,200是要擦除的BLOCK个数,1是参数
7. 输入load term raw 0x80000000 , raw是数据格式,0x80000000是加载地址。然后点击File – send file…弹出对话框选择二进制文件开始传送
8.
9. 传送完毕后要按alt + b 键返回命令行模式。
10. 输入nsave命令,保存传送的文件到nand flash
11. 输入aboot flash raw 0x80000000 ,设置自动引导参数
12. 复位,执行程序。