0

关于投票
STM32 的 USB_MOUSE例子详解及改造(用KEIL MDK在EK-STM32)

这个例子是用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

比较简单.

系统分类: ARM
用户分类: STM32
标签: STM32 USB KEIL
来源: 原创
发表评论 阅读全文(278) | 回复(0)

0

关于投票
EKSTM32+Keil MDK +串口ISP来学习STM32

EKSTM32的板子一般是用IAR来编译调试的,因为板上集成的STLINK2被IAR支持,但是我个人认为IAR的工程管理不太好,各种源文件,头文件在Wokeplace的位置让初学者摸不着头脑,还不如用KEIL,环境跟以前单片机的差不多.缺点是不能用STLINK2的USB调试了,但是我们可以回到单片机的ISP方式下来烧写.
以后自己做STM32 的板子,没钱的话也买不起独立的STLINK2,还是从串口IAP实惠,不要钱

需要的硬件是EK-STM32F,软件用KEIL的Uvision3 从KEIL的中文网站上下载,还有几个EK-STM32例子,

可以一并下载.烧写软件用ST的官方烧写FLSH软件 STMicroelectronics flash loader.exe,600K大

小,可以从ST中文网站或者万利的网站下载.

 

以KEIL的UART-DEMO为例:
首先打开KEIL,project--open project打开uvision3格式的UART的DEMO工程,选择project下的

building或者按F7键就可以编译,生成的HEX文件在工程保存目录的output文件夹.
板子先把BOOT0跳线接1, BOOT1接0,(BOOT选择是在液晶的左边)这样STM32 芯片就可以从内部一个特

殊的FLASH启动,所谓的SSTEM FLASH,专门用来从串口1接受PC的数据,然后写到STM32 用户FLASH.


板子上电  ,打开 STMicroelectronics flash loader,点击NEXT,(串口不用设置,默认设置,STM32会自自动识别波特率)选择Download,并打开刚才生成的HEX 文件(这个FLASHLOADER默认打开BIN,在选择HEX文件时要把打开文件的格式选为HEX才能看见HEX文件),再点击NEXT,很快就烧完了.
烧完后断电,把BOOT0改成1,上电后就可以从用户FLASH启动,这里面的内容就是刚才烧进去的.
如果没有问题,运行这个例子的结果是  液晶上显示PASS.
祝大家好运,我懒得传设置的图片了.

工程在这:点击下载

系统分类: ARM
用户分类: STM32
标签: 用KEIL开发STM32
来源: 原创
发表评论 阅读全文(248) | 回复(0)
总共 , 当前 /