You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

453 lines
16 KiB

11 months ago
9 months ago
12 months ago
11 months ago
12 months ago
11 months ago
12 months ago
11 months ago
11 months ago
11 months ago
9 months ago
12 months ago
11 months ago
12 months ago
9 months ago
12 months ago
11 months ago
12 months ago
9 months ago
11 months ago
11 months ago
9 months ago
11 months ago
9 months ago
11 months ago
9 months ago
11 months ago
9 months ago
11 months ago
9 months ago
11 months ago
9 months ago
11 months ago
9 months ago
11 months ago
9 months ago
11 months ago
9 months ago
11 months ago
9 months ago
11 months ago
9 months ago
11 months ago
9 months ago
11 months ago
9 months ago
11 months ago
9 months ago
9 months ago
9 months ago
9 months ago
  1. #include "apphal.hpp"
  2. #include "uappbase\appcfg\appcfg.hpp"
  3. using namespace iflytop;
  4. void AppHal::MX_TIM6_Init(void) {
  5. __HAL_RCC_TIM6_CLK_ENABLE();
  6. TIM_MasterConfigTypeDef sMasterConfig = {0};
  7. htim6.Instance = TIM6;
  8. htim6.Init.Prescaler = 71;
  9. htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
  10. htim6.Init.Period = 65535;
  11. htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  12. if (HAL_TIM_Base_Init(&htim6) != HAL_OK) {
  13. Error_Handler();
  14. }
  15. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  16. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  17. if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK) {
  18. Error_Handler();
  19. }
  20. /* TIM6 interrupt Init */
  21. HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 5, 0);
  22. HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
  23. }
  24. /* TIM7 init function */
  25. void AppHal::MX_TIM7_Init(void) {
  26. __HAL_RCC_TIM7_CLK_ENABLE();
  27. TIM_MasterConfigTypeDef sMasterConfig = {0};
  28. htim7.Instance = TIM7;
  29. htim7.Init.Prescaler = 81;
  30. htim7.Init.CounterMode = TIM_COUNTERMODE_UP;
  31. htim7.Init.Period = 65535;
  32. htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  33. if (HAL_TIM_Base_Init(&htim7) != HAL_OK) {
  34. Error_Handler();
  35. }
  36. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  37. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  38. if (HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig) != HAL_OK) {
  39. Error_Handler();
  40. }
  41. /* TIM7 interrupt Init */
  42. HAL_NVIC_SetPriority(TIM7_IRQn, 5, 0);
  43. HAL_NVIC_EnableIRQ(TIM7_IRQn);
  44. }
  45. #define EARLY_ASSERT(exptr) \
  46. if (!(exptr)) { \
  47. while (true) { \
  48. } \
  49. }
  50. void AppHal::DEBUG_UART_INIT(Pin_t tx, Pin_t rx, int32_t baudrate) {
  51. #if (DEBUG_UART_INDEX == 1)
  52. GPIO_InitTypeDef GPIO_InitStruct = {0};
  53. __HAL_RCC_USART1_CLK_ENABLE();
  54. __HAL_RCC_GPIOA_CLK_ENABLE();
  55. __HAL_RCC_DMA2_CLK_ENABLE();
  56. if (tx == PA9 && rx == PA10) {
  57. GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10;
  58. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  59. GPIO_InitStruct.Pull = GPIO_NOPULL;
  60. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  61. GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
  62. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  63. } else if (tx == PB6 && rx == PB7) {
  64. GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
  65. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  66. GPIO_InitStruct.Pull = GPIO_NOPULL;
  67. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  68. GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
  69. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  70. } else {
  71. EARLY_ASSERT(false);
  72. }
  73. huart1.Instance = USART1;
  74. huart1.Init.BaudRate = baudrate;
  75. huart1.Init.WordLength = UART_WORDLENGTH_8B;
  76. huart1.Init.StopBits = UART_STOPBITS_1;
  77. huart1.Init.Parity = UART_PARITY_NONE;
  78. huart1.Init.Mode = UART_MODE_TX_RX;
  79. huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  80. huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  81. if (HAL_UART_Init(&huart1) != HAL_OK) {
  82. Error_Handler();
  83. }
  84. HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 5, 0);
  85. HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);
  86. hdma2_stream2.Instance = DMA2_Stream2;
  87. hdma2_stream2.Init.Channel = DMA_CHANNEL_4;
  88. hdma2_stream2.Init.Direction = DMA_PERIPH_TO_MEMORY;
  89. hdma2_stream2.Init.PeriphInc = DMA_PINC_DISABLE;
  90. hdma2_stream2.Init.MemInc = DMA_MINC_ENABLE;
  91. hdma2_stream2.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  92. hdma2_stream2.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  93. hdma2_stream2.Init.Mode = DMA_NORMAL;
  94. hdma2_stream2.Init.Priority = DMA_PRIORITY_LOW;
  95. hdma2_stream2.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  96. if (HAL_DMA_Init(&hdma2_stream2) != HAL_OK) {
  97. Error_Handler();
  98. }
  99. __HAL_LINKDMA(&huart1, hdmarx, hdma2_stream2);
  100. HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
  101. HAL_NVIC_EnableIRQ(USART1_IRQn);
  102. #else
  103. #error "DEBUG_UART_INDEX not supported"
  104. #endif
  105. }
  106. void AppHal::MX_IWDG_Init(void) {
  107. hiwdg.Instance = IWDG;
  108. hiwdg.Init.Prescaler = IWDG_PRESCALER_64;
  109. hiwdg.Init.Reload = 4095;
  110. if (HAL_IWDG_Init(&hiwdg) != HAL_OK) {
  111. Error_Handler();
  112. }
  113. }
  114. void AppHal::UART3_Init(Pin_t tx, Pin_t rx, int32_t baudrate) {
  115. GPIO_InitTypeDef GPIO_InitStruct = {0};
  116. __HAL_RCC_USART3_CLK_ENABLE();
  117. __HAL_RCC_GPIOB_CLK_ENABLE();
  118. __HAL_RCC_DMA1_CLK_ENABLE();
  119. huart3.Instance = USART3;
  120. huart3.Init.BaudRate = baudrate;
  121. huart3.Init.WordLength = UART_WORDLENGTH_8B;
  122. huart3.Init.StopBits = UART_STOPBITS_1;
  123. huart3.Init.Parity = UART_PARITY_NONE;
  124. huart3.Init.Mode = UART_MODE_TX_RX;
  125. huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  126. huart3.Init.OverSampling = UART_OVERSAMPLING_16;
  127. if (HAL_UART_Init(&huart3) != HAL_OK) {
  128. Error_Handler();
  129. }
  130. if (tx == PB10 && rx == PB11) {
  131. __HAL_RCC_GPIOB_CLK_ENABLE();
  132. GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_11;
  133. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  134. GPIO_InitStruct.Pull = GPIO_NOPULL;
  135. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  136. GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
  137. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  138. } else if (tx == PD8 && rx == PD9) {
  139. __HAL_RCC_GPIOD_CLK_ENABLE();
  140. GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9;
  141. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  142. GPIO_InitStruct.Pull = GPIO_NOPULL;
  143. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  144. GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
  145. HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  146. } else {
  147. ASSERT(false, "UART3 NOT SUPPORT PIN");
  148. }
  149. hdma1_stream1.Instance = DMA1_Stream1;
  150. hdma1_stream1.Init.Channel = DMA_CHANNEL_4;
  151. hdma1_stream1.Init.Direction = DMA_PERIPH_TO_MEMORY;
  152. hdma1_stream1.Init.PeriphInc = DMA_PINC_DISABLE;
  153. hdma1_stream1.Init.MemInc = DMA_MINC_ENABLE;
  154. hdma1_stream1.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  155. hdma1_stream1.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  156. hdma1_stream1.Init.Mode = DMA_NORMAL;
  157. hdma1_stream1.Init.Priority = DMA_PRIORITY_LOW;
  158. hdma1_stream1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  159. if (HAL_DMA_Init(&hdma1_stream1) != HAL_OK) {
  160. Error_Handler();
  161. }
  162. __HAL_LINKDMA(&huart3, hdmarx, hdma1_stream1);
  163. hdma1_stream3.Instance = DMA1_Stream3;
  164. hdma1_stream3.Init.Channel = DMA_CHANNEL_4;
  165. hdma1_stream3.Init.Direction = DMA_MEMORY_TO_PERIPH;
  166. hdma1_stream3.Init.PeriphInc = DMA_PINC_DISABLE;
  167. hdma1_stream3.Init.MemInc = DMA_MINC_ENABLE;
  168. hdma1_stream3.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  169. hdma1_stream3.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  170. hdma1_stream3.Init.Mode = DMA_NORMAL;
  171. hdma1_stream3.Init.Priority = DMA_PRIORITY_LOW;
  172. hdma1_stream3.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  173. if (HAL_DMA_Init(&hdma1_stream3) != HAL_OK) {
  174. Error_Handler();
  175. }
  176. __HAL_LINKDMA(&huart3, hdmatx, hdma1_stream3);
  177. HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 5, 0);
  178. HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
  179. HAL_NVIC_SetPriority(DMA1_Stream3_IRQn, 5, 0);
  180. HAL_NVIC_EnableIRQ(DMA1_Stream3_IRQn);
  181. HAL_NVIC_SetPriority(USART3_IRQn, 5, 0);
  182. HAL_NVIC_EnableIRQ(USART3_IRQn);
  183. }
  184. /**
  185. * @brief
  186. */
  187. void AppHal::UART4_Init(Pin_t tx, Pin_t rx, int32_t baudrate) {
  188. GPIO_InitTypeDef GPIO_InitStruct = {0};
  189. __HAL_RCC_UART4_CLK_ENABLE();
  190. __HAL_RCC_GPIOC_CLK_ENABLE();
  191. huart4.Instance = UART4;
  192. huart4.Init.BaudRate = baudrate; // 256000
  193. huart4.Init.WordLength = UART_WORDLENGTH_8B;
  194. huart4.Init.StopBits = UART_STOPBITS_1;
  195. huart4.Init.Parity = UART_PARITY_NONE;
  196. huart4.Init.Mode = UART_MODE_TX_RX;
  197. huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  198. huart4.Init.OverSampling = UART_OVERSAMPLING_16;
  199. if (HAL_UART_Init(&huart4) != HAL_OK) {
  200. Error_Handler();
  201. }
  202. /**UART4 GPIO Configuration
  203. PC10 ------> UART4_TX
  204. PC11 ------> UART4_RX
  205. */
  206. if (tx == PC10 && rx == PC11) {
  207. GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_11;
  208. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  209. GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  210. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  211. GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
  212. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  213. } else {
  214. ASSERT(false, "UART4 NOT SUPPORT PIN");
  215. }
  216. /* UART4 interrupt Init */
  217. HAL_NVIC_SetPriority(UART4_IRQn, 5, 0);
  218. HAL_NVIC_EnableIRQ(UART4_IRQn);
  219. /***********************************************************************************************************************
  220. * DMA_INIT *
  221. ***********************************************************************************************************************/
  222. /* UART4 DMA Init */
  223. /* UART4_RX Init */
  224. hdma1_stream2.Instance = DMA1_Stream2;
  225. hdma1_stream2.Init.Channel = DMA_CHANNEL_4;
  226. hdma1_stream2.Init.Direction = DMA_PERIPH_TO_MEMORY;
  227. hdma1_stream2.Init.PeriphInc = DMA_PINC_DISABLE;
  228. hdma1_stream2.Init.MemInc = DMA_MINC_ENABLE;
  229. hdma1_stream2.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  230. hdma1_stream2.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  231. hdma1_stream2.Init.Mode = DMA_NORMAL;
  232. hdma1_stream2.Init.Priority = DMA_PRIORITY_LOW;
  233. hdma1_stream2.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  234. if (HAL_DMA_Init(&hdma1_stream2) != HAL_OK) {
  235. Error_Handler();
  236. }
  237. __HAL_LINKDMA(&huart4, hdmarx, hdma1_stream2);
  238. /* UART4_TX Init */
  239. hdma1_stream4.Instance = DMA1_Stream4;
  240. hdma1_stream4.Init.Channel = DMA_CHANNEL_4;
  241. hdma1_stream4.Init.Direction = DMA_MEMORY_TO_PERIPH;
  242. hdma1_stream4.Init.PeriphInc = DMA_PINC_DISABLE;
  243. hdma1_stream4.Init.MemInc = DMA_MINC_ENABLE;
  244. hdma1_stream4.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  245. hdma1_stream4.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  246. hdma1_stream4.Init.Mode = DMA_NORMAL;
  247. hdma1_stream4.Init.Priority = DMA_PRIORITY_LOW;
  248. hdma1_stream4.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  249. if (HAL_DMA_Init(&hdma1_stream4) != HAL_OK) {
  250. Error_Handler();
  251. }
  252. __HAL_LINKDMA(&huart4, hdmatx, hdma1_stream4);
  253. }
  254. void AppHal::MX_I2C1_Init(void) {
  255. __HAL_RCC_GPIOB_CLK_ENABLE();
  256. __HAL_RCC_I2C1_CLK_ENABLE();
  257. hi2c1.Instance = I2C1;
  258. hi2c1.Init.ClockSpeed = 400000;
  259. // hi2c1.Init.ClockSpeed = 1000000;
  260. hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  261. hi2c1.Init.OwnAddress1 = 0;
  262. hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  263. hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  264. hi2c1.Init.OwnAddress2 = 0;
  265. hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  266. hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  267. // hi2c1.Instance = I2C1;
  268. // hi2c1.Init.ClockSpeed = 1000000; // 1MHz
  269. // hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  270. // hi2c1.Init.OwnAddress1 = 0;
  271. // hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  272. // hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  273. // hi2c1.Init.OwnAddress2 = 0;
  274. // hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  275. // hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  276. if (HAL_I2C_Init(&hi2c1) != HAL_OK) {
  277. Error_Handler();
  278. }
  279. GPIO_InitTypeDef GPIO_InitStruct = {0};
  280. /**I2C1 GPIO Configuration
  281. PB8 ------> I2C1_SCL
  282. PB9 ------> I2C1_SDA
  283. */
  284. GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9;
  285. GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
  286. GPIO_InitStruct.Pull = GPIO_NOPULL;
  287. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  288. GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
  289. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  290. }
  291. void AppHal::tmc_spi_init() {
  292. #if (MOTOR_SPI_INDEX == 1)
  293. __HAL_RCC_SPI1_CLK_ENABLE();
  294. __HAL_RCC_GPIOA_CLK_ENABLE();
  295. static_assert(&MOTOR_SPI_INS == &hspi1);
  296. hspi1.Instance = SPI1;
  297. hspi1.Init.Mode = SPI_MODE_MASTER;
  298. hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  299. hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  300. hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  301. hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  302. hspi1.Init.NSS = SPI_NSS_SOFT;
  303. hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
  304. hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  305. hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  306. hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  307. hspi1.Init.CRCPolynomial = 10;
  308. if (HAL_SPI_Init(&hspi1) != HAL_OK) {
  309. Error_Handler();
  310. }
  311. static_assert(MOTOR_SPI_SCK == PA5);
  312. static_assert(MOTOR_SPI_SDO == PA6);
  313. static_assert(MOTOR_SPI_SDI == PA7);
  314. GPIO_InitTypeDef GPIO_InitStruct = {0};
  315. GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
  316. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  317. GPIO_InitStruct.Pull = GPIO_NOPULL;
  318. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  319. GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
  320. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  321. #else
  322. #error "MOTOR_SPI_INDEX not supported"
  323. #endif
  324. }
  325. void AppHal::rtc_init() {
  326. RTC_TimeTypeDef sTime = {0};
  327. RTC_DateTypeDef sDate = {0};
  328. RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  329. PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
  330. PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
  331. if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) {
  332. Error_Handler();
  333. }
  334. __HAL_RCC_RTC_ENABLE();
  335. /** Initialize RTC Only
  336. */
  337. hrtc.Instance = RTC;
  338. hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  339. hrtc.Init.AsynchPrediv = 127;
  340. hrtc.Init.SynchPrediv = 255;
  341. hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  342. hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  343. hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  344. if (HAL_RTC_Init(&hrtc) != HAL_OK) {
  345. Error_Handler();
  346. }
  347. /** Initialize RTC and set the Time and Date
  348. */
  349. sTime.Hours = 0x0;
  350. sTime.Minutes = 0x0;
  351. sTime.Seconds = 0x0;
  352. sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  353. sTime.StoreOperation = RTC_STOREOPERATION_RESET;
  354. if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK) {
  355. Error_Handler();
  356. }
  357. sDate.WeekDay = 0x01;
  358. sDate.Month = 0x1;
  359. sDate.Date = 0x1;
  360. sDate.Year = 0x24;
  361. if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK) {
  362. Error_Handler();
  363. }
  364. }
  365. void AppHal::usb_init() {
  366. GPIO_InitTypeDef GPIO_InitStruct = {0};
  367. __HAL_RCC_GPIOA_CLK_ENABLE();
  368. /**USB_OTG_FS GPIO Configuration
  369. PA11 ------> USB_OTG_FS_DM
  370. PA12 ------> USB_OTG_FS_DP
  371. */
  372. GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12;
  373. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  374. GPIO_InitStruct.Pull = GPIO_NOPULL;
  375. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  376. GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
  377. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  378. __HAL_RCC_USB_OTG_FS_CLK_ENABLE();
  379. hhcd_USB_OTG_FS.Instance = USB_OTG_FS;
  380. hhcd_USB_OTG_FS.Init.Host_channels = 8;
  381. hhcd_USB_OTG_FS.Init.speed = HCD_SPEED_FULL;
  382. hhcd_USB_OTG_FS.Init.dma_enable = DISABLE;
  383. hhcd_USB_OTG_FS.Init.phy_itface = HCD_PHY_EMBEDDED;
  384. hhcd_USB_OTG_FS.Init.Sof_enable = DISABLE;
  385. if (HAL_HCD_Init(&hhcd_USB_OTG_FS) != HAL_OK) {
  386. Error_Handler();
  387. }
  388. #if 0
  389. __HAL_RCC_USB_OTG_FS_CLK_DISABLE();
  390. /**USB_OTG_FS GPIO Configuration
  391. PA11 ------> USB_OTG_FS_DM
  392. PA12 ------> USB_OTG_FS_DP
  393. */
  394. HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12);
  395. #endif
  396. }