在前段时间做了一个项目,使用的为中颖8位单片机,型号为SH79F166A。碰到了一个有趣的机制,即分区机制。
该单片机的特殊功能寄存器分为Bank0和Bank1两个扇区,每个扇区的地址均是80H到FFH,每个地址与GPIO,定时器,PWM等相关。相同的地址在不同的扇区内可能代表不同的功能,比如P0CR(控制端口P0的输入输出模式)和P5CR的地址都是E1H,但是P0CR位于Bank0,而P5CR位于Bank1。如果在操作P5CR之前没有进行切换扇区的操作,那么对P5CR的操作就只是对P0CR的操作。而不会对P5CR产生影响。
那么如何切换扇区呢?是否有其它寄存器控制切换扇区的操作呢?如果有的话,该寄存器位于两个扇区中,还是位于两个扇区外呢?在没有寻找到该寄存器的时候,我们就应该意识到,肯定存在寄存器控制切换扇区的操作,因为对单片机的底层的操作归根结底是对单片机底层的寄存器的操作,通过改变寄存器的状态来影响单片机的CPU的运算,从而产生不同的输出结果。那么现在问题的关键就是找到控制切换扇区的寄存器,利用Bank这一关键字在SH79F166A的芯片手册中进行查找,并未查找到可以用来控制Bank0和Bank1切换的寄存器。最终查了好久,在CPU所属的寄存器章节中找到该寄存器。可以通过INSCON位的BKS0寄存器窜则特殊功能寄存器页0和页1,也就是Bank0和Bank1。并且,INSCON位于Bank0和Bank1这两个扇区之外。
最终,说明一下为什么要进行Bank0和Bank1的分区,正常情况下,8位单片机所能进行的寻址是有限的,如果仅有一个分区,那么可用的特殊功能寄存器数量就会减少许多。而如果扩为16位寄存器,无疑单片机设计将会更加麻烦。在这两个中寻找一个平衡点,采用8位寄存器加上分页的设置,设置两个页,通过先页码后寄存器的访问就可以实现在单片机位数的限制下存在更多的特殊功能寄存器。