自己写bootloader --出现system halted问题解决

1.bootloader功能:
分为2个阶段。第一阶段是初始化硬件相关的一些配置,如时钟初始化,关闭看门狗,设置栈,初始化SDRAM,链接脚本配置。第二阶段是从Nand Flash 或 Nor Flash 读出内核,设置启动参数,跳到加载地址启动内核(需要实现Nand 和Nor的初始化操作和读写功能)。

2.遇到的问题:
把自己写的bootloader烧到nor(内核已经烧在nand上了)上电执行时出现
在这里插入图片描述
出现这个问题的原因是nand中有坏块

void nand_read(unsigned int addr, unsigned char *buf,unsigned int len)
{
	int col =  addr %2048;
	int i = 0;

	while(i < len)
		{
		
			

				/* 1.选中 */
			nand_select();
			
			/* 2.发出读命令00h */
			nand_cmd(0x00);
			
			/* 3.发出地址 (分5步发出) */
			nand_addr(addr);
			/* 4.发出读命令30h */
			nand_cmd(0x30);
			/* 5.等待就绪,判断状态 */
			nand_wait_ready();
			/* 6.读数据 */
			for(; (col < 2048) && (i < len); col++)
				{
					buf[i] = nand_data();
					i++;
					addr++;
				}
			col = 0;
			/* 7.取消选中 */
			nand_deselect();
		}


}

加入读坏块的判断之后成功读出内核

void nand_read(unsigned int addr, unsigned char *buf,unsigned int len)
{
	int col =  addr %2048;
	int i = 0;

	while(i < len)
		{		
			if (!(addr & 0x1FFFF) && nand_bad(addr)) /* 一个block只判断一次 */
			{
				addr += (128*1024);  /* 跳过当前block */
				continue;
			}
				/* 1.选中 */
			nand_select();
			
			/* 2.发出读命令00h */
			nand_cmd(0x00);
			
			/* 3.发出地址 (分5步发出) */
			nand_addr(addr);
			/* 4.发出读命令30h */
			nand_cmd(0x30);
			/* 5.等待就绪,判断状态 */
			nand_wait_ready();
			/* 6.读数据 */
			for(; (col < 2048) && (i < len); col++)
				{
					buf[i] = nand_data();
					i++;
					addr++;
				}
			col = 0;
			/* 7.取消选中 */
			nand_deselect();
		}
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值