打印

求高手指点

[复制链接]
2981|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nametony|  楼主 | 2012-12-19 23:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
flash, se, pc, TE, ge
下面的程序用来擦除一FLASH页, 但是一执行就死机, 不知原因何在, 求高手指点(芯片为STM32F103ZET)
void TestEraseFlashPage(void)
{//仅供测试
        uint32_t j,flashAddr;
        char *pc;
        uint16_t *pu16;
        flashAddr=FLASH_MY_DATA_BEG;        //ERASE THIS PAGE: =0x803F000
       
        FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);        //Clear all pending flags
        FLASH_Unlock();                //解锁以允许写FLASH
        j=FLASH_ErasePage(flashAddr);
        FLASH_Lock();        //重新锁定
        switch(j)
        {
        case FLASH_BUSY:
                pc="FLASH_BUSY";
                break;
        case FLASH_ERROR_PG:
                pc="FLASH_ERROR_PG";
                break;
        case FLASH_ERROR_WRP:
                pc="FLASH_ERROR_WRP";
                break;
        case FLASH_TIMEOUT:
                pc="FLASH_TIMEOUT";
                break;
        case FLASH_COMPLETE:
                pc="FLASH_COMPLETE: 成功!";
                break;
        default:
                pc="ERASE PAGE BUG!";
        }

        LCD_ShowText(CMD_HZK16ASC, 0,180, pc);

        //检查是否成功擦除
        pu16=(uint16_t*)flashAddr;
        for (j=0;j<FLASH_PAGE_SIZE/2;j++)
        {
                if (*pu16++!=0xFFFF) break;
        }
        if (j==FLASH_PAGE_SIZE/2) pc="擦除彻底成功!";
        else pc="没擦干净";
        LCD_ShowText(CMD_HZK16ASC, 0,200, pc);
               
}
沙发
uet_cache| | 2012-12-20 10:11 | 只看该作者
执行到哪条语句上死的机啊。

使用特权

评论回复
板凳
nametony|  楼主 | 2012-12-20 22:01 | 只看该作者
uet_cache 发表于 2012-12-20 10:11
执行到哪条语句上死的机啊。

去掉"FLASH_ErasePage(flashAddr);"则程序没问题, 因此原因就出在这一条语句.

使用特权

评论回复
地板
qiurenguo| | 2012-12-20 22:03 | 只看该作者
你把程序也擦除了。。。

使用特权

评论回复
5
qiurenguo| | 2012-12-20 22:04 | 只看该作者
STM32的flash是用来放程序的,懂不,你可能是把程序也擦掉了。懂我的意思吗

使用特权

评论回复
6
qiurenguo| | 2012-12-20 22:06 | 只看该作者
你这个问题,我前段时间也在这里发过,没人回答,后来自己看手册解决掉了

使用特权

评论回复
7
nametony|  楼主 | 2012-12-21 00:33 | 只看该作者
qiurenguo 发表于 2012-12-20 22:03
你把程序也擦除了。。。

程序总长度不到64K. 后面的页是预留保存资料的. 这些要擦除的页已经看过是空白页(皆是FF).
程序中有多个IRQ, 难道擦除页要关闭IRQ?看资料好像是不需要的.
有时候调用它程序不死机, 但调用3次以上就死机. 这些页中没放资料, 也根本没用到!

使用特权

评论回复
8
uet_cache| | 2012-12-21 09:32 | 只看该作者
你单步调试,进入此函数,看是哪条语句上死了。。,顺便检查下你的地址,是否正确。

使用特权

评论回复
9
qiurenguo| | 2012-12-21 19:36 | 只看该作者
nametony 发表于 2012-12-21 00:33
程序总长度不到64K. 后面的页是预留保存资料的. 这些要擦除的页已经看过是空白页(皆是FF).
程序中有多个I ...

你死机后,重启CPU还能正常运行吗?我之前是死机后,重启CPU不能运行了。我把我擦除页的程序给你看看吧。也是调了好久才成功的;

#if defined (STM32F10X_HD) || defined (STM32F10X_CL) || defined (STM32F10X_XL)
  #define FLASH_PAGE_SIZE    ((uint16_t)0x800)
#else
  #define FLASH_PAGE_SIZE    ((uint16_t)0x400)
#endif#define BANK1_WRITE_START_ADDR  ((uint32_t)0x0807F000)
#define BANK1_WRITE_END_ADDR    ((uint32_t)0x0807ffff)
unsigned int FLASH_eraseFlashPage (unsigned char page)
{
        FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
        if (FLASH_ErasePage(BANK1_WRITE_START_ADDR + FLASH_PAGE_SIZE * page) == FLASH_COMPLETE)
                return TRUE;
        else
                return FALSE;
}
这个是我调用的,我只用一页,所以就擦除0
FLASH_Unlock();
    FLASH_eraseFlashPage(0);

使用特权

评论回复
10
qiurenguo| | 2012-12-21 19:39 | 只看该作者
qiurenguo 发表于 2012-12-21 19:36
你死机后,重启CPU还能正常运行吗?我之前是死机后,重启CPU不能运行了。我把我擦除页的程序给你看看吧。 ...

如果还不行可以加我Q详聊。我也才开始学STM32不久。1518859810

使用特权

评论回复
11
nametony|  楼主 | 2012-12-22 23:42 | 只看该作者
qiurenguo 发表于 2012-12-21 19:39
如果还不行可以加我Q详聊。我也才开始学STM32不久。1518859810

首先感谢各位的帮助!
死机后重启一切正常.
我把你的程序完全照抄, 也死机(你的地址=0x807F000,而此处我也没用到).
void TestEraseFlashPage(void)
{//仅供测试
       
        FLASH_Unlock();
    FLASH_eraseFlashPage(0);
        return;

/*

就这3条也死机. 死机后重启一切正常.

使用特权

评论回复
12
qiurenguo| | 2012-12-23 09:02 | 只看该作者

使用特权

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

本版积分规则

0

主题

11

帖子

0

粉丝