前言
在某些应用中需要固件升级功能及存储一些用户定义的标志位,或者存储一些传感器的数据,一般情况我们是用外挂FLASH、EEPROM,或者使用MCU内部的EEPROM来解决。但是外挂EEPROM或者FLASH会增加成本和产品的体积。NORDIC提供了一个比较实用的方法:把这些数据存放在芯片的FLASH中。FLASH起了两个作用:1)程序的存储空间 2)用户自定义的数据存储空间。
NRF51822中的CODE MEMORY有三个部分组成:
1)Code FLASH
用来存放我们编写的程序的存储空间。这一部分我们也可以用来存储自己的数据。
2) FICR
Factory Information Configuration Register的缩写。存放的是芯片出厂的时候被烧进去的一些信息,比如芯片的FLASH分成多少个PAGE,每一个PAGE的大小是多少,工厂代码,RAM的块数,RAM块的大小,芯片地址等信息。FICR的信息是只读的,用户不可以修改或者擦除。
3) UICR
是提供给用户存储自定义数据的存储区域。
相关寄存器介绍
在操作FLASH之前,需要通过配置寄存器来使能允许写或者允许擦除。当使能Wen以后,我们可以对FLASH进行写操作;当使能Een以后,我们可以对FLASH进行擦除。特别注意,Wen跟Een不能同时使能,否则会造成无法预见的后果。
程序编写
4.1 程序流程
1)配置串口,用来打印信息。
2)配置CONFIG寄存器的Een使能。
3)擦除FLASH PAGE。
4)获取串口输入的数据。
5)配置CONFIG寄存器的Wen使能,把串口获取的数据写入到FLASH中。
6)从刚才写数据的FLASH地址里面把数据读出,然后通过串口打印出来。
本例程介绍了NRF51822芯片内部FLASH的读写。
示例详解
基于硬件平台:nrf51822ek_tm开发板。
本示例所用的最小系统板原理图:
-
- 工程创建:
- 打开KEIL,新建一个空工程:Project->NewuVisionProject
- 工程创建:
工程名为nrfxx-flash确认后按下图选择芯片为nrf51822_xxAA->ok
在弹出的对话框中勾选CMSIS中的CORE;Device中的Startup(后面有nrf51Series字样的);在nrf_device中勾选nrf_gpio, nrf_uart, nrf_delay,nrf_err并在nrf_Libraries中勾选app_error,nrf_assert模块。
OK之后工程自动生成如下代码:
新建一个空白文档,保存为main.c,并加入工程中:
配置工程,选择使用MicroLIB库,可以减小程序体积:
加入NRF51定义,并选择化等级3,可以减小程序体积,但仿真运行时可能会出现与代码顺序不一致现象:
调试工具选择J-LINK,并将接口设置为SW口勾选下载程序后自动复位及运行:
-
- 工程代码
- OK之后在man.c中加入如下代码:
- 工程代码
把程序编译,可以看到串口助手中打印了以下输出内容:
关于nrf51xx及flash的更详细介绍可以参看《nRF51822_PS_v3.3.pdf》或https://infocenter.nordicsemi.com/index.jsp
。
OK,本期实验完成!下期见!同时如果大家有什么疑问或是有想了解的其它内容,也欢迎大家留言!!最后喜欢这个公众号的同学们记得加关注了,会有不定期技术干货推出!!
文中源码资料下载,在公众号里给十三发消息:
下载|一起学nRF51xx 12
关注十三公众号