你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32写入Flash不正常

[复制链接]
wang12zhe-29129 提问时间:2015-6-26 09:27 /
我参考原子的战舰开发板


使用实验34 FLASH模拟EEPROM实验的Flash写操作函数 STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)   
从0x08003000开始写入数据,一次写入200个字节,刚开始写入正常,但是当起始地址为0x080033e8的时候,再写入200个字节时,从
0x08003400开始就再也写不进去了,   

这是为什么, 我的芯片是STM32F103RBT6

+
下面是我的一部分代码
void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)
{
u32 secpos;           //扇区地址
u16 secoff;           //扇区内偏移地址(16位字计算)
u16 secremain; //扇区内剩余地址(16位字计算)          
        u16 i;   
u32 offaddr;   //去掉0X08000000后的地址
if(WriteAddr<STM32_FLASH_BASE||(WriteAddr>=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;//非法地址
FLASH_Unlock();         //解锁
offaddr=WriteAddr-STM32_FLASH_BASE;         //实际偏移地址.
secpos=offaddr/STM_SECTOR_SIZE;         //扇区地址  0~127 for STM32F103RBT6
secoff=(offaddr%STM_SECTOR_SIZE)/2;         //在扇区内的偏移(2个字节为基本单位.)
secremain=STM_SECTOR_SIZE/2-secoff;         //扇区剩余空间大小   
if(NumToWrite<=secremain)secremain=NumToWrite;//不大于该扇区范围
while(1)
{
STMFLASH_Read(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//读出整个扇区的内容
for(i=0;i<secremain;i++)//校验数据
{
if(STMFLASH_BUF[secoff+i]!=0XFFFF)break;//需要擦除            
}
if(i<secremain)//需要擦除
{
FLASH_ErasePage(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE);//擦除这个扇区
for(i=0;i<secremain;i++)//复制
{
STMFLASH_BUF[i+secoff]=pBuffer;          
}
STMFLASH_Write_NoCheck(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//写入整个扇区  
}else STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);//写已经擦除了的,直接写入扇区剩余区间.   
if(NumToWrite==secremain)break;//写入结束了
else//写入未结束
{
secpos++;         //扇区地址增1
secoff=0;         //偏移位置为0  
  pBuffer+=secremain;          //指针偏移
WriteAddr+=secremain;        //写地址偏移          
  NumToWrite-=secremain;        //字节(16位)数递减
if(NumToWrite>(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;//下一个扇区还是写不完
else secremain=NumToWrite;//下一个扇区可以写完了
}         
};
FLASH_Lock();//上锁
}





其中
void STMFLASH_Write_NoCheck(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)   
{                                           
        u16 i;
        for(i=0;i<NumToWrite;i++)
        {
                FLASH_ProgramHalfWord(WriteAddr,pBuffer);
            WriteAddr+=2;//地址增加2.
        }  
}





收藏 评论2 发布时间:2015-6-26 09:27

举报

2个回答
stary666 回答时间:2015-6-26 09:40:11
有坏道?还是没有解保护
wang12zhe-29129 回答时间:2015-6-26 19:05:20
stary666 发表于 2015-6-26 09:40
有坏道?还是没有解保护

因为我写入的数据较多,需要跨过几个页,  因此每次写入的数个要能被页大小整除,别人说的

试了一下 成功了,,


不知道原因

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版