jiegebushijiege 发表于 2025-1-22 22:01:47

32G12K128——汇编指令MOV给P3PU寄存器赋值报错(访问拓展SFR)

问题:直接用汇编mov给P3PU寄存器赋值报错。
      新手上路STC32G12K128 系列,在用汇编配置P30端口上拉的时候碰到一些问题。刚开始直接用MOV A,#00000001B和MOV P3PU,A发现报错mission1.asm(22): warning A52: VALUE HAS BEEN TRUNCATED TO 8 BITS,说是值已被截断为 8 位。网上查阅一番在论坛上的另一个帖子找到类似问题:https://www.stcaimcu.com/forum.php?mod=viewthread&tid=5944。
      再查阅芯片手册,P3PU寄存器地址为7EFE13H,属于扩展 SFR,在手册:10.5 扩展特殊功能寄存器列表(XFR:0x7EFE00-0x7EFEFF)可找到,附带有例子。
下列特殊功能寄存器为扩展 SFR(XFR),逻辑地址位于 XDATA 区域,访问前需要将 P_SW2 寄存器的最高位(EAXFR)置 1,然后使用 MOV @DRk, Rm 和 MOV Rm, @DRk 指令进行访问,例如:
MOV A,#00H
MOV WR6,#WORD0 CLKSEL ; CLKSEL 可换为需要访问的寄存器
MOV WR4,#WORD2 CLKSEL
MOV @DR4,R11

MOV WR6,#WORD0 CLKSEL ; CLKSEL 可换为需要访问的寄存器
MOV WR4,#WORD2 CLKSEL
MOV R11,@DR4
      到目前为止我还没有搞懂WR6、WORD0、DR4这些是从哪里蹦出来的,芯片手册没讲,难受。上面的帖子的楼5的图片挺好,不知道是从哪里找到的,我在芯片手册没找到。
      我自己最后给P30口上拉的汇编代码:(话说是这么操作吗?不太确定,代码效果我还没看,迟点回来)
ORL P_SW2,#80H      ;相或操作,将最高位置1,使能访问XFR
MOV WR6,#WORD0 P3PU
MOV WR4,#WORD2 P3PU
MOV A,#00000001B
MOV @DR4,R11PS:WR这些寄存器上网搜80251手册就有了,从TSC80251手册的:Figure 3.5. Register File in Byte, Word, and Dword Register Views那里,第23页。TSC80251,TSC80251 pdf,TSC80251中文资料,TSC80251引脚图,TSC80251电路_datasheet网 (elecfans.com)

jiegebushijiege 发表于 2025-1-24 00:46:13

我的改用引脚下拉的查看按键P33所在的情况,可以的。在芯片手册的IO口那里有:
关于 I/O 的注意事项:
1、 P3.0 和 P3.1 口上电后的状态为弱上拉/准双向口模式
2、 除 P3.0 和 P3.1 外,其余所有 IO 口上电后的状态均为高阻输入状态,用户在使用 IO 口
前必须先设置 IO 口模式。如果按键刚好是P30、P31口那么不用配置相关输入上下拉也效果也正常。我的测试代码:
$INCLUDE (STC32G.INC);引用头文件
      ORG         0000H
      JMP         MAIN
MAIN:
      LCALL      GPIO_Init
      LJMP         MAIN_LOOP      
GPIO_Init:
      MOV         A,#00000001B
      MOV                P0M0,A
      MOV         A,#00000000B
      MOV                P0M1,A                        ;配置P0.0口推挽输出
      ;MOV         A,#00000000B
      ;MOV                P3M0,A
      ;MOV         A,#00000001B      
      ;MOV                P3M1,A                ;配置P3.0口高阻输入      
      MOV         A,#00000000B
      MOV                P3M0,A
      MOV         A,#00001000B      
      MOV                P3M1,A                        ;配置P3.3口高阻输入      
      ORL         P_SW2,#80H                ;相或操作,将最高位置1,使能访问XFR
      MOV         WR6,#WORD0 P3PU
      MOV         WR4,#WORD2 P3PU
      MOV         A,#00001000B      ;P33口上拉      
      MOV         @DR4,R11
      ;MOV         WR6,#WORD0 P3PD
      ;MOV         WR4,#WORD2 P3PD
      ;MOV         A,#00001000B      ;P33口下拉
      ;MOV         @DR4,R11      
      RET
MAIN_LOOP:
    JNB P3.3, BUTTON_PRESSED   ; 如果P3.0为0,跳转
    SETB P0.0                  ; 对P0.0置1
    SJMP MAIN_LOOP
BUTTON_PRESSED:
    CLR P0.0
    SJMP MAIN_LOOP      
    END

jiegebushijiege 发表于 2025-2-7 23:01:48

具体芯片手册没找到的寄存器可以去TSC80251手册找,STC32G12K128用的架构是基于80251架构弄的。找到一篇牵涉到251架构寄存器比较能看懂的:STC32G FreeRTOS入门(11):现场保护与恢复机制—FreeRTOS与C251中断异同 - uCOS/FreeRTOS,GUI-uGFX/U8g2, 文件系统, 国产RTOS, 实时操作系统 国芯技术交流网站 - AI32位8051交流社区 (stcaimcu.com)

jiegebushijiege 发表于 2025-3-2 14:22:54

另外的一些总结放博客了:https://mp.csdn.net/mp_blog/creation/editor/145961875
页: [1]
查看完整版本: 32G12K128——汇编指令MOV给P3PU寄存器赋值报错(访问拓展SFR)