单片机
返回首页

单片机page和bank切换问题

2016-09-25 来源:eefocus

(1)   切换bank 问题

458一共有两个bank,每个都是由20-3f 。

如果需要切换bank来用的话,则需要改变操作寄存器 R4的第6和第7位来实现。我定义一个宏来处理:

;-----------------------macro defination---------------------

               bank0          macro            

               bc             0x04,6

               bc             0x04,7

               endm

              ;------------------------

               bank1          macro

               bs             0x04,6

               bc             0x04,7

endm 

 

这里就定义了两个宏,分别是 bank0,bank1,用的时候直接用就可以。而这里想说说程序开始初始化的时候清bank的程序,相对于156是需要改程序的,反而这个跟 468非常相似,倒是可以直接跟 468通用了(468相应修改成4个bank就可以了。),简单用了一下二重循环搞定。

程序清单:

;----------------------clear rams of all banks----------------------                 

clear_all_ram:

               mov             a,@0x10

               mov             r4,a              

               bank0

               call            clr_ram

               bank1

               call            clr_ram             

               ret

clr_ram:                

               clr             r0

               inc             r4

               mov             a,@0x3f

               and             a,r4

               jbs             psw,z

               jmp             clr_ram

               mov             a,@0x10

               mov             r4,a

               ret  

 

这里的              

and             a,r4

jbs             psw,z

不能换成 xor ,因为xor会受R4最高两位选择bank位的影响。

 

(2)   切换 page 问题

 

实际用的话是在是太简单了,所以这里着重分析原理。

首先R2是PC和堆栈,都是12位宽。 不要和程序代码的13位宽度搞反了。参看datasheet的第7页的内容:

这个就是PC的结构,一个page一共就是1K字节(1024字节),也就是210 ,显然需要用到 A0-A9 一共10个位来寻址。A11和A10是用来切换Page的。Call和jmp 指令(也只有这两个指令是需要切换page的了。),有个共同点,操作的时候的步骤:都是将R2低10位的值载入,这样可以访问 210 个地址,也就是1个page的程序页,不切page的话他们都可以访问整个程序页。Jmp是直接跳转,不用考虑返回问题,所以这个属于比较简单的,只需要

page1

jmp  process

这样就可以跳到其他页面了,之后PC指针也在后来的页面工作。这个比较简单,pass掉吧。

Call是需要考虑程序调用后的返回的问题。

首先跟jmp一样,先将PC+1压入堆栈,然后装载低10位的地址,然后根据10和11位来决定在哪个页面工作

page0

……..

page1

call  subprogram

这样就调用了page1的子程序了。当子程序结束,执行ret返回的时候,由于堆栈和PC都是12位的,所以PC出栈的时候能直接恢复,这个时候的PC指针是正常的,也就是之前压入堆栈的PC+1值了。但是有个问题,虽然PC值正常,但是实际上 R3里面的5,6位的PS0和PS1位是并没有改变的,这样有个隐患,如果不执行 jmp 的话那是正常的没有问题,但是一旦执行了jmp,PC的10和11位会自动装载 R3 的PS0,PS1位,变成了上次执行call的时候切换的那个页面了。程序跑飞。如果这个时候想执行同一个page的子程序,没有切换page的指令,那么call指令同样会出错。所以对于call指令应该是:

page0

………..

page1

call  subprogram

page0

调用完子程序之后记得切换回原来的Page

 

关于中断

中断发生的时候是将这个PC压入堆栈,尽管PC指针已经跳到0x08的中断入口处,但是R3的PS0和PS1位并没有被改变,所以,如果在中断服务程序中,不执行call和jmp指令就没有关系,一旦执行就会出错。所以需要进行一次切换Page的动作的,切换回page0就可以了,这样可以保证jmp的时候是在中断服务程序的范围之内跳。退出中断之前是恢复了R3的值的,所以是不需要在结尾切换page了。

 

虽然说能切换,但是基本上个人不是很建议多次来回的切换,尽量将比较整体的部分写在同一个page,这样可以减少出错的机会。

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 光控音效发生器电路

  • 离子检测器电路分析

  • 非常简单的150W功放电路图

  • 一个简单的警笛电路图

  • 如何使用LED驱动器LM3915制作振动计

  • 一个简单的立体声平衡指示器电路

    相关电子头条文章