关于ARM启动流程的分析(NandFlash Or NorFlash)

本文分析了ARM处理器从NandFlash和NorFlash启动的流程。NorFlash可以直接执行,而NandFlash需要通过CPU内部的SRAM启动,CPU在复位时会自动将NandFlash的前4K代码拷贝到SRAM中。启动时,SRAM中的代码需负责初始化CPU、SDRAM和Nandflash控制器,然后将剩余代码拷贝到SDRAM并跳转执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习了S3C2440的启动流程,如何让bootLoader成功加载。并且找到了一篇讲的非常好的博客,试着结合着自己的理解总结一下,以备以后的复习。


第一部分关于内部的SRAM:

部分ARM9的CPU内部都集成有一个SRAM,SRAM是英文Static RAM的缩写,它是一种具有静止存取功能的内存,不需要刷新电路即能保存它内部存储的数据。这样他不需要初始化就能够直接使用。这与我们在外部扩展的大容量的SDRAM是不一样的,外部大容量的SDRAM是需要初始化后才能使用的

在s3c2440这颗CPU上这个SRAM大小为4KB,datasheet里把它叫做Stepping Stone,江湖人称“起步石”。


第二部分关于Norflash与Nandflash的异同点

Norflash:

Norflash像内存一样是直接挂在系统总线上的,这样有足够多的地址线使得CPU能够寻址到每一个存储单元上去,这也意味着CPU能够直接通过总线访问Norflash上存储的内容,同时他还支持XIP(即片上执行,不用将代码搬到内存中,直接在Norflash上就能运行)。


Nandflash:

### NAND Flash程序的实现 #### 1. 基于FPGA的NAND Flash SPI协议 在基于FPGA的设计中,可以通过SPI接口完成对SD NAND Flash操作。具体来说,需要通过硬件描述语言(如Verilog或VHDL)编逻辑电路,用于生成并发送特定命令至NAND Flash设备,并解析其返回的数据和状态信息。 以下是基于FPGA的一个简单代码框架示例: ```verilog module spi_nand_controller ( input wire clk, // 主时钟信号 input wire reset, // 复位信号 output reg sclk, // SPI串行时钟 output reg mosi, // 主机输出/从机输入 (Master Out Slave In) input wire miso, // 主机输入/从机输出 (Master In Slave Out) output reg cs_n // 片选信号 (低电平有效) ); reg [7:0] cmd; // 当前要发送的命令字节 reg [31:0] addr; // 地址寄存器 reg [7:0] data_out; // 发送数据缓冲区 wire [7:0] data_in; // 接收数据缓冲区 always @(posedge clk or posedge reset) begin if (reset) begin sclk <= 1'b0; mosi <= 1'b0; cs_n <= 1'b1; end else begin // 设置片选信号激活 cs_n <= 1'b0; // 发送命令阶段 send_command(cmd); // 发送地址阶段 send_address(addr); // 数据传输阶段 transfer_data(data_out, data_in); // 完成后释放片选信号 cs_n <= 1'b1; end end task send_command(input [7:0] command); begin for (int i = 0; i < 8; i++) begin @ (posedge sclk); mosi <= command[i]; end end endtask task send_address(input [31:0] address); begin for (int j = 0; j < 32; j += 8) begin send_command(address[j +: 8]); end end endtask task transfer_data(input [7:0] txdata, output reg [7:0] rxdata); begin for (int k = 0; k < 8; k++) begin @ (posedge sclk); mosi <= txdata[k]; rxdata[k] <= miso; end end endtask endmodule ``` 此模块实现了基本的SPI通信功能,包括命令发送、地址设置以及数据交换过程[^1]。 --- #### 2. U-Boot下的NAND Flash方法 U-Boot提供了一套便捷的命令集来支持NAND Flash的操作。例如,在开发板环境中可以利用`sf`指令完成Flash的编程工作。下面是一个典型的例子说明如何将指定区域内的数据复制到NAND Flash中: ```bash sf probe 0 # 初始化spi nor flash控制器 sf read 0x8000000 0x0 0x10000 # 将flash偏移量为0处大小为0x10000字节的数据加载到RAM中的0x8000000位置 sf erase 0xf00000 0x10000 # 清除目标地址范围(起始于0xf00000长度为0x10000字节) sf write 0x81000000 0xf00000 0x10000 # 把内存中从0x81000000开始的0x10000字节内容拷贝到flash里去 ``` 以上脚本片段展示了完整的擦除、流程[^2]。 --- #### 3. 使用STM32 HAL库与CubeMX实现NAND Flash 对于ARM Cortex-M系列微控制器而言,借助ST官方提供的HAL库能够极大简化外设配置难度。以下是从头构建一个简单的NAND Flash访问实例的过程概述: ##### 初始准备 - 配置SPI通道参数匹配目标芯片的要求; - 启用DMA模式提升吞吐效率; ##### 功能函数定义 以C语言为例展示部分核心算法结构如下所示: ```c #include "stm32f4xx_hal.h" void nand_init(void){ __HAL_RCC_SPI1_CLK_ENABLE(); GPIO_InitTypeDef gpio_InitStruct={0}; /* Configure SCK pin as alternate function */ gpio_InitStruct.Pin=GPIO_PIN_5; gpio_InitStruct.Mode=GPIO_MODE_AF_PP; gpio_InitStruct.Pull=GPIO_PULLUP; gpio_InitStruct.Speed=GPIO_SPEED_FREQ_HIGH; gpio_InitStruct.Alternate=GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOA,&gpio_InitStruct); } uint8_t nand_send_cmd(uint8_t cmd,uint32_t addr,uint8_t *pdata,uint16_t size){ uint8_t status=0xFF; SPI_HandleTypeDef hspi1; hspi1.Instance=SPI1; HAL_StatusTypeDef ret_val; // Send Command Byte First ret_val=HAL_SPI_Transmit(&hspi1,(uint8_t*)&cmd,1,100); if(ret_val != HAL_OK)return ERROR; // Then Address Cycles If Needed According To Protocol Spec. if(addr!=0xFFFFFFFF){ ret_val=HAL_SPI_Transmit(&hspi1,(uint8_t*)&addr,sizeof(addr),100); if(ret_val != HAL_OK)return ERROR; } // Finally Transfer Data Block Or Read Response Status Register Value As Required By Operation Type. if(pdata && size>0){ ret_val=(size==1)?HAL_SPI_Receive(&hspi1,pdata,size,100):HAL_SPI_Transmit(&hspi1,pdata,size,100); if(ret_val != HAL_OK)return ERROR; }else{ do{ret_val=HAL_SPI_Receive(&hspi1,&status,1,10);} while((status&0x80)==0&&ret_val==HAL_OK); } return SUCCESS; } ``` 上述源码段落解释了怎样封装底层驱动层面上针对不同种类请求所采取的具体措施[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值