ercircle 发表于 2025-4-12 13:16:57

求助汇编大佬!|已解决

在修改USB汇编示例过程中遇到困难:

8H xdata下,可以识别CDC但是无法正常通讯。用C代码正常。
帮看下汇编语法哪里有问题谢谢

8h_cdc_xdata_interrupt_demo_asm 工程可以发一包报文,第二包异常
8h_cdc_xdata_query_demo_asm 一包都发不出去,但是main.asm替换为main.c正常。

其它工程工作正常,也请帮忙检查下语法。




==========================================================
8H xdata下usb_OUT_callback 和usb_IN_callback两个回调不使用的话要手动赋值空

国芯人工智能 发表于 2025-4-12 13:18:00

在分析您提供的USB汇编示例问题时,首先需要明确几个关键点:汇编语言的精确性、硬件寄存器的配置以及中断处理机制的正确性。以下是对您问题的详细分析和建议。

1. 汇编语法检查
汇编语言对语法和指令的精确性要求极高,任何细微的错误都可能导致程序无法正常运行。以下是一些常见的汇编语法问题,您需要仔细检查:
寄存器使用:确保所有寄存器的使用符合硬件规格,特别是在操作Xdata区域时,需要正确设置DPTR和相关的地址寄存器。
指令顺序:汇编指令的执行顺序对程序逻辑至关重要,确保关键操作(如数据传输、中断处理)的顺序正确。
中断处理:在中断服务例程(ISR)中,确保所有必要的寄存器被保存和恢复,避免因寄存器冲突导致程序异常。

2. 硬件寄存器配置
USB通信涉及多个硬件寄存器的配置,包括但不限于USB控制寄存器、端点寄存器和中断寄存器。以下是一些需要检查的配置项:
USB控制寄存器:确保USB控制寄存器的配置正确,包括USB使能、端点配置和中断使能。
端点寄存器:检查端点寄存器的配置,确保端点的方向、大小和状态设置正确。
中断寄存器:确保中断寄存器的配置正确,包括中断使能和中断标志的清除。

3. 中断处理机制
USB通信通常依赖于中断机制来处理数据传输和状态变化。以下是一些需要检查的中断处理机制:
中断服务例程(ISR):确保ISR能够正确处理所有可能的中断事件,包括数据传输完成、端点状态变化等。
中断标志清除:在ISR中,确保所有中断标志被正确清除,避免因未清除中断标志导致中断无法再次触发。
中断优先级:如果使用了多个中断源,确保USB中断的优先级设置合理,避免因优先级冲突导致中断无法及时处理。

4. 调试建议
在调试过程中,建议采用以下步骤来逐步排查问题:
单步调试:使用调试工具进行单步调试,观察程序执行流程和寄存器状态,找出异常点。
日志输出:在关键位置添加日志输出,记录程序执行状态和寄存器值,帮助定位问题。
对比C代码:将汇编代码与正常工作的C代码进行对比,找出可能的差异和错误。

5. 示例代码检查
针对您提供的两个示例工程,以下是一些具体的检查建议:
stc8hcdcxdatainterruptdemoasm:检查中断服务例程中的数据传输逻辑,确保第二包数据的发送逻辑正确。
stc8hcdcxdataquerydemoasm:检查主程序中的查询逻辑,确保数据发送的条件和时机正确。

结论
通过以上分析和建议,您可以逐步排查和解决USB汇编示例中的问题。汇编语言的精确性和硬件寄存器的正确配置是确保程序正常运行的关键。希望这些建议能帮助您顺利解决问题。如果问题仍然存在,建议进一步详细分析代码逻辑和硬件配置,或寻求更专业的支持。

祝您调试顺利!

[本文内容由国芯人工智能辅助生成,仅供参考]

BeHappy 发表于 2025-4-13 10:14:01

楼主辛苦了!

用8051U验证了stc32g_cdc_interrupt_demo例程,单独的例程正常。
但是,当我想把CDC串口收到的数据从UART4输出时,下载软件的CDC助手卡住了,并报告“信号灯超时时间已到”。

ercircle 发表于 2025-4-13 14:46:02

BeHappy 发表于 2025-4-13 10:14
楼主辛苦了!

用8051U验证了stc32g_cdc_interrupt_demo例程,单独的例程正常。


这个要检查下串口相关代码了。可以和CDC解耦单独测下串口功能是否正常

ercircle 发表于 2025-4-14 10:33:42

8h_cdc_xdata_query_demo_asm 工程定位到usb_OUT_callback 和usb_IN_callback两个指针引起的mcu复位。声明时赋值NULL貌似没用。要在usb_init前显式赋值空。

      
      MOV   R3, A
      MOV   R2, A
      MOV   R1, A
      LCALL   _SET_USB_OUT_CALLBACK
      
      MOV   R3, A
      MOV   R2, A
      MOV   R1, A
      LCALL   _SET_USB_IN_CALLBACK
      
    LCALL   USB_INIT                  ;初始化USB模块

8h_cdc_xdata_interrupt_demo_asm 现象也是异常复位,同样的问题

ercircle 发表于 2025-4-14 12:00:57

汇编真抽象啊,USER_STCISPCMD LIB里有默认值了还要重新赋值一遍才生效!
    MOV   WR0,#WORD2 TAB_STCISPCMD
    MOV   WR2,#WORD0 TAB_STCISPCMD
    MOV   USER_STCISPCMD,DR0          ;初始化不停电下载复位命令

ercircle 发表于 2025-4-14 15:07:33

BeHappy 发表于 2025-4-13 10:14
楼主辛苦了!

用8051U验证了stc32g_cdc_interrupt_demo例程,单独的例程正常。


更新了一版,看下之前没重置回调函数指针,对你有没有影响

BeHappy 发表于 2025-4-14 21:38:46

ercircle 发表于 2025-4-14 15:07
更新了一版,看下之前没重置回调函数指针,对你有没有影响

您好,应用了最新的代码,对我遇到的这个问题没有影响
页: [1]
查看完整版本: 求助汇编大佬!|已解决