ActiveAndy 2024-03-27 21:16 采纳率: 0%
浏览 11
已结题

GD32F470 CDC ACM 中断样式改造问题

您好,看到你文档:GD32F103 USBD CDC移植
我现在用的单片机是GD32F470,标准库是V3.2.0,你你的GD32F103稍有不同
看你的动手能力强,能否帮我也如此中断样式改造呢?
有偿奥!,费用可以协商!
非常感谢!
13809044944 王

  • 写回答

21条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-27 21:16
    关注
    获得0.54元问题酬金

    引自免费微信小程序:皆我百晓生

    理解您想要将GD32F470上的USBD CDC(通用串行总线设备类通信设备)从轮询模式改为中断驱动模式。在GD32 SDK v3.2.0中,尽管我没有直接访问实际硬件和查看相关源码的能力,但我可以根据常规做法提供一种可能的解决方案步骤。

    首先,确保您的GD32F470已经正确配置了USB控制器,并且CDC ACM功能正常运行在轮询模式下。然后按照以下步骤进行中断模式改造:

    1. 修改USB中断优先级和使能: 在初始化阶段,配置USB中断优先级并使能相应的USB中断,例如USB_OTG_Global中断、USB_OTG_IN/OUT中断等。

      NVIC_SetPriority(USB_LP_IRQn, 0); // 设置USB中断优先级
      NVIC_EnableIRQ(USB_LP_IRQn);     // 使能USB中断
      
      // 可能还需要其他中断,根据SDK具体情况配置
      
    2. 更新USB DMA设置: 如果要利用DMA传输数据,确保为USB接口的数据接收和发送通道启用DMA并配置相应的中断。

    3. 重写USB回调函数: 修改CDC类相关的回调函数,使其在中断服务程序中处理数据接收和发送完成事件,而非在主循环中轮询。

      void USBD_CDC_Init(USBD_HandleTypeDef *pdev) {
          // 初始化CDC设备...
          // 配置中断回调函数
          pdev->pClassData = &hcdc;
          hcdc.RxState = CDC_RX_IDLE;
          pdev->pClassData->RxBuffer = UserRxBufferFS;
          USBD_CDC_RegisterInterface(pdev, &USBD_Interface_fops_FS);
      }
      
      static void CDC_ReceiveData(uint8_t* Buf, uint32_t Len) {
          // 在这里处理接收到的数据,而不是在轮询中
      }
      
      static void USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) {
          if (pdev->pClassData &&(pdev->pClassData->RxState == CDC_RX_BUSY)) {
              USBD_CDC_ReceivePacket(pdev);
              // 在这里调用回调函数处理接收到的数据
              CDC_ReceiveData(hcdc.RxBuffer, hcdc.RxLength);
              hcdc.RxState = CDC_RX_IDLE;
          }
      }
      
      static void USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) {
          // 类似的,对于数据发送完成的情况,也可以在这里添加回调函数
      }
      
    4. 调整应用层逻辑: 在应用层,不再主动查询是否有新的USB数据到来,而是注册一个中断服务例程,在这个例程中处理USB数据包的接收与发送。

    5. 检查并适配HAL库: GD32 SDK中的USB HAL库可能会有一些针对中断模式的API或者宏定义,确保正确使用这些API来启动和停止中断传输。

    由于没有具体的GD32F470 USB CDC ACM库代码参考,以上代码仅作为一般指导原则。请参照SDK提供的具体函数和结构体来进行适配和改造。如果有SDK提供的示例工程,可以从那里入手,逐步调整中断相关的部分。

    务必查阅GD32F470的手册以及官方提供的USB CDC库文档,了解关于中断模式的具体实现细节和要求。此外,建议联系GD技术支持获取针对特定芯片型号的官方指导和支持。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月4日
  • 创建了问题 3月27日

悬赏问题

  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址
  • ¥15 elmos524.33 eeprom的读写问题
  • ¥15 使用Java milo连接Kepserver服务端报错?
  • ¥15 用ADS设计一款的射频功率放大器
  • ¥15 怎么求交点连线的理论解?
  • ¥20 软件开发方法学习来了
  • ¥15 微信小程序商城如何实现多商户收款 平台分润抽成
  • ¥15 HC32L176调试了一个通过TIMER5+DMA驱动WS2812B
  • ¥15 关于自相关函数法和周期图法实现对随机信号的功率谱估计的matlab程序运行的问题,请各位专家解答!