This post shows how to use Stm32f7 - Disco board as a usb mouse.
Please view this post to configure HID usb device .Do the same to generate code. After generate code :
In /../Middlewares/ST/STM32_USB_Device_Library/Class/HID/Src
edit file usbd_hid.c
................................
__ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_END =
{
0x09, /* bLength: Configuration Descriptor size */
USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */
USB_HID_CONFIG_DESC_SIZ,
/* wTotalLength: Bytes returned */
0x00,
0x01, /*bNumInterfaces: 1 interface*/
0x01, /*bConfigurationValue: Configuration value*/
0x00, /*iConfiguration: Index of string descriptor describing
the configuration*/
0xE0, /*bmAttributes: bus powered and Support Remote Wake-up */
0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/
/************** Descriptor of Joystick Mouse interface ****************/
/* 09 */
0x09, /*bLength: Interface Descriptor size*/
USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/
0x00, /*bInterfaceNumber: Number of Interface*/
0x00, /*bAlternateSetting: Alternate setting*/
0x01, /*bNumEndpoints*/
0x03, /*bInterfaceClass: HID*/
0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
0x02, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
0, /*iInterface: Index of string descriptor*/
/******************** Descriptor of Joystick Mouse HID ********************/
/* 18 */
0x09, /*bLength: HID Descriptor size*/
HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
0x11, /*bcdHID: HID Class Spec release number*/
0x01,
0x00, /*bCountryCode: Hardware target country*/
0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/
0x22, /*bDescriptorType*/
HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/
0x00,
/******************** Descriptor of Mouse endpoint ********************/
/* 27 */
0x07, /*bLength: Endpoint Descriptor size*/
USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/
HID_EPIN_ADDR, /*bEndpointAddress: Endpoint Address (IN)*/
0x03, /*bmAttributes: Interrupt endpoint*/
HID_EPIN_SIZE, /*wMaxPacketSize: 4 Byte max */
0x00,
HID_FS_BINTERVAL, /*bInterval: Polling Interval (10 ms)*/
/* 34 */
} ;
................................
__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END =
{
0x05, 0x01,
0x09, 0x02,
0xA1, 0x01,
0x09, 0x01,
0xA1, 0x00,
0x05, 0x09,
0x19, 0x01,
0x29, 0x03,
0x15, 0x00,
0x25, 0x01,
0x95, 0x03,
0x75, 0x01,
0x81, 0x02,
0x95, 0x01,
0x75, 0x05,
0x81, 0x01,
0x05, 0x01,
0x09, 0x30,
0x09, 0x31,
0x09, 0x38,
0x15, 0x81,
0x25, 0x7F,
0x75, 0x08,
0x95, 0x03,
0x81, 0x06,
0xC0, 0x09,
0x3c, 0x05,
0xff, 0x09,
0x01, 0x15,
0x00, 0x25,
0x01, 0x75,
0x01, 0x95,
0x02, 0xb1,
0x22, 0x75,
0x06, 0x95,
0x01, 0xb1,
0x01, 0xc0
};
And in Src/main.c add
#include "stm32f7xx_hal.h"
#include "usb_device.h"
#include "usbd_hid.h"
#include <string.h>
#include "stm32f7xx_hal_uart.h"
#include "stm32f7xx_hal_sdram.h"
#include "stm32f7xx_hal_ltdc.h"
#include "stm32746g_discovery.h"
#include "stm32746g_discovery_ts.h"
#include "stm32746g_discovery_lcd.h"
#include "stm32746g_discovery_sdram.h"
#include "stm32f7xx_ll_fmc.h"
#include "stdio.h"
#include <stdbool.h>
void SystemClock_Config(void);
void Error_Handler(void);
static void MX_GPIO_Init(void);
TS_StateTypeDef TS_State;
extern USBD_HandleTypeDef hUsbDeviceHS;
uint8_t buffer[4];
int main(void)
{
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USB_DEVICE_Init();
BSP_LCD_Init();
BSP_LED_Init(LED1);
BSP_LCD_LayerDefaultInit(0, LCD_FB_START_ADDRESS);
BSP_LCD_LayerDefaultInit(1, LCD_FB_START_ADDRESS+(BSP_LCD_GetXSize()*BSP_LCD_GetYSize()*4));
BSP_LCD_DisplayOn();
BSP_LCD_SelectLayer(0);
BSP_LCD_Clear(LCD_COLOR_BLACK);
BSP_LCD_SelectLayer(1);
BSP_LCD_Clear(LCD_COLOR_BLACK);
BSP_LCD_SetFont(&LCD_DEFAULT_FONT);
BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE);
BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
if( BSP_TS_Init(BSP_LCD_GetXSize(), BSP_LCD_GetYSize())!=TS_OK){
Error_Handler();
}
buffer[0]=0x00;
buffer[1]=0x00;
buffer[2]=0x00;
buffer[3]=0x00;
USBD_HID_SendReport(&hUsbDeviceHS,buffer,sizeof(buffer));
BSP_LCD_Clear(LCD_COLOR_WHITE);
BSP_LCD_DrawRect(130, 40, 200, 120);
BSP_LCD_DrawRect(130, 180, 100, 60);
BSP_LCD_DrawRect(230, 180, 100, 60);
BSP_LCD_DrawRect(360, 40, 30, 120);
int x_touch,y_touch,pre_x_touch,pre_y_touch;
//bool mouse_ok=true;
int mouse_ok=0;
BSP_LED_On(LED1);
while (1)
{
BSP_TS_GetState(&TS_State);
if (TS_State.touchDetected==1) {
x_touch=TS_State.touchX[0];
y_touch=TS_State.touchY[0];
if(mouse_ok==0){
pre_x_touch=x_touch;
pre_y_touch=y_touch;
}
else if(mouse_ok==1){
if((x_touch>130&&x_touch<330)&&(y_touch>40&&y_touch<160)){
buffer[1]=3*(x_touch-pre_x_touch);
buffer[2]=3*(y_touch-pre_y_touch);
}
else if((x_touch>130&&x_touch<230)&&(y_touch>180&&y_touch<240)){
buffer[0]=0x01;
BSP_LED_Off(LED1);
}
else if((x_touch>230&&x_touch<330)&&(y_touch>180&&y_touch<240)){
buffer[0]=0x02;
}
else if((x_touch>360&&x_touch<400)&&(y_touch>40&&y_touch<160)){
buffer[3]=(int)((y_touch-pre_y_touch)/4);
}
USBD_HID_SendReport(&hUsbDeviceHS,buffer,sizeof(buffer));
}
mouse_ok=1;
pre_x_touch=x_touch;
pre_y_touch=y_touch;
}
else if(TS_State.touchDetected==0){
mouse_ok=0;
BSP_LED_On(LED1);
}
USBD_HID_SendReport(&hUsbDeviceHS,buffer,sizeof(buffer));
HAL_Delay(40);
buffer[0]=0x00;
buffer[1]=0x00;
buffer[2]=0x00;
buffer[3]=0x00;
}
/* USER CODE END 3 */
}
-----------------------------------------------------------------------------------------------
Please view this post to configure HID usb device .Do the same to generate code. After generate code :
In /../Middlewares/ST/STM32_USB_Device_Library/Class/HID/Src
edit file usbd_hid.c
................................
__ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_END =
{
0x09, /* bLength: Configuration Descriptor size */
USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */
USB_HID_CONFIG_DESC_SIZ,
/* wTotalLength: Bytes returned */
0x00,
0x01, /*bNumInterfaces: 1 interface*/
0x01, /*bConfigurationValue: Configuration value*/
0x00, /*iConfiguration: Index of string descriptor describing
the configuration*/
0xE0, /*bmAttributes: bus powered and Support Remote Wake-up */
0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/
/************** Descriptor of Joystick Mouse interface ****************/
/* 09 */
0x09, /*bLength: Interface Descriptor size*/
USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/
0x00, /*bInterfaceNumber: Number of Interface*/
0x00, /*bAlternateSetting: Alternate setting*/
0x01, /*bNumEndpoints*/
0x03, /*bInterfaceClass: HID*/
0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
0x02, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
0, /*iInterface: Index of string descriptor*/
/******************** Descriptor of Joystick Mouse HID ********************/
/* 18 */
0x09, /*bLength: HID Descriptor size*/
HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
0x11, /*bcdHID: HID Class Spec release number*/
0x01,
0x00, /*bCountryCode: Hardware target country*/
0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/
0x22, /*bDescriptorType*/
HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/
0x00,
/******************** Descriptor of Mouse endpoint ********************/
/* 27 */
0x07, /*bLength: Endpoint Descriptor size*/
USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/
HID_EPIN_ADDR, /*bEndpointAddress: Endpoint Address (IN)*/
0x03, /*bmAttributes: Interrupt endpoint*/
HID_EPIN_SIZE, /*wMaxPacketSize: 4 Byte max */
0x00,
HID_FS_BINTERVAL, /*bInterval: Polling Interval (10 ms)*/
/* 34 */
} ;
................................
__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END =
{
0x05, 0x01,
0x09, 0x02,
0xA1, 0x01,
0x09, 0x01,
0xA1, 0x00,
0x05, 0x09,
0x19, 0x01,
0x29, 0x03,
0x15, 0x00,
0x25, 0x01,
0x95, 0x03,
0x75, 0x01,
0x81, 0x02,
0x95, 0x01,
0x75, 0x05,
0x81, 0x01,
0x05, 0x01,
0x09, 0x30,
0x09, 0x31,
0x09, 0x38,
0x15, 0x81,
0x25, 0x7F,
0x75, 0x08,
0x95, 0x03,
0x81, 0x06,
0xC0, 0x09,
0x3c, 0x05,
0xff, 0x09,
0x01, 0x15,
0x00, 0x25,
0x01, 0x75,
0x01, 0x95,
0x02, 0xb1,
0x22, 0x75,
0x06, 0x95,
0x01, 0xb1,
0x01, 0xc0
};
And in Src/main.c add
#include "stm32f7xx_hal.h"
#include "usb_device.h"
#include "usbd_hid.h"
#include <string.h>
#include "stm32f7xx_hal_uart.h"
#include "stm32f7xx_hal_sdram.h"
#include "stm32f7xx_hal_ltdc.h"
#include "stm32746g_discovery.h"
#include "stm32746g_discovery_ts.h"
#include "stm32746g_discovery_lcd.h"
#include "stm32746g_discovery_sdram.h"
#include "stm32f7xx_ll_fmc.h"
#include "stdio.h"
#include <stdbool.h>
void SystemClock_Config(void);
void Error_Handler(void);
static void MX_GPIO_Init(void);
TS_StateTypeDef TS_State;
extern USBD_HandleTypeDef hUsbDeviceHS;
uint8_t buffer[4];
int main(void)
{
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USB_DEVICE_Init();
BSP_LCD_Init();
BSP_LED_Init(LED1);
BSP_LCD_LayerDefaultInit(0, LCD_FB_START_ADDRESS);
BSP_LCD_LayerDefaultInit(1, LCD_FB_START_ADDRESS+(BSP_LCD_GetXSize()*BSP_LCD_GetYSize()*4));
BSP_LCD_DisplayOn();
BSP_LCD_SelectLayer(0);
BSP_LCD_Clear(LCD_COLOR_BLACK);
BSP_LCD_SelectLayer(1);
BSP_LCD_Clear(LCD_COLOR_BLACK);
BSP_LCD_SetFont(&LCD_DEFAULT_FONT);
BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE);
BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
if( BSP_TS_Init(BSP_LCD_GetXSize(), BSP_LCD_GetYSize())!=TS_OK){
Error_Handler();
}
buffer[0]=0x00;
buffer[1]=0x00;
buffer[2]=0x00;
buffer[3]=0x00;
USBD_HID_SendReport(&hUsbDeviceHS,buffer,sizeof(buffer));
BSP_LCD_Clear(LCD_COLOR_WHITE);
BSP_LCD_DrawRect(130, 40, 200, 120);
BSP_LCD_DrawRect(130, 180, 100, 60);
BSP_LCD_DrawRect(230, 180, 100, 60);
BSP_LCD_DrawRect(360, 40, 30, 120);
int x_touch,y_touch,pre_x_touch,pre_y_touch;
//bool mouse_ok=true;
int mouse_ok=0;
BSP_LED_On(LED1);
while (1)
{
BSP_TS_GetState(&TS_State);
if (TS_State.touchDetected==1) {
x_touch=TS_State.touchX[0];
y_touch=TS_State.touchY[0];
if(mouse_ok==0){
pre_x_touch=x_touch;
pre_y_touch=y_touch;
}
else if(mouse_ok==1){
if((x_touch>130&&x_touch<330)&&(y_touch>40&&y_touch<160)){
buffer[1]=3*(x_touch-pre_x_touch);
buffer[2]=3*(y_touch-pre_y_touch);
}
else if((x_touch>130&&x_touch<230)&&(y_touch>180&&y_touch<240)){
buffer[0]=0x01;
BSP_LED_Off(LED1);
}
else if((x_touch>230&&x_touch<330)&&(y_touch>180&&y_touch<240)){
buffer[0]=0x02;
}
else if((x_touch>360&&x_touch<400)&&(y_touch>40&&y_touch<160)){
buffer[3]=(int)((y_touch-pre_y_touch)/4);
}
USBD_HID_SendReport(&hUsbDeviceHS,buffer,sizeof(buffer));
}
mouse_ok=1;
pre_x_touch=x_touch;
pre_y_touch=y_touch;
}
else if(TS_State.touchDetected==0){
mouse_ok=0;
BSP_LED_On(LED1);
}
USBD_HID_SendReport(&hUsbDeviceHS,buffer,sizeof(buffer));
HAL_Delay(40);
buffer[0]=0x00;
buffer[1]=0x00;
buffer[2]=0x00;
buffer[3]=0x00;
}
/* USER CODE END 3 */
}
-----------------------------------------------------------------------------------------------
chào bạn...cho mình hỏi lúc mình generate code về keil v5 rồi sửa giống code của bạn trong main.c nó báo lỗi ở dòng include uart vậy bạn...giúp mình với!!
Trả lờiXóaoh, ở Việt Nam cũng đang nghiên cứu cái này ah, đây là cu em mình học bên Nhật viết, có gì e mình sẽ sớm trả lời bạn nhé
XóaEm đang là sinh viên...có sử dụng kit này...mong a trả lời sớm giúp e...cảm ơn rất nhiều!
Xóathế ah, anh thì ko biết gì về cái này, thằng em anh thì nó đang về việt nam, tháng sau sang chắc mới có time được, em thử mày mò trước xem- hi
XóaVậy không liên lạc được hả anh...giúp e với...tại e đang làm đồ án môn học...cần gấp...:((
Trả lờiXóacó đấy em ạ- để anh xem xem số nó đang dùng là số nào, hoặc em gửi email vào ngobachduong@gmail.com xem nhé
Xóamail này là của bạn ấy đúng ko anh??..để em gửi email qua thử....có gì giúp em với nhé!!..cảm ơn anh rất nhiều!
Xóamail này là của bạn ấy đúng ko anh??..để em gửi email qua thử....có gì giúp em với nhé!!..cảm ơn anh rất nhiều!
Xóa