打印

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

[复制链接]
4883|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

360截图20140425171117710.jpg (21.09 KB )

360截图20140425171117710.jpg

使用特权

评论回复
5
xbyu520|  楼主 | 2014-4-25 17:17 | 只看该作者
ayb_ice 发表于 2014-4-25 17:01
写,擦除时EEPROM时要用指向XDATA的指针,

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

xdata unsigned int *pwrite;  读出来是5个0xff

使用特权

评论回复
6
xbyu520|  楼主 | 2014-4-25 17:21 | 只看该作者
好像官方给了这方面的例程,但是例程太罗嗦了。且运行不了。我先弄个最简单的试着读写

使用特权

评论回复
7
xbyu520|  楼主 | 2014-4-25 17:40 | 只看该作者
自己顶起来

使用特权

评论回复
8
ningling_21| | 2014-4-25 18:46 | 只看该作者
xbyu520 发表于 2014-4-25 17:21
好像官方给了这方面的例程,但是例程太罗嗦了。且运行不了。我先弄个最简单的试着读写 ...

官方例程运行不了?

使用特权

评论回复
9
xbyu520|  楼主 | 2014-4-25 21:26 | 只看该作者
ningling_21 发表于 2014-4-25 18:46 官方例程运行不了?

我在网上找的,确实运行不了,所以自己按照手册写了。可还是写不成功。找不到原因

使用特权

评论回复
10
ningling_21| | 2014-4-25 21:49 | 只看该作者
xbyu520 发表于 2014-4-25 21:26
我在网上找的,确实运行不了,所以自己按照手册写了。可还是写不成功。找不到原因 ...

你定义的指针是指向哪里的呢?

使用特权

评论回复
11
yhn1973| | 2014-4-25 22:01 | 只看该作者
别用指针了,用XBYTE[0x0100]=xxxx。另外你程序也应该在这个扇区,你把该扇区擦除了还怎么运行程序。

使用特权

评论回复
12
xbyu520|  楼主 | 2014-4-25 22:29 | 只看该作者
ningling_21 发表于 2014-4-25 21:49
你定义的指针是指向哪里的呢?

指向code

使用特权

评论回复
13
xbyu520|  楼主 | 2014-4-25 22:33 | 只看该作者
yhn1973 发表于 2014-4-25 22:01
别用指针了,用XBYTE[0x0100]=xxxx。另外你程序也应该在这个扇区,你把该扇区擦除了还怎么运行程序。 ...

实际运行时,看到led 小灯闪烁了。说明运行了。

使用特权

评论回复
14
xbyu520|  楼主 | 2014-4-26 08:01 | 只看该作者
自己再次顶起来。论坛的网友都来看看啊

使用特权

评论回复
15
ningling_21| | 2014-4-26 08:28 | 只看该作者
xbyu520 发表于 2014-4-25 22:29
指向code

大错特错了,应该指向外部RAM才对...

使用特权

评论回复
16
ningling_21| | 2014-4-26 08:32 | 只看该作者
还是用XBYTE[] 的方式吧...

使用特权

评论回复
17
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;
                        
                }
}

使用特权

评论回复
18
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).

使用特权

评论回复
19
xbyu520|  楼主 | 2014-4-26 08:35 | 只看该作者
以上是调试信息,程序中unsigned int *pwrite;已经改成了xdata unsigned int *pwrite;  用Flash Programming Utility读code 0x0100 到0x0104数据。不是0x99

使用特权

评论回复
20
xbyu520|  楼主 | 2014-4-26 08:37 | 只看该作者
ningling_21 发表于 2014-4-26 08:28
大错特错了,应该指向外部RAM才对...

xdata unsigned int *pwrite  正常情况下,应该在外部xram

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

43

主题

853

帖子

5

粉丝