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

[复制链接]
4162|13
 楼主| 来自下邳的少年 发表于 2015-10-23 12:47 | 显示全部楼层 |阅读模式
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循环里面 就是解锁啊
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;
                }


}
稳稳の幸福 发表于 2015-10-23 16:54 | 显示全部楼层
刚开始是需要个解锁函数操作的。
 楼主| 来自下邳的少年 发表于 2015-10-24 22:16 | 显示全部楼层
我现在解决了 原因可能有以下:
1、每一次进行EEPROM写操作时候最好进行解锁
2、进行软件仿真的时候有可能是运行不下去的,脱机运行是可以的
3、最好使用库函数进行操作
捉虫天师 发表于 2015-10-24 23:37 来自手机 | 显示全部楼层
去看看cube里的代码,他们怎么做的
米尔豪斯 发表于 2015-10-25 16:48 | 显示全部楼层
进行软件仿真的时候有可能是运行不下去的,脱机运行是可以的

这是为什么,软件仿真的时候应该不会有什么影响吧
尤彼卡 发表于 2015-10-25 17:08 | 显示全部楼层
这程序怎么没注释呢
if((FlashAddr<DATA_MEMORY_START_ADDR)||(FlashAddr+ nbyte >DATA_MEMORY_STOP_ADDR))
是要判断什么呢
Thor9 发表于 2015-10-25 17:21 | 显示全部楼层
while ((FLASH->IAPSR & 0x04)==0);/* Wait until Data EEPROM area unlocked flag is set*/
看注释实说是在等待解锁呢,死在这里说明没解锁
可可球 发表于 2015-10-25 17:41 | 显示全部楼层
楼主用的什么方法解决的
gmm2015 发表于 2015-10-26 11:10 | 显示全部楼层
写数据前先解锁,写完之后上锁!
估计是你的程序在其他什么地方执行了上锁操作,然后写数据的时候又没解锁,所有出错
 楼主| 来自下邳的少年 发表于 2015-11-12 09:43 | 显示全部楼层
本帖最后由 来自下邳的少年 于 2015-11-12 09:45 编辑
可可球 发表于 2015-10-25 17:41
楼主用的什么方法解决的

就是在每一次写数据之前先解锁,我们这有个工程师,他说写完之后会自动锁上的所以要解锁
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

11

帖子

0

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