编程驱动的差异
STM8L001和STM8L101系列单片机片上的EEPROM的驱动方式和STM8L05X或STM8L15X系列单片机的驱动方式存在差异,由两组单片机的参考手册中的内存结构图可获知:
- STM8L001系列单片机,内部EEPROM包含在MAIN FLASH上,不能按常规的EEPROM解锁MASS密钥进行解锁;
- STM8L001组驱动内部EEPROM时,进行写保护的解锁的时候,应该解锁的是FLASH的MASS密钥(往**FLASH_PUKR寄存器写入0x56,0xAE**),而非EEPROM的密钥(往FLASH_DUKR寄存器写入0xAE,0x56);
- STM8L15X系列单片机,内部EEPROM独立于MAIN FLASH,可按常规的EEPROM解锁MASS密钥进行解锁;
- STM8L15X组驱动内部EEPROM时,进行写保护的解锁的时候,按常规的EEPROM解锁MASS密钥进行解锁即可。
图1 STM8L001/101系列单片机内存分配图
图2 STM8L05X/15X系列单片机内存分配图
遗留问题
- STM8L001芯片执行EEPROM的block写入操作,会出现重启现象,原因暂不明确;STM8L15x芯片无此现象;
STM8L001芯片执行eeprom写入操作时,推荐直接调用FLASH_ProgramByte(add,data)函数接口单字节写入:
/*******************************************************************************
**函数名称:void EEPROM_Block_Write(u16 start_address, u8 block_Num, u16 *Data)
**功能描述:向EEPROM中固定地址写入一个或多个64字节(1个block)数据
**入口参数:
start_address : EEPROM块首地址
block_Num : 读取的block数量
*Data : 存储数据的数组
**输出:无
*******************************************************************************/
void EEPROM_Block_Write(u16 start_address, u8 block_Num, u16 *Data)
{
u8 DataH = 0;
u8 DataL = 0;
u16 add = 0;
add = start_address;
FLASH_DeInit();
/* Define flash programming Time*/
FLASH_SetProgrammingTime(FLASH_ProgramTime_Standard);
//STM8L001EEPROM需要擦写FLASH,非EEPROM
FLASH_Unlock(FLASH_MemType_Program);
/* Wait until Flash Program area unlocked flag is set*/
while (FLASH_GetFlagStatus(FLASH_FLAG_PUL) == RESET)
{
}
//test
/* for (u16 i = 0; i < IRBUFSIZE; i++)
{
if (i == 100)
{
dataBuf[i] = 0xfffd;
}
else
{
dataBuf[i] = newval++;
}
} */
for (u16 i = 0; i < (FLASH_BLOCK_SIZE * block_Num); i++)
{
// 大端模式,低位地址存高位数据
DataH = (u8)(Data[i] >> 8);
FLASH_ProgramByte(add, DataH);
/* Wait until End of programming flag is set*/
while (FLASH_GetFlagStatus(FLASH_FLAG_EOP) == RESET)
{
}
add++;
DataL = (u8)Data[i];
FLASH_ProgramByte(add, DataL);
add++;
/* Wait until End of programming flag is set*/
while (FLASH_GetFlagStatus(FLASH_FLAG_EOP) == RESET)
{
}
if (Data[i] == 0xFFFD) //读到结束字符,则停止再写入数据
{
break;
}
}
/* lock flash data eeprom memory */
FLASH_Lock(FLASH_MemType_Program);
LED_Normal_Flash(); //写入完成反馈
}
STM8L001芯片读取eeprom的数据时,调用FLASH_ReadByte(add)函数接口单字节读取数据:
/*******************************************************************************
**函数名称:void EEPROM_Block_Read(u16 start_address, u8 block_Num, u16 *Data)
**功能描述:向EEPROM中固定地址读出1个或多个64个字节(1个block)数据
**入口参数:
start_address : EEPROM块首地址
block_Num : 读取的block数量
*Data : 存储数据的数组
**输出:无
*******************************************************************************/
void EEPROM_Block_Read(u16 start_address, u8 block_Num, u16 *Data)
{
u16 DataL = 0;
u16 DataH = 0;
u16 add = 0;
add = start_address;
// test
/* for (u16 i = 0; i < IRBUFSIZE; i++)
{
dataBuf[i] = 0;
} */
for (u16 i = 0; i < (FLASH_BLOCK_SIZE * block_Num); i++)
{
// 大端模式,低位地址存高位数据
DataH = FLASH_ReadByte(add);
add++;
delay_ms(1);
DataL = FLASH_ReadByte(add);
add++;
delay_ms(1);
Data[i] = (DataH << 8) | DataL;
if (Data[i] == 0xFFFD) //读到结束字符,则停止再读取数据
{
break;
}
}
}