再讨论c8051f340内部flash当非易失性存储器,求救

[复制链接]
5674|30
 楼主| xbyu520 发表于 2014-4-25 16:26 | 显示全部楼层 |阅读模式
本帖最后由 xbyu520 于 2014-4-25 16:34 编辑

这是我严格按照f340手册写的简单程序,写完执行后,看到闪灯。用官方Flash Programming Utility读code 0x0100 到0x0104数据。不是0x99  哪里问题呢??困扰几天了
#include<c8051f340.h>
// Peripheral specific initialization functions,
// Called from the Init_Device() function
void PCA_Init()
{
    PCA0MD    &= ~0x40;
    PCA0MD    = 0x00;
}

void Oscillator_Init()
{
    OSCICN    = 0x83;
}
void Reset_Sources_Init()
{
    int i = 0;
    VDM0CN    = 0x80;
    for (i = 0; i < 350; i++);  // Wait 100us for initialization
}
void Port_IO_Init()
{
    P2MDOUT   = 0x10;
    XBR1      = 0x40;
}

// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
    PCA_Init();
    Oscillator_Init();
                Port_IO_Init();
                Reset_Sources_Init();
}

unsigned char i;
unsigned int *pwrite;
unsigned char j;
unsigned char k;
sbit LED=P2^4;
/*²Á³ýflashº¯Êý*/
void EraserFlash()
{
        EA=0;                                                        //"禁止中断,建议这么做"手册原话,一个字没改
        FLKEY=0xA5;                                //写入第一个关键码
        FLKEY=0xF1;                                //写入第二个关键码
        FLSCL=0x80;
        PSCTL=0x03;                        //将pswe  psee 置1
        pwrite=0x0100;
        *pwrite=0xff;                        //写入一个字节,相当于擦除整个扇区
        PSCTL =0;                            //清除pswe  psee
}
/*写字节函数*/
void Write_flash()
{
        EA=0;                                                        //"禁止中断,建议这么做"手册原话,一个字没改
        PFE0CN = 0;      // Clear the FLBWE bit (register PFE0CN) to select single-byte
        PSCTL=0x01;                                //set the PSWE bit,clear the PSEE bit
        for(i=0;i<5;i++)
        {        
                FLKEY=0xA5;                                //送入第一个关键码
                FLKEY=0xF1;                                //送入第二个关键码
                *pwrite=0x99;
                pwrite++;
        }
        PSCTL = 0;                                         // Clear the PSWE bit.½ûÖ¹flashд
        EA=1;                                                                //使能中断
}


void main()
{
                Init_Device();
                EraserFlash();
                Write_flash();
               
                while(1)
                {
                        for(j=0;j<255;j++)
                        for(k=0;k<255;k++);
                        LED=~LED;
                        
                }
}
 楼主| xbyu520 发表于 2014-4-25 16:56 | 显示全部楼层
自己顶起来
ayb_ice 发表于 2014-4-25 17:01 | 显示全部楼层
写,擦除时EEPROM时要用指向XDATA的指针,

多看手册吧,居然说搞几天了
 楼主| xbyu520 发表于 2014-4-25 17:12 | 显示全部楼层
这样写:::   xdata unsigned int *pwrite;  读出来是5个0xff

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| xbyu520 发表于 2014-4-25 17:17 | 显示全部楼层
ayb_ice 发表于 2014-4-25 17:01
写,擦除时EEPROM时要用指向XDATA的指针,

多看手册吧,居然说搞几天了

xdata unsigned int *pwrite;  读出来是5个0xff
 楼主| xbyu520 发表于 2014-4-25 17:21 | 显示全部楼层
好像官方给了这方面的例程,但是例程太罗嗦了。且运行不了。我先弄个最简单的试着读写
 楼主| xbyu520 发表于 2014-4-25 17:40 | 显示全部楼层
自己顶起来
ningling_21 发表于 2014-4-25 18:46 | 显示全部楼层
xbyu520 发表于 2014-4-25 17:21
好像官方给了这方面的例程,但是例程太罗嗦了。且运行不了。我先弄个最简单的试着读写 ...

官方例程运行不了?
 楼主| xbyu520 发表于 2014-4-25 21:26 来自手机 | 显示全部楼层
ningling_21 发表于 2014-4-25 18:46 官方例程运行不了?

我在网上找的,确实运行不了,所以自己按照手册写了。可还是写不成功。找不到原因
ningling_21 发表于 2014-4-25 21:49 | 显示全部楼层
xbyu520 发表于 2014-4-25 21:26
我在网上找的,确实运行不了,所以自己按照手册写了。可还是写不成功。找不到原因 ...

你定义的指针是指向哪里的呢?
yhn1973 发表于 2014-4-25 22:01 | 显示全部楼层
别用指针了,用XBYTE[0x0100]=xxxx。另外你程序也应该在这个扇区,你把该扇区擦除了还怎么运行程序。
 楼主| xbyu520 发表于 2014-4-25 22:29 | 显示全部楼层
ningling_21 发表于 2014-4-25 21:49
你定义的指针是指向哪里的呢?

指向code
 楼主| xbyu520 发表于 2014-4-25 22:33 | 显示全部楼层
yhn1973 发表于 2014-4-25 22:01
别用指针了,用XBYTE[0x0100]=xxxx。另外你程序也应该在这个扇区,你把该扇区擦除了还怎么运行程序。 ...

实际运行时,看到led 小灯闪烁了。说明运行了。
 楼主| xbyu520 发表于 2014-4-26 08:01 | 显示全部楼层
自己再次顶起来。论坛的网友都来看看啊
ningling_21 发表于 2014-4-26 08:28 | 显示全部楼层
xbyu520 发表于 2014-4-25 22:29
指向code

大错特错了,应该指向外部RAM才对...
ningling_21 发表于 2014-4-26 08:32 | 显示全部楼层
还是用XBYTE[] 的方式吧...
 楼主| xbyu520 发表于 2014-4-26 08:33 | 显示全部楼层
#include<c8051f340.h>
// Peripheral specific initialization functions,
// Called from the Init_Device() function
void PCA_Init()
{
    PCA0MD    &= ~0x40;
    PCA0MD    = 0x00;
}

void Oscillator_Init()
{
    OSCICN    = 0x83;
}
void Reset_Sources_Init()
{
    int i = 0;
    VDM0CN    = 0x80;
    for (i = 0; i < 350; i++);  // Wait 100us for initialization
}
void Port_IO_Init()
{
    P2MDOUT   = 0x10;
    XBR1      = 0x40;
}

// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
    PCA_Init();
    Oscillator_Init();
                Port_IO_Init();
                Reset_Sources_Init();
}

unsigned char i;
xdata unsigned int *pwrite;
unsigned char j;
unsigned char k;
sbit LED=P2^4;
/*²Á³ýflashº¯Êý*/
void EraserFlash()
{
        EA=0;                                                        //"禁止中断,建议这么做"手册原话,一个字没改
        FLKEY=0xA5;                                //写入第一个关键码
        FLKEY=0xF1;                                //写入第二个关键码
        FLSCL=0x80;
        PSCTL=0x03;                        //将pswe  psee 置1
        pwrite=0x0100;
        *pwrite=0xff;                        //写入一个字节,相当于擦除整个扇区
        PSCTL =0;                            //清除pswe  psee
}
/*写字节函数*/
void Write_flash()
{
        EA=0;                                                        //"禁止中断,建议这么做"手册原话,一个字没改
        PFE0CN = 0;      // Clear the FLBWE bit (register PFE0CN) to select single-byte
        PSCTL=0x01;                                //set the PSWE bit,clear the PSEE bit
        for(i=0;i<5;i++)
        {        
                FLKEY=0xA5;                                //送入第一个关键码
                FLKEY=0xF1;                                //送入第二个关键码
                *pwrite=0x99;
                pwrite++;
        }
        PSCTL = 0;                                         // Clear the PSWE bit.½ûÖ¹flashд
        EA=1;                                                                //使能中断
}


void main()
{
                Init_Device();
                EraserFlash();
                Write_flash();
               
                while(1)
                {
                        for(j=0;j<255;j++)
                        for(k=0;k<255;k++);
                        LED=~LED;
                        
                }
}
 楼主| xbyu520 发表于 2014-4-26 08:34 | 显示全部楼层
Rebuild target 'Target 1'
compiling test.c...
linking...
Program Size: data=12.0 xdata=3 code=225
"test" - 0 Error(s), 0 Warning(s).
 楼主| xbyu520 发表于 2014-4-26 08:35 | 显示全部楼层
以上是调试信息,程序中unsigned int *pwrite;已经改成了xdata unsigned int *pwrite;  用Flash Programming Utility读code 0x0100 到0x0104数据。不是0x99
 楼主| xbyu520 发表于 2014-4-26 08:37 | 显示全部楼层
ningling_21 发表于 2014-4-26 08:28
大错特错了,应该指向外部RAM才对...

xdata unsigned int *pwrite  正常情况下,应该在外部xram
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:工作不养闲人,团队不养懒人。赚不到钱赚知识,赚不到知识赚经历,赚不到经历赚阅历,让人迷茫的原因只有一

43

主题

854

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部