中级会员
 
- 积分
- 303
- 金钱
- 303
- 注册时间
- 2013-7-15
- 在线时间
- 0 小时
|
下面是我的FLASH 测试代码,只是写入数据:
BOOL CheckBYS(u32 OutTime)
{
while(OutTime &(FLASH->SR &0x00000001))
{
OutTime--;
}
if(OutTime ==0)
return false;
else
return true;
}
uint16_t ErasePage(uint32_t address)
{
if(CheckBYS(0xfff))
{
//set PER
FLASH->CR |=0x00000002;
//select address
FLASH->AR = address;
//set STRT bit
FLASH->CR |= 0x00000040;
if(CheckBYS(0xfff))
{
}
FLASH->CR &= 0xfffffffd;
}
return 0;
}
uint16_t MainFlashWrite_16b(u32 address, u16 data)
{
uint16_t tmpdata;
//1.check BYS bit of FLASH->SR
if(CheckBYS(0xfff))
{
//2. set bit PG of FLASH->CR
FLASH->CR |= 0x00000001;
//3.write data at the address
*(volatile uint16_t *)address = (u16)data;
//4.wait BYS to be reset
if(CheckBYS(0xfff))
{
//5.check program value
tmpdata = *(volatile uint16_t *)address;
}
//set PG reset
FLASH->CR &= 0xfffffffe;
}
return tmpdata;
}
/**
* @brief Main program.
* @param None
* @retval None
*/
int main(void)
{
u32 i,page;
u16 data,cnt;
u32 status;
SystemInit();
//set latency
status = FLASH->ACR;
FLASH->ACR = ((status & 0xfffffff8) | 0x00000002);
//unlock flash
FLASH->KEYR = 0x45670123;
FLASH->KEYR = 0xCDEF89AB;
//clear flag
FLASH->SR |= 0x00000034;
//page number
page = (0x80002000 - 0x80000000)/0x800 + 1; //HD page size is 0x800
//erase page
for(i=0; i< page; i++)
{
ErasePage(0x80000000 + (0x800) * i); //当不执行ErasePage()函数时可以执行整个程序,但是数据不会写入,而且在线仿真发现寄存器都不能写入!!
//FLASH_ErasePage(0x80000000 + (0x800) * i);
}
for(i=0; i<100; i++)
{
data = MainFlashWrite_16b(0x80002000+i*2,0x9999);
if(data != 0x9999)
cnt++;
}
//lock flash
FLASH->CR |= 0x00000080;
while(1);
}
现在的问题是当添加擦出函数 ErasePage()时,程序在硬件上仿真不能运行,停留在启动的地方,软件仿真可以写入。去除 ErasePage()函数可以执行main函数了,但是不能写入,而且查看寄存器的值,根本不能写入,都是 0x00000000.除了一个特殊的寄存器 FLASH->ACR 可以读写,这是什么情况呢?我参考例程感觉没多大的问题。。
|
|