Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* USER CODE BEGIN Header */
- /**
- ******************************************************************************
- * @file : main.c
- * @brief : Main program body
- ******************************************************************************
- * @attention
- *
- * <h2><center>© Copyright (c) 2021 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under BSD 3-Clause license,
- * the "License"; You may not use this file except in compliance with the
- * License. You may obtain a copy of the License at:
- * opensource.org/licenses/BSD-3-Clause
- *
- ******************************************************************************
- */
- /* USER CODE END Header */
- /* Includes ------------------------------------------------------------------*/
- #include "main.h"
- #include "cmsis_os.h"
- #include "lwip.h"
- /* Private includes ----------------------------------------------------------*/
- /* USER CODE BEGIN Includes */
- //#include "sockets.h"
- #include "lwip/api.h"
- #include "VNI8200XP.h"
- #include "CLT01-38SQ7.h"
- /* USER CODE END Includes */
- /* Private typedef -----------------------------------------------------------*/
- /* USER CODE BEGIN PTD */
- /* USER CODE END PTD */
- /* Private define ------------------------------------------------------------*/
- /* USER CODE BEGIN PD */
- #ifdef DEBUG
- #define DEBUG_UART
- #endif
- #ifdef DEBUG_UART
- #include "serialDebug.h"
- #endif
- /* USER CODE END PD */
- /* Private macro -------------------------------------------------------------*/
- /* USER CODE BEGIN PM */
- /* USER CODE END PM */
- /* Private variables ---------------------------------------------------------*/
- SPI_HandleTypeDef hspi1;
- UART_HandleTypeDef huart3;
- PCD_HandleTypeDef hpcd_USB_OTG_FS;
- /* Definitions for defaultTask */
- osThreadId_t defaultTaskHandle;
- const osThreadAttr_t defaultTask_attributes = {
- .name = "defaultTask",
- .stack_size = 128 * 32,
- .priority = (osPriority_t) osPriorityNormal,
- };
- /* USER CODE BEGIN PV */
- uint8_t DIGITAL_INPUTS[8] = {0x0};
- uint8_t DIGITAL_OUTPUTS[8] = {0x0};
- osMutexId_t digital_inputs_mutex;
- osMutexId_t digital_outputs_mutex;
- #ifdef DEBUG_UART
- osMutexId_t serial_mutex;
- #endif
- const osMutexAttr_t IO_Mutex_attr = {
- "IO_mutex", // human readable mutex name
- osMutexPrioInherit, // attr_bits
- NULL, // memory for control block
- 0U // size for control block
- };
- osThreadId_t ServerTaskHandle;
- osThreadId_t ClientTaskHandle;
- osThreadId_t IOTaskHandle;
- const osThreadAttr_t ServerTask_attributes = {
- .name = "Server",
- .stack_size = 128 * 4,
- .priority = (osPriority_t) osPriorityNormal,
- };
- const osThreadAttr_t ServiceTask_attributes = {
- .name = "NetworkTask",
- .stack_size = 128 * 4,
- .priority = (osPriority_t) osPriorityNormal,
- };
- const osThreadAttr_t IOTask_attributes = {
- .name = "IOTask",
- .stack_size = 128 * 4,
- .priority = (osPriority_t) osPriorityRealtime7,
- };
- /* USER CODE END PV */
- /* Private function prototypes -----------------------------------------------*/
- void SystemClock_Config(void);
- static void MX_GPIO_Init(void);
- static void MX_USART3_UART_Init(void);
- static void MX_USB_OTG_FS_PCD_Init(void);
- static void MX_SPI1_Init(void);
- void StartDefaultTask(void *argument);
- /* USER CODE BEGIN PFP */
- static void ServerTask( void *argument );
- static void ServiceTask( void *argument );
- static void IOTask( void *argument );
- /* USER CODE END PFP */
- /* Private user code ---------------------------------------------------------*/
- /* USER CODE BEGIN 0 */
- /* USER CODE END 0 */
- /**
- * @brief The application entry point.
- * @retval int
- */
- int main(void)
- {
- /* USER CODE BEGIN 1 */
- /* 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_USART3_UART_Init();
- MX_USB_OTG_FS_PCD_Init();
- MX_SPI1_Init();
- /* USER CODE BEGIN 2 */
- #ifdef DEBUG_UART
- serial_init( &huart3 );
- #endif
- /* USER CODE END 2 */
- /* Init scheduler */
- osKernelInitialize();
- /* USER CODE BEGIN RTOS_MUTEX */
- digital_inputs_mutex = osMutexNew(&IO_Mutex_attr);
- digital_outputs_mutex = osMutexNew(&IO_Mutex_attr);
- #ifdef DEBUG_UART
- serial_mutex = osMutexNew(&IO_Mutex_attr);
- #endif
- /* USER CODE END RTOS_MUTEX */
- /* USER CODE BEGIN RTOS_SEMAPHORES */
- /* add semaphores, ... */
- /* USER CODE END RTOS_SEMAPHORES */
- /* USER CODE BEGIN RTOS_TIMERS */
- /* start timers, add new ones, ... */
- /* USER CODE END RTOS_TIMERS */
- /* USER CODE BEGIN RTOS_QUEUES */
- /* add queues, ... */
- /* USER CODE END RTOS_QUEUES */
- /* Create the thread(s) */
- /* creation of defaultTask */
- defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
- IOTaskHandle = osThreadNew( IOTask, NULL, &IOTask_attributes );
- /* USER CODE BEGIN RTOS_THREADS */
- /* USER CODE END RTOS_THREADS */
- /* USER CODE BEGIN RTOS_EVENTS */
- /* add events, ... */
- /* USER CODE END RTOS_EVENTS */
- /* Start scheduler */
- osKernelStart();
- /* We should never get here as control is now taken by the scheduler */
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- }
- /* USER CODE END 3 */
- }
- /**
- * @brief System Clock Configuration
- * @retval None
- */
- void SystemClock_Config(void)
- {
- RCC_OscInitTypeDef RCC_OscInitStruct = {0};
- RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
- /** Configure the main internal regulator output voltage
- */
- __HAL_RCC_PWR_CLK_ENABLE();
- __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
- /** Initializes the RCC Oscillators according to the specified parameters
- * in the RCC_OscInitTypeDef structure.
- */
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
- RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
- RCC_OscInitStruct.PLL.PLLM = 4;
- RCC_OscInitStruct.PLL.PLLN = 168;
- RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
- RCC_OscInitStruct.PLL.PLLQ = 7;
- if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
- {
- Error_Handler();
- }
- /** Initializes the CPU, AHB and APB buses 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_DIV4;
- RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
- {
- Error_Handler();
- }
- }
- /**
- * @brief SPI1 Initialization Function
- * @param None
- * @retval None
- */
- static void MX_SPI1_Init(void)
- {
- /* USER CODE BEGIN SPI1_Init 0 */
- /* USER CODE END SPI1_Init 0 */
- /* USER CODE BEGIN SPI1_Init 1 */
- /* USER CODE END SPI1_Init 1 */
- /* SPI1 parameter configuration*/
- hspi1.Instance = SPI1;
- hspi1.Init.Mode = SPI_MODE_MASTER;
- hspi1.Init.Direction = SPI_DIRECTION_2LINES;
- hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
- hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
- hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
- hspi1.Init.NSS = SPI_NSS_SOFT;
- hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
- hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
- hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
- hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
- hspi1.Init.CRCPolynomial = 10;
- if (HAL_SPI_Init(&hspi1) != HAL_OK)
- {
- Error_Handler();
- }
- /* USER CODE BEGIN SPI1_Init 2 */
- /* USER CODE END SPI1_Init 2 */
- }
- /**
- * @brief USART3 Initialization Function
- * @param None
- * @retval None
- */
- static void MX_USART3_UART_Init(void)
- {
- /* USER CODE BEGIN USART3_Init 0 */
- /* USER CODE END USART3_Init 0 */
- /* USER CODE BEGIN USART3_Init 1 */
- /* USER CODE END USART3_Init 1 */
- huart3.Instance = USART3;
- huart3.Init.BaudRate = 115200;
- huart3.Init.WordLength = UART_WORDLENGTH_8B;
- huart3.Init.StopBits = UART_STOPBITS_1;
- huart3.Init.Parity = UART_PARITY_NONE;
- huart3.Init.Mode = UART_MODE_TX_RX;
- huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
- huart3.Init.OverSampling = UART_OVERSAMPLING_16;
- if (HAL_UART_Init(&huart3) != HAL_OK)
- {
- Error_Handler();
- }
- /* USER CODE BEGIN USART3_Init 2 */
- /* USER CODE END USART3_Init 2 */
- }
- /**
- * @brief USB_OTG_FS Initialization Function
- * @param None
- * @retval None
- */
- static void MX_USB_OTG_FS_PCD_Init(void)
- {
- /* USER CODE BEGIN USB_OTG_FS_Init 0 */
- /* USER CODE END USB_OTG_FS_Init 0 */
- /* USER CODE BEGIN USB_OTG_FS_Init 1 */
- /* USER CODE END USB_OTG_FS_Init 1 */
- hpcd_USB_OTG_FS.Instance = USB_OTG_FS;
- hpcd_USB_OTG_FS.Init.dev_endpoints = 4;
- hpcd_USB_OTG_FS.Init.speed = PCD_SPEED_FULL;
- hpcd_USB_OTG_FS.Init.dma_enable = DISABLE;
- hpcd_USB_OTG_FS.Init.phy_itface = PCD_PHY_EMBEDDED;
- hpcd_USB_OTG_FS.Init.Sof_enable = ENABLE;
- hpcd_USB_OTG_FS.Init.low_power_enable = DISABLE;
- hpcd_USB_OTG_FS.Init.lpm_enable = DISABLE;
- hpcd_USB_OTG_FS.Init.vbus_sensing_enable = ENABLE;
- hpcd_USB_OTG_FS.Init.use_dedicated_ep1 = DISABLE;
- if (HAL_PCD_Init(&hpcd_USB_OTG_FS) != HAL_OK)
- {
- Error_Handler();
- }
- /* USER CODE BEGIN USB_OTG_FS_Init 2 */
- /* USER CODE END USB_OTG_FS_Init 2 */
- }
- /**
- * @brief GPIO Initialization Function
- * @param None
- * @retval None
- */
- static void MX_GPIO_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- /* GPIO Ports Clock Enable */
- __HAL_RCC_GPIOC_CLK_ENABLE();
- __HAL_RCC_GPIOH_CLK_ENABLE();
- __HAL_RCC_GPIOA_CLK_ENABLE();
- __HAL_RCC_GPIOE_CLK_ENABLE();
- __HAL_RCC_GPIOB_CLK_ENABLE();
- __HAL_RCC_GPIOD_CLK_ENABLE();
- __HAL_RCC_GPIOG_CLK_ENABLE();
- /*Configure GPIO pin Output Level */
- HAL_GPIO_WritePin(GPIOE, GPIO_PIN_9, GPIO_PIN_RESET);
- /*Configure GPIO pin Output Level */
- HAL_GPIO_WritePin(GPIOB, LD3_Pin|LD2_Pin, GPIO_PIN_RESET);
- /*Configure GPIO pin Output Level */
- HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET);
- /*Configure GPIO pin Output Level */
- HAL_GPIO_WritePin(USB_PowerSwitchOn_GPIO_Port, USB_PowerSwitchOn_Pin, GPIO_PIN_RESET);
- /*Configure GPIO pin : USER_Btn_Pin */
- GPIO_InitStruct.Pin = USER_Btn_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- HAL_GPIO_Init(USER_Btn_GPIO_Port, &GPIO_InitStruct);
- /*Configure GPIO pin : PE9 */
- GPIO_InitStruct.Pin = GPIO_PIN_9;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
- /*Configure GPIO pins : LD3_Pin LD2_Pin */
- GPIO_InitStruct.Pin = LD3_Pin|LD2_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
- /*Configure GPIO pins : PD14 PD15 */
- GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
- /*Configure GPIO pin : USB_PowerSwitchOn_Pin */
- GPIO_InitStruct.Pin = USB_PowerSwitchOn_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- HAL_GPIO_Init(USB_PowerSwitchOn_GPIO_Port, &GPIO_InitStruct);
- /*Configure GPIO pin : USB_OverCurrent_Pin */
- GPIO_InitStruct.Pin = USB_OverCurrent_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- HAL_GPIO_Init(USB_OverCurrent_GPIO_Port, &GPIO_InitStruct);
- }
- /* USER CODE BEGIN 4 */
- static void IOTask( void *argument )
- {
- VNI8200XP_Init(&hspi1);
- CLT01_38SQ7_Init(&hspi1);
- while(1)
- {
- VNI8200XP_WD_Reset();
- osMutexAcquire(digital_inputs_mutex, osWaitForever);
- ReadDigitalInputs( DIGITAL_INPUTS );
- osMutexRelease(digital_inputs_mutex);
- // for( uint8_t i=0; i<8; ++i )
- // {
- // DIGITAL_OUTPUTS[i] = DIGITAL_INPUTS[i];
- // }
- osMutexAcquire(digital_outputs_mutex, osWaitForever);
- WriteDigitalOutputs(DIGITAL_OUTPUTS);
- osMutexRelease(digital_outputs_mutex);
- osDelay(20);
- }
- }
- static void ServiceTask( void * argument )
- {
- /*
- * MEM_SIZE
- * MEMP_NUM_NETCONN
- * THREAD_STACK_SIZE
- * */
- struct netbuf * inbuf;
- char * buf;
- err_t err;
- uint16_t buflen;
- struct netconn * newconn = (struct netconn *)argument;
- err = netconn_recv( newconn, &inbuf );
- if( err == ERR_OK )
- {
- netbuf_data(inbuf, (void**)&buf, &buflen);
- if( buflen >= 12 &&
- buf[0] == 'S' &&
- buf[1] == 'E' &&
- buf[2] == 'T')
- {
- osMutexAcquire(digital_outputs_mutex, osWaitForever);
- for( uint8_t i=0; i<8; ++i )
- {
- if( buf[i+4] == '1' )
- {
- DIGITAL_OUTPUTS[i] = 0x01;
- }
- else if( buf[i+4] == '0' )
- {
- DIGITAL_OUTPUTS[i] = 0x00;
- }
- }
- osMutexRelease(digital_outputs_mutex);
- }
- else if( buflen >= 3 &&
- buf[0] == 'G' &&
- buf[1] == 'E' &&
- buf[2] == 'T' )
- {
- char reply[] = "########\r\n";
- osMutexAcquire(digital_inputs_mutex, osWaitForever);
- for( uint8_t i=0; i<8; ++i )
- {
- if( DIGITAL_INPUTS[i] == 0x00 )
- {
- reply[i] = '0';
- }
- else
- {
- reply[i] = '1';
- }
- }
- osMutexRelease(digital_inputs_mutex);
- netconn_write(newconn, reply, 10, NETCONN_NOCOPY);
- }
- netconn_write(newconn, "OK\r\n", sizeof("OK\r\n")-1, NETCONN_NOCOPY);
- netconn_close(newconn);
- netbuf_delete(inbuf);
- }
- else
- {
- #ifdef DEBUG_UART
- osMutexAcquire(serial_mutex, osWaitForever);
- serial_print("Error en recepción de cliente");
- osMutexRelease(serial_mutex);
- #endif
- }
- netconn_delete(newconn);
- // osThreadExit();
- }
- static void ServerTask( void *argument )
- {
- err_t err;
- struct netconn *conn, *newconn;
- osThreadId_t client_thread;
- conn = netconn_new(NETCONN_TCP);
- netconn_bind(conn, NULL, 503);
- while(1)
- {
- netconn_listen(conn);
- err = netconn_accept(conn,&newconn);
- if( err == ERR_OK )
- {
- // client_thread = sys_thread_new( "ServiceTask", ServiceTask, (void *)newconn, ServiceTask_attributes.stack_size, ServiceTask_attributes.priority );
- ServiceTask((void*)newconn);
- }
- else
- {
- #ifdef DEBUG_UART
- osMutexAcquire(serial_mutex, osWaitForever);
- serial_print("Error de conexión");
- osMutexRelease(serial_mutex);
- #endif
- }
- }
- netconn_close(conn);
- netconn_delete(conn);
- osThreadExit();
- }
- /* USER CODE END 4 */
- /* USER CODE BEGIN Header_StartDefaultTask */
- /**
- * @brief Function implementing the defaultTask thread.
- * @param argument: Not used
- * @retval None
- */
- /* USER CODE END Header_StartDefaultTask */
- void StartDefaultTask(void *argument)
- {
- /* init code for LWIP */
- MX_LWIP_Init();
- /* USER CODE BEGIN 5 */
- // ServerTaskHandle = osThreadNew(ServerTask, NULL, &ServerTask_attributes);
- /* Infinite loop */
- for(;;)
- {
- osDelay(1);
- }
- /* USER CODE END 5 */
- }
- /**
- * @brief Period elapsed callback in non blocking mode
- * @note This function is called when TIM1 interrupt took place, inside
- * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment
- * a global variable "uwTick" used as application time base.
- * @param htim : TIM handle
- * @retval None
- */
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
- {
- /* USER CODE BEGIN Callback 0 */
- /* USER CODE END Callback 0 */
- if (htim->Instance == TIM1) {
- HAL_IncTick();
- }
- /* USER CODE BEGIN Callback 1 */
- /* USER CODE END Callback 1 */
- }
- /**
- * @brief This function is executed in case of error occurrence.
- * @retval None
- */
- void Error_Handler(void)
- {
- /* USER CODE BEGIN Error_Handler_Debug */
- /* User can add his own implementation to report the HAL error return state */
- __disable_irq();
- while (1)
- {
- HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
- }
- /* 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 /* USE_FULL_ASSERT */
- /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement