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

[复制链接]
728|13
 楼主| yufe 发表于 2019-12-18 21:10 | 显示全部楼层 |阅读模式
在调试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 发表于 2019-12-18 21:13 | 显示全部楼层
我把函简化成下面,就是会死机,万分求助
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();//锁定
}
liuzaiy 发表于 2019-12-18 21:16 | 显示全部楼层

原子的有现成的,用原子的好了
 楼主| yufe 发表于 2019-12-18 21:22 | 显示全部楼层
网上找了好多例程,没发现程序出错在哪里
xxmmi 发表于 2019-12-18 21:24 | 显示全部楼层

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

以前调试别的芯片,遵循2个原则
1要关闭中断
2在RAM中运行
不知道有没有帮助
songqian17 发表于 2019-12-18 22:30 | 显示全部楼层
PAGE 要看手册,一般8k/16k/32k 都有可能,一般写块的首地址
 楼主| yufe 发表于 2019-12-18 22:35 | 显示全部楼层
对啊,执行擦除函数也一样会死机,但我发现执行写入函数,我打开函数库里面看过,发现只要执行函数库里面这一句(*(__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 发表于 2019-12-18 22:38 | 显示全部楼层
页地址都试过,所写入的地址和页里面可以完确认没有正常程序的,不存在说把正常使用程序给覆盖了
香水城 发表于 2019-12-18 22:54 | 显示全部楼层
不论标准库还是Cube库里面都有可以参考的。

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

● 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.
wakayi 发表于 2020-1-16 09:53 | 显示全部楼层
每次都会这样吗
wowu 发表于 2020-1-16 10:03 | 显示全部楼层
说明写不进去 啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

983

主题

10170

帖子

1

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