芯片平台:PIC18F26K40

软件版本:MPLAB X IDE v5.20

在使用MPLAB X编译器的过程中,使用自带的MCC代码生成工具,加入memory模块生成的flash读写接口,对单个地址读写时没有问题,但是在进行连续区域地址读写时,就会出现数据读写异常的情况,比如要进行bootloader程序的设计,使用memory的flash读写函数就会出现问题。经过一番摸索,发现使用MCC代码生成工具里面的bootloader模块,里面的flash读写接口是可以正常使用的,为了便于使用,对这个flash读写接口进行了修改,代码如下:

/**Section: Macro Declarations
*/#define WRITE_FLASH_BLOCKSIZE    32
#define ERASE_FLASH_BLOCKSIZE    32
#define END_FLASH                0x010000// *****************************************************************************#include "flash.h"// To be device independent, these are set by mcc in memory.h#define  LAST_WORD_MASK              (WRITE_FLASH_BLOCKSIZE - 1)// Force variables into Unbanked for 1-cycle accessibility uint8_t EE_Key_1    __at(0x0);uint8_t EE_Key_2    __at(0x1);void StartWrite();// *****************************************************************************
// Read Flash
// *****************************************************************************
uint8_t Read_Flash(uint32_t flashAddr, uint8_t *data, uint16_t data_len)
{   if (data == NULL)return 0;TBLPTRU = (uint8_t)((flashAddr & 0x00FF0000) >> 16);TBLPTRH = (uint8_t)((flashAddr & 0x0000FF00)>> 8);TBLPTRL = (uint8_t)(flashAddr & 0x000000FF);NVMCON1 = 0x80;for (uint16_t i = 0; i < data_len; i ++){asm("TBLRD *+");data[i]  = TABLAT;}return (data_len);
}// *****************************************************************************
// Write Flash
// data_len <= WRITE_FLASH_BLOCKSIZE
// *****************************************************************************
uint8_t Write_Flash(uint32_t flashAddr, uint8_t *data, uint16_t data_len)
{   if (data == NULL)return 0;uint8_t GIEBitValue = INTCONbits.GIE;     // Save interrupt enableINTCONbits.GIE = 0; // Disable interruptsEE_Key_1 = 0x55;  // write EE KeysEE_Key_2 = 0xAA;TBLPTRU = (uint8_t)((flashAddr & 0x00FF0000) >> 16);TBLPTRH = (uint8_t)((flashAddr & 0x0000FF00)>> 8);TBLPTRL = (uint8_t)(flashAddr & 0x000000FF);NVMCON1 = 0xA4;       // Setup writesfor (uint16_t  i = 0; i < data_len; i ++){TABLAT = data[i];if (TBLPTR >= END_FLASH){            return (0);}asm("TBLWT *+");if (((TBLPTRL & LAST_WORD_MASK) == 0x00)|| (i == data_len - 1)){asm("TBLRD *-");StartWrite();asm("TBLRD *+");}}EE_Key_1 = 0x00;  // erase EE KeysEE_Key_2 = 0x00;INTCONbits.GIE = GIEBitValue;   // Restore interrupt enablereturn (1);
}// *****************************************************************************
// Erase Program Memory
// Erases data_length rows from program memory
// *****************************************************************************
uint8_t Erase_Flash (uint32_t flashAddr, uint16_t data_len)
{   uint8_t GIEBitValue = INTCONbits.GIE;     // Save interrupt enableINTCONbits.GIE = 0; // Disable interruptsEE_Key_1 = 0x55;  // write EE KeysEE_Key_2 = 0xAA;TBLPTRU = (uint8_t)((flashAddr & 0x00FF0000) >> 16);TBLPTRH = (uint8_t)((flashAddr & 0x0000FF00)>> 8);TBLPTRL = (uint8_t)(flashAddr & 0x000000FF);for (uint16_t i=0; i < data_len; i++){if (TBLPTR >= END_FLASH){            return (0);}NVMCON1 = 0x94;       // Setup writesStartWrite();TBLPTR += ERASE_FLASH_BLOCKSIZE;}EE_Key_1 = 0x00;  // erase EE KeysEE_Key_2 = 0x00;INTCONbits.GIE = GIEBitValue;   // Restore interrupt enablereturn (1);
}// *****************************************************************************
// Unlock and start the write or erase sequence.
// *****************************************************************************
void StartWrite()
{__asm ("banksel NVMCON2");__asm ("movf _EE_Key_1, w, c");__asm ("movwf NVMCON2, b");__asm ("movf _EE_Key_2, w, c");__asm ("movwf NVMCON2, b");__asm ("bsf   NVMCON1,1");       // Start the writeNOP();NOP();return;
}

PIC18F26K40 芯片Flash读写函数相关推荐

  1. (超详细)STM32芯片Flash读写操作讲解和代码(寄存器版本)

    关于Flash,官方的解释为:Flash为32位宽的存储单元,可用于存储代码和数据常量.Flash模块位于微控制器内存映射中的特定基址--.而对于我们来说,只要知道Flash闪存区是一个掉电后也不会清 ...

  2. flash读写导致死机问题分析

    有个项目需要将原NXP1766芯片移植到国民N32芯片中,但是移植过程会出现死机现象.记录下分析过程. 1.现象分析 当PC发送通信申请命令后,STM32动态申请内存空间存储数据并进行处理: 当出现死 ...

  3. STM32的内部Flash读写

    内部Flash官方手册介绍 STM官方关于stm32F103系列的芯片有一个专门介绍flash读写的手册.STM32F100xx超值型产品闪存编程手册 通过J-Link查看自己的芯片内部的flash大 ...

  4. NAND FLASH读写原理

    NAND FLASH读写原理 一.结构分析  S3C2410处理器集成了8位Nand Flash控制器.目前市场上常见的8位NandFlash有三星公司的k9f1208.k9f1g08.k9f2g08 ...

  5. NAND FLASH 读写操作 简介

    NAND FLASH 内存详解与读写寻址方式 一.内存详解 NAND闪存阵列分为一系列128kB的区块(block),这些区块是 NAND器件中最小的可擦除实体.擦除一个区块就是把所有的位(bit)设 ...

  6. 通过mtd读写flash_NOR Flash读写原理及驱动

    本文主要是关于NOR Flash的相关介绍,并着重对NOR Flash读写原理及驱动进行了详尽的阐述. NOR Flash NOR Flash是现在市场上两种主要的非易失闪存技术之一.Intel于19 ...

  7. 瑞萨e2studio(15)----Code FlashData Flash读写

    瑞萨e2studio.15--Code Flash&Data Flash读写 概述 硬件准备 新建工程 工程模板 保存工程路径 芯片配置 工程模板选择 FLASH配置 FLASH属性配置 设置 ...

  8. uboot研读笔记 | 05 - 移植uboot 2012.04到JZ2440(支持Nand Flash读写)

    项目开源地址:https://github.com/Mculover666/uboot-jz2440 0. 教程完整目录 00 - 嵌入式Linux系统中Bootloader的作用和基本运行原理 01 ...

  9. 瑞萨R78族Flash读写操作详细探讨

    前言 最近使用到瑞萨R78族的MCU,准备做一个关于掉电保存参数配置的功能,需求大概是对200多个参数在掉电瞬间保存到芯片flash空间中,网上关于瑞萨MCU的flash读写操作教程也比较少,于是笔者 ...

最新文章

  1. python一点基础都没有的怎么办-为什么我会建议每个大学生都学一点python编程?...
  2. 聊聊并发-Java中的Copy-On-Write容器
  3. SD--RV_accounting_document_create函数的代码解读
  4. A13在c语言中是合法变量吗,C语言中局部变量和全局变量等在内存中的存放位置.doc-资源下载在线文库www.lddoc.cn...
  5. BZOJ 2157: 旅游
  6. 【目标检测_解耦】 Revisiting the Sibling Head in Object Detector_2020
  7. 大数据之_亿级分布式日志管理ELK_工作笔记001_ELK认识介绍
  8. Java多线程之同步与阻塞队列
  9. java浅_浅谈Java浅层复制和深层复制
  10. 六西格玛黑带是什么?取得黑带认证有何意义?
  11. Windows Server 2016 搭建DHCP服务器(踩坑后总结)
  12. 微信开发之小程序分享设置图片标题
  13. 使用aspose.words将Word转为PDF
  14. java为什么被开发者_Spring为何受到Java开发者的青睐?Spring是如何简化Java开发的?...
  15. 树突状细胞(DC细胞)特征及应用进展综述
  16. 服装家纺生产制造执行系统——MES
  17. X-Plane飞行模拟器购买安装
  18. matplotlib之pyplot模块之坐标轴配置(axis():设置坐标轴外观、设置坐标轴范围)
  19. RJ45以太网接口EMC设计方案
  20. Label 相关论文汇总

热门文章

  1. Debian/Ubuntu升级B-B-R教程
  2. hi3531调用sil9024的驱动
  3. ai建立使用图案_AI笔刷15款古典雕刻图案线条
  4. Java在当前日期基础上加一年、一个月或一天
  5. 前端项目执行npm install错误
  6. Linux gcc编译过程及动态/静态库制作
  7. oracle客户端精简版(好东东)
  8. ASP.NET删除服务器端文件,asp.net 删除服务器上的文件系统
  9. QT软件开发: 使用QImage创建一张空图片
  10. 新能源汽车VCU开发模型及控制策略 新能源汽车整车控制器VCU学习模型,适用于初学者