🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
* 导师视频讲解:[**去听课**](https://www.bilibili.com/video/BV1k34y1D7Vz?p=20) >[success] **技术支持说明:** >**1**.一般以自主学习为主 > **2**.可到官方问答社区中提问:[**去提问**](https://bbs.csdn.net/forums/zigbee) > **3**.工程师**会尽快**解答社区问题,但他们是一线开发,【**难以保证**】解答时效,解答辛苦,感谢理解! <br/> ## **硬件准备** 本节课需要用到NOR Flash存储器 * ZigBee标准板带有NOR Flash存储器,如图所示。 ![](https://img.kancloud.cn/15/b8/15b8ba93a495ed85be5a411d479adbf1_709x852.png =250x) ### * 由于ZigBee MiNi板默认无NOR Flash存储器,无标准板的读者可以跳过本节课 <br/> ## **Flash存储器简介** Flash存储器可以用于保存信息,例如系统配置信息、资料文档等,用途用非常广泛。 ### 按照内部存储结构不同,Flash存储器可分为NOR Flash和NAND Flash两种类型。 <br/> ### **NOR Flash** NOR Flash存储器的读取速度快、存储可靠性高、支持使用随机地址访问存储空间支持,但是存储容量小、价格贵,多用于保存电子产品的程序。 ### ### **NAND Flash** 相对于NOR Flash,**NAND Flash**存储器的容量大、可反复读写次数高和价格便宜,但是读取数据速度慢、不支持随机地址访问存储空间,有点类似于光盘或硬盘,多用于存储卡、U盘中。 <br/> ## **M25PE80简介** &emsp;&emsp;ZigBee标准板中带有一颗M25PE80芯片,这是一款NOR Flash,其容量是1024KB(8M bit)。另外,CC2530F256的内部也带有Flash存储器,其容量是256KB。也就是说,标准板上共有1024KB+256KB的Flash容量。 * M25PE80实物图: ![](https://img.kancloud.cn/61/51/6151c23deb2673139fb03bd6baa0af7e_218x280.png =100x) ### * M25PE80引脚图: ![](https://img.kancloud.cn/a6/a9/a6a94f42c0585c926fbd8f3e1616da6e_274x186.png =200x) <br/> ## **了解 M25PE80 API** M25PE80的通信协议是SPI。在学习显示器的实验时,已经讲解过SPI驱动API的设计方式了,**只需要基于通用SPI驱动API适配出M25PE80的专用SPI驱动API即可**。 ### 打开配套工程代码,展开Hal\_Flash\_Spi,可以看到笔者设计的通用SPI驱动API和M25Exx驱动专用的SPI驱动API,如图所示。 ### ![](https://img.kancloud.cn/5c/c9/5cc9a44a4c2e185a935d497c0b3a4dab_406x526.png =300x) ### 借助此API,M25PE80的使用非常简单,只需要学习一下hal\_m25pexx.h/c文件中的3个API即可,其定义如下: ``` /** * @fn halM25PExxInit * * @brief 初始化M25PExx * * @return none */ void halM25PExxInit(void); /** * @fn halM25PExxRead * * @brief 从M25PExx中读取数据 * * @param addr - 将要读取的数据所在的存储器地址. * @param pBuf - 变量指针,用于保存储器中读出来的数据. * @param len - 指定从存储器中读取多少个字节的数据. * * @return 如果读取成功,则返回0 */ int halM25PExxRead(uint32 addr, uint8 *pBuf, uint16 len); /** * @fn halM25PExxWrite * * @brief 把数据写入到存储器中 * * @param addr - 说明把数据写入到存储器的哪个地址 * @param pBuf - 变量指针,指向将要写入到存储器的数据 * @param len - 指定把多少个字节的数据写入到存储器中 * * @return 如果写入成功,则返回0 */ int halM25PExxWrite(uint32 addr, uint8 *pBuf, uint16 len); ``` <br/> ## **使用 M25PE80 API** 打开main.c文件,可以使用 M25PE80 API读写数据的示例代码: ``` void main(void) { uint8 writeVal = 0;//此变量的值将会被写入到存储器中 uint8 readVal = 0;//从存储器读取到的值将会存入此变量中 char str[50]; setSystemClk32MHZ();//初始化系统时钟为32MHz initUart0(USART_BAUDRATE_115200);//初始化串口0 halM25PExxInit();//初始化M25PE80存储器 //进入到循环中 while(1) { /* 1.写数据到M25PE80存储器中 */ //串口通信 sprintf(str, "Write: %d\r\n", writeVal); uart0Send((unsigned char *)str, strlen(str)); //把writeVal的值写入到存储器中地址为0x12345的存储空间中;由于writeVal的类型为uint8,也就1个字节,所以传入的数据长度为1 if (halM25PExxWrite(0x12345, &writeVal, 1) != 0) { uart0Send("Write Error\r\n", 13);//如果函数返回值不等于0,表示写入错误 continue; } writeVal++;//把写入值增加1 delayMs(SYSCLK_32MHZ, 1000);//延迟 /* 2.从M25PE80存储器中读取数据 */ //从halM25PExxRead的0x12345处读取1个字节的数据,并将其保存到readVal中 if (halM25PExxRead(0x12345, &readVal, 1) != 0) { uart0Send("Read Error\r\n", 12);//如果函数返回值不等于0,表示读取错误 continue; } //串口通信 sprintf(str, "Read: %d\r\n", readVal); uart0Send((uint8 *)str, strlen(str)); delayMs(SYSCLK_32MHZ, 1000);//延迟 } } ``` <br/> ### **调试仿真** >[danger] 在学习本节课前,需要先掌握基本的程序下载及仿真操作,参考:[程序下载及仿真](2482302) 1.使用仿真器连接ZigBee标准板到电脑中, 2.按一下仿真器中的复位按键 3.打开配套工程,编译源代码并烧录程序到ZigBee标准板中 4.断开仿真器连接,用Micro USB线连接开发板到电脑,并且打开串口调试助手,可以看到写入和读取的过程: ![](https://img.kancloud.cn/74/94/7494aff79da543dc4974c6129bb33307_830x654.png =600x) <br/> <br/> ## **项目定制** * 如需项目定制开发,可扫码添加项目经理好友(注明“**项目定制**”) * 定制范围:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等IoT技术方案 * 善学坊官网:[www.sxf-iot.com](https://www.sxf-iot.com/) ![](https://img.kancloud.cn/ca/73/ca739f92cab220a3059378642e3bd502_430x430.png =200x) * 非项目定制**勿扰**,此处**非**技术支持