当前位置: 首页 > news >正文

做淘宝券推广的网站有哪些陕西建设厅官网

做淘宝券推广的网站有哪些,陕西建设厅官网,海南省住房公积金管理局app,为什么要做外贸网站1)资料下载:点击资料即可下载2)对正点原子Linux感兴趣的同学可以加群讨论#xff1a;9354467413#xff09;关注正点原子公众号#xff0c;获取最新资料更新上一章我们向大家介绍了如何利用 STM32F4 的 USB HOST 接口来驱动 U 盘#xff0c;本章#xff0c;我们 将利用 ST…1)资料下载:点击资料即可下载2)对正点原子Linux感兴趣的同学可以加群讨论9354467413关注正点原子公众号获取最新资料更新上一章我们向大家介绍了如何利用 STM32F4 的 USB HOST 接口来驱动 U 盘本章我们 将利用 STM32F4 的 USB HOST 来驱动 USB 鼠标/键盘。本章分为如下几个部分 59.1 USB 鼠标键盘简介 59.2 硬件设计 59.3 软件设计 59.4 下载验证 59.1 USB 鼠标键盘简介 传统的鼠标和键盘是采用 PS/2 接口和电脑通信的但是现在 PS/2 接口在电脑上逐渐消失 所以现在越来越多的鼠标键盘采用的是 USB 接口而不是 PS/2 接口的了。 USB 鼠标键盘属于 USB HID 设备。USB HID 即Human Interface Device人机交互设备 的缩写键盘、鼠标与游戏杆等都属于此类设备。不过 HID 设备并不一定要有人机接口只要 符合 HID 类别规范的设备都是 HID 设备。关于 USB HID 的知识我们这里就不详细介绍了 请大家自行百度学习。 本章我们同上一章一样我们直接移植官方的 USB HID 例程官方例程路径光盘→8 STM32 参考资料→STM32 USB 学习资料→STM32_USB-Host-Device_Lib_V2.1.0→Project→ USB_Host_Examples→HID该例程支持 USB 鼠标和键盘等 USB HID 设备本章我们将移植这 个例程到探索者 STM32F407 开发板上。 59.2 硬件设计 本节实验功能简介开机的时候先显示一些提示信息然后初始化 USB HOST并不断轮 询。当检测到 USB 鼠标/键盘的插入后显示设备类型并显示设备输入数据 如果是 USB 鼠标将显示鼠标移动的坐标XY 坐标滚轮滚动数值Z 坐标以及 按键左中右。 如果是 USB 键盘将显示键盘输入的数字/字母等内容不是所有按键都支持部分按键 没有做解码支持比如 F1~F12。 最后还是用 DS0 提示程序正在运行。 所要用到的硬件资源如下 1 指示灯 DS0 2 串口 3 TFTLCD 模块 4 USB HOST 接口 这几个部分在之前的实例中都已经介绍过了我们在此就不多说了。这里再次提醒大家 P11 的连接要通过跳线帽连接 PA11 和 D-以及 PA12 和 D。 59.3 软件设计 本章我们在第十八章实验 实验 13 TFTLCD 显示实验 的基础上修改先打开实验 13 的工程在 HARDWARE 文件夹所在文件夹下新建一个 USB 的文件夹对照官方 HID 例子 将相关文件拷贝到 USB 文件夹下。然后我们在工程里面添加 USB HID 相关代码最终得到如图 59.3.1 所示的工程 图 59.3.1 USB 鼠标键盘工程截图可以看到USB 部分代码同上一章的在结构上是一模一样的只是.c 文件稍微有些变化。 同样我们移植需要修改的代码就是 USB_APP 里面的这两个.c 文件了。 其中 usb_bsp.c 的代码和之前的章节一模一样可以用上一章的代码直接替换即可正常使 用。 usbh_usr.c 里面的代码则有所变化重点代码如下 //下面两个函数,为 ALIENTEK 添加,以防止 USB 死机 //USB 枚举状态死机检测,防止 USB 枚举失败导致的死机 //phost:USB_HOST 结构体指针 //返回值:0,没有死机 // 1,死机了,外部必须重新启动 USB 连接. u8 USBH_Check_EnumeDead(USBH_HOST *phost) { static u16 errcnt0; //这个状态,如果持续存在,则说明 USB 死机了. if(phost-gStateHOST_CTRL_XFER(phost-EnumStateENUM_IDLE|| phost-EnumStateENUM_GET_FULL_DEV_DESC)) { errcnt; if(errcnt2000)//死机了 { errcnt0;RCC-AHB2RSTR|17; //USB OTG FS 复位 delay_ms(5); RCC-AHB2RSTR~(17); //复位结束 return 1; } }else errcnt0; return 0; } //USB HID 通信死机检测,防止 USB 通信死机(暂时仅针对:DTERR,即 Data toggle error) //pcore:USB_OTG_Core_dev_HANDLE 结构体指针 //phidm:HID_Machine_TypeDef 结构体指针 //返回值:0,没有死机 // 1,死机了,外部必须重新启动 USB 连接. u8 USBH_Check_HIDCommDead(USB_OTG_CORE_HANDLE *pcore, HID_Machine_TypeDef *phidm) { if(pcore-host.HC_Status[phidm-hc_num_in]HC_DATATGLERR) //检测到 DTERR 错误,直接重启 USB. { return 1; } return 0; } // //USB 键盘鼠标数据处理 //鼠标初始化 void USR_MOUSE_Init(void) { USBH_Msg_Show(2); //USB 鼠标 USB_FIRST_PLUGIN_FLAG1;//标记第一次插入 } //键盘初始化 void USR_KEYBRD_Init(void) { USBH_Msg_Show(1); //USB 键盘 USB_FIRST_PLUGIN_FLAG1;//标记第一次插入 } //零时数组,用于存放鼠标坐标/键盘输入内容(4.3 屏,最大可以输入 2016 字节) __align(4) u8 tbuf[2017]; //USB 鼠标数据处理 //data:USB 鼠标数据结构体指针 void USR_MOUSE_ProcessData(HID_MOUSE_Data_TypeDef *data) { static signed short x,y,z; if(USB_FIRST_PLUGIN_FLAG)//第一次插入,将数据清零 { USB_FIRST_PLUGIN_FLAG0; xyz0; } x(signed char)data-x; if(x9999)x9999; if(x-9999)x-9999; y(signed char)data-y; if(y9999)y9999; if(y-9999)y-9999; z(signed char)data-z; if(z9999)z9999; if(z-9999)z-9999; POINT_COLORBLUE; sprintf((char*)tbuf,BUTTON:); if(data-button0X01)strcat((char*)tbuf,LEFT ); if((data-button0X03)0X02)strcat((char*)tbuf,RIGHT); else if((data-button0X03)0X03)strcat((char*)tbuf,RIGHT); if((data-button0X07)0X04)strcat((char*)tbuf,MID ); else if((data-button0X07)0X04)strcat((char*)tbuf,MID); LCD_Fill(3056,180,lcddev.width-1,18016,WHITE); LCD_ShowString(30,180,210,16,16,tbuf); sprintf((char*)tbuf,X POS:%05d,x); LCD_ShowString(30,200,200,16,16,tbuf); sprintf((char*)tbuf,Y POS:%05d,y); LCD_ShowString(30,220,200,16,16,tbuf); sprintf((char*)tbuf,Z POS:%05d,z); LCD_ShowString(30,240,200,16,16,tbuf); //printf(btn,X,Y,Z:0x%x,%d,%d,%drn,data-button,(signed char)data-x, //(signed char)data-y,(signed char)data-z); } //USB 键盘数据处理 //data:USB 鼠标数据结构体指针 void USR_KEYBRD_ProcessData (uint8_t data) { static u16 pos; static u16 endx,endy; static u16 maxinputchar; u8 buf[4]; if(USB_FIRST_PLUGIN_FLAG)//第一次插入,将数据清零 {USB_FIRST_PLUGIN_FLAG0; endx((lcddev.width-30)/8)*830; //得到 endx 值 endy((lcddev.height-220)/16)*16220; //得到 endy 值 maxinputchar((lcddev.width-30)/8); maxinputchar*(lcddev.height-220)/16;//当前 LCD 最大可以显示的字符数. pos0; } POINT_COLORBLUE; sprintf((char*)buf,%02X,data); LCD_ShowString(3056,180,200,16,16,buf);//显示键值 if(data data~) { tbuf[pos]data; tbuf[pos]0; //添加结束符. if(posmaxinputchar)posmaxinputchar;//最大输入这么多 }else if(data0X0D) //退格键 { if(pos)pos--; tbuf[pos]0; //添加结束符. } if(posmaxinputchar) //没有超过显示区 { LCD_Fill(30,220,endx,endy,WHITE); LCD_ShowString(30,220,endx-30,endy-220,16,tbuf); } //printf(KEY Board Value:%02Xrn,data); //printf(KEY Board Char:%crn,data); } ST 官方的 USB HID 例程仅仅是能用很多地方还要改善比如识别率低容易死机枚 举/通信都可能死机等问题这里USBH_Check_EnumeDead 和 USBH_Check_HIDCommDead 这两个函数就是我们针对官方 HID 例程现有 bug 做出的改进处理通过这两个函数可以检 测枚举/通信是否正常当出现异常时直接重启 USB 内核重新连接设备这样可以防止死 机造成的程序无响应情况。 另外为了提高对鼠标键盘的识别率和兼容性对 usbh_hid_core.c 里面的两处代码进行了 修改 1USBH_HID_ClassRequest 函数修改代码351 行为 classReqStatus USBH_Set_Idle (pdev, pphost, 100, 0);//这里 duration 官方设置的是 0,修改为 //100,提高兼容性 2USBH_Set_Idle 函数修改代码542 行为 phost-Control.setup.b.wLength.w 100; //官方的这里设置的是 0,导致部分鼠标无法识别, //这里修改为 100 以后,识别率明显提高. 以上两处地方官方默认值都是设置的 0我们修改为 100 后可以明显提高 USB 鼠标/ 键盘的识别率兼容性好很多。还有在 usbh_hid_keybd.h 里面要修改键盘类型的定义改为 #define QWERTY_KEYBOARD //通用键盘 //#define AZERTY_KEYBOARD //法国版键盘 ST 官方例程是使用的法国版键盘一般我们国内用的是通用键盘所以需要换一个宏 定义换成QWERTY_KEYBOARD。 最后在 usbh_hid_mouse.c 里面MOUSE_Decode 函数用于鼠标数据解析但是 ST 官方 例程仅对 4 字节鼠标数据做了解析而忽略了 5 字节/6 字节鼠标数据的处理所以需要修改 该函数为 extern HID_Machine_TypeDef HID_Machine; static void MOUSE_Decode(uint8_t *data) { if(HID_Machine.length5||HID_Machine.length6)//5/6 字节长度 USB 鼠标数据处理 { HID_MOUSE_Data.button data[0]; HID_MOUSE_Data.x data[1]; HID_MOUSE_Data.y data[3]4|data[2]4; HID_MOUSE_Data.z data[4]; }else if(HID_Machine.length4) //4 字节长度的 USB 鼠标数据处理 { HID_MOUSE_Data.button data[0]; HID_MOUSE_Data.x data[1]; HID_MOUSE_Data.y data[2]; HID_MOUSE_Data.z data[3]; } USR_MOUSE_ProcessData(HID_MOUSE_Data); } 再回到 usbh_usr.cUSR_MOUSE_Init 和 USR_MOUSE_ProcessData 用于处理鼠标数据这 两个函数在 usbh_hid_mouse.c 里面被调用USR_MOUSE_Init 在鼠标初始化的时候被调用而 USR_MOUSE_ProcessData 函数则在鼠标初始化成功轮询数据的时候调用处理鼠标数据 该函数将得到的鼠标数据显示在 LCD 上面。 同样USR_KEYBRD_Init 和 USR_KEYBRD_ProcessData 用于处理键盘数据这两个函数 在 usbh_hid_keybd.c 里面被调用USR_KEYBRD_Init 在键盘初始化的时候被调用而 USR_KEYBRD_ProcessData 函数则在键盘初始化成功轮询数据的时候调用处理键盘数据 该函数将键盘输入的字符显示在 LCD 上面。 其他代码我们就不再介绍了请大家参考开发板光盘本例程源码。 最后来看看 main.c 里面的代码如下 USBH_HOST USB_Host; USB_OTG_CORE_HANDLE USB_OTG_Core_dev; extern HID_Machine_TypeDef HID_Machine; //USB 信息显示 //msgx:0,USB 无连接 // 1,USB 键盘 // 2,USB 鼠标// 3,不支持的 USB 设备 void USBH_Msg_Show(u8 msgx) { POINT_COLORRED; switch(msgx) { case 0: //USB 无连接 LCD_ShowString(30,130,200,16,16,USB Connecting...); LCD_Fill(0,150,lcddev.width,lcddev.height,WHITE); break; case 1: //USB 键盘 LCD_ShowString(30,130,200,16,16,USB Connected ); LCD_ShowString(30,150,200,16,16,USB KeyBoard); LCD_ShowString(30,180,210,16,16,KEYVAL:); LCD_ShowString(30,200,210,16,16,INPUT STRING:); break; case 2: //USB 鼠标 LCD_ShowString(30,130,200,16,16,USB Connected ); LCD_ShowString(30,150,200,16,16,USB Mouse); LCD_ShowString(30,180,210,16,16,BUTTON:); LCD_ShowString(30,200,210,16,16,X POS:); LCD_ShowString(30,220,210,16,16,Y POS:); LCD_ShowString(30,240,210,16,16,Z POS:); break; case 3: //不支持的 USB 设备 LCD_ShowString(30,130,200,16,16,USB Connected ); LCD_ShowString(30,150,200,16,16,Unknow Device); break; } } //HID 重新连接 void USBH_HID_Reconnect(void) { //关闭之前的连接 USBH_DeInit(USB_OTG_Core_dev,USB_Host); //复位 USB HOST USB_OTG_StopHost(USB_OTG_Core_dev); //停止 USBhost if(USB_Host.usr_cb-DeviceDisconnected) //存在,才禁止 { USB_Host.usr_cb-DeviceDisconnected(); //关闭 USB 连接 USBH_DeInit(USB_OTG_Core_dev, USB_Host); USB_Host.usr_cb-DeInit(); USB_Host.class_cb-DeInit(USB_OTG_Core_dev,USB_Host.device_prop); }USB_OTG_DisableGlobalInt(USB_OTG_Core_dev);//关闭所有中断 //重新复位 USB __HAL_RCC_USB_OTG_FS_FORCE_RESET();//USB OTG FS 复位 delay_ms(5); __HAL_RCC_USB_OTG_FS_RELEASE_RESET();//复位结束 memset(USB_OTG_Core_dev,0,sizeof(USB_OTG_CORE_HANDLE)); memset(USB_Host,0,sizeof(USB_Host)); //重新连接 USB HID 设备 USBH_Init(USB_OTG_Core_dev,USB_OTG_FS_CORE_ID,USB_Host,HID_cb, USR_Callbacks); } int main(void) { u32 t; HAL_Init(); //初始化 HAL 库 Stm32_Clock_Init(336,8,2,7); //设置时钟,168Mhz delay_init(168); //初始化延时函数 uart_init(115200); //初始化 USART usmart_dev.init(84); //初始化 USMART LED_Init(); //初始化 LED KEY_Init(); //初始化 KEY LCD_Init(); //初始化 LCD SRAM_Init(); //初始化外部 SRAM W25QXX_Init(); //初始化 W25Q128 POINT_COLORRED; LCD_ShowString(30,50,200,16,16,Explorer STM32F4); LCD_ShowString(30,70,200,16,16,USB MOUSE/KEYBOARD TEST); LCD_ShowString(30,90,200,16,16,ATOMALIENTEK); LCD_ShowString(30,110,200,16,16,2017/5/16); LCD_ShowString(30,130,200,16,16,USB Connecting...); //初始化 USB 主机 USBH_Init(USB_OTG_Core_dev,USB_OTG_FS_CORE_ID,USB_Host,HID_cb, USR_Callbacks); while(1) { USBH_Process(USB_OTG_Core_dev, USB_Host); if(bDeviceState1)//连接建立了 { if(USBH_Check_HIDCommDead(USB_OTG_Core_dev,HID_Machine)) //检测 USB HID 通信,是否还正常? { USBH_HID_Reconnect();//重连 }}else //连接未建立的时候,检测 { if(USBH_Check_EnumeDead(USB_Host)) //检测 USB HOST 枚举是否死机了?死机了,则重新初始化 { USBH_HID_Reconnect();//重连 } } t; if(t200000) { LED0!LED0; t0; } } } 这里总共三个函数USBH_Msg_Show 用于显示一些提示信息在 usbh_usr.c 里面被相关 函数调用。USBH_HID_Reconnect 则用于 USB HID 重新连接当发现枚举/通信死机的时候 调用该函数实现 USB 复位重启以重新连接最后main 函数就比较简单了处理方式和上 一章几乎一样只是多了一些通信死机处理。 软件设计部分就为大家介绍到这里。 59.4 下载验证 在代码编译成功之后我们下载到探索者 STM32F4 开发板上然后在 USB_HOST 端子插 入 USB 鼠标/键盘注意此时 USB SLAVE 口不要插 USB 线到电脑否则会干扰 等 USB 鼠标/键盘成功识别后便可以看到 LCD 显示 USB Connected并显示设备类型 USB Mouse 或者 USB KeyBoard同时也会显示输入的数据如图 58.4.1 和图 58.4.2 所示 图 59.4.1 USB 鼠标测试图 59.4.2 USB 键盘测试其中图 59.4.1 是 USB 鼠标测试界面图 59.4.2 是 USB 键盘测试界面。 最后特别提醒大家由于例程的 HID 内核只处理了第一个接口描述符所以对于 USB 符合设备只能识别第一个描述符所代表的设备。体现到实际使用中就是USB 无线鼠标 一般是无法使用被识别为键盘而 USB 无线键盘可以使用因为键盘在第一个描述符 鼠标在第二个描述符。 如果想支持 USB 无线鼠标可以通过修改 usbh_hid_core.c 里面的 USBH_HID_InterfaceInit 函数来支持。
http://www.pierceye.com/news/849783/

相关文章:

  • 阜阳网站建设云平台玉溪建设局门户网站
  • 网站建设什么原因最主要怎么制作网站首页
  • 网站建设深圳赶集网网页设计工程师工资
  • 哪家企业网站建设好闵行区网站制作
  • 重庆行业网站建设陕西省建设监理协会查询官方网站
  • 手机网站 尺寸网站规划的认识
  • 永川网站制作联系电话wordpress 参数 传递
  • 西宁市网站建设高端网站开发人员要求
  • 前端做商城网站需要多久yum wordpress
  • 便宜网站建设成都免费建网站视频教程
  • 班级网站自助建设功能没有充值入口的传奇
  • 杭州网站seo免费网站建设
  • 好看的网站设计网站开发龙岗网站建设
  • 物流如何做网站wordpress qq互联插件
  • 权威发布李建济南做seo排名
  • 六安网站建设 220广州安尔捷做的网站好吗
  • 企业网站写好如何发布wordpress免插件生成地图
  • 公司 网站 苏州链接下载
  • 网站页面设计素材网站做权重的方法
  • 网站优化标题怎么做宿迁房产网备案查询
  • 建设企业官方网站的流程秦皇岛网站备案
  • 北京网站优化前景建设银行包头分行网站
  • 南京江宁区住房建设局网站电商交流平台有哪些
  • 查询网站流量排名做网站 我们的工人怎么写
  • 龙岗-网站建设深圳信科免备案的网站空间
  • 360网站推广官网软件安徽海外网络推广
  • c# asp.net网站开发书考试网站怎么做的
  • 网站开发 技术路线融资融券配资网站建设
  • 建设网站如国家高新技术企业证书
  • 网站服务是什么网站建设投标书报价表