找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7601|回复: 12
收起左侧

stc8单片机功能脚切换寄存器这一位EAXFR是干什么的?

[复制链接]
ID:718037 发表于 2020-7-16 16:42 | 显示全部楼层 |阅读模式
寄存器这一位 EAXFR 是干什么的

下载.png
回复

使用道具 举报

ID:155507 发表于 2020-7-16 22:07 | 显示全部楼层
P_SW2寄存器的最高位EAXFR 是扩展SFR访问控制使能
如下特殊功能寄存器位于扩展 RAM 区域 访问这些寄存器,需先将 P_SW2 的 BIT7(EAXFR) 设置为 1,才可正常读写


EAXFR-STC8A.jpg


  1. #include "reg51.h"
  2. #include "intrins.h"

  3. //测试工作频率为11.0592MHz

  4. sfr     P_SW2       =   0xba;
  5. sfr     PWMCFG      =   0xf1;
  6. sfr     PWMIF       =   0xf6;
  7. sfr     PWMFDCR     =   0xf7;
  8. sfr     PWMCR       =   0xfe;

  9. #define PWMC            (*(unsigned int volatile xdata *)0xfff0)
  10. #define PWMCKS          (*(unsigned char volatile xdata *)0xfff2)
  11. #define TADCP           (*(unsigned int volatile xdata *)0xfff3)
  12. #define PWM0T1          (*(unsigned int volatile xdata *)0xff00)
  13. #define PWM0T2          (*(unsigned int volatile xdata *)0xff02)
  14. #define PWM0CR          (*(unsigned char volatile xdata *)0xff04)
  15. #define PWM0HLD         (*(unsigned char volatile xdata *)0xff05)
  16. #define PWM1T1          (*(unsigned int volatile xdata *)0xff10)
  17. #define PWM1T2          (*(unsigned int volatile xdata *)0xff12)
  18. #define PWM1CR          (*(unsigned char volatile xdata *)0xff14)
  19. #define PWM1HLD         (*(unsigned char volatile xdata *)0xff15)
  20. #define PWM2T1          (*(unsigned int volatile xdata *)0xff20)
  21. #define PWM2T2          (*(unsigned int volatile xdata *)0xff22)
  22. #define PWM2CR          (*(unsigned char volatile xdata *)0xff24)
  23. #define PWM2HLD         (*(unsigned char volatile xdata *)0xff25)
  24. #define PWM3T1          (*(unsigned int volatile xdata *)0xff30)
  25. #define PWM3T2          (*(unsigned int volatile xdata *)0xff32)
  26. #define PWM3CR          (*(unsigned char volatile xdata *)0xff34)
  27. #define PWM3HLD         (*(unsigned char volatile xdata *)0xff35)
  28. #define PWM4T1          (*(unsigned int volatile xdata *)0xff40)
  29. #define PWM4T2          (*(unsigned int volatile xdata *)0xff42)
  30. #define PWM4CR          (*(unsigned char volatile xdata *)0xff44)
  31. #define PWM4HLD         (*(unsigned char volatile xdata *)0xff45)
  32. #define PWM5T1          (*(unsigned int volatile xdata *)0xff50)
  33. #define PWM5T2          (*(unsigned int volatile xdata *)0xff52)
  34. #define PWM5CR          (*(unsigned char volatile xdata *)0xff54)
  35. #define PWM5HLD         (*(unsigned char volatile xdata *)0xff55)
  36. #define PWM6T1          (*(unsigned int volatile xdata *)0xff60)
  37. #define PWM6T2          (*(unsigned int volatile xdata *)0xff62)
  38. #define PWM6CR          (*(unsigned char volatile xdata *)0xff64)
  39. #define PWM6HLD         (*(unsigned char volatile xdata *)0xff65)
  40. #define PWM7T1          (*(unsigned int volatile xdata *)0xff70)
  41. #define PWM7T2          (*(unsigned int volatile xdata *)0xff72)
  42. #define PWM7CR          (*(unsigned char volatile xdata *)0xff74)
  43. #define PWM7HLD         (*(unsigned char volatile xdata *)0xff75)

  44. void main()
  45. {
  46.     P_SW2 = 0x80;  //将P_SW2寄存器的最高位EAXFR置1,访问XSFR
  47.     PWMCKS = 0x00;                              // PWM时钟为系统时钟
  48.     PWMC = 0x1000;                              //设置PWM周期为1000H个PWM时钟
  49.     PWM0T1= 0x0100;                             //在计数值为100H地方输出低电平
  50.     PWM0T2= 0x0500;                             //在计数值为500H地方输出高电平
  51.     PWM0CR= 0x80;                               //使能PWM0输出
  52.     P_SW2 = 0x00;

  53.     PWMCR = 0x80;                               //启动PWM模块

  54.     while (1);
  55. }

复制代码




回复

使用道具 举报

ID:311846 发表于 2020-7-17 09:33 | 显示全部楼层
你认真看下这个表的下面文档,你会发现惊喜,
回复

使用道具 举报

ID:718037 发表于 2020-7-17 10:35 | 显示全部楼层
谢了,昨天看了后面才发现
回复

使用道具 举报

ID:718037 发表于 2020-7-17 10:39 | 显示全部楼层
angmall 发表于 2020-7-16 22:07
P_SW2寄存器的最高位EAXFR 是扩展SFR访问控制使能
如下特殊功能寄存器位于扩展 RAM 区域 访问这些寄存器, ...

谢谢,昨天看了后面才发现
回复

使用道具 举报

ID:883988 发表于 2021-3-13 10:55 | 显示全部楼层
这个操作
一言难尽!
我看IIC的时候刚好把这个漏过去了,结果硬件IIC怎么也通讯不成功,看了芯片资料给的例程后发现P_SW2的第一位被置一了,然后再过来查。前前后后搞了好久好久
回复

使用道具 举报

ID:890869 发表于 2021-9-4 00:50 | 显示全部楼层
小胸姑娘 发表于 2021-3-13 10:55
这个操作
一言难尽!
我看IIC的时候刚好把这个漏过去了,结果硬件IIC怎么也通讯不成功,看了芯片资料给的 ...

对,我也是这里,卡了好几天
回复

使用道具 举报

ID:911455 发表于 2023-5-15 16:38 | 显示全部楼层
他没有讲这位置1后,耽误访问data里的内容不
回复

使用道具 举报

ID:206581 发表于 2023-5-15 21:57 | 显示全部楼层
我也是没注意到,搞了好久
回复

使用道具 举报

ID:155507 发表于 2023-5-16 08:39 | 显示全部楼层
innere 发表于 2023-5-15 16:38
他没有讲这位置1后,耽误访问data里的内容不

8.2.8 扩展SFR 使能寄存器EAXFR 的使用说明
STC8G/8H 的扩展SFR 地址范围为0FA00H~0FFFFH,如需访问XFR 区域的扩展SFR,需要先将EAXFR
(P_SW2.7)置1,并使用MOVX A,@DPTR 和MOVX @DPTR,A 这两条指令进行读写操作。XFR 的地址范
围与外部扩展RAM 地址的0FA00H~0FFFFH 区域是重叠的。
1、若用户不使用外部扩展RAM 或者外部扩展RAM 的最大地址不超过0FA00H
(例如只外扩32K RAM),这种情况下不会有不同区域的访问地址冲突,可以在上电系统初始化时将EAXFR
寄存器设置为1(例如:P_SW2 |= 0x80;),后续一直保持为1 不用再修改,
即可正常访问XFR 区域。
2、若用户有外扩64K 的扩展RAM,则在访问XFR 和外部扩展RAM 时需要注意:
访问XFR 时需要将EAXFR 寄存器位设置为1;
访问地址范围在0FA00H~0FFFFH 的外部扩展RAM 时需要将EAXFR 设置为0;
访问地址范围在0000H~0F9FFH 的外部扩展RAM 时,与EAXFR 设置的值无关
EAXFR.jpg





回复

使用道具 举报

ID:879348 发表于 2023-5-16 11:52 | 显示全部楼层
搞的太复杂了,这就是51架构的局限性
回复

使用道具 举报

ID:1034262 发表于 2023-5-16 12:18 | 显示全部楼层
用于访问扩展的特殊功能寄存器,因为51的架构问题,常规的特殊功能寄存器地址(128字节)远远不够,所以STC增加的几百个特殊功能寄存器都放在xdata地址空间,为了避免与xdata内存冲突,所以用这一位来允许/禁止扩展的特殊功能寄存器访问。
如果没有外接xdata芯片,或外接的没到64K,或者到64K,最后几百个字节不用,则程序已开始设置该位为1,一直不用清除。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表