PIC18F26K40 芯片Flash读写函数
芯片平台: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读写函数相关推荐
- (超详细)STM32芯片Flash读写操作讲解和代码(寄存器版本)
关于Flash,官方的解释为:Flash为32位宽的存储单元,可用于存储代码和数据常量.Flash模块位于微控制器内存映射中的特定基址--.而对于我们来说,只要知道Flash闪存区是一个掉电后也不会清 ...
- flash读写导致死机问题分析
有个项目需要将原NXP1766芯片移植到国民N32芯片中,但是移植过程会出现死机现象.记录下分析过程. 1.现象分析 当PC发送通信申请命令后,STM32动态申请内存空间存储数据并进行处理: 当出现死 ...
- STM32的内部Flash读写
内部Flash官方手册介绍 STM官方关于stm32F103系列的芯片有一个专门介绍flash读写的手册.STM32F100xx超值型产品闪存编程手册 通过J-Link查看自己的芯片内部的flash大 ...
- NAND FLASH读写原理
NAND FLASH读写原理 一.结构分析 S3C2410处理器集成了8位Nand Flash控制器.目前市场上常见的8位NandFlash有三星公司的k9f1208.k9f1g08.k9f2g08 ...
- NAND FLASH 读写操作 简介
NAND FLASH 内存详解与读写寻址方式 一.内存详解 NAND闪存阵列分为一系列128kB的区块(block),这些区块是 NAND器件中最小的可擦除实体.擦除一个区块就是把所有的位(bit)设 ...
- 通过mtd读写flash_NOR Flash读写原理及驱动
本文主要是关于NOR Flash的相关介绍,并着重对NOR Flash读写原理及驱动进行了详尽的阐述. NOR Flash NOR Flash是现在市场上两种主要的非易失闪存技术之一.Intel于19 ...
- 瑞萨e2studio(15)----Code FlashData Flash读写
瑞萨e2studio.15--Code Flash&Data Flash读写 概述 硬件准备 新建工程 工程模板 保存工程路径 芯片配置 工程模板选择 FLASH配置 FLASH属性配置 设置 ...
- uboot研读笔记 | 05 - 移植uboot 2012.04到JZ2440(支持Nand Flash读写)
项目开源地址:https://github.com/Mculover666/uboot-jz2440 0. 教程完整目录 00 - 嵌入式Linux系统中Bootloader的作用和基本运行原理 01 ...
- 瑞萨R78族Flash读写操作详细探讨
前言 最近使用到瑞萨R78族的MCU,准备做一个关于掉电保存参数配置的功能,需求大概是对200多个参数在掉电瞬间保存到芯片flash空间中,网上关于瑞萨MCU的flash读写操作教程也比较少,于是笔者 ...
最新文章
- python一点基础都没有的怎么办-为什么我会建议每个大学生都学一点python编程?...
- 聊聊并发-Java中的Copy-On-Write容器
- SD--RV_accounting_document_create函数的代码解读
- A13在c语言中是合法变量吗,C语言中局部变量和全局变量等在内存中的存放位置.doc-资源下载在线文库www.lddoc.cn...
- BZOJ 2157: 旅游
- 【目标检测_解耦】 Revisiting the Sibling Head in Object Detector_2020
- 大数据之_亿级分布式日志管理ELK_工作笔记001_ELK认识介绍
- Java多线程之同步与阻塞队列
- java浅_浅谈Java浅层复制和深层复制
- 六西格玛黑带是什么?取得黑带认证有何意义?
- Windows Server 2016 搭建DHCP服务器(踩坑后总结)
- 微信开发之小程序分享设置图片标题
- 使用aspose.words将Word转为PDF
- java为什么被开发者_Spring为何受到Java开发者的青睐?Spring是如何简化Java开发的?...
- 树突状细胞(DC细胞)特征及应用进展综述
- 服装家纺生产制造执行系统——MES
- X-Plane飞行模拟器购买安装
- matplotlib之pyplot模块之坐标轴配置(axis():设置坐标轴外观、设置坐标轴范围)
- RJ45以太网接口EMC设计方案
- Label 相关论文汇总