c8051f 分页机制,调试时看到的可能不是真实值

来源:互联网 发布:算法统宗圆中正方形 编辑:程序博客网 时间:2024/06/03 19:29

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;        // Save Current SFR page    SFRPAGE = TMR3_PAGE;                // Set SFR page    TMR3CF  = 0x00;    TMR3CN  = 0x00;    TMR3CN  = 0x02;    tmp=TMR3CN;    TMR3L = 0x00;             // Init the Timer3 register    TMR3H = 0x00;    TMR3CN |= 0x04;   // Enable Timer3 in auto-reload mode    TR3 = 1;    SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page

而其中的TMR2_PAGE, TMR3_PAGE,TMR4_PAGE是不一样的,所以并没有重叠,而Keil uVision5 并不知道这一机制,所以在调试窗口直接查看TMR3CN的时候,结果是不正确的。解决的方法之一就是如上面的代码所示,定义一个变量tmp,在需要查看TMR3CN的地方,把TMR3CN赋给tmp,我们再查看tmp;

0 0
原创粉丝点击