/** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** ** This notice applies to any and all portions of this file * that are not between comment pairs USER CODE BEGIN and * USER CODE END. Other portions of this file, whether * inserted by the user or by software development tools * are owned by their respective copyright owners. * * COPYRIGHT(c) 2019 STMicroelectronics * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of STMicroelectronics nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "stm32f1xx_hal.h" #include "tim.h" #include "adc.h" #include "can.h" #include "dma.h" #include "iwdg.h" #include "usart.h" #include "gpio.h" #include "iwdg.h" /* USER CODE BEGIN Includes */ #include "key_drivers.h" #include "var.h" #include "eeprom.h" #include "tasks.h" #include "app_loader.h" #include "stm32fxx_STUlib.h" #include "rtc.h" #include "functional_safety_key.h" /* USER CODE END Includes */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ uint8_t TimeBase_10ms=0; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP */ /* Private function prototypes -----------------------------------------------*/ void STU_TimeBase(void); /* USER CODE END PFP */ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * @brief The application entry point. * * @retval None */ int main(void) { /* USER CODE BEGIN 1 */ IAP_Init(); /* USER CODE END 1 */ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* MCU Configuration----------------------------------------------------------*/ MX_GPIO_Init(); MX_TIM1_Init(); MX_TIM2_Init(); MX_DMA_Init(); MX_ADC1_Init(); MX_USART1_UART_Init(); LED_INIT_ALL(); MX_CAN_Init(); // MX_RTC_Init(); STU_InitRunTimeChecks(); /* USER CODE BEGIN Init */ HAL_TIM_Base_Start(&htim2); ADC_Start(); //ADC启动 Var_Init(); //变量初始化 EEPROM_Check(); //EEPROM参数检测 KeyInitial(); //第一次发送握手指令给TE SendUartDataToTE(ID_CDL_TO_PBU_TE, MODE_REPORT, 0x8800, (uint8_t*)NULL); PBU_PowerOn_Process.PowerOnTimeCnt=SysTime_5ms; do { Uart_RxData_Process(&UART_RxBuff_Struct1, 500); CAN_RxData_Process(&CAN_RxBuf_Struct_CDL, 500); if(PBU_TE_Status == UPDATE_ING) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); } else if(PBU_TE_Status == UPDATE_FINISH) { HAL_Delay(20); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); } else { if( TimeCntDiff_5ms(PBU_PowerOn_Process.PowerOnTimeCnt) > 10 ) { PBU_PowerOn_Process.PowerOnTimeCnt=SysTime_5ms; PBU_PowerOn_Judge(); Power_Mos_Check(); //置标志后发送错误码 } } }while(PBU_PowerOn_Process.PowerKeyStatus == 0); /* USER CODE END Init */ /* USER CODE BEGIN SysInit */ HAL_Delay(1000); SendCfgToMC(); //发送电机配置参数 MC_Online_TimeCnt=SysTime_5ms; BMS_Online_TimeCnt=SysTime_5ms; Vin_test_TimeCnt=SysTime_5ms; /* USER CODE END SysInit */ /* USER CODE BEGIN 2 */ MX_IWDG_Init(); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ FSK_Process(); PBU_RunMode_Process(PBU_RunMode); Led_Process(); CanRx_Process(); Battery_Information_Process(); Uart_RxData_Process(&UART_RxBuff_Struct1, 200); PBU_PowerOn_Judge(); AutoPowerOff_Process(); PBU_Error_Process(); HAL_IWDG_Refresh(&hiwdg1); STU_TimeBase(); STU_DoRunTimeChecks(); } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_PeriphCLKInitTypeDef PeriphClkInit; /**Initializes the CPU, AHB and APB busses clocks */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.LSIState = RCC_LSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } /**Initializes the CPU, AHB and APB busses 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_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC; PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV8; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } /**Configure the Systick interrupt time */ HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); /**Configure the Systick */ HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); /* SysTick_IRQn interrupt configuration */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } /* USER CODE BEGIN 4 */ void STU_TimeBase(void) { STU_TestStatus ram_test; if(TimeBase_10ms >= 10 ) { TimeBase_10ms = 0; TimeBaseFlag = 0xAAAAAAAAuL; TimeBaseFlagInv = 0x55555555uL; /*--------------------------------------------------------------------------*/ /* --------------------- RAM functional test -------------------*/ /*--------------------------------------------------------------------------*/ __disable_irq(); ram_test = STU_RamRun(); __enable_irq(); switch ( ram_test ) { case TEST_RUNNING: break; case TEST_OK: break; case TEST_FAILURE: case CLASS_C_DATA_FAIL: default: FailSafePOR(); break; } } } /* USER CODE END 4 */ /** * @brief This function is executed in case of error occurrence. * @param file: The file name as string. * @param line: The line in file as a number. * @retval None */ void _Error_Handler(char *file, int line) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ 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, tex: 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****/