搜索
bottom↓
回复: 17

帮忙看下FLASH擦除问题的原因

[复制链接]

出100入101汤圆

发表于 2014-12-24 11:16:04 | 显示全部楼层 |阅读模式
单片机是PIC24FJ256GB206

配置位如下:

// These are the same config settings used by the bootloader and must not be changed here.
_CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & FWDTEN_OFF & ICS_PGx3)
_CONFIG2( IESO_OFF & FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMOD_NONE & FNOSC_FRCPLL & PLLDIV_NODIV & IOL1WAY_ON)
_CONFIG3( SOSCSEL_EC & WPCFG_WPCFGDIS & WPDIS_WPDIS)                //Disable erase/write protect of all memory regions.

擦除代码用的官方的:

/********************************************************************
; Function:         void Erase(WORD page, WORD addrLo, WORD cmd);
;
; PreCondition: None.
;
; Input:            page         - upper byte of address
;                                addrLo         - lower word of address
;                                cmd                - type of memory operation to perform
;                              
; Output:           None.
;
; Side Effects: TBLPAG changed
;
; Overview:         Erases page of flash memory at input address
*********************************************************************/       
void Erase(WORD page, WORD addrLo, WORD cmd)
{
        WORD temp;       

        temp = TBLPAG;
        TBLPAG = page;

        NVMCON = cmd;

        __builtin_tblwtl(addrLo,addrLo);

        __builtin_write_NVM();

        while(NVMCONbits.WR == 1);

        TBLPAG = temp;
}

为何执行Erase(170, 0, PM_PAGE_ERASE);后,串口就收不到数据了?如果执行了该操作,重新初始化串口,则又可以收到数据。

出100入101汤圆

 楼主| 发表于 2014-12-24 11:52:48 | 显示全部楼层
擦除某个扇区后,写入数据、读出数据都正常,但就是要重新设置下串口的配置。实在是一头雾水!

出100入101汤圆

 楼主| 发表于 2014-12-24 15:39:18 | 显示全部楼层
最新测试结果,烧写完程序后,重新上电也可以正常工作。为什么执行了Erase(170, 0, PM_PAGE_ERASE);需要重新初始化串口或重新上电?

出100入101汤圆

 楼主| 发表于 2014-12-24 16:34:23 | 显示全部楼层
为什么执行了Erase(170, 0, PM_PAGE_ERASE);需要重新初始化串口或重新上电?

出100入101汤圆

 楼主| 发表于 2014-12-24 16:40:31 | 显示全部楼层
该单片机带有PPS功能,难道擦除FLASH会影响到PPS的配置,进而影响到串口?

出100入101汤圆

 楼主| 发表于 2014-12-24 16:59:50 | 显示全部楼层
无语了。擦出FLASH某个扇区后,需要重新初始化UART,不然串口不工作。

出100入101汤圆

 楼主| 发表于 2014-12-24 20:20:24 | 显示全部楼层
顶一下,一点建议都没有么?

出100入101汤圆

 楼主| 发表于 2014-12-25 09:36:49 | 显示全部楼层
再顶一下,一点进展都没有。再想想,也许哪儿没有注意到!

出100入101汤圆

 楼主| 发表于 2014-12-25 12:49:21 | 显示全部楼层
再顶一下,一点进展都没有。再想想,也许哪儿没有注意到!

出0入0汤圆

发表于 2014-12-25 21:06:55 | 显示全部楼层
帮顶,刚接触STM32的FLASH

出100入101汤圆

 楼主| 发表于 2014-12-27 17:25:00 | 显示全部楼层
貌似这个问题解决了,没注意到改了什么地方,但现在没问题了。

出100入101汤圆

 楼主| 发表于 2014-12-27 17:27:43 | 显示全部楼层
搭车问另外一个问题,使用PIC24FJ256GB206,MPLAB IDE8.92,C30编译器,如何定义两个2048大小的数组?现在只能定义1个,定义2个或以上,就提示错误。该单片机有96K ram。

出0入0汤圆

发表于 2014-12-27 17:30:45 | 显示全部楼层
惭愧,只用了KL系列,还未操作过flash。

出100入101汤圆

 楼主| 发表于 2014-12-27 17:44:14 | 显示全部楼层
nos002 发表于 2014-12-27 17:30
惭愧,只用了KL系列,还未操作过flash。

谢谢回复。这个问题貌似是一个乌龙问题。帮忙看下:使用PIC24FJ256GB206,MPLAB IDE8.92,C30编译器,如何定义两个2048大小的数组?现在只能定义1个,定义2个或以上,就提示错误。该单片机有96K ram。

出0入0汤圆

发表于 2014-12-27 20:18:30 | 显示全部楼层
检查擦除程序,一般擦除写入过程会禁止中断,擦除完成后才会开中断,如果你的串口在中断处理,那自然接收不到了

出0入0汤圆

发表于 2014-12-24 11:16:05 | 显示全部楼层
fengyunyu 发表于 2014-12-27 17:44
谢谢回复。这个问题貌似是一个乌龙问题。帮忙看下:使用PIC24FJ256GB206,MPLAB IDE8.92,C30编译器,如 ...

这个在哪个文档里好像有说明,记不得了。
使用XC16可以在编译器选项里勾选允许定义大数组。

出0入0汤圆

发表于 2014-12-27 21:20:19 | 显示全部楼层
szeng 发表于 2014-12-27 20:18
检查擦除程序,一般擦除写入过程会禁止中断,擦除完成后才会开中断,如果你的串口在中断处理,那自然接收不 ...

除非一次擦除太多,否则应该不会正巧每次都碰撞,EEPROM写入一个字也要禁止中断5个指令周期,不过我都是以中断方式一个字一个字的写。

出0入0汤圆

发表于 2015-1-2 10:30:52 | 显示全部楼层
PIC,EEPROM 写入大概3ms,你说的5个指令周期有何依据?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-30 14:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表