본문 바로가기

공부/STM32F1

18.[stm32f103][hal]USB HID 마우스

728x90
반응형

1. STM32CubeMX 설정

 

 

 

 

 

 

PA1 Output 설정한 이유는 

제가 쓰는 JK 에서 구매한 Dragonboard 에서의 회로도에서 PA1으로 ON/OFF 하는 기능이 추가 되어 있어서

이걸 High 시켜줘야 USB 가 작동 됩니다.

보통은 그냥 PA11 PA12만 연결하면 됩니다.

이렇게 연결하신 분들은 PA1 설정 안하셔도 됩니다.

 

 

 

2. main.c

#include "main.h"

#include "stm32f1xx_hal.h"

#include "usb_device.h"



/* USER CODE BEGIN Includes */



/* USER CODE END Includes */



/* Private variables ---------------------------------------------------------*/

UART_HandleTypeDef huart1;



/* USER CODE BEGIN PV */

/* Private variables ---------------------------------------------------------*/



/* USER CODE END PV */



/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_USART1_UART_Init(void);



/* USER CODE BEGIN PFP */

/* Private function prototypes -----------------------------------------------*/

static void GetPointerData(uint8_t *pbuf);

/* USER CODE END PFP */



/* USER CODE BEGIN 0 */

int fputc(int ch, FILE *f)

{

    uint8_t temp[1]={ch};

    HAL_UART_Transmit(&huart1, temp, 1, 2);

  return(ch);

}

/* USER CODE END 0 */



int main(void)

{



  /* USER CODE BEGIN 1 */

  uint8_t HID_Buffer[4];

  /* USER CODE END 1 */



  /* MCU Configuration----------------------------------------------------------*/



  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();



  /* USER CODE BEGIN Init */



  /* USER CODE END Init */



  /* Configure the system clock */

  SystemClock_Config();



  /* USER CODE BEGIN SysInit */



  /* USER CODE END SysInit */



  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_USB_DEVICE_Init();

  MX_USART1_UART_Init();



  /* USER CODE BEGIN 2 */

  HAL_StatusTypeDef R_stat;

  uint8_t UsartData[1];

  GetPointerData(HID_Buffer);          

        

  printf("rs232 test\r\n");

  /* USER CODE END 2 */

  

  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

  /* USER CODE END WHILE */

    R_stat = HAL_UART_Receive(&huart1,UsartData,1,5000);

    if(R_stat == HAL_OK){      

      printf("%c\r\n",UsartData[0]);

      if(UsartData[0]=='u'){

        HID_Buffer[1]=0;

        HID_Buffer[2]=-100;

        USBD_HID_SendReport(&hUsbDeviceFS, HID_Buffer, 4);

      }

      else if(UsartData[0]=='m'){

        HID_Buffer[1]=0;

        HID_Buffer[2]=100;

        USBD_HID_SendReport(&hUsbDeviceFS, HID_Buffer, 4);

      }

      else if(UsartData[0]=='h'){

        HID_Buffer[1]=-100;

        HID_Buffer[2]=0;

        USBD_HID_SendReport(&hUsbDeviceFS, HID_Buffer, 4);

      }

      else if(UsartData[0]=='k'){

        HID_Buffer[1]=100;

        HID_Buffer[2]=0;

        USBD_HID_SendReport(&hUsbDeviceFS, HID_Buffer, 4);

      }

      

    }

    /* USER CODE BEGIN 3 */



  }

  /* USER CODE END 3 */



}



/** System Clock Configuration

*/

void SystemClock_Config(void)

{



  RCC_OscInitTypeDef RCC_OscInitStruct;

  RCC_ClkInitTypeDef RCC_ClkInitStruct;

  RCC_PeriphCLKInitTypeDef PeriphClkInit;



    /**Initializes the CPU, AHB and APB busses clocks 

    */

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;

  RCC_OscInitStruct.HSEState = RCC_HSE_ON;

  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;

  RCC_OscInitStruct.HSIState = RCC_HSI_ON;

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }



    /**Initializes the CPU, AHB and APB busses clocks 

    */

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;

  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;



  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }



  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB;

  PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5;

  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }



    /**Configure the Systick interrupt time 

    */

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);



    /**Configure the Systick 

    */

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);



  /* SysTick_IRQn interrupt configuration */

  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

}



/* USART1 init function */

static void MX_USART1_UART_Init(void)

{



  huart1.Instance = USART1;

  huart1.Init.BaudRate = 115200;

  huart1.Init.WordLength = UART_WORDLENGTH_8B;

  huart1.Init.StopBits = UART_STOPBITS_1;

  huart1.Init.Parity = UART_PARITY_NONE;

  huart1.Init.Mode = UART_MODE_TX_RX;

  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

  huart1.Init.OverSampling = UART_OVERSAMPLING_16;

  if (HAL_UART_Init(&huart1) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }



}



/** Configure pins as 

        * Analog 

        * Input 

        * Output

        * EVENT_OUT

        * EXTI

*/

static void MX_GPIO_Init(void)

{



  GPIO_InitTypeDef GPIO_InitStruct;



  /* GPIO Ports Clock Enable */

  __HAL_RCC_GPIOA_CLK_ENABLE();



  /*Configure GPIO pin Output Level */

  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);



  /*Configure GPIO pin : PA1 */

  GPIO_InitStruct.Pin = GPIO_PIN_1;

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);



}



/* USER CODE BEGIN 4 */

static void GetPointerData(uint8_t *pbuf)

{

  //static int8_t cnt = 0;

  int8_t  x = 0, y = 0 ;

 

  

  pbuf[0] = 0;

  pbuf[1] = x;

  pbuf[2] = y;

  pbuf[3] = 0;

}

/* USER CODE END 4 */



/**

  * @brief  This function is executed in case of error occurrence.

  * @param  None

  * @retval None

  */

void _Error_Handler(char * file, int line)

{

  /* USER CODE BEGIN Error_Handler_Debug */

  /* User can add his own implementation to report the HAL error return state */

  while(1) 

  {

  }

  /* USER CODE END Error_Handler_Debug */ 

}



#ifdef USE_FULL_ASSERT



/**

   * @brief Reports the name of the source file and the source line number

   * where the assert_param error has occurred.

   * @param file: pointer to the source file name

   * @param line: assert_param error line source number

   * @retval None

   */

void assert_failed(uint8_t* file, uint32_t line)

{

  /* USER CODE BEGIN 6 */

  /* User can add his own implementation to report the file name and line number,

    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* USER CODE END 6 */



}



#endif



/**

  * @}

  */ 



/**

  * @}

*/ 



/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

static void GetPointerData(uint8_t *pbuf);

=함수 선언

 

int fputc(int ch, FILE *f)

{

    uint8_t temp[1]={ch};

    HAL_UART_Transmit(&huart1, temp, 1, 2);

  return(ch);

}

=printf 함수를 쓰기 위한 코드

 

 uint8_t HID_Buffer[4];

=usb 초기값 받기 위한 변수

 

  HAL_StatusTypeDef R_stat;

=통신 rx 상태 구조체

  uint8_t UsartData[1];

=통신 값 받기 아스키코드 

  GetPointerData(HID_Buffer);          

=버퍼에 초기값 쓰기        

  printf("rs232 test\r\n");

=통신 TEST

 

static void GetPointerData(uint8_t *pbuf)

{

  //static int8_t cnt = 0;

  int8_t  x = 0, y = 0 ;

 

  

  pbuf[0] = 0; //1: 왼쪽 클릭 2: 오론쪽클릭

  pbuf[1] = x;

  pbuf[2] = y;

  pbuf[3] = 0;//휠

}

= 초기값 함수

 

3. 결과

정상적으로 작동 하게 되면

키보드에서 

u : 마우스 위로 이동

m : 마우스 아래로 이동

h : 마우스 왼쪽으로 이동

k :  마우스 오론쪽으로 이동 

 

 

728x90
반응형