Flash ROM驱动示例 点击:3867 | 回复:7



gongkongedit

    
  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2004-03-02 11:42:00
楼主
Flash ROM驱动示例 i28F320B: 64*64K,64个blocks,4M空间,每个block 64K,第一个64K由8个8*8K小blocks组成. 每个Black可以被独立擦写(寿命周期) 100,000次以上 Flash操作的大概步骤: flash读写操作中,读应该很简单,和RAM一样,写就复杂一点. Intel TE28F320C3的flash是4M空间 flash空间,划分成许多的block,Intel TE28F320C3的flash是4M空间,64个block,每个block由64K. 要对所有的block单独进行操作, 每个操作结束,都需要判断状态, 每个block操作的大概步骤如下: 1.unlock 2.erase 3.check empty 所有的block完成上述操作,且状态正确,才能进行下一步,写 4.write ARM汇编程序 LDR r2, =FlashBase Flash起始地址 //第一步,UNLOCK的64个block,步骤和上边一样 MOV r1,#63 63x64k block 计数 01 LDRB r3, =X16_FLASH_COMMAND_CONFIG_SETUP STRB r3, [r2] 该block的首地址 LDRB r3, =X16_FLASH_COMMAND_UNLOCK_BLOCK STRB r3, [r2] 将Unlock命令写入 ADD r2, r2, #0x10000 64K SUBS r1, r1, #1 BNE %b01 ;Unlock OK Unlock 完成 //第二布,擦除blocks LDR r0, =FlashBase LDR r1,=63 擦除 63x64k block 01 LDR r3, =X16_FLASH_COMMAND_ERASE LDR r2, =X16_FLASH_COMMAND_CONFIRM ORR r3, r3, r2, LSL #16 STR r3, [r0] LDR r3, =X16_FLASH_COMMAND_STATUS 检查寄存器状态 STRB r3, [r0] 02 LDRB r3, [r0] 读状态 TST r3, #X16_FLASH_STATUS_READY BEQ %b02 若状态ready,执行下一个 TST r3, #X16_FLASH_STATUS_ERROR BNE error_erase_block ADD r0, r0, #0x10000 SUBS r1, r1, #1 BNE %b01 B EraseOK error_erase_block .............. ;EraseOK 擦除完成 //第三步,检查flash是否为空 ;Check Flash Empty LDR r4, =FlashBase LDR r5, =0x100000 检查 1MB LDR r0, =0xffffffff loop_1 LDR r1, [r4] CMP r1, r0 比较地址内容和0xffffffff BNE empty_error ADD r4, r4, #4 CMP r4, r5 BLO loop_1 B CheckOK empty_error ................. CheckOK ................. ;Check empty OK 检查完成 //第四步,写flash ;Burn data to Flash ROM LDR r6, =Length_Flash 定义数据长度 LDR r0, =FlashBase LDR r1, =BufferBase MOV r9, #0 LDR r4,=0x10000000 LDR r7,=0xc0001000 STR r4, [r7] LDR r1, [r1, r9] 03 LDR r3, =X16_FLASH_COMMAND_WRITE STRB r3, [r0] 把写命令放入Block首地址 LDR r3, =X16_FLASH_COMMAND_STATUS LDR r2, [r7] LDR r5, =0x0000ffff AND r2, r2, r5 ORR r2, r2, r3, LSL #16 STR r2, [r0] 02 LDR r3, [r0] 读状态寄存器状态 TST r3, #X16_FLASH_STATUS_READY BEQ %b02 若状态ready,执行下一个 LDR r3, =X16_FLASH_COMMAND_WRITE LDR r2, [r7] LDR r5, =0xffff0000 AND r2, r2, r5 ORR r3, r3, r2 STR r3, [r0] LDR r3, =X16_FLASH_COMMAND_STATUS STRB r3, [r0] 02 LDR r3, [r0] read status TST r3, #X16_FLASH_STATUS_READY BEQ %b02 LDR r4, =X16_FLASH_COMMAND_READ STRB r4, [r0] ADD r0, r0, #4 LDR r8, [r7] ADD r8, r8,#1 STR r8, [r7]



小慧

  • 精华:1帖
  • 求助:0帖
  • 帖子:6帖 | 18回
  • 年度积分:0
  • 历史总积分:91
  • 注册:2004年2月12日
发表于:2004-03-02 11:42:00
1楼
楼主好强!! 这个驱动是在arm上的 如果要用在TMS320C5420上,要怎样改写呢? 谢谢楼主不吝赐教!! 邮箱:hhlvf@163.com

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2004-03-04 09:36:00
2楼
TMS320C5420 没做过 不过它的内核 应该也是arm的 本文只起到抛砖引玉的作用 主要 举例参数 flash的 驱动的 主要步骤!

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2004-03-04 09:38:00
3楼
小慧 我 e-mail : sura_zh@sina.com qq: 35934906 有兴趣共同研究的话 可以加!

ttlff

  • 精华:0帖
  • 求助:0帖
  • 帖子:17帖 | 93回
  • 年度积分:0
  • 历史总积分:148
  • 注册:2004年1月14日
发表于:2004-03-04 09:43:00
4楼
5420不是dsp吗?内核怎么会是arm的?

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2004-03-04 14:24:00
5楼
不好意思的 我当是ARM+DSP结构TMS320DSC2X 这个了 ~! 改写的话,你该查阅相关dsp语言命令手册

major tcp/ip

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 2回
  • 年度积分:0
  • 历史总积分:2
  • 注册:2004年3月22日
发表于:2004-08-15 14:38:00
6楼
楼主,我现在想利用FALSH来分区(做成两个存储区),请问针对软件如何设置? 我的邮箱:heciang@sohu.com 如有好的建议请指教。

wangkj1234

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:1
  • 注册:2002年9月02日
发表于:2004-09-15 22:10:00
7楼
不知道楼主是怎么处理FLASH的频繁读写的?如果读写次数过多的话,使用寿命肯定不会很长

热门招聘
相关主题

官方公众号

智造工程师