打印

keil中怎么用C实现MOVC指令功能

[复制链接]
楼主: hyhjjg
手机看帖
扫描二维码
随时随地手机跟帖
21
hyhjjg|  楼主 | 2008-11-5 19:26 | 只看该作者 回帖奖励 |倒序浏览

birenai 朋友的例子也是只能读不能写啊

使用特权

评论回复
22
qingsha| | 2008-11-5 21:22 | 只看该作者

胡整

代码区怎么能写呢,真是的!

使用特权

评论回复
23
hgjinwei| | 2008-11-6 00:02 | 只看该作者

要改就要动用IAP了.

使用特权

评论回复
24
birenai| | 2008-11-8 14:14 | 只看该作者

把“code”去掉就能写了

但这样需要足够的RAM

使用特权

评论回复
25
playxzy| | 2008-11-10 16:14 | 只看该作者

ding

使用特权

评论回复
26
aceice| | 2008-11-10 16:47 | 只看该作者

乱搞哦~你普通51也不能用MOVC写CODE区吧~

使用特权

评论回复
27
soho| | 2008-11-10 23:08 | 只看该作者

代码区不能写

但现在有的51可以把代码区映射到数据区,可以写,但用的指令不是movc!movc只有一个传送方向。

使用特权

评论回复
28
flanker| | 2008-11-13 13:10 | 只看该作者

土,用函数指针呗

使用特权

评论回复
29
flanker| | 2008-11-13 13:12 | 只看该作者

哈佛结构的处理器,代码段当然不能改

要知道,哈佛结构的处理器里面,代码段是不能改的。只有普林斯顿结构的处理器才能改。
而且,系统也经常通过MMU,把.text段弄成read-only。如果访问,系统会抛出一个exception。

使用特权

评论回复
30
xiaoyuan_ly| | 2008-11-13 16:56 | 只看该作者

这样可以吗???!!

需要将程序代码在上电时,转移到数据存储器中,然后让CPU认为这个数据存储器就是“FLASH"(需要硬件连线支持),这样就可以了,其实际就是让MOVC和MOVX指令等价。。。。。。。。。。。

使用特权

评论回复
31
shq1119| | 2008-11-14 09:01 | 只看该作者

re

看看先

使用特权

评论回复
32
aceice| | 2008-11-14 09:44 | 只看该作者

32楼的办法可以啊~但是实质并没有变化

读取是用MOVC,写这段区域是用MOVX~

使用特权

评论回复
33
yzqok| | 2008-11-14 16:56 | 只看该作者

没有试过看看热闹,路过。。。

使用特权

评论回复
34
aibuaiwo| | 2008-11-16 14:41 | 只看该作者

好好看书吗

使用特权

评论回复
35
dtmcp| | 2008-11-19 07:17 | 只看该作者

*(unsigned char code*)(0x1234)=0x56

*(unsigned char code*)(0x1234)=0x56

使用特权

评论回复
36
McuPlayer| | 2008-11-20 01:57 | 只看该作者

建议先做A人,这个建议很好

使用特权

评论回复
37
hotpower| | 2008-11-20 03:56 | 只看该作者

同意39楼之建议~~~

使用特权

评论回复
38
sky_net| | 2008-11-22 08:59 | 只看该作者

关于IAP功能,对指令存储区数据的修改

MOVC指令是从指令存储区读取数据,传统51单片机是不允许在运行中修改指令存取内容的(即IAP(In-Application Programming)功能,在应用中编程),也有一些单片机如PHILIPS单片机具有IAP功能,其指令存储区的内容可以在应用中修改,但也不是可以任意修改的。
P89C51RD2是Philips公司的80C51系列单片机中的佼佼者,具有1KB的片上RAM和64KB的片上内存;具有3种编程方式,即在系统编程ISP(InSystem Programming)、在应用中编程IAP(In-Application Programming)以及通过商用编程器的并行编程。

摘选有关内容转贴:
4 IAP功能的使用

4.1 程序空间用作数据空间

在一个实际的应用系统中,往往有一些关键性的数据需要保存,例如用户设置数据或重要的过程数据。目前的通过做法有两种:一种是在电路中扩展非易失性SRAM,多用在对时间要求比较苛刻的场合;另一种做法是扩展EEPROM(并行或串行)或类似存储器,多用在对时间要求不太荷刻的场合。这两种方法可达到掉电后数据不丢失的目的。

P89C51RD2具有64KB的片上闪存,这对于一般的应用来说足够大,往往会有剩余的闪存空间。在通常状况下,MCU的编程只能通过商用编程器来进行,那么剩余的闪存空间只能作为程序升级的备用空间,而不能作为数据空间;另一方面,如果需要保存数据,还要另外扩展存储器,这样不但增加了电路板的面积,而且增加了调试难度。

而P89C51RD2是一种具有IAP功能的单片机,其内存结构具有如下特点(见图1):

①闪存空间是分块的。64KB的内存空间共分5块,由低到高分别为8KB(BLOCK0)、8KB(BLOCK1)、16KB(BLOCK2)、16KB(BLOCK3)、16KB(BLOCK4);

②每一块都可以单独擦除;

③在程序中可以调用IAP功能,对闪存中的每一字节进行单独编程。

正是由于上述3个特点,在一些对时间要求不是很荷刻的场合,都可以将剩余的闪存空间作为数据空间来使用。例如,作者在海洋气象监测仪器的研制中,有些关键数据需要存储,如整点的风速、风向、温度、湿度、气压和降水量的瞬时值和十分钟平均值,以及最值、极值、大风段等。而数据的采集要求3s采集1次,采集处理时间大约需要0.5s,则剩余的时间内就可以利用IAP功能来存储数据。这些存储的数据可以通过串口被上位机调用。

    由于整个软件经汇编后大约20KB,因此,将地址为0000H~7FFFH的32KB内存空间作为程序空间,则可以仪器的升级预留足够的空间;而将8000H~0FFFFH的32KB闪存空间留作数据存储空间。由图1可以看出,从8000H~0FFFFH的32KB闪存空间由BLOCK3和BLOCK4两块组成,每一块为16KB,足可以存储10天的数据量。在实际操作中,将BLOCK3和BLOCK4轮流使用,当10天的数据量存满其中一块时,通过程序跳转到另一块中,在使用前先将该块擦除。这样BLOCK3和BLOCK4每过20天便分别被擦除和重写1次。对有关地址定义如下:

ADDR_L EQU 30H ;被编程数据的低8位地址

ADDR_L EQU 31H ;被编程数据的高8位地址

DATA_TEMP EQU 32H ;被编程数据

ADDR_L,ADDR_H和DATA_TEMP的具体地址可以根据用户程序的实际情况进行定义;AUXR1,PGM_MTP的定义同前。有关子程序为:

擦除BL0CK3

ERSBLOCK3: ;BLOCK3擦除

MOV AUXR1,#20H ;AUXR1的位ENBOOT=1,寻址到固件

MOV R0,#11 ;晶振为11.0592MHz,取11

MOV R1,#01H ;R1=01H,块擦除

MOV DPTR,#8000H ;擦除BLOCK3

LCALL PGM_MTP ;调用,无返回参数

RET

擦除BL0CK4

EPSBLOCK4: ;BLOCK4擦除

MOV AUXR1,#20 ;AUXR1的位ENBOOT=1,寻址到固件

MOV R0,#11 ;晶振为11.0592MHz,取11

MOV R1,#01H ;RI=01H,块擦除

MOV DPTR,#0C000H ;擦除BLOCK4

LCALL PGM_MTP ;调用,无返回参数

RET

字节编程

WRDATA:

MOV AUXR1,#20H ;AUXR1的位ENBOOT=1,寻址到固件

MOV R0,#11 ;晶振为11.0592MHz,取11

MOV R1,#02H ;R1=02H,字节编程功能

MOV DPH,ADDR_H ;高8位地址

MOV DPL,ADDR_L ;低8位地址

MOV A,DATA_TEMP ;被编程数据

LCALL PGM_MTP ;调用,返回参数ACC=0,调用成功,非0调用失败

RET

读闪存字节内容

RDDATA:

MOV AUXR1,#20H ;AUXR1的位ENBOOT=1,寻址到固件

MOV R0,#11 ;晶振为11.0592MHz,取11

MOV R1,#03H ;R1=03H,读闪存字节内容

MOV DPL,ADDR_L ;低8位地址

MOV DPH,ADDR_H ;高8位地址

LCALL PGM_TEMP ;调用,返回参数ACC中为读出字节内容

RET

将上述4个子程序结合实际情况灵活运用,便可以实现数据的有效存储,而且这些数据在掉电后是不丢失的,完全达到系统要求。

使用特权

评论回复
39
hyhjjg|  楼主 | 2008-11-22 10:14 | 只看该作者

没想此问题点击率还顶高的

确实,普通单片机在遇到需要存取的大量数据块的时候,只能通过外挂RAM,如果是掉电不能丢失的应用还要背个电池,不过好在有片内带可供用户使用的FLASH型的单片机的出现,使线路板体积又节省了好多

使用特权

评论回复
40
Lost1421| | 2008-11-24 09:56 | 只看该作者

点击率高,但是没有解决问题

在C中使用MOVC A,@A+PC要非常谨慎,你不知道Keil会给你编译出什么样的代码,可能由于优化的不同,每次编译结果都不一样。

使用特权

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

本版积分规则