STM32学习笔记USB HID
―――序
在keilc安装目录下C:\Keil\ARM\Boards\Keil\MCBSTM32\下USBHID文件夹为STM32 USB HID操作例子。
将USBHID复制到用户目录下,进行改动就能运行STM32的USB HID程序。
在USB协议中,数据线的上下拉电阻为USB启动信号。试验板USB电路如下图:
<!--[if !vml]-->
<!--[endif]-->
可以看出,上电复位后,由于对PD2无操作,则USB的数据线D+上拉电阻没有使能。在USB则处于空闲。如果要连接USB设备,只需要将PD使能三极管导通,则能让USB主机检测到本USB设备。所以在USB连接函数中改动:
void USB_Connect (BOOL con) {
//==============================================================
GPIO_InitTypeDef m_GPIO_InitTypeDef;
m_GPIO_InitTypeDef.GPIO_Pin = GPIO_Pin_2;
m_GPIO_InitTypeDef.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
m_GPIO_InitTypeDef.GPIO_Speed = GPIO_Speed_2MHz;//速度2M
GPIO_Init(GPIOD,&m_GPIO_InitTypeDef);
//===============================================================
//让usb处于复位状态,让USB模拟电路准备
CNTR = CNTR_FRES; /* Force USB Reset */
ISTR = 0; /* Clear Interrupt Status */
if (con) //:连接USB
{//清除USB复位信号,向USB主机发送"恢复请求",并且使能复位中断请求
//则当USB主机向本机发送“恢复请求”后,相应中断,并调用USB_Reset函数.
//说明:如果此操作在1-15ms有效,USB主机将对USB模块发出"唤醒操作"
CNTR = CNTR_RESETM; /* USB Reset Interrupt Mask */
GPIO_SetBits(GPIOD,GPIO_Pin_2);//PD2=1:连接USB
}
else //:断开USB
{//清除USB复位信号,关闭USB电源
CNTR = CNTR_FRES | CNTR_PDWN; /* Switch Off USB Device */
GPIO_ResetBits(GPIOD,GPIO_Pin_2);//PD2=0,不连接USB设备
}
}
至此,程序编译连接,烧写到STM32,程序运行。
可以从我的电脑,设备管理器看到HID-compliant device为USB HID设备。
USB连接测试等,因为USB HID协议,主机32ms(HID协议可以设置ms) GetInReport。则在GetInReport函数中加了USB连接测试灯,当连接成功。USB测试灯一闪一闪
void GetInReport (void)
{
static unsigned int i="0";
InReport = 0x00;
if ((GPIOA->IDR & S2) == 0) InReport |= 0x01; // S2 pressed means 0
if ((GPIOC->IDR & S3) == 0) InReport |= 0x02; // S3 pressed means 0
InReport = GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0);//读取按键值返回
i++;
if(i%10==0)
{
GPIOC->ODR = GPIOC->ODR ^ 0x0200;//每隔640ms亮灭一次。32ms×10 × 2
}
}
测试源文件
用户139848 2011-10-25 21:42
pentral0311_880012608 2011-7-6 10:40
用户399772 2009-12-18 13:51
用户1494767 2009-5-19 21:40
tengjingshu_112148725 2009-5-19 08:59