本帖最后由 skyhawl 于 2017-11-23 15:45 编辑
该芯片的flash的main program区域可以到0x17fff,但是在进行flash块写的时候,可以一直写到0xffff所在块。但是0x10000之后的块写不进去了。不知道是何原因。大概代码如下。完整代码比较多。简单贴出部分。大致做法是:有一个flash中的fls_write_block函数。将它copy到ram中,然后从ram中调用。使用环境为STVD环境。
COPY_FLSWRITEBLOCK_INTO_RAM();
for(i=0;i<128;i++)//初始化/赋值块数据缓冲区
{
DataBuffer = i;
}
eeprom_block = 0xff80; // 块操作的首地址。
_asm("call _eeprom_write_block_in_ram"); // 调用RAM地址的指令
//----------------------------------------
eeprom_block = 0x10000; // 块操作的首地址。
_asm("call _eeprom_write_block_in_ram"); // 调用RAM地址的指令
//----------------------------------------
void FLS_WRITE_BLOCK(void)
{
unsigned char count;
/*固定编程时间为tprog,FIX=1 */
FLASH_CR1 &= ~0x01;
FLASH_CR1 |= 0x01;
/*设置为块编程模式*/
FLASH_CR2 &= ~0x01;
FLASH_CR2 |= 0x01;
/*输入MASS密钥,解锁EEPROM */
FLASH_PUKR = 0x56;
FLASH_PUKR = 0xAE;
/*写入128字节数据,即一个块*/
for(count = 0;count < 128;count++)
{
*((unsigned char*)(eeprom_block + count)) = DataBuffer[count];
}
/*等待HVOFF=1,即EEPROM编程结束*/
while((FLASH_IAPSR & 0x40)!= 0);
}
//----------------------------------------
/************将块写函数EEPROM_WRITE_BLOCK拷贝到RAM中************/
void COPY_EEPROMWRITEBLOCK_INTO_RAM(void)
{
unsigned char eecount = 0;
while(*((unsigned char*)FLS_WRITE_BLOCK+ eecount) != 0x81)
{
eeprom_write_block_in_ram[eecount] = *((unsigned char*)FLS_WRITE_BLOCK+ eecount);
eecount++;
}
eeprom_write_block_in_ram[eecount] = 0x81; //0x81为RET指令
}
|