(arm wince) ep93xx启动初始化

EP9301的BootROM(1)


2.1     BootROM概述      


       为方便用户调试和进行系统开发,EP93XX的ARM微处理器内部都设计了ROM,存放了用于系统启动的最简单的初始化代码,当系统上电时,可以选择从片 内的ROM开始运行程序,我们称之为BootROM,由于受ROM容量的限制,这部分程序一般都比较小,仅能完成一些基本的功能,如初始化一个串行口,可 以和PC机进行简单的串行通讯,将PC上的程序接受下来,存放在系统芯片内部的RAM中,然后跳转到那里运行等。



       EP9301的BootROM支持从串行口接收程序并运行、从系统的FLASH(或ROM)启动运行、或从系统的SPI存储器读取代码并运行,但这种方式用得相对较少。


       EP9301片内集成了16KB的ROM,分成3个部分,前8KB的内容为系统的启动代码,接下来的4KB为第一保护代码块,最后4KB为第二保护代码 块。当系统以非保护方式启动时,可以访问到前8KB的代码,而当系统以保护方式启动时,后面两个保护代码块之一是可访问的。


       EP93XX的这种安全机制对需要加密的系统设计非常有用,它可以使每个系统运行的软件都是唯一的,甚至可以禁止通过JTAG对系统进行侦测并禁止系统从外部存储器启动,完全防止对系统软件的抄袭和仿制。


       在EP9301内,系统的BootROM基地址固定为 0x8009_0000,当使能BootROM时(在大多数情况下),启动代码被拷贝到0x0地址被执行。


       BootROM中的代码完成必要的初始化工作以后,决定系统的哪一个片外存储器中的代码首先执行,通常,它支持以下几种方式:

       1、UART1方式:通过UART1接收从主机传来的代码放到片内缓冲区(SRAM)并执行;

       2、SPI串行ROM方式:从系统的SPI接口的串行ROM读取代码拷贝到片内缓冲区(SRAM)并执行;

       3、FLASH方式:执行FLASH中的代码。

       BootROM代码禁用ARM920T的MMU,所有的存储器访问均为实际的物理地址。无论从哪里获取的代码,均需要有一个前缀标识字串(HeaderID):CRUS或SURC,否则代码就不能执行,看来Cirrus Logic希望我们随时都要想起它。



2.2     BootROM的启动流程


        RootROM按如下固定的启动流程执行:




        1、  存储器重映射;


        2、  将用于指示系统运行状态的红、绿发光二极管置为如下状态:红灯亮,绿灯熄;


         3、  禁用看门狗(Watchdog);

         4、  读取由跳线设置的启动状态;

         5、  由外部时钟建立系统时钟并运行;

         6、  根据启动状态设置的存储器宽度,进行如下操作

                A、 以最基本的方式对SDRAM和FLASH存储器接口进行初始化操作,以保持最好的兼容性;

                B、 以同样的方式初始化SRAM接口;

                C、 进行最基本的存储器测试;

          7、  根据系统配置寄存器(SysCfg,0x8093_009C)的SBOOT位,决定是否开始串行启动,如果为串行启动,则进行如下操作:

                A、 以9600的波特率、8个数据位、1个停止位、无校验的方式初始化UART1;

                B、 输出一个字符‘<’;

                C、 从UART1接收2048(2KB)字节的数据并存储到片内启动缓冲区中(就是以太网的MAC缓冲区);

                D、输出一个字符‘>’,表示已成功接收到2048字节的数据;

                E、 点亮绿灯;

                F、 跳转到片内启动缓冲区的程序执行;

          8、  如果不为串行启动,就尝试读取SPI串行ROM,并进行如下操作:

                A、 检测串行ROM的前4个字节是否为“CRUS”或“SURC”的ASCII码,校验标识字串;

               B、 读取其后2048(2KB)字节的数据并存储到片内启动缓冲区中;

               C、 点亮绿灯;

               D、跳转到片内启动缓冲区的程序执行;

         9、  如果不能从串行ROM启动,就尝试从系统的FLASH(FLASH的基地址+0x0000处)读取标识字串“CRUS”或“SURC”的ASCII码并进行校验,每个FLASH存储区都会被读取,然后进行如下操作:

              A、 点亮绿灯;

              B、 程序跳转到FLASH基地址加4字节的位置;

       10、 如果校验错误,则尝试从系统的FLASH(FLASH的基地址+0x1000处)读取标识字串“CRUS”或“SURC”的ASCII码并进行校验,每个FLASH存储区都会被读取,然后进行如下操作:

             A、 点亮绿灯;

             B、 程序跳转到FLASH的起始地址;

        11、 如果校验错误,则尝试从系统的0xC000_0000和0xF000_0000处读取标识字串“CRUS”或“SURC”的ASCII码并进行校验,这是试图从SDRAM或同步FLASH启动,然后进行如下操作:

             A、 点亮绿灯;

             B、 程序跳转到0xC000_0004或0xF000_0004处;

        12、如果校验错误,则尝试从系统的0xC000_1000和0xF000_1000处读取标识字串“CRUS”或“SURC”的ASCII码并进行校验,这也是试图从SDRAM或同步FLASH启动,然后进行如下操作

             A、 点亮绿灯;

             B、 程序跳转到0xC000_0000或0xF000_0000处;

       13、若以上步骤都未能正常启动系统,则将未初始化的异常向量拷贝到0x0地址的SDRAM,同时绿灯闪烁。



       可见,EP9301的BootROM代码考虑得还比较全面,将所有可以启动系统的方法都考虑到了,只不过显得略微有些复杂。

        BootROM的启动流程可以参考EP9301用户手册P62的Figure 3-1。 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ARM平台的DMA初始化分为以下步骤: 1. 配置DMA控制器 首先需要配置DMA控制器的寄存器,如设置DMA通道数目、配置DMA时钟源、设置DMA传输模式等。 2. 分配DMA缓冲区 为了进行DMA数据传输,需要分配DMA缓冲区。一般情况下,DMA缓冲区需要使用可以被DMA访问的内存区域。 3. 配置DMA传输参数 根据具体的应用场景,配置DMA传输参数,如源地址、目的地址、传输长度、传输方向、传输周期等。 4. 使能DMA传输 经过以上步骤的配置后,就可以使能DMA传输,并等待DMA传输完成中断或者轮询DMA传输状态。 下面是一个简单的ARM DMA初始化的示例代码: ```c #include "stm32f10x_dma.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" // 定义DMA缓冲区 uint8_t dma_buffer[64]; void dma_init(void) { DMA_InitTypeDef dma_init_struct; // 使能DMA时钟 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // 配置DMA通道 DMA_StructInit(&dma_init_struct); dma_init_struct.DMA_PeripheralBaseAddr = (uint32_t)&(USART1->DR); dma_init_struct.DMA_MemoryBaseAddr = (uint32_t)dma_buffer; dma_init_struct.DMA_DIR = DMA_DIR_PeripheralDST; dma_init_struct.DMA_BufferSize = 64; dma_init_struct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; dma_init_struct.DMA_MemoryInc = DMA_MemoryInc_Enable; dma_init_struct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; dma_init_struct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; dma_init_struct.DMA_Mode = DMA_Mode_Normal; dma_init_struct.DMA_Priority = DMA_Priority_High; dma_init_struct.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel4, &dma_init_struct); // 使能DMA通道 DMA_Cmd(DMA1_Channel4, ENABLE); } ``` 以上代码中,我们使用了STM32F10x系列单片机的DMA模块,通过配置DMA通道和缓冲区,实现了从USART1外设向DMA缓冲区的数据传输。具体的代码实现可以根据实际需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值