Advertisement
Guest User

Untitled

a guest
Jul 17th, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.61 KB | None | 0 0
  1.  
  2. /**
  3. ******************************************************************************
  4. * @file : main.c
  5. * @brief : Main program body
  6. ******************************************************************************
  7. ** This notice applies to any and all portions of this file
  8. * that are not between comment pairs USER CODE BEGIN and
  9. * USER CODE END. Other portions of this file, whether
  10. * inserted by the user or by software development tools
  11. * are owned by their respective copyright owners.
  12. *
  13. * COPYRIGHT(c) 2018 STMicroelectronics
  14. *
  15. * Redistribution and use in source and binary forms, with or without modification,
  16. * are permitted provided that the following conditions are met:
  17. * 1. Redistributions of source code must retain the above copyright notice,
  18. * this list of conditions and the following disclaimer.
  19. * 2. Redistributions in binary form must reproduce the above copyright notice,
  20. * this list of conditions and the following disclaimer in the documentation
  21. * and/or other materials provided with the distribution.
  22. * 3. Neither the name of STMicroelectronics nor the names of its contributors
  23. * may be used to endorse or promote products derived from this software
  24. * without specific prior written permission.
  25. *
  26. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  27. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  28. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  29. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  30. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  31. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  32. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  33. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  34. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  35. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  36. *
  37. ******************************************************************************
  38. */
  39. /* Includes ------------------------------------------------------------------*/
  40. #include "main.h"
  41. #include "stm32f4xx_hal.h"
  42. /* USER CODE BEGIN Includes */
  43.  
  44. #include "cmsis_os.h" /* CMSIS RTOS definitions */
  45. #define ADCaverage 32
  46. #define holdtime 8 //plugs heat up and then hold for X seconds.
  47. #define Heat2HoldCurrent 0x28 // Amps upon program switches from warmup to hold heat strategy.
  48.  
  49. uint8_t mode;
  50. uint16_t timeremaining = holdtime;
  51. uint16_t current[6]; //temp channels to hold each channel's current.
  52. uint16_t currentamps[6];
  53. osThreadId id;
  54. /* USER CODE END Includes */
  55.  
  56. /* Private variables ---------------------------------------------------------*/
  57. ADC_HandleTypeDef hadc1;
  58.  
  59. CAN_HandleTypeDef hcan1;
  60.  
  61. /* USER CODE BEGIN PV */
  62. /* Private variables ---------------------------------------------------------*/
  63. static void PLUG1 (void const *arg);
  64. osThreadDef(PLUG1, osPriorityNormal, 2, 0);
  65. static void PLUG2 (void const *arg);
  66. osThreadDef(PLUG2, osPriorityNormal, 2, 0);
  67. static void PLUG3 (void const *arg);
  68. osThreadDef(PLUG3, osPriorityNormal, 2, 0);
  69. static void PLUG4 (void const *arg);
  70. osThreadDef(PLUG4, osPriorityNormal, 2, 0);
  71. static void PLUG5 (void const *arg);
  72. osThreadDef(PLUG5, osPriorityNormal, 2, 0);
  73. static void PLUG6 (void const *arg);
  74. osThreadDef(PLUG6, osPriorityNormal, 2, 0);
  75. static void Control (void const *arg);
  76. osThreadDef(Control, osPriorityNormal, 2, 0);
  77. static void Timer (void const *arg);
  78. osThreadDef(Timer, osPriorityNormal, 2, 0);
  79. /* USER CODE END PV */
  80.  
  81. /* Private function prototypes -----------------------------------------------*/
  82. void SystemClock_Config(void);
  83. static void MX_GPIO_Init(void);
  84. static void MX_ADC1_Init(void);
  85. static void MX_CAN1_Init(void);
  86.  
  87. /* USER CODE BEGIN PFP */
  88. /* Private function prototypes -----------------------------------------------*/
  89.  
  90.  
  91. /* USER CODE END PFP */
  92.  
  93. /* USER CODE BEGIN 0 */
  94. uint16_t adc_read(uint8_t channel){
  95. // HAL_GPIO_WritePin(GPIOI, GPIO_PIN_1, GPIO_PIN_SET);
  96. uint32_t average=0;
  97. uint8_t samples = 0; //32samples = 50uS per acquisition. 50uS*4 = 200uS for 4 channels.
  98. for(samples =0; samples<ADCaverage; samples++){
  99. hadc1.Instance->SQR3 = channel; //Select the channel
  100. hadc1.Instance->CR2 = 0x40000001UL; //Start the conversion
  101. while ((hadc1.Instance->SR & 0x02) == 0); //wait for conversion to complete.
  102. average = average + hadc1.Instance->DR; //Add result to average
  103. }
  104. average = average / ADCaverage; //divide out average
  105. // HAL_GPIO_WritePin(GPIOI, GPIO_PIN_1, GPIO_PIN_RESET);
  106. return (average);
  107. }
  108.  
  109. long map(long x, long in_min, long in_max, long out_min, long out_max)
  110. {
  111. return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
  112. }
  113.  
  114. static void PLUG1 (void const *arg) {
  115. while(1){
  116. switch(mode){
  117. case 0: //Turn plugs off
  118. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
  119. break;
  120. case 1: //Fast heat
  121. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
  122. break;
  123. case 2: //maintain heat
  124. HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_8);
  125. break;
  126. default: //turn off.
  127. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
  128. break;
  129. } //end switch(mode)
  130. osDelay(500);
  131. } //end while(1)
  132. }
  133. static void PLUG2 (void const *arg) {
  134. while(1){
  135. switch(mode){
  136. case 0: //Turn plugs off
  137. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);
  138. break;
  139. case 1: //Fast heat
  140. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);
  141. break;
  142. case 2: //maintain heat
  143. HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_9);
  144. break;
  145. default: //turn off.
  146. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);
  147. break;
  148. } //end switch(mode)
  149. osDelay(500);
  150. } //end while(1)
  151. }
  152. static void PLUG3 (void const *arg) {
  153. while(1){
  154. switch(mode){
  155. case 0: //Turn plugs off
  156. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
  157. break;
  158. case 1: //Fast heat
  159. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
  160. break;
  161. case 2: //maintain heat
  162. HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_15);
  163. break;
  164. default: //turn off.
  165. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
  166. break;
  167. } //end switch(mode)
  168. osDelay(500);
  169. } //end while(1)
  170. }
  171. static void PLUG4 (void const *arg) {
  172. while(1){
  173. switch(mode){
  174. case 0: //Turn plugs off
  175. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
  176. break;
  177. case 1: //Fast heat
  178. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
  179. break;
  180. case 2: //maintain heat
  181. HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);
  182. break;
  183. default: //turn off.
  184. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
  185. break;
  186. } //end switch(mode)
  187. osDelay(500);
  188. } //end while(1)
  189. }
  190. static void PLUG5 (void const *arg) {
  191. while(1){
  192. switch(mode){
  193. case 0: //Turn plugs off
  194. HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET);
  195. break;
  196. case 1: //Fast heat
  197. HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);
  198. break;
  199. case 2: //maintain heat
  200. HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_6);
  201. break;
  202. default: //turn off.
  203. HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET);
  204. break;
  205. } //end switch(mode)
  206. osDelay(500);
  207. } //end while(1)
  208. }
  209. static void PLUG6 (void const *arg) {
  210. while(1){
  211. switch(mode){
  212. case 0: //Turn plugs off
  213. HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_RESET);
  214. break;
  215. case 1: //Fast heat
  216. HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_SET);
  217. break;
  218. case 2: //maintain heat
  219. HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_7);
  220. break;
  221. default: //turn off.
  222. HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_RESET);
  223. break;
  224. } //end switch(mode)
  225. osDelay(500);
  226. } //end while(1)
  227. }
  228.  
  229. static void Control (void const *arg) {
  230.  
  231. uint8_t i;
  232. while(1){
  233. current[0] = adc_read(2);
  234. current[1] = adc_read(1);
  235. current[2] = adc_read(0);
  236. current[3] = adc_read(3);
  237. current[4] = adc_read(5);
  238. current[5] = adc_read(6);
  239. osDelay(100);
  240. //Convert bits to Amps. 12-bit ADC = .000806v/Bit. 20A is 0.765V.
  241. for(i=0; i<6; i++){
  242. currentamps[i] = map(current[i], 0, 950, 0, 200);
  243. }
  244.  
  245. if(timeremaining != 0){
  246. //Compare Amps to setpoint at top of file.
  247. for(i=0; i<6; i++){
  248. if(currentamps[i] > 1 && currentamps[i] <= Heat2HoldCurrent){ //Turn to hold heat if current is less than setpoint and not 0 for open circuit.
  249. mode = 2; //move plugs to hold heat mode.
  250. osThreadCreate (osThread(Timer), NULL); //Start timer thread to count down.
  251. osThreadTerminate (id);
  252. }
  253. }
  254. }
  255. osDelay(100);
  256. } //end while(1)
  257. }
  258.  
  259. static void Timer (void const *arg) { //Timer thread started inside of Control thread.
  260.  
  261. while(1){
  262. if(timeremaining == 0){
  263. mode = 0;
  264. } else {
  265. timeremaining--; //subtract 1 second
  266. }
  267. osDelay(1000); //wait 1 second
  268. } //end while(1)
  269. }
  270.  
  271.  
  272. /* USER CODE END 0 */
  273.  
  274. /**
  275. * @brief The application entry point.
  276. *
  277. * @retval None
  278. */
  279. int main(void)
  280. {
  281. /* USER CODE BEGIN 1 */
  282.  
  283. /* USER CODE END 1 */
  284.  
  285. /* MCU Configuration----------------------------------------------------------*/
  286.  
  287. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  288. HAL_Init();
  289.  
  290. /* USER CODE BEGIN Init */
  291.  
  292. /* USER CODE END Init */
  293.  
  294. /* Configure the system clock */
  295. SystemClock_Config();
  296.  
  297. /* USER CODE BEGIN SysInit */
  298.  
  299. /* USER CODE END SysInit */
  300.  
  301. /* Initialize all configured peripherals */
  302. MX_GPIO_Init();
  303. MX_ADC1_Init();
  304.  
  305. // MX_CAN1_Init();
  306. /* USER CODE BEGIN 2 */
  307. HAL_ADC_Start(&hadc1);
  308.  
  309. mode = 1; //start heating plugs when key'd on.
  310.  
  311. osThreadCreate (osThread(PLUG1), NULL);
  312. osThreadCreate (osThread(PLUG2), NULL);
  313. osThreadCreate (osThread(PLUG3), NULL);
  314. osThreadCreate (osThread(PLUG4), NULL);
  315. osThreadCreate (osThread(PLUG5), NULL);
  316. osThreadCreate (osThread(PLUG6), NULL);
  317. id = osThreadCreate (osThread(Control), NULL);
  318.  
  319. /* USER CODE END 2 */
  320.  
  321. /* Infinite loop */
  322. /* USER CODE BEGIN WHILE */
  323. while (1)
  324. {
  325.  
  326. /* USER CODE END WHILE */
  327.  
  328. /* USER CODE BEGIN 3 */
  329. osThreadYield();
  330. }
  331. /* USER CODE END 3 */
  332.  
  333. }
  334.  
  335. /**
  336. * @brief System Clock Configuration
  337. * @retval None
  338. */
  339. void SystemClock_Config(void)
  340. {
  341.  
  342. RCC_OscInitTypeDef RCC_OscInitStruct;
  343. RCC_ClkInitTypeDef RCC_ClkInitStruct;
  344.  
  345. /**Configure the main internal regulator output voltage
  346. */
  347. __HAL_RCC_PWR_CLK_ENABLE();
  348.  
  349. __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);
  350.  
  351. /**Initializes the CPU, AHB and APB busses clocks
  352. */
  353. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  354. RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  355. RCC_OscInitStruct.HSICalibrationValue = 16;
  356. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  357. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  358. {
  359. _Error_Handler(__FILE__, __LINE__);
  360. }
  361.  
  362. /**Initializes the CPU, AHB and APB busses clocks
  363. */
  364. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  365. |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  366. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  367. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  368. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  369. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  370.  
  371. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  372. {
  373. _Error_Handler(__FILE__, __LINE__);
  374. }
  375.  
  376. /**Configure the Systick interrupt time
  377. */
  378. HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
  379.  
  380. /**Configure the Systick
  381. */
  382. HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  383.  
  384. /* SysTick_IRQn interrupt configuration */
  385. HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  386. }
  387.  
  388. /* ADC1 init function */
  389. static void MX_ADC1_Init(void)
  390. {
  391.  
  392. ADC_ChannelConfTypeDef sConfig;
  393.  
  394. /**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
  395. */
  396. hadc1.Instance = ADC1;
  397. hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV6;
  398. hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  399. hadc1.Init.ScanConvMode = DISABLE;
  400. hadc1.Init.ContinuousConvMode = DISABLE;
  401. hadc1.Init.DiscontinuousConvMode = DISABLE;
  402. hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  403. hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  404. hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  405. hadc1.Init.NbrOfConversion = 1;
  406. hadc1.Init.DMAContinuousRequests = DISABLE;
  407. hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  408. if (HAL_ADC_Init(&hadc1) != HAL_OK)
  409. {
  410. _Error_Handler(__FILE__, __LINE__);
  411. }
  412.  
  413. /**Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  414. */
  415. sConfig.Channel = ADC_CHANNEL_0;
  416. sConfig.Rank = 1;
  417. sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  418. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  419. {
  420. _Error_Handler(__FILE__, __LINE__);
  421. }
  422.  
  423. }
  424.  
  425. /* CAN1 init function */
  426. static void MX_CAN1_Init(void)
  427. {
  428. hcan1.Instance = CAN1;
  429. hcan1.Init.Prescaler = 1;
  430. hcan1.Init.Mode = CAN_MODE_NORMAL;
  431. hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
  432. hcan1.Init.TimeSeg1 = CAN_BS1_13TQ;
  433. hcan1.Init.TimeSeg2 = CAN_BS2_2TQ;
  434. hcan1.Init.TimeTriggeredMode = DISABLE;
  435. hcan1.Init.AutoBusOff = ENABLE;
  436. hcan1.Init.AutoWakeUp = DISABLE;
  437. hcan1.Init.AutoRetransmission = DISABLE;
  438. hcan1.Init.ReceiveFifoLocked = DISABLE;
  439. hcan1.Init.TransmitFifoPriority = DISABLE;
  440. if (HAL_CAN_Init(&hcan1) != HAL_OK)
  441. {
  442. _Error_Handler(__FILE__, __LINE__);
  443. }
  444.  
  445. }
  446.  
  447. /** Configure pins as
  448. * Analog
  449. * Input
  450. * Output
  451. * EVENT_OUT
  452. * EXTI
  453. */
  454. static void MX_GPIO_Init(void)
  455. {
  456.  
  457. GPIO_InitTypeDef GPIO_InitStruct;
  458.  
  459. /* GPIO Ports Clock Enable */
  460. __HAL_RCC_GPIOA_CLK_ENABLE();
  461. __HAL_RCC_GPIOC_CLK_ENABLE();
  462. __HAL_RCC_GPIOB_CLK_ENABLE();
  463.  
  464. /*Configure GPIO pin Output Level */
  465. HAL_GPIO_WritePin(GPIOC, Control5_Pin|Control6_Pin, GPIO_PIN_RESET);
  466.  
  467. /*Configure GPIO pin Output Level */
  468. HAL_GPIO_WritePin(GPIOA, Control1_Pin|Control2_Pin|Control3_Pin, GPIO_PIN_RESET);
  469.  
  470. /*Configure GPIO pin Output Level */
  471. HAL_GPIO_WritePin(GPIOB, Control7_Pin|Control8_Pin|Control4_Pin, GPIO_PIN_RESET);
  472.  
  473. /*Configure GPIO pin : INPUT_Pin */
  474. GPIO_InitStruct.Pin = INPUT_Pin;
  475. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  476. GPIO_InitStruct.Pull = GPIO_NOPULL;
  477. HAL_GPIO_Init(INPUT_GPIO_Port, &GPIO_InitStruct);
  478.  
  479. /*Configure GPIO pins : Control5_Pin Control6_Pin */
  480. GPIO_InitStruct.Pin = Control5_Pin|Control6_Pin;
  481. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  482. GPIO_InitStruct.Pull = GPIO_NOPULL;
  483. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  484. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  485.  
  486. /*Configure GPIO pins : Control1_Pin Control2_Pin Control3_Pin */
  487. GPIO_InitStruct.Pin = Control1_Pin|Control2_Pin|Control3_Pin|GPIO_PIN_5;
  488. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  489. GPIO_InitStruct.Pull = GPIO_NOPULL;
  490. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  491. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  492.  
  493. /*Configure GPIO pins : Control7_Pin Control8_Pin Control4_Pin */
  494. GPIO_InitStruct.Pin = Control7_Pin|Control8_Pin|Control4_Pin;
  495. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  496. GPIO_InitStruct.Pull = GPIO_NOPULL;
  497. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  498. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  499.  
  500. }
  501.  
  502. /* USER CODE BEGIN 4 */
  503.  
  504. /* USER CODE END 4 */
  505.  
  506. /**
  507. * @brief This function is executed in case of error occurrence.
  508. * @param file: The file name as string.
  509. * @param line: The line in file as a number.
  510. * @retval None
  511. */
  512. void _Error_Handler(char *file, int line)
  513. {
  514. /* USER CODE BEGIN Error_Handler_Debug */
  515. /* User can add his own implementation to report the HAL error return state */
  516. while(1)
  517. {
  518. }
  519. /* USER CODE END Error_Handler_Debug */
  520. }
  521.  
  522. #ifdef USE_FULL_ASSERT
  523. /**
  524. * @brief Reports the name of the source file and the source line number
  525. * where the assert_param error has occurred.
  526. * @param file: pointer to the source file name
  527. * @param line: assert_param error line source number
  528. * @retval None
  529. */
  530. void assert_failed(uint8_t* file, uint32_t line)
  531. {
  532. /* USER CODE BEGIN 6 */
  533. /* User can add his own implementation to report the file name and line number,
  534. tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  535. /* USER CODE END 6 */
  536. }
  537. #endif /* USE_FULL_ASSERT */
  538.  
  539. /**
  540. * @}
  541. */
  542.  
  543. /**
  544. * @}
  545. */
  546.  
  547. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement