打印
[STM32F1]

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

[复制链接]
2276|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gmgmgm|  楼主 | 2018-6-3 17:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在调试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
        }
沙发
gmgmgm|  楼主 | 2018-6-3 18:03 | 只看该作者
我把函简化成下面,就是会死机,万分求助
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();//锁定
}

使用特权

评论回复
板凳
yklstudent| | 2018-6-3 20:31 | 只看该作者
原子的有现成的,用原子的好了

使用特权

评论回复
地板
gmgmgm|  楼主 | 2018-6-4 09:43 | 只看该作者
yklstudent 发表于 2018-6-3 20:31
原子的有现成的,用原子的好了

网上找了好多例程,没发现程序出错在哪里

使用特权

评论回复
5
yklstudent| | 2018-6-4 12:07 | 只看该作者
FLASH_ErasePage(0x08002a50);
你先确认这个是否又问题

使用特权

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

各个页的地址可以在参考手册的Memory map的Flash module organization查看到。

使用特权

评论回复
7
kingkits| | 2018-6-4 16:52 | 只看该作者
以前调试别的芯片,遵循2个原则
1要关闭中断
2在RAM中运行
不知道有没有帮助

使用特权

评论回复
8
kingkits| | 2018-6-4 16:55 | 只看该作者
PAGE 要看手册,一般8k/16k/32k 都有可能,一般写块的首地址

使用特权

评论回复
9
gmgmgm|  楼主 | 2018-6-4 17:11 | 只看该作者
yklstudent 发表于 2018-6-4 12:07
FLASH_ErasePage(0x08002a50);
你先确认这个是否又问题

对啊,执行擦除函数也一样会死机,但我发现执行写入函数,我打开函数库里面看过,发现只要执行函数库里面这一句(*(__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;//上锁

使用特权

评论回复
10
gmgmgm|  楼主 | 2018-6-4 17:14 | 只看该作者
香水城 发表于 2018-6-4 14:21
你擦除的地址要遵循page大小对齐。你的编程函数用库函数的应该没啥问题,如果自己写的
注意F1系列支持半字 ...

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

使用特权

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

本版积分规则

135

主题

766

帖子

2

粉丝