本帖最后由 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)是测试用的错误陷阱,如果进到这说明读或写的包是不完整的。
|