njhying 发表于 2018-5-12 16:14:19

DSPIC33FJ芯片如何保存数据?

本帖最后由 njhying 于 2018-5-13 08:29 编辑

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


MPLAB 8.9
C30
PICKIT3

1a2b3c 发表于 2018-5-12 20:51:12

把真正执行flash操作的那些部分先屏蔽掉,看看能否正常,能正常说明你的flash操作有误,比如地址啊什么的,写到不该写的地方了,如果还是不正常那么说明你的框架流程又问题,和使用flash本身没有关系

shhludb 发表于 2018-5-12 21:54:36

外面挂FRAM或者EEprom啊

砂山老妖 发表于 2018-5-12 23:42:35

上这种片子了当然不差外边挂个sot23的eeorom了,何苦为难flash

njhying 发表于 2018-5-13 08:22:04

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

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

njhying 发表于 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了。

砂山老妖 发表于 2018-5-13 09:12:06

我一直为产品保留了dspic线,不想断了microchip,和主流arm比虽然谈不上性价比,但是用着简洁。

leolong03 发表于 2018-5-13 13:24:35

没有遇到过,官网有范例的啊

eeant.net 发表于 2018-5-13 16:13:45

看了你的描述,似乎flash擦除是吧中断的代码
flash是按页擦除的
所以你需要自己分配空间来保存数据

njhying 发表于 2018-5-13 16:21:43

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

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

njhying 发表于 2018-5-13 16:22:37

leolong03 发表于 2018-5-13 13:24
没有遇到过,官网有范例的啊

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

a150252874 发表于 2018-5-13 16:32:11

保存到FLASH里面。

eeant.net 发表于 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为你使用MCU型号对应擦除页长度的整数倍,一般是0x400或者0x800

njhying 发表于 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是什么意思呢?

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

eeant.net 发表于 2018-5-14 20:32:01

njhying 发表于 2018-5-14 17:45
非常感谢你的解答,但还是有些不明白,可否帮忙看看我的程序?谢谢!
那个example是什么意思呢? ...

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

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

njhying 发表于 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不断闪烁。

lhj200304 发表于 2018-5-15 20:29:15

你写的地址在哪里?是不是把中断函数给冲掉了

wanggoals 发表于 2018-5-15 20:49:14

不错,还有人在坚守pic单片机

njhying 发表于 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位的活,甚至还赶不上,特别是在我比较了解的电机驱动领域。

wanggoals 发表于 2018-5-15 21:58:34

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

之前一直也用pic,最近几年慢慢不怎么写代码了,其实对pic还是情有独钟,最近刚好有个对功耗有要求的小东西,刚好选型pic的,发现microchip的MCC配置功能还是蛮好的。
页: [1]
查看完整版本: DSPIC33FJ芯片如何保存数据?