由于8051的特殊寄存器(SFR)只有128个字节,但是现在MCU的功能越做越强大,集成了很多外设在芯片中,使用这些外设就需要通过SFR去设置,这样一来导致128个字节的SFR根本不够用,那怎么办?于是用page的方式解决,将SFR寄存器放在不同page中,可以增加SFR访问的字节数。
大家有没考虑过增加page带来的副作用?
代码里对SFR访问时需要频繁的切换page,会增加额外的代码量,其实这不是致命的问题。
主要问题是中断程序中切换page带来的影响,比如主循环中刚刚切换到page0,下一步对page0中SFR读\写操作,但是这时被中断打断了,进入中断中又切换到page1,退出中断后,此时代码中想对page0的SFR读\写操作,其实是对page1相同地址读\写操作,就根本没有读\写成功,更糟糕的是还破坏了page1中SFR值。
如何解决中断中切换page问题,我们可以对page选择SFRS寄存器进行压栈和出栈保护。怎么实现?很简单如下操作:
以KeilC51为例,注意使用push和pop要#include ”intrins.h”
以IAR为例,注意0x91是SFRS的地址
除此之外还会遇到哪些问题呢? 使用UART printf 打印不出SFR的值 建议使用XRAM来暂存不同页内需要打印的SFR值,再回到SFRS PAGE0来印出。以ML51EB9AE为例,演示如何打印出PWM0C1H的值。因为UART0的SBUF所在位置为page 0且PWM0C1H所在位置为page 1,需先将PWM0C1H值存入XRAM中再将SFR page切换至SBUF 所在page,才能正确的印出PWM0C1H的值。范例程序如下图所示。 切记调用printf前一定先切换到page0,否则代码会卡死在printf函数中。
|