登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

江湖救急!~

作者:高建明 栏目:MCU技术
江湖救急!~
本人现在用SH69P55F芯片,有一问题比较郁闷:该芯片有4页8KROM,当程序运行在高4Krom的时候,此时来了一个定时中断,程序能不能返回到0页的中断向量?当中断退出后,程序能不能自动返回高4K?还是需要设置BNK寄存器?请高手解答,谢谢.

2楼: >>参与讨论
warm_ice
可以
因为ROM的每个页为4K,但其中有2K是共用的,所以来中断的响应和返回都不会有问题的.你可以试一下,仿真是可以仿出来的.

3楼: >>参与讨论
高建明
谢谢
你好,谢谢你的解答,可是我仿真是错误的,SH69P55总共有4页,8KROM,
我把主程序放在0页,子程序放在3页(最后2KROM空间),但是第3页程序执行过程中的中断确实可以响应到,但是不能返回到第3页的子程序中,仿真的情况就是这样的.虽然我不希望这样,但是我还是认为应该是对的,应为第0页主程序调用第3页子程序是需要通过寄存器换页的,而中断返回时,执行的RTNI指令是没有换页操作的,所以最后就会跳到错误的地方去,不知我这样理解对不对?还有如何做才能达到我希望的情况?

4楼: >>参与讨论
高建明
难道是堆栈溢出?
我换页的时候没有关中断

5楼: >>参与讨论
warm_ice
最好把中断放在前2K内
最好把中断放在前2K内,因为这2K空间是共用的,无论程序运行在哪个ROM页区,都可以正常响应中断并返回.

6楼: >>参与讨论
高建明
这样的程序结构合理吗?
ORG 0000H
JMP RESET
JMP TIMER0
JMP TIMER1
JMP TIMER2
JMP INT
TIMER1:RTNI
TIMER2:RTNI
INT:RTNI
TIMER0:;中断位于BANK0
........
.......
......
RTNI
RESET:CALL MAIN;调用BANK0程序
JMP RESET

MAIN:
LCALL BANK1_ROM;长调用BANK1程序
LCALL BANK2_ROM;长调用BANK2程序
LCALL BANK3_ROM;长调用BANK3程序
RTNI

ORG 800H
BANK1_ROM:
CALL AAA;调用BANK1范围内的子程序
RTNI
AAA:RTNI

ORG 1000H
BANK2_ROM:
CALL BBB;调用BANK2范围内的子程序
RTNI
BBB:RTNI

ORG 1800H
BANK3_ROM:
CALL CCC;调用BANK3范围内的子程序
RTNI
CCC:RTNI

END


7楼: >>参与讨论
未雨绸缪
你的程序结构完全合理
对于中颖芯片rom超出4k的程序就要这样写的。

对于你的问题,如果程序严格按照你规划的架构来写,可以正常相应中断的。
中颖芯片规划Rom区的Bank是按照下面方式来执行的:
SH6XX系列的程序计数器用于寻址程序 ROM。该计数器有12 位:页寄存器(PC11),和循环递增计数器(PC10-PC0)。所以SH6XX系列以2K ROM為一個BANK,4K ROM為一個页面。
程序计数器装入与该条指令相关的数据。对于目标地址大于2K 的ROM 空间,可通过无条件跳转指令(JMP)设置页寄存器位的值实现跳转。程序计数器只能寻址4K 程序ROM 空间。所以對於超過4KROM空間的芯片就有一個ROMBANK寄存器控制ROM页面的切換。
如下面的寄存器1F( ROMBANK寄存器):
$1F     -    -    -    BNK0     R/W     Bit0: Bank register for ROM
页切换技术用于扩展CPU 寻址范围。在SH6XX系列CPU的ROM空間地址結構為低2K的ROM地址($000-$7FF)映射为ROM页面基本2K地址。CPU 地址空间的高2K 映射为ROM 页面的擴展地址,所以SH69P55的縂8K ROM空間被劃分為3 个ROM页面(BNK 0, 1,2)。
ROM 页面空间的 CPU 實際地址如下:
CPU Address     ROM Space
                   BNK = $00            BNK = $01                 $000 - $7FF     $0000 - $07FF (BANK 0)     $0000 - $07FF (BANK 0)
$800 - $17FF     $0800-$0FFF (BANK 1)     $1000 - $17FF (BANK 2)
                   BNK-= $02
$000 - $7FF     $0000 - $07FF (BANK 0)      
$1800 - $1FFF     $1800-$1FFF (BANK 3)      
   


助记符    指令代码    功能    标记位改变
CALL X     11000 xxxx xxx xxxx     ST <- CY, PC +1 PC <- X ( 不包括p)     
JMP X     1110P xxxx xxx xxxx     PC <- X ( 包括p)     
從指令代碼中可以CALL指令只能訪問到2K ROM空間,而且還不能跨BANK,JMP指令可以訪問4K ROM空間,可以在一個页面跨BANK訪問。但不能跨页面訪問。
由於中斷發生時,PC指針會自動壓棧,壓棧内容是PC12位地址和進位位,然後PC指針會指向ROM 0001-0004地址;所以在改變ROMBANK寄存器值,來切換页面時要先屏蔽掉中斷,再用JMP指令完成換页動作。否則中斷響應發生在擴展地址的改變ROMBANK寄存器值和JMP語句之間時,從堆棧返回PC時就會因ROMBANK寄存器值不同,而不能正常返回到發生中斷響應的地方。但是如果在基本2K地址就不會有問題。
所以如果程序中到處有屏蔽中斷的語句,就會增加編寫程序的困難度,因而這裡用一個技巧來解決這個問題。由於每個ROM页都包含了基本2K ROM地址,所以可以把所有主流程都放在基本2K ROM地址,然後用CALL子程序和JMP的方式來完成擴展,這樣就不會要屏蔽中斷,下面的宏指令就是為滿足這個要求而編寫的,可以看為新的指令.新的指令可以實現從BANK0調用任何BANK的子程序和跳轉地址而不用管ROMBANK寄存器值。
;功能:    Bank0-->直接跳转,Bank123-->跨页跳转,修改RomBank寄存器
;条件:    仅用于Bank0 <--> Bank123间跨页跳转,可直接用RTNI返回
LONGJUMP     MACRO    FUNCLABEL
        LDI        TEMP,(FUNCLABEL>>11)&0FH
        BAZ        $+2
        LDI        ROMBANK,((FUNCLABEL>>11)-1)&0FH
        JMP        FUNCLABEL
    ENDM
;---------------------------------------------------------------
;功能:    Bank0<-->Bank123间相互子程序长调用,地址范围 8K
;条件:    1.主程序与子程序在同一Bank
;    2.主程序与子程序分在Bank0<-->Bank123两个页面中
;如果扩展此指令功能,使之支持8K内任意调用,则返回指令亦需改造,call前备份Rombank,RTNI前恢复之.
LONGCALL     MACRO    FUNCLABEL
        CALL    $+2
        JMP       $+5
        LDI       TEMP,(FUNCLABEL>>11)&0FH
        BAZ       $+2
        LDI       ROMBANK,((FUNCLABEL>>11)-1)&0FH
        JMP       FUNCLABEL
    ENDM


8楼: >>参与讨论
高建明
所有问题都已经解决了,谢谢你的回答
现在只剩下时间问题了.

9楼: >>参与讨论
未雨绸缪
时间有什么问题
 
10楼: >>参与讨论
高建明
我是说技术问题解决了,只剩下程序编写时间了
 
参与讨论
昵称:
讨论内容:
 
 
相关帖子
到底是什么出身的MCU?
请教6613的复位
防夾車窗控制器的問題
请问内部WDT复位与外部复位的差别
想不到NTK的MCU也由论坛了
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号