stm32fxx_STUstartup.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. #include "stm32f1xx_hal.h"
  2. #define ALLOC_GLOBALS
  3. #include "stm32fxx_STUlib.h"
  4. #include "motor_control.h"
  5. #include "power12V_driver.h"
  6. #include "tasks.h"
  7. #include "can.h"
  8. #include "gpio.h"
  9. #include "iwdg.h"
  10. #include "app_loader.h"
  11. #include "tim.h"
  12. #include "pwm_driver.h"
  13. #include "uart_process.h"
  14. #include "can_process.h"
  15. uint8_t FIT_testflag=1;
  16. //static uint32_t sRomTestData=0x55555555; //0x55555554
  17. CRC_HandleTypeDef CrcHandle = {0};
  18. void StartUpClock_Config_Reset(void);
  19. void STU_delay_ms(uint16_t time);
  20. #ifdef __CC_ARM /* KEIL Compiler */
  21. void $Sub$$main(void)
  22. {
  23. __disable_irq();
  24. if ( CRC_FLAG != 0xAAu )
  25. {
  26. STU_StartUp(); /* trick to call StartUp before main entry */
  27. }
  28. CRC_FLAG = 0u;
  29. __enable_irq();
  30. $Super$$main();
  31. }
  32. #endif /* __CC_ARM */
  33. void STU_StartUp(void)
  34. {
  35. uint32_t crc_result;
  36. uint32_t index;
  37. FIT_testflag = 10;
  38. /* Reset of all peripherals, Initializes the Flash interface and the Systick */
  39. HAL_Init();
  40. /*时钟倍频到72Mhz*/
  41. StartUpClock_Config();
  42. // /*FIT*/
  43. // FIT_rom_test();
  44. /* Initialization of counters for control flow monitoring */
  45. init_control_flow();
  46. /*--------------------------------------------------------------------------*/
  47. /*------------------- CPU registers test --------------------*/
  48. /*--------------------------------------------------------------------------*/
  49. control_flow_call(CPU_TEST_CALLER);
  50. STU_CpuTestStartup();
  51. control_flow_resume(CPU_TEST_CALLER);
  52. STU_CPURegsAddressing();
  53. FIT_testflag = 12;
  54. /*--------------------------------------------------------------------------*/
  55. /*--------------------- ROM CRC check ------------------------*/
  56. /*--------------------------------------------------------------------------*/
  57. control_flow_call(CRC32_TEST_CALLER);
  58. CrcHandle.Instance = CRC;
  59. __HAL_CRC_DR_RESET(&CrcHandle);
  60. HAL_CRC_Init(&CrcHandle);
  61. for(index = 0; index < (uint32_t)ROM_SIZEinWORDS; index++)
  62. {
  63. CRC->DR = (*((uint32_t *)ROM_START + index));
  64. }
  65. crc_result = CRC->DR;
  66. if(crc_result != *(uint32_t *)(&REF_CRC32))
  67. {
  68. /*ROM err*/
  69. FailSafePOR();
  70. }
  71. control_flow_resume(CRC32_TEST_CALLER);
  72. FIT_testflag = 14;
  73. /*--------------------------------------------------------------------------*/
  74. /* --------------------- Instruct and decode test -------------------*/
  75. /*--------------------------------------------------------------------------*/
  76. control_flow_call(INSTRUCT_AND_DECODE_TEST_CALLER);
  77. if(STU_InstructAndDecode() == ERROR)
  78. {
  79. FailSafePOR();
  80. }
  81. control_flow_resume(INSTRUCT_AND_DECODE_TEST_CALLER);
  82. FIT_testflag = 16;
  83. /*--------------------------------------------------------------------------*/
  84. /* --------------------- Addressing test -------------------*/
  85. /*--------------------------------------------------------------------------*/
  86. control_flow_call(ADDRESSING_TEST_CALLER);
  87. if(STU_AddressingTest() == ERROR)
  88. {
  89. FailSafePOR();
  90. }
  91. control_flow_resume(ADDRESSING_TEST_CALLER);
  92. FIT_testflag = 18;
  93. /*--------------------------------------------------------------------------*/
  94. /* --------------------- Peripheral Registers test -------------------*/
  95. /*--------------------------------------------------------------------------*/
  96. control_flow_call(PERIPHERAL_REGS_TEST_CALLER);
  97. if(STU_PeripheralRegistersTest() == ERROR)
  98. {
  99. FailSafePOR();
  100. }
  101. FIT_testflag = 20;
  102. /*做两次测试,确保0->1,1->0均能有效翻转*/
  103. if(STU_PeripheralRegistersTest() == ERROR)
  104. {
  105. FailSafePOR();
  106. }
  107. control_flow_resume(PERIPHERAL_REGS_TEST_CALLER);
  108. FIT_testflag = 22;
  109. /*--------------------------------------------------------------------------*/
  110. /* Verify Control flow before RAM init (which clears Ctrl flow counters) */
  111. /*--------------------------------------------------------------------------*/
  112. if (control_flow_check_point(STARTUP_CHECK) == ERROR)
  113. {
  114. FailSafePOR();
  115. }
  116. FIT_testflag = 24;
  117. /*--------------------------------------------------------------------------*/
  118. /* --------------------- RAM functional test -------------------*/
  119. /*--------------------------------------------------------------------------*/
  120. //__disable_irq();
  121. if(STU_FullRamWalkpat((uint32_t *)RAM_START ,RAM_SIZE) == ERROR)
  122. {
  123. FailSafePOR();
  124. }
  125. //__enable_irq();
  126. /*复位时钟到默认状态*/
  127. StartUpClock_Config_Reset();
  128. // FIT_testflag = 5;
  129. GotoCompilerStartUp();
  130. }
  131. void StartUpClock_Config(void)
  132. {
  133. RCC_OscInitTypeDef RCC_OscInitStruct;
  134. RCC_ClkInitTypeDef RCC_ClkInitStruct;
  135. RCC_PeriphCLKInitTypeDef PeriphClkInit;
  136. /**Initializes the CPU, AHB and APB busses clocks
  137. */
  138. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;
  139. RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  140. RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  141. RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  142. RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  143. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  144. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  145. RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  146. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  147. {
  148. _Error_Handler(__FILE__, __LINE__);
  149. }
  150. /**Initializes the CPU, AHB and APB busses clocks
  151. */
  152. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  153. |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  154. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  155. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  156. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  157. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  158. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  159. {
  160. _Error_Handler(__FILE__, __LINE__);
  161. }
  162. PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
  163. PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
  164. if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  165. {
  166. _Error_Handler(__FILE__, __LINE__);
  167. }
  168. /**Configure the Systick interrupt time
  169. */
  170. HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
  171. /**Configure the Systick
  172. */
  173. HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  174. /* SysTick_IRQn interrupt configuration */
  175. HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  176. }
  177. /**
  178. * @brief System Clock Configuration
  179. * @retval None
  180. */
  181. void StartUpClock_Config_Reset(void)
  182. {
  183. RCC_OscInitTypeDef RCC_OscInitStruct;
  184. RCC_ClkInitTypeDef RCC_ClkInitStruct;
  185. /**Initializes the CPU, AHB and APB busses clocks
  186. */
  187. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  188. RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  189. RCC_OscInitStruct.HSICalibrationValue = 16;
  190. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  191. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  192. {
  193. _Error_Handler(__FILE__, __LINE__);
  194. }
  195. /**Initializes the CPU, AHB and APB busses clocks
  196. */
  197. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  198. |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  199. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  200. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  201. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  202. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  203. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  204. {
  205. _Error_Handler(__FILE__, __LINE__);
  206. }
  207. /**Configure the Systick interrupt time
  208. */
  209. HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
  210. /**Configure the Systick
  211. */
  212. HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  213. /* SysTick_IRQn interrupt configuration */
  214. HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  215. }
  216. /**
  217. * @brief Verifies the consistency and value of control flow counters
  218. * @param : check value of the positive counter
  219. * @retval : ErrorStatus (SUCCESS, ERROR)
  220. */
  221. ErrorStatus control_flow_check_point(uint32_t chck)
  222. {
  223. ErrorStatus Result= SUCCESS;
  224. if ((CtrlFlowCnt != (chck)) || ((CtrlFlowCnt ^ CtrlFlowCntInv) != 0xFFFFFFFFuL))
  225. {
  226. Result= ERROR;
  227. }
  228. return(Result);
  229. }
  230. void FailSafePOR(void)
  231. {
  232. /*上电自检错误时需要初始化如下内容*/
  233. IAP_Init();
  234. MX_GPIO_Init();
  235. MX_TIM1_Init();
  236. /*开启总中断,系统滴答时钟才能计时*/
  237. __enable_irq();
  238. /*RAM全检查失败后,此变量需要重置,否则影响CAN初始化*/
  239. hcan.State = HAL_CAN_STATE_RESET;
  240. MX_CAN_Init();
  241. __disable_irq();
  242. #if DEBUG
  243. MX_IWDG_Init();
  244. #endif
  245. /*停止电机,关PWM定时器和IO口*/
  246. Pwm_Timer_Stop();
  247. Disable_PwmGpio_Out();
  248. //MCU故障
  249. MC_ErrorCode.Code = 0;
  250. MC_ErrorCode.ERROR_Bit.Fault_MCU = 1;
  251. while(1)
  252. {
  253. SendData(ID_MC_BC, MODE_REPORT, 0x1104, (uint8_t*)&MC_ErrorCode.Code);
  254. STU_delay_ms(200);
  255. //看门狗清零
  256. #if DEBUG
  257. HAL_IWDG_Refresh(&hiwdg);
  258. #endif
  259. }
  260. }
  261. void STU_delay_ms(uint16_t time)
  262. {
  263. uint16_t i=0;
  264. while(time--)
  265. {
  266. i=7500; //72MHZ主频,1ms
  267. while(i--) ;
  268. }
  269. }