打印
[STM32F4]

2015-04-22 STM32F407 FreeRTOS+USB HID 调试小结

[复制链接]
6710|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wowow|  楼主 | 2015-4-22 18:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wowow 于 2015-4-22 18:12 编辑

前言:
版本:CubeMX 4.7 + STM32Cube_FW_F4_V1.5.0生成的代码
配置:FreeRTOS + FatFS(SD卡) + FwIP + USB HID,其中FwIP只做了初始化未使用。


本文主要记录要点和bug解决方案。要点:
1. 需要用户补充的代码
2. 打印调试信息
3. 测试代码
4. bug:移动鼠标读到的数据是乱的,fifo读写也有些问题
5. 疑问

1.需要用户补充的代码:VBUS电源的开关


2. 打印调试信息
usbh_conf.h定义了USBH_DEBUG_LEVEL宏,可以设置是否打印Log信息。
缺省调用的是printf,由于SWO脚没接,串口太慢,改用更快的RTT。
如下将“printf(”替换成“SEGGER_RTT_printf(0, ”并添加RTT相关的代码。

#if (USBH_DEBUG_LEVEL > 0)
#define  USBH_UsrLog(...)   SEGGER_RTT_printf(0, __VA_ARGS__);\
                            SEGGER_RTT_printf(0, "\n");
#else
#define USBH_UsrLog(...)   
#endif
多线程调用SEGGER_RTT得用户自己实现,暂时还不会弄,以后再说。

3. 测试代码,在生成的StartDefaultTask线程里主循环改成如下:
  for(;;)
  {
          if(Appli_state == APPLICATION_READY){
                  HID_MOUSE_Info_TypeDef *m_pinfo;  
                        m_pinfo = USBH_HID_GetMouseInfo(&hUsbHostFS);

                        if(m_pinfo != NULL)

                        {
                                sprintf(MouseBuf, "x=%4d y=%4d z=%3d %d%d%d",m_pinfo->x, m_pinfo->y, m_pinfo->z, m_pinfo->buttons[0],m_pinfo->buttons[1],m_pinfo->buttons[2]);
                                USBH_UsrLog (MouseBuf);
                        }
          }
    osDelay(50);
  }

其中Appli_state在usb_host.c里修改的,当usb设备成枚举后变成APPLICATION_READY。

4. bug:开始测单击左右键是正常的,快速移动鼠标,接收的数据是乱的,发现是fifo的问题:
1) usb线程里接收鼠标数据,暂存到mouse_report_data,然后写到fifo。主线程读fifo也是提取数据到mouse_report_data再做解析,这肯定会有冲突,只不过测试时没有发现。
解决办法:另定义一个缓冲区,暂时弄了个mouse_report_data2。一个用于接收鼠标数据存入fifo,一个用于提取fifo里的数据用于解析。
2) 当fifo满的时候,最后写入的包不完整,读出时字节错位了。详情:fifo初始化时大小定义为10个数据包大小(HID_QUEUE_SIZE):
fifo_init(&HID_Handle->fifo, phost->device.Data, HID_QUEUE_SIZE * sizeof(mouse_report_data));
当head==tail时表示为空,那么最多只能存HID_QUEUE_SIZE*sizeof(mouse_report_data)-1个数据,缓冲区写满时最后一个包是不完整的,读出来的数据肯定出错了。
解决办法有很多种:
(1).改动最小的方法是初始化时长度+1。HID_QUEUE_SIZE * sizeof(mouse_report_data)+1
(2).修改fifo算法,以一个包为单位读写数据,就不会出现这个问题,而且对于鼠标这种4字节的数据包效率更高一些,一次读写一个word。
(3).直接用RTOS的Queue
这里用了最简单的方法(1)
3) fifo读写如果没成功返回值确是成功的。
修改前后代码对比:
fifo_init时长度+1:
修改mouse_info的结构体定义,x,y的类型由uint8_t改成了int8_t,因为读出来的值是有符号数。增加了滚轮z。
另外定义一个变量保存从fifo读出的数据,解析鼠标数据部分增加滚轮。没用report item的方法


fifo_read和fifo_write少了一个else的分支。while(1)是测试用的错误陷阱,如果进到这说明读或写的包是不完整的。




沙发
wowow|  楼主 | 2015-4-22 18:05 | 只看该作者
本帖最后由 wowow 于 2015-4-22 18:09 编辑

5. HID鼠标测通了又转测别的模块,有些问题没有解决,有了解的请提点下:

1.  测试的罗技鼠标有时枚举大多数情况下成功,有时枚举不成功。另一个鼠标一次没成功。why?
2.  无线鼠标的接收器通常为识别为一个键盘和一个鼠标,如何切换到鼠标上?键盘鼠标能一起用吗?
3.  HAL库支持接个USB hub同时接键盘鼠标U盘吗?

使用特权

评论回复
板凳
wowow|  楼主 | 2015-4-23 13:09 | 只看该作者
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:skywolf.github.io

59

主题

649

帖子

3

粉丝