[STM32F1] STM32F103C8内部FLASH模拟EEPORM操作死机问题

[复制链接]
 楼主| yufe 发表于 2022-1-1 12:14 | 显示全部楼层 |阅读模式
在调试STM32F103C8内部FLASH当EEPORM使用时,一直没调通,求助友们;调了好几天没调通,读取指定位置没有问题,但是尝试写入时就会死机,就是程序执行FLASH_ProgramHalfWord()这句时就会死机。求大家相助,谢谢,
void STMFLASH_Write_NoCheck(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)
{
        u16 i;
        for(i=0;i<NumToWrite;i++)
        {
                FLASH_ProgramHalfWord(WriteAddr,pBuffer[i]);
                WriteAddr+=2;//地址增加2
        }
 楼主| yufe 发表于 2022-1-1 12:16 | 显示全部楼层
我把函简化成下面,就是会死机,万分求助
void FLASHINIT_FLASH(void)
{
FLASH_Unlock();//解锁
FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);//清除标志位
FLASH_ErasePage(0x08002a50);//要擦出页的起始地址
FLASH_ProgramWord(0x08002a50,0x1234);//写数据
//是一个字即四个字节
FLASH_Lock();//锁定
}
llljh 发表于 2022-1-1 12:18 | 显示全部楼层
原子的有现成的,用原子的好了
 楼主| yufe 发表于 2022-1-1 12:23 | 显示全部楼层
网上找了好多例程,没发现程序出错在哪里
xxmmi 发表于 2022-1-1 12:25 | 显示全部楼层

FLASH_ErasePage(0x08002a50);
你先确认这个是否又问题
zwll 发表于 2022-1-1 12:28 | 显示全部楼层
你擦除的地址要遵循page大小对齐。你的编程函数用库函数的应该没啥问题,如果自己写的
注意F1系列支持半字编程。
xxrs 发表于 2022-1-1 12:30 | 显示全部楼层
各个页的地址可以在参考手册的Memory map的Flash module organization查看到。
heweibig 发表于 2022-1-1 12:32 | 显示全部楼层

以前调试别的芯片,遵循2个原则
1要关闭中断
2在RAM中运行
不知道有没有帮助
songqian17 发表于 2022-1-1 12:35 | 显示全部楼层
PAGE 要看手册,一般8k/16k/32k 都有可能,一般写块的首地址
 楼主| yufe 发表于 2022-1-1 12:36 | 显示全部楼层
对啊,执行擦除函数也一样会死机,但我发现执行写入函数,我打开函数库里面看过,发现只要执行函数库里面这一句(*(__IO uint16_t*)baseaddr =0x3456;//在指定的地址写入要编程的半字);就会死机,我只要把函数库里面这一句删掉就不会死机。
下面是我用寄存器方式编程也一样会死机:

                FLASH->KEYR = 0x45670123;  //解锁 打开FPEC模块
                    FLASH->KEYR = 0xCDEF89AB;
                    FLASH->CR|=1;//设置FLASH_CR寄存器的PG位为’1’;编程操作
                *(__IO uint16_t*)baseaddr =0x3456;//在指定的地址写入要编程的半字;执行这一句时就死机,重新上电也一样现象
        FLASH->CR |= 0x00000080;//上锁
 楼主| yufe 发表于 2022-1-1 12:39 | 显示全部楼层

页地址都试过,所写入的地址和页里面可以完确认没有正常程序的,不存在说把正常使用程序给覆盖了
stly 发表于 2022-1-1 12:48 | 显示全部楼层
不论标准库还是Cube库里面都有可以参考的。

关于flash的编写流程,手册写得清楚,将它结合例程代码看下。整个操作不难,细心点。
stly 发表于 2022-1-1 12:52 | 显示全部楼层
● Check that no main Flash memory operation is ongoing by checking the BSY bit in the
FLASH_SR register.
● Set the PG bit in the FLASH_CR register.
● Perform the data write (half-word) at the desired address.
● Wait for the BSY bit to be reset.
● Read the programmed value and verify.
jlyuan 发表于 2022-1-1 12:55 | 显示全部楼层
每次都会这样吗
heweibig 发表于 2022-1-1 13:00 | 显示全部楼层
说明写不进去 啊
 楼主| yufe 发表于 2022-1-1 13:03 | 显示全部楼层

嗯,我再好好缕一缕吧,有了好消息及时通知大家
zylhaha 发表于 2022-7-23 16:14 | 显示全部楼层
这个应该跟定义的数据结构有关,数据的地址必须是对齐的,可以尝试增加一个u8变量或者删除一个u8变量。我碰到的问题是这样解决的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

983

主题

10170

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部