【ARM裸板】Nor Flash基础知识与编程示例

发布者:ByteChaser最新更新时间:2020-03-05 来源: eefocus关键字:ARM裸板  Nor  Flash  基础知识  编程示例 手机看文章 扫描二维码
随时随地手机看文章

1.NOR与NAND的区别

Flash NOR NAND

接口 RAM-Like,引脚多 引脚少,复用(地址数据共用)

容量 小(1-32M) 大(128M+)

读 简单 复杂

写 发出特定命令(慢) 发出特定命令(快)

价格 贵 较便宜

缺点 无位反转、坏块 位反转、坏块

一般存放 bootloader(关键程序) 大文件、视频

xip 可以 不可以

xip(eXecute In Place),即芯片内执行,指应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。flash内执行是指nor flash 不需要初始化,可以直接在flash内执行代码。但往往只执行部分代码,比如初始化RAM.


2.命令表

在这里插入图片描述

在这里插入图片描述

UBOOT下读写数据


2.1 读数据

md.b为读命令

mw.w为写命令

md.b 0


2.2 读ID

Nor手册

往(555H)写入AAH

往(2AAH)写入55H

往(555H)写入90H

读(0)得到厂家(Manifacture)ID:C2H

读(1)得到设备(Device)ID:22C4/2249

在这里插入图片描述

但是由于地址是错开1位的(具体原因可查看第15章),则往CPU写的地址需要addr<<1,即(地址*2)因此:


UBOOT下

往(AAAH)写入AAH

往(554H)写入55H (这两步为解锁命令)

往(AAAH)写入90H(90H为命令)

读(0H)得到厂家(Manifacture)ID:C2H

读(2H)得到设备(Device)ID:22C4/2249

退出读ID状态(即复位)

mw.w aaa aa

mw.w 554 55

mw.w aaa 90

md.w 0 1   #读0地址1次

md.w 2 1   

mw.w 0 F0


2.3 CFI模式

CFI(Common Flash Interface)


Nor手册

往(55H)写入98H(进入CFI模式)

读(27H)得到容量2^n的n

退出CFI模式(复位)

UBOOT下

往(AAH)写入98H(进入CFI模式)

读(4EH)得到容量2^n的n

往(0H)写入F0H


3.基本函数

3.1 写函数

Nor Flash 地址线21:即可访问2M内存,0x1FFFFF,其范围地址为 0~0x1FFFFF

#define NOR_FLASH_BASE 0 /* Nor Flash基地址 nor-->cs0,base_addr = 0 */


/* Nor Flash写入一个字

 * 基地址:base,偏移地址:offset,写入的值:value

 * eg: 55 98

 * 往(0 + (0x55)<<1 )写入0x98

*/

void nor_write_word(unsigned int base,unsigned int offset,unsigned short value)

{

volatile unsigned short *p = (volatile unsigned short *) (base + offset<<1);

*p = value;

}


进行封装

void nor_cmd(unsigned int offset,unsigned short cmd)

{

nor_write_word(NOR_FLASH_BASE, offset, cmd);

}


3.2 读函数

/* Nor Flash读取一个字

 * 基地址:base,偏移地址:offset

 * eg: 55 98

 * 往(0 + (0x55)<<1 )写入0x98

*/

unsigned int nor_read_word(unsigned int base,unsigned int offset)

{

volatile unsigned short *p = (volatile unsigned short *) (base + offset<<1);

return *p;

}


进行封装

unsigned int nor_dat(unsigned int offset)

{

return nor_read_word(NOR_FLASH_BASE, offset);

}


4.识别NOR

4.1 读取ID号

往(555H)写入AAH

往(2AAH)写入55H

往(555H)写入90H

读(0)得到厂家(Manifacture)ID:C2H

读(1)得到设备(Device)ID:22C4/2249

/* 1.打印 Manifacture ID、Device ID */

nor_unlock();       //解锁

nor_cmd(0x555,0x90);//读命令

manifa_id = nor_dat(0x00); //读厂家ID

device_id = nor_dat(0x01); //读设备ID

nor_reset_mode(); //复位

在这里插入图片描述

4.2 进入CFI Mode

往(55H)写98H

CFI(Common Flash Interface)

/* 1.进入CFI Mode */

nor_cmd(0x55,0x98); 

在这里插入图片描述

4.3 读取容量

读(27H)得到容量bytes

/* 2.打印容量 */

size = 1<<(nor_dat(0x27));

printf("nor size = 0x%x, %dMrn",size,size>>20);

在这里插入图片描述

4.4 读取各个扇区

4.4.1 获得region数量

regions = nor_dat(0x2C);

1

4.4.2 region详细信息

erase block region :里面含有1个或多个block,它们大小都一样,一个nor含有1个或多个region,一个region含有1个或多个block(扇区)


Erase block region information:

前2字节+1:表示该region有多少个block

后2字节*256:表示该block的大小(bytes)

在这里插入图片描述

参考CFI标准:

在这里插入图片描述

regions的基址从0x2D开始

region_info_base = 0x2D;

block_addr = 0;

for(i = 0;i < regions; i++){

/* 获取block的数量和大小 */

blocks = 1 + nor_dat(region_info_base) + (nor_dat(region_info_base+1)<<8);//低2字节,获取block数量

block_size = 256 * (nor_dat(region_info_base+2) + (nor_dat(region_info_base+3)<<8));//高2字节,获取block大小

region_info_base += 4;//region读取的基址+4


/* 打印每个block的起始地址 */

for(j = 0;j < blocks; j++){

printf("0x%08x ",block_addr);

block_addr += block_size;

if( ((++cnt) % 5) == 0){ //每打印5个换行

printf("rn");

}

}

}


4.5 退出CFI Mode

nor_cmd(0x00,0xF0);//复位

在这里插入图片描述

5.写数据

5.1 写入

需要注意一个点,写入的数据是16位的,也就是两个字节,需要一次性写入一个字节,所以在写入之前需要对数据进行整合。


while(str[i] && str[i+1]){//两个字符都不为0时

data = str[i] + (str[i+1]<<8);

nor_unlock();//解锁

nor_cmd(0x555,0xA0); //写命令

nor_cmd(addr>>1,data);


/* 等待烧写完成:读数据Q6,无变化时表示完成*/

wait_ready(addr);

i += 2;

addr += 2;

}

在这里插入图片描述

5.2 判断数据写入完成

等待烧写完成:读数据Q6,无变化时表示完成

两次读取的结果不一致,说明数据还在变化,继续等待

//等待读取或擦除完毕

void wait_ready(unsigned int addr)

{

unsigned int pre_val;//上一次的值

unsigned int cur_val;


pre_val = nor_dat(addr>>1);

cur_val = nor_dat(addr>>1);


/* 两次读取的结果不一致,说明数据还在变化,继续等待 */

while((cur_val & (1<<6) != (pre_val &(1<<6)))){//当前的Q6不等于上一次的Q6则等待

pre_val = cur_val;//更新上一次的值

val = nor_dat(addr>>1);//重新获取

}

}

在这里插入图片描述
在这里插入图片描述

6.测试

6.1 读取

在这里插入图片描述

6.2 写入

在这里插入图片描述

6.3 擦除

在这里插入图片描述

7.问题

7.1 系统异常卡死

执行多次的菜单选择,导致系统卡死

该为定时器造成的异常错误,关闭定时器,则不会卡死

 因为当测试nor进入CFI模式时,如果发生了中断,CPU必定读NOR,那么读不到正确的指令,导致程序异常崩溃

7.2 nor数据错误

读取设备ID时,读到的是0x002f,0xea00,改为反汇编中text的[0]上的数据


 编译程序加上选项:指定ARM版本指令集-march=armv4 或者指定芯片类型 -mcpu=arm9tdmi

否则像如下的写入操作会被分成两个strb步骤(我们需要的是strh,一次性写入两个字节),最后导致读取设备ID和厂家ID的时候出错。


     volatile unsigned short *p =value;    

    *p = value;


没加编译指定选项(分两次存2个字节)

在这里插入图片描述

加了编译指定芯片类型 -mcpu=arm9tdmi(一次性存2个字节)

在这里插入图片描述

8.擦除扇区

void erase_nor_flash(void)

{

unsigned int addr;

/* 获得地址*/

printf("Enter the address of sector to erase:");

addr = get_uint();

printf("Erase...rn");


nor_unlock();

nor_cmd(0x555,0x80); //擦除扇区命令


nor_unlock(); 

nor_cmd(addr>>1,0x30); //发出扇区地址

wait_ready(addr);

}

关键字:ARM裸板  Nor  Flash  基础知识  编程示例 引用地址:【ARM裸板】Nor Flash基础知识与编程示例

上一篇:【ARM裸板】Nand Flash基础与时序分析
下一篇:ARM处理器:“冯·诺依曼”体系结构和“哈佛”体系结构

推荐阅读最新更新时间:2024-11-17 17:15

单片机外围模块漫谈之一,图解说明什么是Flash, SAR, Sigma-Delta型ADC
模数转换模块ADC是连接现实世界模拟量和数字量之间的桥梁,它的转换精度经常可以决定一个产品的品质。现在单片机上一般都会集成ADC,我们如何根据自己的应用选择恰当的产品呢?怎么实现高的性价比,让产品在激烈的市场竞争中立于不败之地呢?下面我们从常用的几种ADC类型的特点,到使用中的注意事项,逐一探讨一下。 ADC类型 常用的ADC基本上可以分为三种类型: Flash型,SAR型,Sigma-Delta型。下面我们来了解一下它们的工作原理与性能特点。单片机中最常采用的是SAR型,在一些高精度场合会用到Sigma-Delta型,而Flash型很少会集成在MCU内部,如果需要一般需要通过串行或并行总线外扩。 Flash型
[单片机]
基于STM32F0的SPI通信的FLASH程序分析
一、GPIO的综合描述 stm32每一个GPIO端口拥有2个32bits的configuration寄存器(GPIOx_CRL,GPIOx_CRH),2个32bits的数据寄存器(GPIOx_IDR,GPIOx_ODR),1个32bits的set/reset寄存器(GPIOx_BSRR),1个16bits的reset寄存器(GPIOx_BRR)和1个32bits的Lock寄存器(GPIOx_LCKR)。 (一)每一个IO引脚都可以使用软件配置为以下几种模式: 1. 浮空输入 2. 带上拉输入 3. 带下拉输入 4. 模拟输入 5. 开漏输出——(此模式可实现hotpower说的真双向IO) 6. 推挽输出 7. 复用功能的推挽
[单片机]
Nordic助力可穿戴产品使用动脉信号分析算法
Nordic Semiconductor宣布国内的维亿魄公司在其SPO2手环解决方案中集成了Nordic屡获奖项的低功耗蓝牙(Bluetooth® Low Energy / Bluetooth LE) nRF52832系统级芯片(SoC),这款产品可让不具备RF设计专有技术的OEM厂商快速开发用于中年至年长者、吸烟者,以及其它亚健康状况人士,尤其是间质性呼吸、心脏病,或睡眠呼吸暂停综合症患者的可穿戴健康解决方案。 SPO2手环解决方案可让OEM开发人员设计可监控动脉血氧饱和度,从而估计肺的氧合能力以及血液中血红蛋白携带能力的产品。Nordic的nRF52832 SoC提供低功耗蓝牙,以无线方式连接手环和使用蓝牙4.0 (或更
[医疗电子]
<font color='red'>Nor</font>dic助力可穿戴产品使用动脉信号分析算法
Nordic助力模块收集和传输心电图数据
勇芯科技BCL601S1模块采用Nordic Semiconductor的nRF52840 SoC 来运行心电图算法引擎,并通过低功耗蓝牙传输数据 挪威奥斯陆 – 2023年11月24日 – 致力于为AIoT市场提供Chiplet芯片级解决方案的勇芯科技 (Bravechip) 推出了微型模块BCL601S1,用于提供心电图 (ECG) 读数的医疗设备 。这款 “BCL601S1蓝牙心电Chiplet” 的外形尺寸仅为 9 x 9 毫米,提供运动状态检测、心率和心率变异性(HRV)计算。可用于各种低功耗蓝牙 (Bluetooth® LE) 心电图产品设计,如动态心电记录仪、心电贴片、心电手表和心电套装等。 强大的处理
[医疗电子]
<font color='red'>Nor</font>dic助力模块收集和传输心电图数据
垂涎SSD商机NAND Flash厂强化布局
转自台湾新电子的消息,NAND快闪记忆体(NAND Flash Memory)业者正对三层式储存(TLC)颗粒的固态硬盘市场虎视眈眈。继三星(Samsung)于2012下半年以其优良的控制技术,成功推出具性价比优势的TLC固态硬盘后,亦间接吸引了NAND快闪记忆体业者强化其控制技术,以期能循三星模式抢进低价的TLC固态硬盘市场。 集邦科技记忆体储存事业处协理杨文得表示,在NAND快闪记忆体业者竞相投入布局下,TLC固态硬盘可望挟高性价比优势扩大渗透消费性市场。 集邦科技记忆体储存事业处协理杨文得表示,三星从前年开始便积极布局以TLC颗粒打造的固态硬盘技术,并成功在去年推出产品;而产品甫一上市便凭藉极具吸引力的售价和
[嵌入式]
儒卓力提供Nordic的高成本效益nRF9160开发套件
Nordic Semiconductor的nRF9160开发套件(DK)是一款单板硬件开发平台,提供了全部必需工具让用户能够评测和开发基于nRF9160系统级封装(SiP)器件之应用固件。 nRF9160开发套件包含支持690至960MHz和1710至2200MHz频段的LTE天线,并且具有内置GPS的nRF9160型款的专用GPS天线,还有一个用于蓝牙5、蓝牙Mesh和IEEE 802.15.4协议(比如Thread或Zigbee®)的2.4GHz天线。这款套件集成了nRF52840系统级芯片(SoC) 作为板控制器,可用于构建低功耗蓝牙(Bluetooth® Low Energy)网关及其它应用。如需了解有关支持频段和认证
[物联网]
儒卓力提供<font color='red'>Nor</font>dic的高成本效益nRF9160开发套件
基于S3C6410的ARM11学习基础知识
ARM11和之前学习的STM32的开发是很不一样的。STM32,都是把代码烧到STM32芯片FLASH中,然后代码从FLASH中执行,而且程序执行是不需要外部挂ram的,因为芯片的内部就集成了一定大小的ram。 而ARM11是不一样的,内部没有FLASH和ram,所以就需要外挂flash设备和ram设备,然后ARM11通过存储控制器来操作这些设备。 从图中就可以直观的看出区别了。对于S3C6410,因为内部没有存储器,所以需要将代码烧录到外挂的FLASH设备,这里FLASH设备可以有多种,但是一定要芯片支持的flash才行,这个在芯片的数据手册中是有说明的。程序执行,是需要内存的,所以还要外挂一个内存设备,用来执行程
[单片机]
基于S3C6410的<font color='red'>ARM</font>11学习<font color='red'>基础知识</font>
TrueFFS上VxWorks应用程序的启动及动态更新
   引 言   在嵌入式产品中,一般使用Flash作为应用程序代码及各种数据和参数的存储介质。尤其是NOR Flash具有操作接口简单、传输效率高、芯片内执行(eXecute In Place,XIP)的特点,在电力、铁路等工业控制领域得到了广泛应用。   为了便于用户的使用,VxWorks操作系统提供了基于Flash的文件系统,即TrueFFS。TrueFFS与DosFS文件系统基本兼容,通过VxWorks提供的操作接口以文件的方式实现对Flash的操作。而对于用户来说,如何在自己的硬件系统上根据Flash的具体型号和使用要求实现TrueFFS系统,并在此基础上完成应用程序代码的灵活启动、更新,同时兼顾仿真调试的需求,
[嵌入式]
小广播
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved