/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * Copyright (c) 2025 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "adc.h" #include "tim.h" #include "usart.h" #include "gpio.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "dallas_tools.h" #include "def.h" #include #include "rs_message.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ int fputc(int ch, FILE *f) { HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY); return ch; } /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ uint16_t iter,cnt=5; /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ float temperature; extern uint8_t roms[MAX_DEVICES][8]; //extern uint8_t devices_found ; uint8_t init=1; //TEMP temp_sense[30]; float set_temp_old[30]; char rx_buffer[64]; uint8_t rx_index = 0; char command_ready = 0; uint8_t uart_byte = 0; uint8_t first_in=1; DALLAS_SensorHandleTypeDef sens[30]; /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP */ /* 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_TIM1_Init(); MX_USART1_UART_Init(); MX_TIM2_Init(); MX_ADC1_Init(); /* USER CODE BEGIN 2 */ //TIM1->DIER |= TIM_DIER_UIE; // HAL_TIM_Base_MspInit(&htim1); // HAL_TIM_Base_Start(&htim1); GPIOC->ODR^=(1<<13); HAL_Delay(50); GPIOC->ODR^=(1<<13); HAL_Delay(50); GPIOC->ODR^=(1<<13); HAL_Delay(50); GPIOC->ODR^=(1<<13); HAL_Delay(50); GPIOC->ODR^=(1<<13); HAL_Delay(50); GPIOC->ODR^=(1<<13); HAL_Delay(50); GPIOC->ODR^=(1<<13); HAL_Delay(50); GPIOC->ODR^=(1<<13); HAL_Delay(50); GPIOC->ODR^=(1<<13); HAL_Delay(50); GPIOC->ODR^=(1<<13); HAL_Delay(50); GPIOC->ODR^=(1<<13); HAL_Delay(50); GPIOC->ODR^=(1<<13); HAL_Delay(50); GPIOC->ODR&=~(1<<13); //DS18B20_Init(GPIOA, GPIO_PIN_1); MODBUS_FirstInit(); uint8_t uart_byte = 0; RS_Receive_IT(&hmodbus1, &MODBUS_MSG); //HAL_UART_Receive_IT(&huart1, &uart_byte, 1); Dallas_BusFirstInit(&htim1); // инициализация по порядку найденных датчиков // Инициализация по индексу (порядковому номеру найденного датчика) for ( int i=0; iRomCnt;i++) { // Инициализация по ROM-адресу //sens[i].Init.init_func = &Dallas_SensorInitByROM; // sens[i].Init.InitParam.ROM = rom_address; sens[i].Init.InitParam.Ind = i; sens[i].Init.init_func = &Dallas_SensorInitByInd; sens[i].Init.Resolution = DALLAS_CONFIG_9_BITS; sens[i].set_temp =20.; sens[i].hyst =3; Dallas_AddNewSensors(&hdallas, &sens[i]); } /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { if (init) { init=0; MB_DATA.Coils.init_param=0; for(int i=0;iRomCnt;i++) { MB_DATA.HoldRegs.set_Temp[i]=21; } // init_all_T_sense(); //DS18B20_Search(&DS, &OW); } init=MB_DATA.Coils.init_param; Dallas_StartConvertTAll(&hdallas,DALLAS_WAIT_BUS,0); for(int i=0;iRomCnt;i++) { Dallas_ReadTemperature(&sens[i]); sens[i].set_temp = MB_DATA.HoldRegs.set_Temp[i]; MB_DATA.InRegs.sens_Temp[i]=sens[i].temperature*10; if (sens[i].temperatureODR|=1<<13; MB_DATA.Coils.coils.all|=1<sens[i].set_temp+sens[i].hyst) { GPIOC->ODR&=~(1<<13); MB_DATA.Coils.coils.all&=~(1<KR = 0xAAAA; // Сбросить таймер } //void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) //{ // if (huart->Instance == USART1) // { // if(first_in) // { // first_in=0; // rx_index = 0; // // } // // // // static uint8_t ch; // HAL_UART_Receive_IT(&huart1, &ch, 1); // if (ch == '\r' || ch == '\n') // { // rx_buffer[rx_index] = 0; // command_ready = 1; // rx_index = 0; // first_in=1; // // } // else // { // if (rx_index < sizeof(rx_buffer) - 1) // { // rx_buffer[rx_index++] = ch; // } // } // } //} //uint16_t handle_valves(TEMP* tmp_sense ) //{ // // if (temp_sense[0].state==STATE_OPEN_VALVE) // { // GPIOC->ODR|=1<<14; // } // else // if (temp_sense[0].state==STATE_CLOSE_VALVE) // { // GPIOC->ODR&=~(1<<14); // } // // return 1; // //} //void init_all_T_sense(void) //{ // //ds_search_devices(); // for(int i=0;iRomCnt;i++) //{ // temp_sense[i].id[0]=roms[i][0]<<0|roms[i][1]<<8|roms[i][2]<<16|roms[i][3]<<24; // temp_sense[i].id[1]=roms[i][4]<<0|roms[i][5]<<8|roms[i][6]<<16|roms[i][7]<<24; // temp_sense[i].count =i+1; // temp_sense[i].location=1; // temp_sense[i].t_open=22; // temp_sense[i].t_close=18; // temp_sense[i].status_T_sense=1; //} //} /* USER CODE END 4 */ /** * @brief Period elapsed callback in non blocking mode * @note This function is called when TIM3 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 == TIM3) { 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) { } /* 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 */