标题:
PIC16F1455 Flash不能擦除和写入
[打印本页]
作者:
Antecer
时间:
2016-1-10 11:42
标题:
PIC16F1455 Flash不能擦除和写入
本帖最后由 Antecer 于 2016-1-10 11:49 编辑
以下是我用于测试的代码:
#include <xc.h>
// CONFIG1
#pragma config FOSC = INTOSC // Oscillator Selection Bits (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF // Internal/External Switchover Mode (Internal/External Switchover Mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config CPUDIV = NOCLKDIV// CPU System Clock Selection Bit (NO CPU system divide)
#pragma config USBLSCLK = 48MHz // USB Low SPeed Clock Selection bit (System clock expects 48 MHz, FS/LS USB CLKENs divide-by is set to 8.)
#pragma config PLLMULT = 3x // PLL Multipler Selection Bit (3x Output Frequency Selected)
#pragma config PLLEN = ENABLED // PLL Enable Bit (3x or 4x PLL Enabled)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LPBOR = OFF // Low-Power Brown Out Reset (Low-Power BOR is disabled)
#pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)
#define UINT8 unsigned char
#define UINT16 unsigned int
#define NV_MEM_SIZE 32
extern const unsigned char NVMEM[NV_MEM_SIZE];
#define NV_ADDRESS (0x2000U - NV_MEM_SIZE)
const UINT8 NVMEM[NV_MEM_SIZE]@NV_ADDRESS = {
0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13,
0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b,
0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23
};
UINT8 GetData[NV_MEM_SIZE];
void ReadFlash(UINT16 FlashAddr, UINT8 *Data, UINT8 DataLength) {
PMADR = FlashAddr; //读取数据的首地址
for (UINT8 i = 0; i < DataLength; i++) //循环读取连续数据
{
CFGS = 0;
RD = 1;
NOP();
NOP();
*Data = PMDATL; //取数据低8位存入数组
PMADR++;
Data++;
}
}
void UnlockFlash(){
PMCON2 = 0x55;
PMCON2 = 0xAA;
WR = 1;
NOP();
NOP();
}
void EraseFlash(UINT16 address){
OSCCON = 0b11101100; //切换到1MHz x 3PLL;
GIE = 0;
PMCON1bits.CFGS = 0;
PMADR = address;
PMCON1bits.FREE = 1; //启用程序闪存擦除启用
PMCON1bits.WREN = 1; //允许编程
UnlockFlash(); //解锁序列
PMCON1bits.WREN = 0; //禁止编程
GIE = 1;
}
void main(void) {
ReadFlash(NV_ADDRESS,GetData,NV_MEM_SIZE);
EraseFlash(NV_ADDRESS);
while (1);
}
复制代码
QQ截图20160110111812.jpg
(87.91 KB, 下载次数: 113)
下载附件
2016-1-10 11:42 上传
作者:
Antecer
时间:
2016-1-10 21:03
等了一天了,还是没得到解答 = =
作者:
涛qq623942603
时间:
2023-11-28 08:12
解决了吗?我也遇到了类似的问题,我用PIC16F1825,可以写入数据,也可以读出数据,就是不能擦除数据。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1