学习笔记

1、FLASH存储器简介

ME32F030采用高可靠的嵌入式Flash 技术,64K用户区间,支持 IAP/ISP Flash 擦写技术。MCU Flash 采用 32 位数据总线读写,充分利用 32 位 ARM CPU 性能优势,同时它的 512 字节小扇区结构,管理操作也更加灵活。Flash 存储器支持的操作如下:

读操作:

ARM CPU 可以通过读指令直接从嵌入式 Flash 读取数据,最高支持达 30MHz 的读取速度。当 CPU 时钟超过 Flash 的最大读取速度时,需要插入延迟时钟,延迟时钟由 RDCYC 寄存器控制。

FLASH 擦写操作:

Flash 擦写采用扇区擦除,字(WORD)写入模式,并通过一寄存器组实现。擦写地址必须是 32 位对齐。擦除扇区流程如下:

①、向地址寄存器写入要操作的FLASH地址。

②、发FLASH扇区擦除指令0x04。

③、判断FLASH是否处于忙状态,不处于忙状态则流程结束。

字(WORD)编程的流程如下:

①、向地址寄存器写入要操作的FLASH地址。

②、向数据寄存器写入要编程的数据。

③、发FLASH扇区擦除指令0x02。

④、判断FLASH是否处于忙状态,不处于忙状态则流程结束。

这里要注意的是如果要编程数据,一定要先进行擦除步骤,然后再向FLASH进行编程操作。否则直接执行编程流程是无效的。

2、FLASH寄存器

ME32F030的FLASH造作十分简便。相对应的寄存器也较少。

图1 FLASH寄存器列表

2-1 FLASH操作命令寄存器

该寄存器用来发 Flash 操作命令和读 Flash 状态。

图2 FLASH操作命令寄存器

2-2 FLASH操作编程数据寄存器

该寄存器用于存储对 Flash 编程的数据,这里有一点需要注意的要求,就是该数据必须在 Flash 操作命令发出之前准备好。并且编写的数据是32位对齐的。

图3 FALSH操作编程数据寄存器

2-3 FLASH操作地址寄存器

该寄存器存储 Flash 操作地址。

图4 FALSH操作地址寄存器

2-4 FLASH访问周期寄存器

根据系统时钟频率不同,Flash 访问速度可以配置 FLASH_RDCYC 寄存器来实现(该功能目前禁止使用)。

3、FLASH操作函数

3-1 FLASH擦除函数

该函数用于擦除指定地址段所在扇区的FLASH数据,从起始地址startaddr所在扇区开始擦除,直到结束地址endaddr所在扇区。

void EraseMCUDataMemory(uint32_t startaddr, uint32_t endaddr){//判断是否到达结束地址while(startaddrADDR = startaddr;  //FLASH擦除指令FMC->CMD = 0x04;  //等待FLASH完成操作while ((FMC->CMD & 0x100)!=0);//地址偏移,开始下个地址的擦除startaddr+=512;   }}

3-2 FLASH数据编程

这个函数用于向指定的地址,写入指定长度的数据。

Dataadd:要写入的地址Size:要写入的数据长度Suradd:要写入的数据内容void SaveDatatoMCU(uint32_t dataadd, uint32_t size, uint32_t suradd){uint32_t n,temp0,temp1,temp2,*dataptr;temp1=size>>2;temp2=dataadd;dataptr=(uint32_t *)suradd;for (n=0;nADDR = temp2;      //写入编程数据FMC->DATA = *dataptr++;   //FLASH编程指令FMC->CMD = 0x02;     //等待FLASH完成操作while ((FMC->CMD & 0x100)!=0);   //地址偏移,开始下个地址的编程temp2 +=4;            }}

3-3 FLASH读取数据

这个函数用于从指定的地址,读出指定长度的数据。

Dataadd:要读取的地址Size:要读取的数据长度Suradd:要读取的数据内容void ReadDataFromMCU(uint32_t dataadd, uint32_t size, uint32_t* suradd){uint32_t n,temp1,*dataptr;uint32_t a = 0;temp1=size>>2;dataptr=(uint32_t *)suradd;for (n=0;n

4、FLASH例程

接下来做个小实验来测试下FLASH的擦写和数据编程,我们向0x0000FC80地址写入一组数据,随后读出校验是否正确编程FLASH。

int main(void){uint32_t WriteData[4] = {0x12121212,0x34343434,0x56565656,0x78787878};uint32_t ReadData[4]  = {0x00000000,0x00000000,0x00000000,0x00000000};uint32_t DataAddr = 0x0000FC80;uint32_t EndAddr = 0x0000FFFF;WDT->MOD=0;PB_9_INIT(PB_9_GPIO);GPIO_ConfigPinsAsOutput(PB, IO_PIN9); //擦除FLASHEraseMCUDataMemory(DataAddr,EndAddr);//向Data Addr写入数据WriteDataSaveDatatoMCU(DataAddr, 16, WriteData);//读出的数据存放到ReadData ReadDataFromMCU(DataAddr, 16, ReadData);while (1){PB->NOT_b.NOT9=1;//小灯闪烁,提示程序运行SYS_DelaymS(500);}}

程序编译无误后,便可以下载仿真测试。首先在如图所示的位置打上断点,然后全速运行。

图5 实例运行1

运行到断点处后,我们把WriteData和ReadData添加的WATCH1中观察下,结果如图所示,此时ReadData的数据全部都是0x000000000,与写入的数据不一致,这是因为还没有开始从FLASH中读取。接下来按快捷键F10单步执行下读取FLASH函数。

图6 实例运行2

单步执行后的效果如图所示,这时候数据已经从FLASH中读取出来并存放到ReadData中,此时的数据已经和写入的WriteData一致了。

图7 实例运行3

通过mtd读写flash_敏矽微电子Cortex-M0学习笔记11-FLASH存储器相关推荐

  1. wringPi 初始化GPIO 为上拉_敏矽微电子Cortex-M0学习笔记04-GPIO详解及应用实例

    前面我们已经对敏矽微电子的基于cortex m0内核的ME32F030R8T6的基本功能做了介绍,然后详细讲解了开发环境MDK的安装,pack包的安装,工程的建立及程序的仿真,紧接着讲解了ME32F0 ...

  2. STM32学习笔记:FLASH读写之二

    因为关于STM32的Flash相关的知识点比较多,所以该内容的学习我们分为以下4个部分 1.RAM和ROM的一些基本概念 -- STM32学习笔记:FLASH读写之一 2.STM32的Flash寄存器 ...

  3. STM32学习笔记:FLASH读写之一

    因为关于STM32的Flash相关的知识点比较多,所以该内容的学习我们分为以下4个部分 1.RAM和ROM的一些基本概念 -- STM32学习笔记:FLASH读写之一 2.STM32的Flash寄存器 ...

  4. 通过mtd读写flash_关于如何在kernel起来之后通过直接dd读写nand flash分区来更新zImage的mtd问题...

    关于如何在kernel起来之后通过直接dd读写nand flash分区来更新zImage的mtd问题 主要是设置struct mtd_partition中的mask_flags标志位 具体含义为: 1 ...

  5. 通过mtd读写flash_【转】 Linux下读写FLASH驱动——MTD设备分析

    最近在学习驱动读写flash的代码部分.经历了可笑的过程:开始我知道flash用通过spi口来读写.所以就到了driver/spi 下面看相关代码.发现有个spidev.c里面有read/write/ ...

  6. SPI 读取不同长度 寄存器_敏矽微电子Cortex-M0学习笔记10-SPI通信详解

    1.SPI简介 ME32F030支持扩展的 SPI (Serial Peripheral interface)接口,它可以支持标准的 SPI 操作,兼容 4 线的 SSI (SynchronousSe ...

  7. 二十一世纪大学英语读写教程(第三册)学习笔记(原文)——8 - The Highs of Low Technology(“低”科技的优点)

    Unit 8 - The Highs of Low Technology("低"科技的优点) The Highs of Low Technology Johanne Mednick ...

  8. 二十一世纪大学英语读写教程(第四册)学习笔记(原文)——10 - My Graduation Speech(毕业演说)

    Unit 10 - My Graduation Speech(毕业演说) My Graduation Speech Neil Postman Author's Note: Having sat thr ...

  9. 二十一世纪大学英语读写教程(第三册)学习笔记(原文)——4 - College Pressures(大学生的压力)

    Unit 4 - College Pressures(大学生的压力) College Pressures William Zinsser I am master of Branford College ...

最新文章

  1. DOM(Document object madle) 文档对象模型: 元素节点 文本节点 属性节点
  2. 洲际的merlin怎么用_天问一号是怎么拍摄地月合影的?
  3. 图模型(graphical model, GM)的表示
  4. 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。
  5. codeforces B. The Fibonacci Segment 解题报告
  6. Nginx 安装使用
  7. 一种简单的给MD5加盐算法
  8. HTML hr 标签的用法
  9. Apache日志分割及分析
  10. python能调用身份证读卡器吗_华视身份证读卡机Python二次开发
  11. 怎么删掉计算机云u盘,win10系统删除360云u盘图标的方法
  12. vue3 集成西瓜视频播放器xgplayer
  13. ESP-MQTT-AT指令连接阿里云物联网平台
  14. 架构 - 单点登录 - Springboot 模拟单点登录
  15. JAVA程序开发参考手册
  16. 关于Map入参,出参
  17. skype安卓手机版_最新手机系统——安卓Q尝鲜版体验
  18. OCI、CRI、CNI、CSI规范在kubernetes项目体系里的关系
  19. ALSA 音频开发部分基础知识
  20. Impinj阅读器与PC连接

热门文章

  1. python 真多线程_Python之路200个小例子,在线网页版来了,从此学习更方便!
  2. Hologres基于TPCH的性能测试介绍
  3. 叮!快收好这份Android网络性能监控方案
  4. 如何用AR升级星巴克体验?阿里工程师祭出了“三板斧”
  5. wait_timeout【Mysql】解决方案
  6. 如何让tomcat只支持ipv4
  7. oracle 启动监听报错TNS-12547: TNS:lost contact
  8. 关于Oracle中varchar2和dbms_output.put_line的长度限制问题小结
  9. 设置elementUI的table组件滚动条位置
  10. C#基础加强(7)之ref与out