OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5390|回复: 3

STM32 FLASH问题

[复制链接]

38

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2013-7-15
在线时间
0 小时
发表于 2014-4-18 12:12:43 | 显示全部楼层 |阅读模式
下面是我的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 可以读写,这是什么情况呢?我参考例程感觉没多大的问题。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-18 13:04:21 | 显示全部楼层
回复【楼主位】TDB:
---------------------------------
帮顶
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-4-18 20:33:29 | 显示全部楼层
你可以直接拿我们例程试试先。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

38

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2013-7-15
在线时间
0 小时
 楼主| 发表于 2014-4-18 21:55:23 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
解决了,FLASH地址写错。。。。本来该起始地址 0x08000000,结果写成了 0x80000000,而且,FLASH编程的起始地址不能太低
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-10 05:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表