ahong 发表于 2024-1-9 09:33:23

USB HID 如何用中断模式发送数据

官方的范例是在循环中查询接收和发送的,我想改为中断模式

将官方STC8H8K64U系列用户ISP范例(USB模式)代码中的这一句void usb_isr() //interrupt USB_VECTOR注释去掉后改为void usb_isr() interrupt USB_VECTOR,出现报错如下:

*** WARNING L15: MULTIPLE CALL TO FUNCTION
    NAME:    _USB_WRITE_FIFO/USB
    CALLER1: USB_ISR/USB
    CALLER2: ?C_C51STARTUP


找了其他USB HID例程里面是简单的原路返回(其实官方不应该用这个原路返回做标准例程,根本不实用,新手不知如何改成发送自己的内容),然后根据USB键盘的例程,修改发送代码如下:


void usb_IN()
{
//    usb_write_reg(INDEX, 1);
//    while (usb_read_reg(INCSR1) & INIPRDY);
//    usb_bulk_intr_in(UsbInBuffer, 64, 1);
//    bUsbInBusy = 1;

      unsigned char i;
      while(bUsbInBusy);
      IE2 &= ~EUSB;
      bUsbInBusy = 1;
      usb_write_reg(INDEX, 1);
      for (i=0; i<64; i++)
      {
               usb_write_reg(FIFO1, UsbInBuffer);
      }
      usb_write_reg(INCSR1, INIPRDY);
      IE2 |= EUSB;
}

这样是不报错了,但不知这样是否正规,有没有隐患,请大佬们帮忙看一下,或者帮忙推荐一个正式的发送自己内容的USB HID的例程看一下。

zhp 发表于 2024-1-9 10:12:10

*** WARNING L15: MULTIPLE CALL TO FUNCTION
上面的错误的原因是多个模块调用同一个非可重入的函数所导致的
原本的查询方式,USB_WRITE_FIFO这个函数只被主函数调用
你改为中断方式后,就可能同时被主函数和中断函数调用

解决办法是将函数声明为可重入就可以了,如下:



你的方法也可以

乘风飞扬 发表于 2024-1-9 10:38:06

用户应用(AP)程序里如果有使用中断的话,用户ISP里面就不能使用中断。
因为用户ISP里面"isr.asm"设置了中断地址偏移,这样用户AP程序才能正常使用中断。
所以在线升级的ISP范例都是使用查询模式。

此外,原路返回是最简单的验证收发是否正常的方法,只要收到内容跟发送内容一致,就说明收发正常。
而且只要看看发送函数的原型就知道几个参数的用途,将发送缓冲区跟长度进行修改就能发送自己想要的数据。

ahong 发表于 2024-1-9 11:12:13

zhp 发表于 2024-1-9 10:12
*** WARNING L15: MULTIPLE CALL TO FUNCTION
上面的错误的原因是多个模块调用同一个非可重入的函数所导致 ...

看来一开始发错版块了,在这里很快就有大佬回复,谢谢!

ahong 发表于 2024-1-9 11:15:56

乘风飞扬 发表于 2024-1-9 10:38
用户应用(AP)程序里如果有使用中断的话,用户ISP里面就不能使用中断。
因为用户ISP里面"isr.asm"设置了中断 ...

好的,明白。
新接触USB,自己去改的话心里没底,最好能有实用的例程,原路返回实用性几乎没有,自己改又有重入的报错,直接给个实用的例程对新手更友好

乘风飞扬 发表于 2024-1-9 11:53:29

ahong 发表于 2024-1-9 11:15
好的,明白。
新接触USB,自己去改的话心里没底,最好能有实用的例程,原路返回实用性几乎没有,自己改又 ...

这里有最简单的USB应用教程:
视频回放, 2023/7/3期, USB 零基础实战,CAN应用,STC32位8051实战宣讲会
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=2990

以及最权威的USB标准教学课程:
视频教学:【USB 原理及实战,16课时】,大学标准课程
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4526
(出处: 国芯论坛-STC全球32位8051爱好者互助交流社区)

学习USB的话可以去看看。

ZTJ 发表于 2024-6-25 14:56:19

乘风飞扬 发表于 2024-1-9 10:38
用户应用(AP)程序里如果有使用中断的话,用户ISP里面就不能使用中断。
因为用户ISP里面"isr.asm"设置了中断 ...

“用户应用(AP)程序里如果有使用中断的话,用户ISP里面就不能使用中断。”STC8H芯片是无法实现ISP程序也使用中断吗?我需要两段程序都实现中断,怎么解决这个问题呢?

神农鼎 发表于 2024-6-25 15:30:59



中断模式的USB-CDC/虚拟串口库函数及中断模式的HID库函数 使用说明,STC32G/STC8H - USB:USB-CDC虚拟串口/就是串口,一箭双雕之USB转双串口,[鼠标+键盘]的HID复合设备 国芯技术交流网站 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)

乘风飞扬 发表于 2024-6-25 16:04:34

ZTJ 发表于 2024-6-25 14:56
“用户应用(AP)程序里如果有使用中断的话,用户ISP里面就不能使用中断。”STC8H芯片是无法实现ISP程序也 ...

AP里面使用中断需要进行地址偏移,而用户ISP的中断不要进行地址偏移,这样就产生了矛盾。建议参考例子,用户ISP里面不用中断,使用查询模式即可。

ZTJ 发表于 2024-6-26 11:55:57

乘风飞扬 发表于 2024-6-25 16:04
AP里面使用中断需要进行地址偏移,而用户ISP的中断不要进行地址偏移,这样就产生了矛盾。建议参考例子, ...

您看这样是否可行:在执行ISP程序时,默认在使用中断前就将地址偏移改为0,当要切换到app程序前一刻,将地址偏移改为AP需要的偏移。
页: [1]
查看完整版本: USB HID 如何用中断模式发送数据