作者:訫鈊衅 | 来源:互联网 | 2023-05-19 06:48
c8051f中使用了SFR分页机制,查看c8051f120.h文件部分内容如下
/* TMR2CN 0xC8 */
sbit TF2 = 0xCF ; /* TIMER 2 OVERFLOW FLAG */
sbit EXF2 = 0xCE ; /* TIMER 2 EXTERNAL FLAG */
sbit EXEN2 = 0xCB ; /* TIMER 2 EXTERNAL ENABLE FLAG */
sbit TR2 = 0xCA ; /* TIMER 2 ON/OFF CONTROL */
sbit CT2 = 0xC9 ; /* TIMER 2 COUNTER SELECT */
sbit CPRL2 = 0xC8 ; /* TIMER 2 CAPTURE SELECT */
/* TMR3CN 0xC8 */
sbit TF3 = 0xCF ; /* TIMER 3 OVERFLOW FLAG */
sbit EXF3 = 0xCE ; /* TIMER 3 EXTERNAL FLAG */
sbit EXEN3 = 0xCB ; /* TIMER 3 EXTERNAL ENABLE FLAG */
sbit TR3 = 0xCA ; /* TIMER 3 ON/OFF CONTROL */
sbit CT3 = 0xC9 ; /* TIMER 3 COUNTER SELECT */
sbit CPRL3 = 0xC8 ; /* TIMER 3 CAPTURE SELECT */
/* TMR4CN 0xC8 */
sbit TF4 = 0xCF ; /* TIMER 4 OVERFLOW FLAG */
sbit EXF4 = 0xCE ; /* TIMER 4 EXTERNAL FLAG */
sbit EXEN4 = 0xCB ; /* TIMER 4 EXTERNAL ENABLE FLAG */
sbit TR4 = 0xCA ; /* TIMER 4 ON/OFF CONTROL */
sbit CT4 = 0xC9 ; /* TIMER 4 COUNTER SELECT */
sbit CPRL4 = 0xC8 ; /* TIMER 4 CAPTURE SELECT */
可以看到TMR2CN,TMR3CN,TMR4CN的地址都是相同的,看上去好像存在重叠,事实上在设置TMRxCN的时候,我们会先设置SFR_PAGE为对应的TMRx_PAGE,如下代码所示:
char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = TMR3_PAGE;
TMR3CF = 0x00;
TMR3CN = 0x00;
TMR3CN = 0x02;
tmp=TMR3CN;
TMR3L = 0x00;
TMR3H = 0x00;
TMR3CN |= 0x04;
TR3 = 1;
SFRPAGE = SFRPAGE_SAVE;
而其中的TMR2_PAGE, TMR3_PAGE,TMR4_PAGE是不一样的,所以并没有重叠,而Keil uVision5 并不知道这一机制,所以在调试窗口直接查看TMR3CN的时候,结果是不正确的。解决的方法之一就是如上面的代码所示,定义一个变量tmp,在需要查看TMR3CN的地方,把TMR3CN赋给tmp,我们再查看tmp;