搜索
bottom↓
回复: 19

DSPIC33FJ芯片如何保存数据?

[复制链接]

出0入0汤圆

发表于 2018-5-12 16:14:19 | 显示全部楼层 |阅读模式
本帖最后由 njhying 于 2018-5-13 08:29 编辑

相信有很多高手都使用过DSPIC33FJ的单片机,但这个芯片没有内置的EEPROM,当需要保存一些校准数据的时候,需要保存到FLASH里面。
现在问题来了,我使用官方的FLASH写例程的时候,功能都很正常。但是在里面添加中断函数的时候,中断就不能正常工作了。可以确定的是,只要有FLASH擦除操作,中断就不行,估计是写操作把有关中断的代码给抹了。
把这个问题给了所谓的原厂工程师,基本回答就是很简单但又不给实际的解决方案,真的不知道他们的钱是怎么拿的。
我是在写FLASH后才开中断的,请问有类似经验的朋友给个提示,谢谢了!


MPLAB 8.9
C30
PICKIT3

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入475汤圆

发表于 2018-5-12 20:51:12 来自手机 | 显示全部楼层
把真正执行flash操作的那些部分先屏蔽掉,看看能否正常,能正常说明你的flash操作有误,比如地址啊什么的,写到不该写的地方了,如果还是不正常那么说明你的框架流程又问题,和使用flash本身没有关系

出0入0汤圆

发表于 2018-5-12 21:54:36 | 显示全部楼层
外面挂FRAM或者EEprom啊

出0入0汤圆

发表于 2018-5-12 23:42:35 来自手机 | 显示全部楼层
上这种片子了当然不差外边挂个sot23的eeorom了,何苦为难flash

出0入0汤圆

 楼主| 发表于 2018-5-13 08:22:04 | 显示全部楼层
1a2b3c 发表于 2018-5-12 20:51
把真正执行flash操作的那些部分先屏蔽掉,看看能否正常,能正常说明你的flash操作有误,比如地址啊什么的, ...

单独测试FLASH读写都没有问题,只是FLASH读写和中断执行两者不能同时进行,估计是FLASH擦除和中断函数在地址上有冲突,但是很奇怪,为什么C30编译器不能自动处理地址的分配呢?
是不是有什么我不知道的地址声明什么的没有加上去?

出0入0汤圆

 楼主| 发表于 2018-5-13 08:23:38 | 显示全部楼层
本帖最后由 njhying 于 2018-5-13 08:28 编辑
砂山老妖 发表于 2018-5-12 23:42
上这种片子了当然不差外边挂个sot23的eeorom了,何苦为难flash


话说microchip的SOT23-5的EEPROM确实不错,只是觉得明明FLASH可以保存数据而用不了,心里觉得别扭。

基本上用了什么STM32之类的ARM 32位单片机之后,总觉得搞得很麻烦,而使用DSPIC这种16位单片机时,直接操作寄存器来配置功能,也不靠什么固件库之类的玩意,有足够的速度和处理能力,还是觉得这个东西好些!
可以把精力真正花在控制算法的实现上,而不是花费很多时间来熟悉工具。所以我又开始使用DSPIC了。

出0入0汤圆

发表于 2018-5-13 09:12:06 | 显示全部楼层
我一直为产品保留了dspic线,不想断了microchip,和主流arm比虽然谈不上性价比,但是用着简洁。

出0入0汤圆

发表于 2018-5-13 13:24:35 | 显示全部楼层
没有遇到过,官网有范例的啊

出0入0汤圆

发表于 2018-5-13 16:13:45 | 显示全部楼层
看了你的描述,似乎flash擦除是吧中断的代码
flash是按页擦除的
所以你需要自己分配空间来保存数据

出0入0汤圆

 楼主| 发表于 2018-5-13 16:21:43 | 显示全部楼层
eeant.net 发表于 2018-5-13 16:13
看了你的描述,似乎flash擦除是吧中断的代码
flash是按页擦除的
所以你需要自己分配空间来保存数据 ...

兄弟,怎么个分配法呢?
是添加什么声明还是修改什么文件配置?
在下先谢过了哈。

出0入0汤圆

 楼主| 发表于 2018-5-13 16:22:37 | 显示全部楼层
leolong03 发表于 2018-5-13 13:24
没有遇到过,官网有范例的啊

官网的是单纯的读写FLASH,我的是带定时器中断的。

出0入0汤圆

发表于 2018-5-13 16:32:11 | 显示全部楼层
保存到FLASH里面。

出0入0汤圆

发表于 2018-5-14 09:31:28 | 显示全部楼层
njhying 发表于 2018-5-13 16:21
兄弟,怎么个分配法呢?
是添加什么声明还是修改什么文件配置?
在下先谢过了哈。 ...

两种方法可以做
1.通过修改gld文件,减少链接文件中的program的LENGTH,减少的长度为你使用MCU型号对应擦除页长度的整数倍,一般是0x400或者0x800
2.通过属性修改,char __attribute__((space(prog),aligned(LENGTH))) example[LENGTH] ;]
        其中的LENGTH为你使用MCU型号对应擦除页长度的整数倍,一般是0x400或者0x800

出0入0汤圆

 楼主| 发表于 2018-5-14 17:45:16 | 显示全部楼层
本帖最后由 njhying 于 2018-5-14 17:47 编辑
eeant.net 发表于 2018-5-14 09:31
两种方法可以做
1.通过修改gld文件,减少链接文件中的program的LENGTH,减少的长度为你使用MCU型号对应擦 ...


非常感谢你的解答,但还是有些不明白,可否帮忙看看我的程序?谢谢!
那个example[LENGTH]是什么意思呢?

如果这个能够解决的话,我会把具体的解决方法共享给大家,这样就可以免去外部的EEPROM了,也帮了我的大忙!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-5-14 20:32:01 | 显示全部楼层
njhying 发表于 2018-5-14 17:45
非常感谢你的解答,但还是有些不明白,可否帮忙看看我的程序?谢谢!
那个example[LENGTH]是什么意思呢? ...

我手上现在没有MCU可以测试,你可以试着吧
#define PM_ROW        __attribute__((space(prog), aligned(128)))
改为
#define PM_ROW        __attribute__((space(prog), aligned(1024)))

const int  PM_ROW MyRowDataInFlash[]
改为
const int  PM_ROW MyRowDataInFlash[1024]
这个因为数据手册上说到:
RTSP allows the user application to erase a  page  of  memory,  which  consists  of  eight  rows  (512 instructions) at a time, and to program one row or one word  at  a  time.  
flash一次擦除的是512 ,对于保存在flash中的数据,编译器的处理是,只使用其低16位.
修改flash中的数据要先把flash中的数据全部读出来,然后擦除,再写入.

出0入0汤圆

 楼主| 发表于 2018-5-15 20:07:10 | 显示全部楼层
本帖最后由 njhying 于 2018-5-15 20:17 编辑
eeant.net 发表于 2018-5-14 20:32
我手上现在没有MCU可以测试,你可以试着吧
#define PM_ROW        __attribute__((space(prog), aligned(128)))
...


感谢eeant.net兄弟的答复,今天试了一下,确实可以了!

现在给大家的建议是:如果需要在DSPIC33FJ系列芯片中保存一些数据的话,可以不用外接EEPROM,完全可以使用FLASH来保存,方法就是上面高手的回复。


下面是可以运行的程序,有兴趣的朋友可以参考,功能是保存0X1234这个数据到FLASH中,然后定时中断会让LED不断闪烁。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出95入100汤圆

发表于 2018-5-15 20:29:15 | 显示全部楼层
你写的地址在哪里?是不是把中断函数给冲掉了

出0入9汤圆

发表于 2018-5-15 20:49:14 | 显示全部楼层
不错,还有人在坚守pic单片机

出0入0汤圆

 楼主| 发表于 2018-5-15 21:41:07 | 显示全部楼层
wanggoals 发表于 2018-5-15 20:49
不错,还有人在坚守pic单片机

其实在用了ARM 32位单片机5,6年后,还是觉得8位、16位单片机好用!编程简单快捷,性能够猛,只是在一个充满贩卖焦虑的年代,很难不受32位的影响。

用8位的C8051、STM8S105,16位的DSPIC基本可以干所有想干的事情,就以国内的研发水平,大部分人能把8位机的能力用好都不错了,有的时候,很多人用的STM32,干的却是8位的活,甚至还赶不上,特别是在我比较了解的电机驱动领域。

出0入9汤圆

发表于 2018-5-15 21:58:34 | 显示全部楼层
njhying 发表于 2018-5-15 21:41
其实在用了ARM 32位单片机5,6年后,还是觉得8位、16位单片机好用!编程简单快捷,性能够猛,只是在一个 ...

之前一直也用pic,最近几年慢慢不怎么写代码了,其实对pic还是情有独钟,最近刚好有个对功耗有要求的小东西,刚好选型pic的,发现microchip的MCC配置功能还是蛮好的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-29 16:30

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

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