当前位置: 首页 > news >正文

【普中 51-Ai8051 开发攻略】-- 第 31 章 IAP EEPROM 实验

(1)实验平台普中 51-Ai8051 开发板​​​https://item.taobao.com/item.htm?abbucket17id1026052331067(2)资料下载 普中科技-各型号产品资料下载链接Ai8051U 系列单片机内部集成了大容量的 EEPROM。 利用 ISP/IAP 技术可将内部 Data Flash 当 EEPROM 擦写次数在 10 万次以上。 EEPROM 可分为若干个扇区每个扇区包含 512 字节。 本章学习使用 AI8051 内部 EEPROM 控制。 本章分为如下几部分内容31.1 实验介绍31.1.1 实验简介31.1.2 实验目的31.2 硬件设计31.3 软件设计31.3.1 创建和配置工程31.3.1.1 GPIO 配置31.3.1.2 配置 IAP EEPROM31.3.1.3 生成工程31.3.2 添加用户驱动代码31.3.2.1 iap.c 文件31.3.2.2 main.c 文件31.4 实验现象31.1 实验介绍31.1.1 实验简介Ai8051U 系列单片机内部集成了大容量的 EEPROM。 利用 ISP/IAP 技术可将内部 Data Flash 当 EEPROM 擦写次数在 10 万次以上。 EEPROM 可分为若干个扇区每个扇区包含 512 字节。注意 EEPROM 的写操作只能将字节中的 1 写为 0 当需要将字节中的 0 写为1 则必须执行扇区擦除操作。 EEPROM 的读/写操作是以 1 字节为单位进行 而EEPROM擦除操作是以1扇区(512字节)为单位进行,在执行擦除操作时,如果目标扇区中有需要保留的数据,则必须预先将这些数据读取到 RAM 中暂存 待擦除完成后再将保存的数据和需要更新的数据一起再写回 EEPROM/DATA-FLASH。所以在使用 EEPROM 时 建议同一次修改的数据放在同一个扇区 不是同一次修改的数据放在不同的扇区 不一定要用满。 数据存储器的擦除操作是按扇区进行的每扇区 512 字节 。EEPROM 可用于保存一些需要在应用过程中修改并且掉电不丢失的参数数据。在用户程序中 可以对 EEPROM 进行字节读/字节编程/扇区擦除操作。 在工作电压偏低时 建议不要进行 EEPROM 操作 以免发生数据丢失的情况。31.1.2 实验目的使用内部 EEPROM 实现数据读写 K1 将数据累加写入 EEPROM K2 读取在数码管显示。31.2 硬件设计本实验使用到硬件资源如下1 按键模块2 串口 13 数码管模块相关电路在前面章节已经介绍过 此处省略。31.3 软件设计31.3.1 创建和配置工程按照前面章节内容创建一份新工程 并命名为 28-iap_eeprom 如下图所示31.3.1.1 GPIO 配置使能端口和时钟 数码管、 按键端口、 UART1 管脚配置可参考前面实验。 如下图所示31.3.1.2 配置 IAP EEPROM在 IAP 的参数设置界面中 选择需要扇区擦除函数、 字节编程函数、 字节读取函数。 如下图所示31.3.1.3 生成工程配置完成后 按下代码生成按钮 自动创建工程 系统开始生成初始化代码。生成工程文件目录如下图所示在工程文件夹内新建一个 APP 文件夹 用于存储用户编写的外设驱动 方便后期工程管理和程序移植。 在 APP 文件夹下将数码管和按键驱动复制进来。然后在导出的工程中添加 APP 组 并将 xx.c 导入到工程组内 最后添加头文件路径 否则编译将报错。 如下31.3.2 添加用户驱动代码31.3.2.1 iap.c 文件该文件是由工具自动生成 在此基础上需要额外实现任意地址的读写 代码如下//AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN // 在此添加用户函数实现代码 #define IAP_EEPROM_ADDR_BASE 0 //从指定地址开始读出指定长度的数据 //ReadAddr:起始地址 //pBuffer:数据指针 //NumToWrite:扇区最大存储字节数512 void IAP_EEPROM_Read(u32 ReadAddr,u8 *pBuffer,u16 NumToRead) { u16 i; for(i0;iNumToRead;i) { pBuffer[i]IAP_ReadByte(IAP_EEPROM_ADDR_BASEReadAddri);//读取1个字节. } } u8 IAP_EEPROM_BUF[512];//最多一个扇区是512字节 void IAP_EEPROM_Write(u32 WriteAddr,u8 *pBuffer,u16 NumToWrite) { u16 i; //读取整个扇区内数据 IAP_EEPROM_Read(IAP_EEPROM_ADDR_BASE,IAP_EEPROM_BUF,512); //擦除整个扇区内数据 IAP_EraseSector(IAP_EEPROM_ADDR_BASE); //将要写入的数据存储在缓存区内 for(i0;iNumToWrite;i) { IAP_EEPROM_BUF[iWriteAddr]pBuffer[i]; } //将缓存区数据一次性写入到EEPROM内 for(i0;i512;i) { IAP_ProgramByte(IAP_EEPROM_ADDR_BASEi,IAP_EEPROM_BUF[i]); } }通过前面 IAP 介绍 我们知道要对 EEPROM 写数据 需要将对应扇区擦除一个扇区是 512 字节 这样一来其它位置数据也会被擦除掉 因此在 RAM 中定义一个 512 字节缓冲区 用于在擦除前先保存数据 然后将要写入的数据存储在该缓冲区中 最后一次性写入即可。31.3.2.2 main.c 文件//AICUBE_USER_HEADER_REMARK_BEGIN /* 深圳市普中科技有限公司PRECHIN 普中 * 在线视频https://space.bilibili.com/2146492485/video 官网www.prechin.cn * 实验名称IAP_EEPROM实验 * * 接线说明参考电路图 * * 实验现象程序下载成功后K1将数据累加写入EEPROMK2读取在数码管显示 * * 注意事项 * */ //AICUBE_USER_HEADER_REMARK_END #include config.h //默认已包含stdio.h、intrins.h、ai_usb.h等头文件 //AICUBE_USER_INCLUDE_BEGIN // 在此添加用户头文件包含 #include key.h #include smg.h //AICUBE_USER_INCLUDE_END //AICUBE_USER_GLOBAL_DEFINE_BEGIN // 在此添加用户全局变量定义、用户宏定义以及函数声明 //AICUBE_USER_GLOBAL_DEFINE_END //////////////////////////////////////// // 项目主函数 // 入口参数: 无 // 函数返回: 无 //////////////////////////////////////// void main(void) { //AICUBE_USER_MAIN_INITIAL_BEGIN // 在此添加用户主函数初始化代码 u8 buf[3]; u8 key; u8 k0; //AICUBE_USER_MAIN_INITIAL_END SYS_Init(); printf(Hello World !\n); //AICUBE_USER_MAIN_CODE_BEGIN // 在此添加主函数中运行一次的用户代码 //AICUBE_USER_MAIN_CODE_END while (1) { //AICUBE_USER_MAIN_LOOP_BEGIN // 在此添加主函数中用户主循环代码 keyKEY_Scan(0); if(keyKEY1_PRESS) { k; if(k255) k255; IAP_EEPROM_Write(0,k,1); printf(写入的数\xfd据是%d\r\n,k); } else if(keyKEY2_PRESS) { IAP_EEPROM_Read(0,k,1); printf(读取的数\xfd据是%d\r\n,k); } buf[0]gsmg_code[k/100]; buf[1]gsmg_code[k%100/10]; buf[2]gsmg_code[k%100%10]; SMG_Display(buf,6); //AICUBE_USER_MAIN_LOOP_END } }主函数实现的功能很简单 首先调用初始化函数。 然后进入 while 循环 调用 KEY_Scan 函数 不断检测 KEY1 和 KEY2 按键是否按下 如果 KEY1 按键按下将变量 k 值加 1 写入到内部 EEPROM 的地址 0 内 并通过打印输出写入的值 当KEY2 按键按下 将内部 EEPROM 的地址 0 内数据读取出来保存到变量 k 中 并通过打印输出读取的值以及数码管显示读写数据。31.4 实验现象将程序编译下载到目标板运行 打开串口助手“\5--开发工具\5-串口调试助手\串口调试助手丁丁 \sscom5.13.1.exe” 实验现象 K1 累加数据写入EEPROM K2 读取上次写入数据在数码管显示。
http://www.zskr.cn/news/1340315.html

相关文章:

  • AMD Ryzen调试神器:SMUDebugTool完整使用指南,轻松掌控处理器性能
  • 【本地部署】告别高昂 API 费用:使用 Ollama 本地部署视觉模型(LlaVA/Qwen-VL)实战
  • 南昌购宠避坑指南:5 家靠谱实体门店实测推荐 - 资讯纵览
  • Redis 实现限流功能的几种方法
  • 江苏储能电池箱定制企业排行 品质保障实力盘点 - 奔跑123
  • Prometheus标签操作实战:从label_replace到group_left,搞定K8s监控数据关联与聚合
  • 从恶意软件分析到CTF解题:Capstone反汇编框架的5个实战应用场景与Python绑定使用指南
  • AI入门该选什么语言?Python仍是最低成本答案
  • FT62F28X芯片烧录全记录:从FMD IDE固件升级到接线避坑指南
  • GPT-3.5和GPT-4写Prompt,差别到底在哪?
  • 健身房私教管理系统 (三):巧妙利用分步表单,解耦 1+N 模型的双表连续写入
  • 苏州晟雅泰电子:关于铠侠芯片物料THGJFGT0T25BAB8的解析及应用领域
  • 今日算法(构造二叉搜索树)
  • 如何快速清理电脑中的重复图片:AntiDupl智能去重工具完全指南
  • 视觉驱动跨平台UI自动化框架:Midscene.js的技术架构与实现原理
  • 手把手教你用vulkaninfo和ldd命令,精准定位Ubuntu下UE游戏Vulkan启动失败的根本原因
  • 2026电梯物联网大数据机构排行榜高频疑问全解答 - 资讯纵览
  • 临近毕业降AI率保姆级教程:嘎嘎降3分钟,知网AI率5%以下 - 我要发一区
  • 启XX辰-头部安全公司面试提问
  • STM32CubeMX 6.14版本保姆级安装教程:从下载到环境变量配置,一次搞定中文乱码
  • 实战踩坑:用Comparator排序List<Map<String, Object>>时,遇到null值、类型转换怎么办?
  • QGIS数据入库实战:如何将Excel坐标点一键导入PostgreSQL/PostGIS数据库
  • Chrome密码恢复终极指南:如何安全找回所有浏览器保存的密码
  • 3步找回被遗忘的压缩包密码:ArchivePasswordTestTool使用全攻略
  • 一基础验证
  • 从实验室到商业项目:Midjourney皮肤质感渲染的临床级验证报告(N=47位皮肤科医生盲测,真实度提升317%的关键3参数组合)
  • 向量库+RAG+大模型在医疗AI中为何常显不足?揭秘图谱如何重塑医疗知识系统信任度!
  • RT-Thread移植到RA4M2(Cortex-M33)踩坑记:HardFault了别慌,手把手教你解读xPSR/CFSR/HFSR
  • 预付卡闲置变现行业解析,瑞祥商联卡红卡合规回收渠道评测 - 资讯纵览
  • 挪威语语音合成精准度跃迁方案(Nynorsk/Bokmål双引擎适配深度解析)