main.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683
  1. /* USER CODE BEGIN Header */
  2. /**
  3. ******************************************************************************
  4. * @file : main.c
  5. * @brief : Main program body
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * Copyright (c) 2023 STMicroelectronics.
  10. * All rights reserved.
  11. *
  12. * This software is licensed under terms that can be found in the LICENSE file
  13. * in the root directory of this software component.
  14. * If no LICENSE file comes with this software, it is provided AS-IS.
  15. *
  16. ******************************************************************************
  17. */
  18. /* USER CODE END Header */
  19. /* Includes ------------------------------------------------------------------*/
  20. #include "main.h"
  21. #include "cmsis_os.h"
  22. #include "adc.h"
  23. #include "dma.h"
  24. #include "tim.h"
  25. #include "usart.h"
  26. #include "gpio.h"
  27. /* Private includes ----------------------------------------------------------*/
  28. /* USER CODE BEGIN Includes */
  29. /* USER CODE END Includes */
  30. /* Private typedef -----------------------------------------------------------*/
  31. /* USER CODE BEGIN PTD */
  32. /* USER CODE END PTD */
  33. /* Private define ------------------------------------------------------------*/
  34. /* USER CODE BEGIN PD */
  35. /* USER CODE END PD */
  36. /* Private macro -------------------------------------------------------------*/
  37. /* USER CODE BEGIN PM */
  38. /* USER CODE END PM */
  39. /* Private variables ---------------------------------------------------------*/
  40. /* USER CODE BEGIN PV */
  41. int spr000;
  42. uint8_t data_to_send[50];
  43. uint16_t CRC_value = 0;
  44. uint16_t initial_address = 0x00C1;
  45. uint16_t BaudrateValue = 0x0000;
  46. uint16_t Adc2_CalibrationValue ;
  47. uint16_t Adc3_CalibrationValue ;
  48. uint32_t System_version = Version_sys;
  49. uint8_t Rx_Flag = 0;
  50. uint8_t gpioaStatus = 0;
  51. uint8_t gpiobStatus = 0;
  52. uint8_t bufMain[128] = {0};
  53. uint8_t Rx_Buf[Rx_Max] = {0};
  54. uint16_t Rx_Len = 0;
  55. /* USER CODE END PV */
  56. /* Private function prototypes -----------------------------------------------*/
  57. void SystemClock_Config(void);
  58. void MX_FREERTOS_Init(void);
  59. /* USER CODE BEGIN PFP */
  60. /* USER CODE END PFP */
  61. /* Private user code ---------------------------------------------------------*/
  62. /* USER CODE BEGIN 0 */
  63. /* USER CODE END 0 */
  64. /**
  65. * @brief The application entry point.
  66. * @retval int
  67. */
  68. int main(void)
  69. {
  70. /* USER CODE BEGIN 1 */
  71. #if IR_ROM1 == 0x08000000
  72. Start_BootLoader();
  73. #else
  74. SCB->VTOR = 0x08020000;
  75. __set_PRIMASK(0);
  76. #endif
  77. /* USER CODE END 1 */
  78. /* MCU Configuration--------------------------------------------------------*/
  79. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  80. HAL_Init();
  81. /* USER CODE BEGIN Init */
  82. /* USER CODE END Init */
  83. /* Configure the system clock */
  84. SystemClock_Config();
  85. /* USER CODE BEGIN SysInit */
  86. /* USER CODE END SysInit */
  87. /* Initialize all configured peripherals */
  88. MX_GPIO_Init();
  89. MX_DMA_Init();
  90. MX_USART1_UART_Init();
  91. MX_ADC1_Init();
  92. MX_TIM2_Init();
  93. MX_USART3_UART_Init();
  94. /* USER CODE BEGIN 2 */
  95. HAL_TIM_Base_Start_IT(&htim2);
  96. read_new_address(ADDR_FLASH_PAGE_94);
  97. updatePbStatus(read_flash_16(ADDR_FLASH_PAGE_104));
  98. update_baudrate(read_flash_16(ADDR_FLASH_PAGE_114));
  99. AdcCalibration_init();
  100. spr000 = sprintf((char*)bufMain, "system reboot...");
  101. HAL_UART_Transmit(&huart1, bufMain, spr000, 300);
  102. HAL_UART_Receive_DMA(&huart1,USART2_RX_BUF,Uart2_BUF_SIZE);
  103. __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
  104. /* USER CODE END 2 */
  105. /* Call init function for freertos objects (in freertos.c) */
  106. MX_FREERTOS_Init();
  107. /* Start scheduler */
  108. osKernelStart();
  109. /* We should never get here as control is now taken by the scheduler */
  110. /* Infinite loop */
  111. /* USER CODE BEGIN WHILE */
  112. while (1)
  113. {
  114. /* USER CODE END WHILE */
  115. /* USER CODE BEGIN 3 */
  116. }
  117. /* USER CODE END 3 */
  118. }
  119. /**
  120. * @brief System Clock Configuration
  121. * @retval None
  122. */
  123. void SystemClock_Config(void)
  124. {
  125. RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  126. RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  127. RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  128. /** Initializes the RCC Oscillators according to the specified parameters
  129. * in the RCC_OscInitTypeDef structure.
  130. */
  131. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  132. RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  133. RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  134. RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  135. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  136. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  137. RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  138. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  139. {
  140. Error_Handler();
  141. }
  142. /** Initializes the CPU, AHB and APB buses clocks
  143. */
  144. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  145. |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  146. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  147. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  148. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  149. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  150. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  151. {
  152. Error_Handler();
  153. }
  154. PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
  155. PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
  156. if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  157. {
  158. Error_Handler();
  159. }
  160. }
  161. /* USER CODE BEGIN 4 */
  162. uint16_t read_flash_16(uint32_t addr){
  163. uint16_t data = *(volatile uint16_t*)addr; // 从Flash中读取2个字节
  164. return data;
  165. }
  166. void read_new_address(uint32_t addr){
  167. uint16_t init_address = read_flash_16(addr);
  168. if(init_address == 0xFFFF) {
  169. initial_address = initial_address;
  170. } else {
  171. initial_address = init_address; // 读取新地址并赋值给initial_address
  172. }
  173. }
  174. void erase_flash(uint32_t ADDR_FLASH){ //进行擦除
  175. FLASH_EraseInitTypeDef erase_init;
  176. erase_init.TypeErase = FLASH_TYPEERASE_PAGES; // 擦除类型为页擦除
  177. erase_init.PageAddress = ADDR_FLASH;
  178. erase_init.NbPages = 1; // 擦除的页数
  179. uint32_t page_error = 0;
  180. HAL_FLASH_Unlock(); // 解锁Flash
  181. HAL_StatusTypeDef status = HAL_FLASHEx_Erase(&erase_init, &page_error); // 执行擦除操作
  182. HAL_FLASH_Lock(); // 上锁Flash
  183. if(status == HAL_OK){
  184. if(ADDR_FLASH == ADDR_FLASH_PAGE_94) {
  185. initial_address = 0; // 将initial_address清零
  186. }
  187. else if(ADDR_FLASH == ADDR_FLASH_PAGE_104) {
  188. gpiobStatus = 0; // 将pb_status清零
  189. }
  190. else if(ADDR_FLASH == ADDR_FLASH_PAGE_114) {
  191. BaudrateValue = 0xFFFF;
  192. }
  193. else if(ADDR_FLASH == ADDR_FLASH_PAGE_124) {
  194. Adc2_CalibrationValue = 0x0000; // 清零
  195. }
  196. else if(ADDR_FLASH == ADDR_FLASH_PAGE_134) {
  197. Adc3_CalibrationValue = 0x0000; // 清零
  198. }
  199. }
  200. }
  201. void Write_Information(uint32_t addr, uint8_t* rx_buffer, uint8_t buffer_index) {
  202. uint16_t newValue = 0;
  203. erase_flash(addr);
  204. HAL_FLASH_Unlock(); // 解锁Flash
  205. if (addr == ADDR_FLASH_PAGE_94) { // 写入地址到Flash
  206. newValue = rx_buffer[buffer_index];
  207. HAL_StatusTypeDef status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ADDR_FLASH_PAGE_94, newValue);
  208. if (status == HAL_OK) {
  209. initial_address = newValue; // 将新地址赋值给initial_address
  210. }
  211. }
  212. else if (addr == ADDR_FLASH_PAGE_104) { // 写入PB状态到Flash
  213. newValue = rx_buffer[buffer_index];
  214. HAL_StatusTypeDef status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ADDR_FLASH_PAGE_104, newValue);
  215. if (status == HAL_OK) {
  216. gpiobStatus = newValue; // 将新状态赋值给gpiobStatus
  217. }
  218. }
  219. else if (addr == ADDR_FLASH_PAGE_114) { // 写入波特率到Flash
  220. newValue = rx_buffer[buffer_index];
  221. HAL_StatusTypeDef status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ADDR_FLASH_PAGE_114, newValue);
  222. if (status == HAL_OK) {
  223. BaudrateValue = newValue; // 将新状态赋值给BaudrateValue
  224. }
  225. }
  226. else if (addr == ADDR_FLASH_PAGE_124 || addr == ADDR_FLASH_PAGE_134) { // 写入ADC校准值到Flash
  227. uint16_t Standard_value = (0.6 / (3.3 / 4096));
  228. if (addr == ADDR_FLASH_PAGE_124) {
  229. if (adc2_rawValue >= Standard_value) {
  230. newValue = adc2_rawValue - Standard_value;
  231. } else {
  232. newValue = Standard_value - adc2_rawValue;
  233. newValue |= 0x8000;
  234. }
  235. HAL_StatusTypeDef status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ADDR_FLASH_PAGE_124, newValue);
  236. if (status == HAL_OK) {
  237. Adc2_CalibrationValue = newValue & 0x7FFF;
  238. Value_old_addr2 = newValue;
  239. }
  240. } else if (addr == ADDR_FLASH_PAGE_134) {
  241. if (adc3_rawValue >= Standard_value) {
  242. newValue = adc3_rawValue - Standard_value;
  243. } else {
  244. newValue = Standard_value - adc3_rawValue;
  245. newValue |= 0x8000;
  246. }
  247. HAL_StatusTypeDef status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ADDR_FLASH_PAGE_134, newValue);
  248. if (status == HAL_OK) {
  249. Adc3_CalibrationValue = newValue & 0x7FFF;
  250. Value_old_addr3 = newValue;
  251. }
  252. }
  253. }
  254. HAL_FLASH_Lock(); // 上锁Flash
  255. }
  256. void delay_sys_us(uint32_t Delay)//1个delay,大概1.5us
  257. {
  258. uint32_t cnt = Delay * 8;
  259. uint32_t i = 0;
  260. for(i = 0; i < cnt; i++)__NOP();
  261. }
  262. void ModBus(void) {
  263. if (Rx_Flag == 1 && (calculate_crc(Rx_Buf,6) == (Rx_Buf[7] << 8 | Rx_Buf[6])) && data_lengthU2 < 10) {
  264. if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x01 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x01){
  265. uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x02, 0x00, gpioaStatus, 0x00, 0x00};
  266. uint16_t CRC_value = calculate_crc(data_to_send, 5);
  267. data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
  268. data_to_send[6] = (uint8_t)(CRC_value >> 8);
  269. HAL_UART_Transmit(&huart1, data_to_send, 7, 6);
  270. memset(Rx_Buf, 0, sizeof(Rx_Buf));
  271. memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);
  272. Rx_Flag = 0;
  273. HAL_UART_AbortReceive(&huart1);
  274. HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE);
  275. }
  276. else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x02 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x01){
  277. uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x02, 0x00, gpiobStatus, 0x00, 0x00};
  278. uint16_t CRC_value = calculate_crc(data_to_send, 5);
  279. data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
  280. data_to_send[6] = (uint8_t)(CRC_value >> 8);
  281. HAL_UART_Transmit(&huart1, data_to_send, 7, 6);
  282. memset(Rx_Buf, 0, sizeof(Rx_Buf));
  283. memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);
  284. Rx_Flag = 0;
  285. HAL_UART_AbortReceive(&huart1);
  286. HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE);
  287. }
  288. else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x03 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x01){
  289. uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x02, adc2_byte1, adc2_byte2, 0x00, 0x00};
  290. uint16_t CRC_value = calculate_crc(data_to_send, 5);
  291. data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
  292. data_to_send[6] = (uint8_t)(CRC_value >> 8);
  293. HAL_UART_Transmit(&huart1, data_to_send, 7, 6);
  294. memset(Rx_Buf, 0, sizeof(Rx_Buf));
  295. memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);
  296. Rx_Flag = 0;
  297. HAL_UART_AbortReceive(&huart1);
  298. HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE);
  299. }
  300. else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x04 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x01){
  301. uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x02, adc3_byte1, adc3_byte2, 0x00, 0x00};
  302. uint16_t CRC_value = calculate_crc(data_to_send, 5);
  303. data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
  304. data_to_send[6] = (uint8_t)(CRC_value >> 8);
  305. HAL_UART_Transmit(&huart1, data_to_send, 7, 6);
  306. memset(Rx_Buf, 0, sizeof(Rx_Buf));
  307. memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);
  308. Rx_Flag = 0;
  309. HAL_UART_AbortReceive(&huart1);
  310. HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE);
  311. }
  312. else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x05 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x01){
  313. uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x02, adc1_byte1, adc1_byte2, 0x00, 0x00};
  314. uint16_t CRC_value = calculate_crc(data_to_send, 5);
  315. data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
  316. data_to_send[6] = (uint8_t)(CRC_value >> 8);
  317. HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 6);
  318. memset(Rx_Buf, 0, sizeof(Rx_Buf));
  319. memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);
  320. Rx_Flag = 0;
  321. HAL_UART_AbortReceive(&huart1);
  322. HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE);
  323. }
  324. else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x01 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x02){
  325. uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x04, 0x00, gpioaStatus, 0x00, gpiobStatus, 0x00, 0x00};
  326. uint16_t CRC_value = calculate_crc(data_to_send, 7);
  327. data_to_send[7] = (uint8_t)(CRC_value & 0xFF);
  328. data_to_send[8] = (uint8_t)(CRC_value >> 8);
  329. HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 9, 8);
  330. memset(Rx_Buf, 0, sizeof(Rx_Buf));
  331. memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);
  332. Rx_Flag = 0;
  333. HAL_UART_AbortReceive(&huart1);
  334. HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE);
  335. }
  336. else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x01 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x03){
  337. uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x06, 0x00, gpioaStatus, 0x00, gpiobStatus, adc2_byte1, adc2_byte2, 0x00, 0x00};
  338. uint16_t CRC_value = calculate_crc(data_to_send, 9);
  339. data_to_send[9] = (uint8_t)(CRC_value & 0xFF);
  340. data_to_send[10] = (uint8_t)(CRC_value >> 8);
  341. HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 11, 10);
  342. memset(Rx_Buf, 0, sizeof(Rx_Buf));
  343. memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);
  344. Rx_Flag = 0;
  345. HAL_UART_AbortReceive(&huart1);
  346. HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE);
  347. }
  348. else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x01 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x04){
  349. uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x08, 0x00, gpioaStatus, 0x00, gpiobStatus, adc2_byte1, adc2_byte2, adc3_byte1, adc3_byte2, 0x00, 0x00};
  350. uint16_t CRC_value = calculate_crc(data_to_send, 11);
  351. data_to_send[11] = (uint8_t)(CRC_value & 0xFF);
  352. data_to_send[12] = (uint8_t)(CRC_value >> 8);
  353. HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 13, 12);
  354. memset(Rx_Buf, 0, sizeof(Rx_Buf));
  355. memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);
  356. Rx_Flag = 0;
  357. HAL_UART_AbortReceive(&huart1);
  358. HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE);
  359. }
  360. else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x01 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x05){
  361. uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x0A, 0x00, gpioaStatus, 0x00, gpiobStatus, adc2_byte1, adc2_byte2, adc3_byte1, adc3_byte2, adc1_byte1, adc1_byte2, 0x00, 0x00};
  362. uint16_t CRC_value = calculate_crc(data_to_send, 13);
  363. data_to_send[13] = (uint8_t)(CRC_value & 0xFF);
  364. data_to_send[14] = (uint8_t)(CRC_value >> 8);
  365. HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 15, 14);
  366. memset(Rx_Buf, 0, sizeof(Rx_Buf));
  367. memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);
  368. Rx_Flag = 0;
  369. HAL_UART_AbortReceive(&huart1);
  370. HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE);
  371. }
  372. else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x02 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x02){
  373. uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x04, 0x00, gpiobStatus, adc2_byte1, adc2_byte2, 0x00, 0x00};
  374. uint16_t CRC_value = calculate_crc(data_to_send, 7);
  375. data_to_send[7] = (uint8_t)(CRC_value & 0xFF);
  376. data_to_send[8] = (uint8_t)(CRC_value >> 8);
  377. HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 9, 8);
  378. memset(Rx_Buf, 0, sizeof(Rx_Buf));
  379. memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);
  380. Rx_Flag = 0;
  381. HAL_UART_AbortReceive(&huart1);
  382. HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE);
  383. }
  384. else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x02 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x03){
  385. uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x06, 0x00, gpiobStatus, adc2_byte1, adc2_byte2, adc3_byte1, adc3_byte2, 0x00, 0x00};
  386. uint16_t CRC_value = calculate_crc(data_to_send, 9);
  387. data_to_send[9] = (uint8_t)(CRC_value & 0xFF);
  388. data_to_send[10] = (uint8_t)(CRC_value >> 8);
  389. HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 11, 10);
  390. memset(Rx_Buf, 0, sizeof(Rx_Buf));
  391. memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);
  392. Rx_Flag = 0;
  393. HAL_UART_AbortReceive(&huart1);
  394. HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE);
  395. }
  396. else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x02 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x04){
  397. uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x08, 0x00, gpiobStatus, adc2_byte1, adc2_byte2, adc3_byte1, adc3_byte2, adc1_byte1, adc1_byte2, 0x00, 0x00};
  398. uint16_t CRC_value = calculate_crc(data_to_send, 11);
  399. data_to_send[11] = (uint8_t)(CRC_value & 0xFF);
  400. data_to_send[12] = (uint8_t)(CRC_value >> 8);
  401. HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 13, 12);
  402. memset(Rx_Buf, 0, sizeof(Rx_Buf));
  403. memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);
  404. Rx_Flag = 0;
  405. HAL_UART_AbortReceive(&huart1);
  406. HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE);
  407. }
  408. else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x03 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x02){
  409. uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x04, adc2_byte1, adc2_byte2, adc3_byte1, adc3_byte2, 0x00, 0x00};
  410. uint16_t CRC_value = calculate_crc(data_to_send, 7);
  411. data_to_send[7] = (uint8_t)(CRC_value & 0xFF);
  412. data_to_send[8] = (uint8_t)(CRC_value >> 8);
  413. HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 9, 8);
  414. memset(Rx_Buf, 0, sizeof(Rx_Buf));
  415. memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);
  416. Rx_Flag = 0;
  417. HAL_UART_AbortReceive(&huart1);
  418. HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE);
  419. }
  420. else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x03 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x03){
  421. uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x06, adc2_byte1, adc2_byte2, adc3_byte1, adc3_byte2, adc1_byte1, adc1_byte2, 0x00, 0x00};
  422. uint16_t CRC_value = calculate_crc(data_to_send, 9);
  423. data_to_send[9] = (uint8_t)(CRC_value & 0xFF);
  424. data_to_send[10] = (uint8_t)(CRC_value >> 8);
  425. HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 11, 10);
  426. memset(Rx_Buf, 0, sizeof(Rx_Buf));
  427. memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);
  428. Rx_Flag = 0;
  429. HAL_UART_AbortReceive(&huart1);
  430. HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE);
  431. }
  432. else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x04 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x02){
  433. uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x04, adc3_byte1, adc3_byte2, adc1_byte1, adc1_byte2, 0x00, 0x00};
  434. uint16_t CRC_value = calculate_crc(data_to_send, 7);
  435. data_to_send[7] = (uint8_t)(CRC_value & 0xFF);
  436. data_to_send[8] = (uint8_t)(CRC_value >> 8);
  437. HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 9, 8);
  438. memset(Rx_Buf, 0, sizeof(Rx_Buf));
  439. memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);
  440. Rx_Flag = 0;
  441. HAL_UART_AbortReceive(&huart1);
  442. HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE);
  443. }
  444. else if(Rx_Buf[0] == 0xFA && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0xAA && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x01){
  445. uint8_t data_to_send[] = {0xFA, 0x03, 0x02, 0x00, (uint8_t)initial_address, 0x00, 0x00};
  446. uint16_t CRC_value = calculate_crc(data_to_send, 5);
  447. data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
  448. data_to_send[6] = (uint8_t)(CRC_value >> 8);
  449. HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 6);
  450. memset(Rx_Buf, 0, sizeof(Rx_Buf));
  451. memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);
  452. Rx_Flag = 0;
  453. HAL_UART_AbortReceive(&huart1);
  454. HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE);
  455. }
  456. else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0xBB && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x02){
  457. uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x04, (uint8_t)(System_version >> 24), (uint8_t)(System_version >> 16), (uint8_t)(System_version >> 8), (uint8_t)(System_version ), 0x00, 0x00};
  458. uint16_t CRC_value = calculate_crc(data_to_send, 7);
  459. data_to_send[7] = (uint8_t)(CRC_value & 0xFF);
  460. data_to_send[8] = (uint8_t)(CRC_value >> 8);
  461. HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 9, 8);
  462. memset(Rx_Buf, 0, sizeof(Rx_Buf));
  463. memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);
  464. Rx_Flag = 0;
  465. HAL_UART_AbortReceive(&huart1);
  466. HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE);
  467. }
  468. else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x06 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x02 && Rx_Buf[4] == 0x00){
  469. updatePbStatus(Rx_Buf[5]);
  470. Write_Information(ADDR_FLASH_PAGE_104, Rx_Buf, 5); // 写入Flash
  471. uint8_t data_to_send[] = {(uint8_t)initial_address, 0x06, 0x02, 0x00, Rx_Buf[5], 0x00, 0x00};
  472. uint16_t CRC_value = calculate_crc(data_to_send, 5);
  473. data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
  474. data_to_send[6] = (uint8_t)(CRC_value >> 8);
  475. HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 7);
  476. memset(Rx_Buf, 0, sizeof(Rx_Buf));
  477. memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);
  478. Rx_Flag = 0;
  479. HAL_UART_AbortReceive(&huart1);
  480. HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE);
  481. }
  482. else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x06 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x0A && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x01){
  483. Write_Information(ADDR_FLASH_PAGE_124, Rx_Buf, 0);
  484. uint16_t now_calibrationValue = Adc2_CalibrationValue;
  485. uint8_t data_to_send[] = {(uint8_t)initial_address, 0x06, 0x02, (uint8_t)((now_calibrationValue >> 8) & 0xFF), (uint8_t)(now_calibrationValue & 0xFF), 0x00, 0x00};
  486. uint16_t CRC_value = calculate_crc(data_to_send, 5);
  487. data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
  488. data_to_send[6] = (uint8_t)(CRC_value >> 8);
  489. HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 7);
  490. memset(Rx_Buf, 0, sizeof(Rx_Buf));
  491. memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);
  492. Rx_Flag = 0;
  493. HAL_UART_AbortReceive(&huart1);
  494. HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE);
  495. }
  496. else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x06 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x0B && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x01){
  497. Write_Information(ADDR_FLASH_PAGE_134, Rx_Buf, 0);
  498. uint16_t now_calibrationValue = Adc3_CalibrationValue;
  499. uint8_t data_to_send[] = {(uint8_t)initial_address, 0x06, 0x02, (uint8_t)((now_calibrationValue >> 8) & 0xFF), (uint8_t)(now_calibrationValue & 0xFF), 0x00, 0x00};
  500. uint16_t CRC_value = calculate_crc(data_to_send, 5);
  501. data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
  502. data_to_send[6] = (uint8_t)(CRC_value >> 8);
  503. HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 7);
  504. memset(Rx_Buf, 0, sizeof(Rx_Buf));
  505. memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);
  506. Rx_Flag = 0;
  507. HAL_UART_AbortReceive(&huart1);
  508. HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE);
  509. }
  510. else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x06 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x0C && Rx_Buf[4] == 0x00){
  511. update_baudrate(Rx_Buf[5]);
  512. Write_Information(ADDR_FLASH_PAGE_114, Rx_Buf, 5); // 写入Flash
  513. uint8_t data_to_send[] = {(uint8_t)initial_address, 0x06, 0x00, 0x0C, 0x00, Rx_Buf[5], 0x00, 0x00};
  514. uint16_t CRC_value = calculate_crc(data_to_send, 6);
  515. data_to_send[6] = (uint8_t)(CRC_value & 0xFF);
  516. data_to_send[7] = (uint8_t)(CRC_value >> 8);
  517. HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 8, 8);
  518. memset(Rx_Buf, 0, sizeof(Rx_Buf));
  519. memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);
  520. Rx_Flag = 0;
  521. HAL_UART_AbortReceive(&huart1);
  522. HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE);
  523. }
  524. else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x06 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0xAA && Rx_Buf[4] == 0x00){
  525. Write_Information(ADDR_FLASH_PAGE_94, Rx_Buf, 5); // 写入Flash
  526. uint8_t data_to_send[] = {(uint8_t)initial_address, 0x06, 0x02, 0x00, (uint8_t)initial_address, 0x00, 0x00};
  527. uint16_t CRC_value = calculate_crc(data_to_send, 5);
  528. data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
  529. data_to_send[6] = (uint8_t)(CRC_value >> 8);
  530. HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 7);
  531. memset(Rx_Buf, 0, sizeof(Rx_Buf));
  532. memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);
  533. Rx_Flag = 0;
  534. HAL_UART_AbortReceive(&huart1);
  535. HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE);
  536. }
  537. else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x06 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0xCC && Rx_Buf[4] == 0xA5 && Rx_Buf[5] == 0x5A){
  538. Rx_Flag = 0; // 将标志位重新置为0
  539. memset(Rx_Buf,0,sizeof(Rx_Buf));
  540. memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);
  541. HAL_NVIC_SystemReset();
  542. }
  543. else {
  544. memset(Rx_Buf, 0, sizeof(Rx_Buf));
  545. memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);
  546. Rx_Flag = 0;
  547. HAL_UART_AbortReceive(&huart1);
  548. HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE);
  549. }
  550. }
  551. }
  552. void reboot_sys(void)
  553. {
  554. __disable_irq();
  555. HAL_NVIC_SystemReset();
  556. }
  557. /* USER CODE END 4 */
  558. /**
  559. * @brief Period elapsed callback in non blocking mode
  560. * @note This function is called when TIM3 interrupt took place, inside
  561. * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment
  562. * a global variable "uwTick" used as application time base.
  563. * @param htim : TIM handle
  564. * @retval None
  565. */
  566. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  567. {
  568. /* USER CODE BEGIN Callback 0 */
  569. /* USER CODE END Callback 0 */
  570. if (htim->Instance == TIM3) {
  571. HAL_IncTick();
  572. }
  573. /* USER CODE BEGIN Callback 1 */
  574. /* USER CODE END Callback 1 */
  575. }
  576. /**
  577. * @brief This function is executed in case of error occurrence.
  578. * @retval None
  579. */
  580. void Error_Handler(void)
  581. {
  582. /* USER CODE BEGIN Error_Handler_Debug */
  583. /* User can add his own implementation to report the HAL error return state */
  584. __disable_irq();
  585. while (1)
  586. {
  587. }
  588. /* USER CODE END Error_Handler_Debug */
  589. }
  590. #ifdef USE_FULL_ASSERT
  591. /**
  592. * @brief Reports the name of the source file and the source line number
  593. * where the assert_param error has occurred.
  594. * @param file: pointer to the source file name
  595. * @param line: assert_param error line source number
  596. * @retval None
  597. */
  598. void assert_failed(uint8_t *file, uint32_t line)
  599. {
  600. /* USER CODE BEGIN 6 */
  601. /* User can add his own implementation to report the file name and line number,
  602. ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  603. /* USER CODE END 6 */
  604. }
  605. #endif /* USE_FULL_ASSERT */