打印
[STM8]

求解啊! STM8L151的EEPROM写不进去数据啊

[复制链接]
3663|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
void ST_EEPROM_Init(void)
{
        FLASH_SetProgrammingTime(FLASH_ProgramTime_TProg);
        do/*EEPROM存储*/       
        {
                FLASH->DUKR=0xAE;
                FLASH->DUKR=0x56;
        }while ((FLASH->IAPSR & 0x08)==0);/* Wait until Data EEPROM area unlocked flag is set*/
}

/***********************************ST_EEPROM写************************************/
void ST_EEPROM_Write(uint16_t addr,uint8_t data)
{
        /*uint8_t *p;
        p =(u8 *)(0X1000+addr);
        *p =data;*/
        *(PointerAttr uint8_t*) (uint16_t)(0X1000+addr) = data;
        while ((FLASH->IAPSR & 0x04)==0);/* Wait until Data EEPROM area unlocked flag is set*/
}

沙发
来自下邳的少年|  楼主 | 2015-10-23 12:48 | 只看该作者
程序老是死在while ((FLASH->IAPSR & 0x04)==0);/* Wait until Data EEPROM area unlocked flag is set*/这里面

使用特权

评论回复
板凳
金融小数| | 2015-10-23 14:38 | 只看该作者
你解锁了吗?

使用特权

评论回复
地板
来自下邳的少年|  楼主 | 2015-10-23 15:26 | 只看该作者

第一段程序的do循环里面 就是解锁啊

使用特权

评论回复
5
xiaox314| | 2015-10-23 16:18 | 只看该作者
/********************************************************************
FUNCTION:        Data_FlashInit(void)
DESCRIPTION:     初始化数据Flash (解锁)
INPUT:            
OUTPUT:            
RETURN:         
Created By:     Created Date:
********************************************************************/
void DataFlashInit(void)
{
                /* Define flash programming Time*/
                FLASH_SetProgrammingTime(FLASH_ProgramTime_Standard);
                /* Unlock flash data eeprom memory */
                FLASH_Unlock(FLASH_MemType_Data);
                /* Wait until Data EEPROM area unlocked flag is set*/
                while (FLASH_GetFlagStatus(FLASH_FLAG_DUL) == RESET);
}

/***************************************************************************
FUNCTION:       Data_FlashRead(uint32_t FlashAddr, uint8_t *dest, uint16_t nbyte)
DESCRIPTION:    读数据Flash
INPUT:          FlashAddr 地址 *dest 读出数据存储地址 nbyte 个数
OUTPUT:               
RETURN:        TRUE 读成功  FALSE 不成功
CREATED BY:    CREATED DATE:
***************************************************************************/
   
uint8_t DataFlashRead(uint32_t FlashAddr, uint8_t *dest, uint16_t nbyte)
{
                uint8_t i;
                if((FlashAddr<DATA_MEMORY_START_ADDR)||(FlashAddr+ nbyte >DATA_MEMORY_STOP_ADDR))
                {
                                return FALSE;
                }
                else
                {
                                for(i=0;i<nbyte;i++)
                                {
                                        *(dest+i)=FLASH_ReadByte(FlashAddr+i);
                                }
                                FLASH_WaitForLastOperation(FLASH_MemType_Data);
                                return TRUE;
                }
}

/****************************************************************************
FUNCTION:       Data_FlashWrite(uint32_t FlashAddr, uint8_t *source, uint16_t nbyte)
DESCRIPTION:    写数据Flash
INPUT:          FlashAddr  地址   *source  内容   nbyte 个数
OUTPUT:               
RETURN:        
CREATED BY:    CREATED DATE:
*****************************************************************************/
uint8_t DataFlashWrite(uint32_t FlashAddr, uint8_t *source, uint16_t nbyte)
{
                uint8_t i;
                if((FlashAddr<DATA_MEMORY_START_ADDR)||(FlashAddr+ nbyte >DATA_MEMORY_STOP_ADDR))
                {
                                return FALSE;
                }
                else
                {
                                for(i=0;i<nbyte;i++)
                                {
                                                FLASH_ProgramByte((FlashAddr+i),*(source + i));
                                }
                                FLASH_WaitForLastOperation(FLASH_MemType_Data);
                                return TRUE;
                }


}

使用特权

评论回复
6
稳稳の幸福| | 2015-10-23 16:54 | 只看该作者
刚开始是需要个解锁函数操作的。

使用特权

评论回复
7
来自下邳的少年|  楼主 | 2015-10-24 22:16 | 只看该作者
我现在解决了 原因可能有以下:
1、每一次进行EEPROM写操作时候最好进行解锁
2、进行软件仿真的时候有可能是运行不下去的,脱机运行是可以的
3、最好使用库函数进行操作

使用特权

评论回复
8
捉虫天师| | 2015-10-24 23:37 | 只看该作者
去看看cube里的代码,他们怎么做的

使用特权

评论回复
9
米尔豪斯| | 2015-10-25 16:48 | 只看该作者
进行软件仿真的时候有可能是运行不下去的,脱机运行是可以的

这是为什么,软件仿真的时候应该不会有什么影响吧

使用特权

评论回复
10
尤彼卡| | 2015-10-25 17:08 | 只看该作者
这程序怎么没注释呢
if((FlashAddr<DATA_MEMORY_START_ADDR)||(FlashAddr+ nbyte >DATA_MEMORY_STOP_ADDR))
是要判断什么呢

使用特权

评论回复
11
Thor9| | 2015-10-25 17:21 | 只看该作者
while ((FLASH->IAPSR & 0x04)==0);/* Wait until Data EEPROM area unlocked flag is set*/
看注释实说是在等待解锁呢,死在这里说明没解锁

使用特权

评论回复
12
可可球| | 2015-10-25 17:41 | 只看该作者
楼主用的什么方法解决的

使用特权

评论回复
13
gmm2015| | 2015-10-26 11:10 | 只看该作者
写数据前先解锁,写完之后上锁!
估计是你的程序在其他什么地方执行了上锁操作,然后写数据的时候又没解锁,所有出错

使用特权

评论回复
14
来自下邳的少年|  楼主 | 2015-11-12 09:43 | 只看该作者
本帖最后由 来自下邳的少年 于 2015-11-12 09:45 编辑
可可球 发表于 2015-10-25 17:41
楼主用的什么方法解决的

就是在每一次写数据之前先解锁,我们这有个工程师,他说写完之后会自动锁上的所以要解锁

使用特权

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

本版积分规则

3

主题

11

帖子

0

粉丝