原创 STM32 的 USB_MOUSE例子详解及改造(用KEIL MDK在EK-STM32)

2008-5-10 15:03 6301 8 9 分类: MCU/ 嵌入式

这个例子是用EK的板子上的KEY4实现一个鼠标,不需要自己编USB驱动,因为使用标准的HID


用KEIL打开那个USB例子的工程,在main.c:
 while (1)
  {
    Delay(10000);
    if (JoyState() != 0)
    {
      Joystick_Send(JoyState());
    }
  }
可以看到 主程序不断循环检测按键,一旦有键按下,就通过USB发送到PC.
这里说明一下,鼠标发送的有用数据是4个字节,0字节的bit0表示鼠标左键单击,bit1是右键
  1字节是X位置,2字节是Y位置,3号字节我没弄清除
然后打开hw_config.h和hw_config.c这两个是硬件配置,主要是按键


.
检测.
在.h开始加上
#define DOWN            1
#define LEFT            2
#define RIGHT           3
#define UP              4
#define SEL    7
#define CURSOR_STEP     5   //原来的版本是30 ,被我改成5 这样每次移动时鼠标更准确
#define LEFT_CLICK       8  //这两个是我加的 ,把板子上的KEY2和KEY3作为左键和右键
#define RIGHT_CLICK      9
相应的.c文件也有改动
u8 JoyState(void)
{
  ......前面4个按键检测我这里省略不写了,我没有改动,下面是我添的
  if (!GPIO_ReadInputDataBit(GPIOD, JOY_SEL))
  {
    return SEL;
  }
  if (!GPIO_ReadInputDataBit(GPIOD, MISE_LEFT))
  {
    return LEFT_CLICK;
  }
  if (!GPIO_ReadInputDataBit(GPIOD, MISE_RIGHT))
  {
    return  RIGHT_CLICK;
  }


  /* No key is pressed */
  else
  {
    return 0;
  }
}
在USB发送函数,我也添加了几条如下:
void Joystick_Send(u8 Keys)
{
  u8 Mouse_Buffer[4] = {0, 0, 0, 0};
  s8 X = 0, Y = 0;
  //u8 Sel_flag=0;
  switch (Keys)
  {
    case LEFT:
      X -= CURSOR_STEP;  //左键按下, 以下类似
      break;
    case RIGHT:


      X += CURSOR_STEP;
      break;
    case UP:
      Y -= CURSOR_STEP;
      break;
    case DOWN:
      Y += CURSOR_STEP;
    case  SEL:
 //  Sel_flag=1;
   break;
//鼠标发送的有用数据是4个字节,0字节的bit0表示鼠标左键单击,bit1是右键
    case  LEFT_CLICK:
   Mouse_Buffer[0] =0x01; //上面说了,鼠标发送的4个字节的0号字节有左右键信息.
      break;
    case  RIGHT_CLICK:
      Mouse_Buffer[0]=0x02;
      break;
    default:
      return;
  }


  /* prepare buffer to send */
  Mouse_Buffer[1] = X;
  Mouse_Buffer[2] = Y;
 
  /*copy mouse position info in ENDP1 Tx Packet Memory Area*/
  UserToPMABufferCopy(Mouse_Buffer, GetEPTxAddr(ENDP1), 4);
  /* enable endpoint for transmission */
  SetEPTxValid(ENDP1);
}


上面先根据按键的信息确定XY坐标,任何左右键信息然后调用:
UserToPMABufferCopy(Mouse_Buffer, GetEPTxAddr(ENDP1), 4);把4个字节
通过USB发送出去,UserToPMABufferCopy()是USB库的底层驱动
好了,程序写完了,我们先保存再F7一下生成HEX.再把板子的BOOT0跳线设为1,BOOT1为0
然后用ST的串口ISP软件烧进STM32去.断电后再把BOOT0设为0.
USB插到板子右边那个USB口,USBEN跳线接到0.过几秒钟,左右按动KEY4,电脑上的鼠标点击标志
是不是移动了,如果是,恭喜你,你成功了,要没动的话,可以断电后再试一次.(检查跳线,USBEN应为0)
工程的说明文档Readme.TXT建议说最好先运行STM32 再插USB线,你可以通过2根USB线来实现,
先插上板子左边那个USB,供电跳线选STLINK2,过一段实践后插右边的USB口,这样被PC识别率会高.



在IAR的例子上,其实是一样的,IAR例子用SELEC来实现单击,有EK板子的可以试试.这个例子对于学USB


比较简单.

文章评论1条评论)

登录后参与讨论

用户1323085 2010-4-26 23:53

怪事 怎么我也是这样改的 就是有问题 左右键有时候总出问题
相关推荐阅读
用户1407470 2012-11-04 15:12
MEGa128驱动ENC28J60
ENC28J60调试心得: (1)网线要通,建议两根直连网线,将ENC28j60模块、MEGA128各自分别接到路由器,使用前确保网线是好的。不建议使用交叉网线将模块直接连电脑,我先这样没调通...
用户1407470 2012-11-04 15:05
MEGA128驱动超声波测距模块US-100
AVRstudio6下写的,IDE自带GCC。使用Timer1的输入捕获,晶振8M.   #include <stdio.h> #define F_CPU 8000000...
用户1407470 2012-11-03 21:47
MEGa128驱动ENC28J60
MEGa128驱动ENC28J60  ...
用户1407470 2012-11-03 21:47
MEGa128驱动ENC28J60
MEGa128驱动ENC28J60  ...
用户1407470 2009-07-17 21:06
把我的AT91SAM7X256转CAN开源了
https://static.assets-stash.eet-china.com/album/old-resources/2009/7/17/4dc7a64c-c7ff-4d73-a706-d410...
用户1407470 2008-07-28 21:43
万利板子上创建SD卡的FAT文件系统(一)
万利的板子上创建SD卡文件系统 (一)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />...
我要评论
1
8
关闭 站长推荐上一条 /2 下一条