打印
[STM32F1]

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

[复制链接]
451|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 | 只看该作者
网上找了好多例程,没发现程序出错在哪里

使用特权

评论回复
5
xxmmi| | 2022-1-1 12:25 | 只看该作者

FLASH_ErasePage(0x08002a50);
你先确认这个是否又问题

使用特权

评论回复
6
zwll| | 2022-1-1 12:28 | 只看该作者
你擦除的地址要遵循page大小对齐。你的编程函数用库函数的应该没啥问题,如果自己写的
注意F1系列支持半字编程。

使用特权

评论回复
7
xxrs| | 2022-1-1 12:30 | 只看该作者
各个页的地址可以在参考手册的Memory map的Flash module organization查看到。

使用特权

评论回复
8
heweibig| | 2022-1-1 12:32 | 只看该作者

以前调试别的芯片,遵循2个原则
1要关闭中断
2在RAM中运行
不知道有没有帮助

使用特权

评论回复
9
songqian17| | 2022-1-1 12:35 | 只看该作者
PAGE 要看手册,一般8k/16k/32k 都有可能,一般写块的首地址

使用特权

评论回复
10
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;//上锁

使用特权

评论回复
11
yufe|  楼主 | 2022-1-1 12:39 | 只看该作者

页地址都试过,所写入的地址和页里面可以完确认没有正常程序的,不存在说把正常使用程序给覆盖了

使用特权

评论回复
12
stly| | 2022-1-1 12:48 | 只看该作者
不论标准库还是Cube库里面都有可以参考的。

关于flash的编写流程,手册写得清楚,将它结合例程代码看下。整个操作不难,细心点。

使用特权

评论回复
13
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.

使用特权

评论回复
14
jlyuan| | 2022-1-1 12:55 | 只看该作者
每次都会这样吗

使用特权

评论回复
15
heweibig| | 2022-1-1 13:00 | 只看该作者
说明写不进去 啊

使用特权

评论回复
16
yufe|  楼主 | 2022-1-1 13:03 | 只看该作者

嗯,我再好好缕一缕吧,有了好消息及时通知大家

使用特权

评论回复
17
zylhaha| | 2022-7-23 16:14 | 只看该作者
这个应该跟定义的数据结构有关,数据的地址必须是对齐的,可以尝试增加一个u8变量或者删除一个u8变量。我碰到的问题是这样解决的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

983

主题

10170

帖子

1

粉丝