1. 程式人生 > >STM32配置CH375B成HID Host模式讀取自定義HID裝置的資料 ——STM32埠初始化

STM32配置CH375B成HID Host模式讀取自定義HID裝置的資料 ——STM32埠初始化

  最近產品需要一個USB主機測試治具,所以需要做一個USB HOST去讀取HID裝置的資料,由於以前也沒做過USB方面的專案,對這一塊也不是很熟悉,因此遇到了很多困難,所幸的是經過兩天半的努力,最終完成了CH375B的除錯。得意不多廢話,先上一張我除錯的MCU管腳分配圖

  

標頭檔案

  1. #ifndef __BSP_INIT_H__
  2. #define __BSP_INIT_H__
  3. #include "stm32f0xx_hal.h"
  4. #include "config.h"
  5. typedefstruct
  6. {  
  7.     struct
  8.     {  
  9.         uint16_t USB_BaseTime;  
  10.         uint8_t  USB_Flag;  
  11.     }USB_Heart;  
  12. }Sys_Heart_Def;  
  13. typedefstruct
  14. {  
  15.     Sys_Heart_Def   Sys_Heart_Info;  
  16.     uint8_t         USB_Connect_Status;  
  17. }Sys_Param_Def;  
  18. extern Sys_Param_Def      SysParam_Info;  
  19. extern UART_HandleTypeDef HAL_CH375_USART;  
  20. void Error_Handler(void);  
  21. void Bsp_Peripherals_Init(void);  
  22. #endif


詳細的程式碼如下:

  1. #include "bsp_init.h"
  2. Sys_Param_Def      SysParam_Info;  
  3. /* Private variables ---------------------------------------------------------*/
  4. UART_HandleTypeDef HAL_CH375_USART;  
  5. void Bsp_SystemClock_Init(void)  
  6. {  
  7.   RCC_OscInitTypeDef RCC_OscInitStruct;  
  8.   RCC_ClkInitTypeDef RCC_ClkInitStruct;  
  9.   RCC_PeriphCLKInitTypeDef PeriphClkInit;  
  10.   /* Initializes the CPU, AHB and APB busses clocks */
  11.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;  
  12.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;  
  13.   RCC_OscInitStruct.HSICalibrationValue = 16;  
  14.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;  
  15.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;  
  16.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12;  
  17.   RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;  
  18.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)  
  19.   {  
  20.     Error_Handler();  
  21.   }  
  22.   /* Initializes the CPU, AHB and APB busses clocks */
  23.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK  
  24.                                 |RCC_CLOCKTYPE_PCLK1;  
  25.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;  
  26.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;  
  27.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;  
  28.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)  
  29.   {  
  30.     Error_Handler();  
  31.   }  
  32.   PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;  
  33.   PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;  
  34.   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)  
  35.   {  
  36.     Error_Handler();  
  37.   }  
  38.   /* Configure the Systick interrupt time */
  39.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);  
  40.   /* Configure the Systick */
  41.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);  
  42.   /* SysTick_IRQn interrupt configuration */
  43.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);  
  44. }  
  45. void Bsp_GPIO_Init(void)  
  46. {  
  47.   GPIO_InitTypeDef GPIO_InitStruct;  
  48.   /* GPIO Ports Clock Enable */
  49.   __HAL_RCC_GPIOC_CLK_ENABLE();  
  50.   __HAL_RCC_GPIOA_CLK_ENABLE();  
  51.   __HAL_RCC_GPIOB_CLK_ENABLE();  
  52.   /*Configure GPIO pin Output Level */
  53.   HAL_GPIO_WritePin(CH375_D0_GPIO_Port, CH375_D0_Pin, GPIO_PIN_SET);  
  54.   HAL_GPIO_WritePin(CH375_D1_GPIO_Port, CH375_D1_Pin, GPIO_PIN_SET);  
  55.   HAL_GPIO_WritePin(CH375_D2_GPIO_Port, CH375_D2_Pin, GPIO_PIN_SET);  
  56.   HAL_GPIO_WritePin(CH375_D3_GPIO_Port, CH375_D3_Pin, GPIO_PIN_SET);  
  57.   HAL_GPIO_WritePin(CH375_D4_GPIO_Port, CH375_D4_Pin, GPIO_PIN_SET);  
  58.   HAL_GPIO_WritePin(CH375_D5_GPIO_Port, CH375_D5_Pin, GPIO_PIN_SET);  
  59.   HAL_GPIO_WritePin(CH375_D6_GPIO_Port, CH375_D6_Pin, GPIO_PIN_SET);  
  60.   HAL_GPIO_WritePin(CH375_D7_GPIO_Port, CH375_D7_Pin, GPIO_PIN_SET);  
  61.   /*Configure GPIO pin Output Level */
  62.   HAL_GPIO_WritePin(CH375_WR_GPIO_Port, CH375_WR_Pin, GPIO_PIN_SET);  
  63.   HAL_GPIO_WritePin(CH375_RD_GPIO_Port, CH375_RD_Pin, GPIO_PIN_SET);  
  64.   HAL_GPIO_WritePin(CH375_CS_GPIO_Port, CH375_CS_Pin, GPIO_PIN_SET);  
  65.   HAL_GPIO_WritePin(CH375_A0_GPIO_Port, CH375_A0_Pin, GPIO_PIN_SET);      
  66.   /*Configure GPIO pin : CH375_INT_Pin */
  67.   GPIO_InitStruct.Pin = CH375_INT_Pin;  
  68.   GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;  
  69.   GPIO_InitStruct.Pull = GPIO_PULLUP;  
  70.   HAL_GPIO_Init(CH375_INT_GPIO_Port, &GPIO_InitStruct);  
  71.   /*Configure GPIO pins : CH375_D0_Pin CH375_D1_Pin CH375_D2_Pin CH375_D3_Pin  
  72.                            CH375_D4_Pin CH375_D5_Pin CH375_D6_Pin CH375_D7_Pin */
  73.   GPIO_InitStruct.Pin = CH375_D0_Pin;  
  74.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;  
  75.   GPIO_InitStruct.Pull = GPIO_NOPULL;  
  76.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;  
  77.   HAL_GPIO_Init(CH375_D0_GPIO_Port, &GPIO_InitStruct);    
  78.   GPIO_InitStruct.Pin = CH375_D1_Pin;  
  79.   HAL_GPIO_Init(CH375_D1_GPIO_Port, &GPIO_InitStruct);  
  80.   GPIO_InitStruct.Pin = CH375_D2_Pin;  
  81.   HAL_GPIO_Init(CH375_D2_GPIO_Port, &GPIO_InitStruct);  
  82.   GPIO_InitStruct.Pin = CH375_D3_Pin;  
  83.   HAL_GPIO_Init(CH375_D3_GPIO_Port, &GPIO_InitStruct);  
  84.   GPIO_InitStruct.Pin = CH375_D4_Pin;  
  85.   HAL_GPIO_Init(CH375_D4_GPIO_Port, &GPIO_InitStruct);  
  86.   GPIO_InitStruct.Pin = CH375_D5_Pin;  
  87.   HAL_GPIO_Init(CH375_D5_GPIO_Port, &GPIO_InitStruct);  
  88.   GPIO_InitStruct.Pin = CH375_D6_Pin;  
  89.   HAL_GPIO_Init(CH375_D6_GPIO_Port, &GPIO_InitStruct);  
  90.   GPIO_InitStruct.Pin = CH375_D7_Pin;  
  91.   HAL_GPIO_Init(CH375_D7_GPIO_Port, &GPIO_InitStruct);  
  92.   /*Configure GPIO pins : CH375_WR_Pin CH375_RD_Pin CH375_CS_Pin CH375_A0_Pin */
  93.   GPIO_InitStruct.Pin = CH375_WR_Pin;  
  94.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;  
  95.   GPIO_InitStruct.Pull = GPIO_NOPULL;  
  96.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;  
  97.   HAL_GPIO_Init(CH375_WR_GPIO_Port, &GPIO_InitStruct);  
  98.   GPIO_InitStruct.Pin = CH375_RD_Pin;  
  99.   HAL_GPIO_Init(CH375_RD_GPIO_Port, &GPIO_InitStruct);  
  100.   GPIO_InitStruct.Pin = CH375_CS_Pin;  
  101.   HAL_GPIO_Init(CH375_CS_GPIO_Port, &GPIO_InitStruct);  
  102.   GPIO_InitStruct.Pin = CH375_A0_Pin;  
  103.   HAL_GPIO_Init(CH375_A0_GPIO_Port, &GPIO_InitStruct);  
  104.   HAL_NVIC_SetPriority(EXTI4_15_IRQn,0,0);  
  105.   HAL_NVIC_DisableIRQ(EXTI4_15_IRQn);  
  106. }  
  107. void Bsp_CH375_USART_Init(void)  
  108. {  
  109.   HAL_CH375_USART.Instance = USART1;  
  110.   HAL_CH375_USART.Init.BaudRate = 115200;  
  111.   HAL_CH375_USART.Init.WordLength = UART_WORDLENGTH_8B;  
  112.   HAL_CH375_USART.Init.StopBits = UART_STOPBITS_1;  
  113.   HAL_CH375_USART.Init.Parity = UART_PARITY_NONE;  
  114.   HAL_CH375_USART.Init.Mode = UART_MODE_TX_RX;  
  115.   HAL_CH375_USART.Init.HwFlowCtl = UART_HWCONTROL_NONE;  
  116.   HAL_CH375_USART.Init.OverSampling = UART_OVERSAMPLING_16;  
  117.   HAL_CH375_USART.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;  
  118.   HAL_CH375_USART.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;  
  119.   if (HAL_UART_Init(&HAL_CH375_USART) != HAL_OK)  
  120.   {  
  121.     Error_Handler();  
  122.   }  
  123.   __HAL_UART_ENABLE(&HAL_CH375_USART);  
  124. }  
  125. void Bsp_Peripherals_Init(void)  
  126. {  
  127.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  128.   HAL_Init();  
  129.   /* Configure the system clock */
  130.   Bsp_SystemClock_Init();  
  131.   Bsp_GPIO_Init();  
  132.   Bsp_CH375_USART_Init();  
  133. }  
  134. /** 
  135.   * @brief  This function is executed in case of error occurrence. 
  136.   * @param  None 
  137.   * @retval None 
  138.   */
  139. void Error_Handler(void)  
  140. {  
  141.   /* USER CODE BEGIN Error_Handler */
  142.   /* User can add his own implementation to report the HAL error return state */
  143.   while(1)   
  144.   {  
  145.   }  
  146.   /* USER CODE END Error_Handler */
  147. }  
  148. /***/