Browse Source

add Baud Rate Modification

terry 2 years ago
parent
commit
77715f93a0

+ 1 - 1
.gitignore

@@ -6,7 +6,7 @@ Output
 *.sct /s
 *.htm /s
 *.iex /s
-JLinkLog.txt /s
+MDK-ARM/JLinkLog.txt
 *.dep /s  
 *.plg /s
 *.rpt /s

+ 5 - 2
Core/Inc/main.h

@@ -69,6 +69,7 @@ void write_flash_address(uint8_t* rx_buffer);
 void write_flash_PbStatus(uint8_t* rx_buffer);
 void write_flash_autoAdc(uint32_t ADDR_FLASH);
 void CoverADC(uint32_t ADDR);
+void write_flash_Baudrate(uint8_t* rx_buffer);
 /* USER CODE END EFP */
 
 /* Private defines -----------------------------------------------------------*/
@@ -78,9 +79,11 @@ void CoverADC(uint32_t ADDR);
 #define Modbus 1
 #define ADDR_FLASH_PAGE_61   ((uint32_t)0x0800A000)  // Flash扇区61的起始地址      address
 #define ADDR_FLASH_PAGE_62   ((uint32_t)0x0800C000)  // Flash扇区62的起始地址      PbStatus
-#define ADDR_FLASH_PAGE_63   ((uint32_t)0x0800E000)  // Flash扇区63的起始地址      Adc1_Calibration    温度
+#define ADDR_FLASH_PAGE_63   ((uint32_t)0x0800E000)  // Flash扇区63的起始地址      Baudrate
 #define ADDR_FLASH_PAGE_64   ((uint32_t)0x0800EC00)  // Flash扇区64的起始地址      Adc2_Calibration    4-20mA
-#define ADDR_FLASH_PAGE_65   ((uint32_t)0x0800F800)  // Flash扇区65的起始地址      Adc3_Calibration    预留
+#define ADDR_FLASH_PAGE_65   ((uint32_t)0x0800F000)  // Flash扇区65的起始地址      Adc3_Calibration    4-20mA
+#define ADDR_FLASH_PAGE_66   ((uint32_t)0x0800FC00)  // Flash扇区66的起始地址      
+
 /* USER CODE END Private defines */
 
 #ifdef __cplusplus

+ 1 - 1
Core/Inc/usart.h

@@ -44,7 +44,7 @@ void MX_USART1_UART_Init(void);
 void MX_USART3_UART_Init(void);
 
 /* USER CODE BEGIN Prototypes */
-
+void update_baudrate(uint16_t temp);
 /* USER CODE END Prototypes */
 
 #ifdef __cplusplus

+ 7 - 8
Core/Src/adc.c

@@ -166,13 +166,12 @@ void AdcCalibration_init(void)
 {
     Value_old_addr2 = read_flash_16(ADDR_FLASH_PAGE_64);
     Value_old_addr3 = read_flash_16(ADDR_FLASH_PAGE_65);
-    if (Value_old_addr2 != 0xffff) {
-        Adc2_CalibrationValue = Value_old_addr2;
-    }
-    if (Value_old_addr3 != 0xffff) {
-        Adc3_CalibrationValue = Value_old_addr3;
-    }
-}
+    
+    Adc2_CalibrationValue = Value_old_addr2 != 0xFFFF ? Value_old_addr2 : Adc2_CalibrationValue;
+    Adc3_CalibrationValue = Value_old_addr3 != 0xFFFF ? Value_old_addr3 : Adc3_CalibrationValue;
+    Adc2_CalibrationValue &= 0x7FFF;
+    Adc3_CalibrationValue &= 0x7FFF;
+} 
 
 void ApplyFilter(uint16_t raw_data, uint16_t* filtered_data, uint16_t* raw_data_buffer, uint8_t* buffer_index)
 {
@@ -182,7 +181,7 @@ void ApplyFilter(uint16_t raw_data, uint16_t* filtered_data, uint16_t* raw_data_
         sum += raw_data_buffer[i];
     }
     *filtered_data = (uint16_t)(sum / FILTER_LENGTH);
-    *buffer_index = (*buffer_index + 1) % FILTER_LENGTH;
+    *buffer_index = (*buffer_index + 1) % FILTER_LENGTH;	//Ö¸Ïò×î¾ÉµÄ
 }
 
 void GetADCResults(ADC_HandleTypeDef* hadc)

+ 3 - 0
Core/Src/gpio.c

@@ -76,6 +76,7 @@ void MX_GPIO_Init(void)
 
 uint8_t GetPaInputStatus(void)
 {
+    HAL_Delay(10);
     uint8_t gpio_idr_byte = GPIOA->IDR & 0xFF; // 获取GPIOA的低8位状态
     gpio_idr_byte ^= 0xFF; 
     return gpio_idr_byte;
@@ -83,6 +84,7 @@ uint8_t GetPaInputStatus(void)
 
 uint8_t GetPbOutputStatus(void)
 {
+    HAL_Delay(10);
     uint8_t gpio_odr_byte = (GPIOB->ODR >> 3) & 0x0F; // 读取GPIOB的3-6位的状态
     return gpio_odr_byte;
 }
@@ -102,6 +104,7 @@ void updatePbStatus(uint16_t temp)
     }
 }
 
+
 // 计算CRC校验值
 uint16_t calculate_crc(uint8_t* buffer, uint8_t length) 
 {

+ 103 - 58
Core/Src/main.c

@@ -55,7 +55,8 @@ int fputc(int ch, FILE *f)
 uint8_t data_to_send[300];
 uint16_t CRC_value = 0;
 uint16_t initial_address = 0x0000;
-uint32_t System_version  = 0x23050400;
+uint32_t System_version  = 0x23051100;
+uint16_t BaudrateValue = 0x0000;
 uint16_t Adc2_CalibrationValue ;
 uint16_t Adc3_CalibrationValue ;
 /* USER CODE END PV */
@@ -107,6 +108,7 @@ int main(void)
   HAL_TIM_Base_Start_IT(&htim2);
   read_new_address_from_flash(ADDR_FLASH_PAGE_61); 
   updatePbStatus(read_flash_16(ADDR_FLASH_PAGE_62));
+  update_baudrate(read_flash_16(ADDR_FLASH_PAGE_63));
   AdcCalibration_init();
 //  printf("init\r\n");
   /* USER CODE END 2 */
@@ -123,65 +125,65 @@ int main(void)
     if (flag == 1 && (calculate_crc(receive_buffer,6) == (receive_buffer[7] << 8 | receive_buffer[6]))) // 如果标志位为1
     {
         if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x01 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x01){
-            data_to_send[0] = (uint8_t)initial_address; // 将接收到的数据存储到一个新的数组中
+            data_to_send[0] = (uint8_t)initial_address; 
             data_to_send[1] = 0x03;
-            data_to_send[2] = 0x02; // 将接收到的数据存储到一个新的数组中
+            data_to_send[2] = 0x02;
             data_to_send[3] = 0x00; 
             data_to_send[4] = gpioaStatus;
             CRC_value = calculate_crc(data_to_send,5);
-            data_to_send[5] = (uint8_t)(CRC_value & 0xFF);; // 将接收到的数据存储到一个新的数组中
+            data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[6] = (uint8_t)(CRC_value >> 8);
-            HAL_UART_Transmit(&huart1, data_to_send, 7, 6); // 发送数据
+            HAL_UART_Transmit(&huart1, data_to_send, 7, 7); // 发送数据
             flag = 0; // 将标志位重新置为0
         }
 
         if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x02 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x01){
-            data_to_send[0] = (uint8_t)initial_address; // 将接收到的数据存储到一个新的数组中
+            data_to_send[0] = (uint8_t)initial_address; 
             data_to_send[1] = 0x03;
-            data_to_send[2] = 0x02; // 将接收到的数据存储到一个新的数组中
+            data_to_send[2] = 0x02; 
             data_to_send[3] = 0x00; 
             data_to_send[4] = gpiobStatus;
             CRC_value = calculate_crc(data_to_send,5);
-            data_to_send[5] = (uint8_t)(CRC_value & 0xFF);; // 将接收到的数据存储到一个新的数组中
+            data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[6] = (uint8_t)(CRC_value >> 8);
             HAL_UART_Transmit(&huart1, data_to_send, 7, 7); // 发送数据
             flag = 0; // 将标志位重新置为0
         }
         
         if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x03 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x01){
-            data_to_send[0] = (uint8_t)initial_address; // 将接收到的数据存储到一个新的数组中
+            data_to_send[0] = (uint8_t)initial_address; 
             data_to_send[1] = 0x03;
-            data_to_send[2] = 0x02; // 将接收到的数据存储到一个新的数组中
+            data_to_send[2] = 0x02; 
             data_to_send[3] = adc2_byte1; 
             data_to_send[4] = adc2_byte2;
             CRC_value = calculate_crc(data_to_send,5);
-            data_to_send[5] = (uint8_t)(CRC_value & 0xFF);; // 将接收到的数据存储到一个新的数组中
+            data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[6] = (uint8_t)(CRC_value >> 8);
             HAL_UART_Transmit(&huart1, data_to_send, 7, 7); // 发送数据
             flag = 0; // 将标志位重新置为0
         }
         
         if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x04 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x01){
-            data_to_send[0] = (uint8_t)initial_address; // 将接收到的数据存储到一个新的数组中
+            data_to_send[0] = (uint8_t)initial_address; 
             data_to_send[1] = 0x03;
-            data_to_send[2] = 0x02; // 将接收到的数据存储到一个新的数组中
+            data_to_send[2] = 0x02; 
             data_to_send[3] = adc3_byte1; 
             data_to_send[4] = adc3_byte2;
             CRC_value = calculate_crc(data_to_send,5);
-            data_to_send[5] = (uint8_t)(CRC_value & 0xFF);; // 将接收到的数据存储到一个新的数组中
+            data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[6] = (uint8_t)(CRC_value >> 8);
             HAL_UART_Transmit(&huart1, data_to_send, 7, 7); // 发送数据
             flag = 0; // 将标志位重新置为0
         }
         
         if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x05 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x01){
-            data_to_send[0] = (uint8_t)initial_address; // 将接收到的数据存储到一个新的数组中
+            data_to_send[0] = (uint8_t)initial_address; 
             data_to_send[1] = 0x03;
-            data_to_send[2] = 0x02; // 将接收到的数据存储到一个新的数组中
+            data_to_send[2] = 0x02;
             data_to_send[3] = adc1_byte1; 
             data_to_send[4] = adc1_byte2;
             CRC_value = calculate_crc(data_to_send,5);
-            data_to_send[5] = (uint8_t)(CRC_value & 0xFF);; // 将接收到的数据存储到一个新的数组中
+            data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[6] = (uint8_t)(CRC_value >> 8);
             HAL_UART_Transmit(&huart1, data_to_send, 7, 7); // 发送数据
             flag = 0; // 将标志位重新置为0
@@ -192,13 +194,13 @@ int main(void)
             write_flash_autoAdc(ADDR_FLASH_PAGE_64);
             uint16_t now_calibrationValue = Adc2_CalibrationValue;
             CoverADC(ADDR_FLASH_PAGE_64);
-            data_to_send[0] = (uint8_t)initial_address; // 将接收到的数据存储到一个新的数组中
+            data_to_send[0] = (uint8_t)initial_address; 
             data_to_send[1] = 0x06;
-            data_to_send[2] = 0x02; // 将接收到的数据存储到一个新的数组中
+            data_to_send[2] = 0x02; 
             data_to_send[3] = (uint8_t)((now_calibrationValue >> 8) & 0xFF); 
             data_to_send[4] = (uint8_t)(now_calibrationValue & 0xFF); // 获取低8位
             CRC_value = calculate_crc(data_to_send,5);
-            data_to_send[5] = (uint8_t)(CRC_value & 0xFF);; // 将接收到的数据存储到一个新的数组中
+            data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[6] = (uint8_t)(CRC_value >> 8);
             HAL_UART_Transmit(&huart1, data_to_send, 7, 7); // 发送数据
             flag = 0; // 将标志位重新置为0
@@ -215,7 +217,7 @@ int main(void)
             data_to_send[3] = (uint8_t)((now_calibrationValue >> 8) & 0xFF); 
             data_to_send[4] = (uint8_t)(now_calibrationValue & 0xFF); // 获取低8位
             CRC_value = calculate_crc(data_to_send,5);
-            data_to_send[5] = (uint8_t)(CRC_value & 0xFF);; // 将接收到的数据存储到一个新的数组中
+            data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[6] = (uint8_t)(CRC_value >> 8);
             HAL_UART_Transmit(&huart1, data_to_send, 7, 7); // 发送数据
             flag = 0; // 将标志位重新置为0
@@ -230,22 +232,22 @@ int main(void)
             data_to_send[3] = 0x00; 
             data_to_send[4] = receive_buffer[5]; // 获取低8位
             CRC_value = calculate_crc(data_to_send,5);
-            data_to_send[5] = (uint8_t)(CRC_value & 0xFF);; // 将接收到的数据存储到一个新的数组中
+            data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[6] = (uint8_t)(CRC_value >> 8);
             HAL_UART_Transmit(&huart1, data_to_send, 7, 7); // 发送数据
             flag = 0; // 将标志位重新置为0
         }
         
         if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0xBB && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x02){
-            data_to_send[0] = (uint8_t)initial_address; // 将接收到的数据存储到一个新的数组中
+            data_to_send[0] = (uint8_t)initial_address;
             data_to_send[1] = 0x03;
-            data_to_send[2] = 0x04; // 将接收到的数据存储到一个新的数组中
+            data_to_send[2] = 0x04;
             data_to_send[3] = (uint8_t)(System_version >> 24);
             data_to_send[4] = (uint8_t)(System_version >> 16);
             data_to_send[5] = (uint8_t)(System_version >> 8);
             data_to_send[6] = (uint8_t)(System_version );
             CRC_value = calculate_crc(data_to_send,7);
-            data_to_send[7] = (uint8_t)(CRC_value & 0xFF);; // 将接收到的数据存储到一个新的数组中
+            data_to_send[7] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[8] = (uint8_t)(CRC_value >> 8);
             HAL_UART_Transmit(&huart1, data_to_send, 9, 9); // 发送数据
             flag = 0; // 将标志位重新置为0
@@ -260,37 +262,37 @@ int main(void)
             updatePbStatus(receive_buffer[5]);
             erase_flash(ADDR_FLASH_PAGE_62);
             write_flash_PbStatus(receive_buffer);  // 写入Flash
-            data_to_send[0] = (uint8_t)initial_address; // 将接收到的数据存储到一个新的数组中
+            data_to_send[0] = (uint8_t)initial_address; 
             data_to_send[1] = 0x06;
-            data_to_send[2] = 0x02; // 将接收到的数据存储到一个新的数组中
+            data_to_send[2] = 0x02; 
             data_to_send[3] = 0x00;
             data_to_send[4] = receive_buffer[5];
             CRC_value = calculate_crc(data_to_send,5);
-            data_to_send[5] = (uint8_t)(CRC_value & 0xFF);; // 将接收到的数据存储到一个新的数组中
+            data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[6] = (uint8_t)(CRC_value >> 8);
             HAL_UART_Transmit(&huart1, data_to_send, 7, 7); // 发送数据
             flag = 0; // 将标志位重新置为0
         }
         
         if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x01 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x02 ){
-            data_to_send[0] = (uint8_t)initial_address; // 将接收到的数据存储到一个新的数组中
+            data_to_send[0] = (uint8_t)initial_address; 
             data_to_send[1] = 0x03;
-            data_to_send[2] = 0x04; // 将接收到的数据存储到一个新的数组中
+            data_to_send[2] = 0x04;
             data_to_send[3] = 0x00;
             data_to_send[4] = gpioaStatus;
             data_to_send[5] = 0x00;
             data_to_send[6] = gpiobStatus;
             CRC_value = calculate_crc(data_to_send,7);
-            data_to_send[7] = (uint8_t)(CRC_value & 0xFF);; // 将接收到的数据存储到一个新的数组中
+            data_to_send[7] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[8] = (uint8_t)(CRC_value >> 8);
             HAL_UART_Transmit(&huart1, data_to_send, 9, 8); // 发送数据
             flag = 0; // 将标志位重新置为0
         }
         
         if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x01 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x03 ){
-            data_to_send[0] = (uint8_t)initial_address; // 将接收到的数据存储到一个新的数组中
+            data_to_send[0] = (uint8_t)initial_address; 
             data_to_send[1] = 0x03;
-            data_to_send[2] = 0x06; // 将接收到的数据存储到一个新的数组中
+            data_to_send[2] = 0x06; 
             data_to_send[3] = 0x00;
             data_to_send[4] = gpioaStatus;
             data_to_send[5] = 0x00;
@@ -298,16 +300,16 @@ int main(void)
             data_to_send[7] = adc2_byte1;
             data_to_send[8] = adc2_byte2;
             CRC_value = calculate_crc(data_to_send,9);
-            data_to_send[9] = (uint8_t)(CRC_value & 0xFF);; // 将接收到的数据存储到一个新的数组中
+            data_to_send[9] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[10] = (uint8_t)(CRC_value >> 8);
             HAL_UART_Transmit(&huart1, data_to_send, 11, 10); // 发送数据
             flag = 0; // 将标志位重新置为0
         }
         
         if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x01 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x04 ){
-            data_to_send[0] = (uint8_t)initial_address; // 将接收到的数据存储到一个新的数组中
+            data_to_send[0] = (uint8_t)initial_address; 
             data_to_send[1] = 0x03;
-            data_to_send[2] = 0x08; // 将接收到的数据存储到一个新的数组中
+            data_to_send[2] = 0x08; 
             data_to_send[3] = 0x00;
             data_to_send[4] = gpioaStatus;
             data_to_send[5] = 0x00;
@@ -317,16 +319,16 @@ int main(void)
             data_to_send[9] = adc3_byte1;
             data_to_send[10] = adc3_byte2;
             CRC_value = calculate_crc(data_to_send,11);
-            data_to_send[11] = (uint8_t)(CRC_value & 0xFF);; // 将接收到的数据存储到一个新的数组中
+            data_to_send[11] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[12] = (uint8_t)(CRC_value >> 8);
             HAL_UART_Transmit(&huart1, data_to_send, 13, 12); // 发送数据
             flag = 0; // 将标志位重新置为0
         }
         
         if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x01 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x05 ){
-            data_to_send[0] = (uint8_t)initial_address; // 将接收到的数据存储到一个新的数组中
+            data_to_send[0] = (uint8_t)initial_address; 
             data_to_send[1] = 0x03;
-            data_to_send[2] = 0x0A; // 将接收到的数据存储到一个新的数组中
+            data_to_send[2] = 0x0A; 
             data_to_send[3] = 0x00;
             data_to_send[4] = gpioaStatus;
             data_to_send[5] = 0x00;
@@ -338,31 +340,31 @@ int main(void)
             data_to_send[11] = adc1_byte1;
             data_to_send[12] = adc1_byte2;
             CRC_value = calculate_crc(data_to_send,13);
-            data_to_send[13] = (uint8_t)(CRC_value & 0xFF);; // 将接收到的数据存储到一个新的数组中
+            data_to_send[13] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[14] = (uint8_t)(CRC_value >> 8);
             HAL_UART_Transmit(&huart1, data_to_send, 15, 14); // 发送数据
             flag = 0; // 将标志位重新置为0
         }
         
         if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x02 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x02 ){
-            data_to_send[0] = (uint8_t)initial_address; // 将接收到的数据存储到一个新的数组中
+            data_to_send[0] = (uint8_t)initial_address; 
             data_to_send[1] = 0x03;
-            data_to_send[2] = 0x04; // 将接收到的数据存储到一个新的数组中
+            data_to_send[2] = 0x04; 
             data_to_send[3] = 0x00;
             data_to_send[4] = gpiobStatus;
             data_to_send[5] = adc2_byte1;
             data_to_send[6] = adc2_byte2;
             CRC_value = calculate_crc(data_to_send,7);
-            data_to_send[7] = (uint8_t)(CRC_value & 0xFF);; // 将接收到的数据存储到一个新的数组中
+            data_to_send[7] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[8] = (uint8_t)(CRC_value >> 8);
             HAL_UART_Transmit(&huart1, data_to_send, 9, 8); // 发送数据
             flag = 0; // 将标志位重新置为0
         }
         
         if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x02 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x03 ){
-            data_to_send[0] = (uint8_t)initial_address; // 将接收到的数据存储到一个新的数组中
+            data_to_send[0] = (uint8_t)initial_address; 
             data_to_send[1] = 0x03;
-            data_to_send[2] = 0x06; // 将接收到的数据存储到一个新的数组中
+            data_to_send[2] = 0x06; 
             data_to_send[3] = 0x00;
             data_to_send[4] = gpiobStatus;
             data_to_send[5] = adc2_byte1;
@@ -370,16 +372,16 @@ int main(void)
             data_to_send[7] = adc3_byte1;
             data_to_send[8] = adc3_byte2;
             CRC_value = calculate_crc(data_to_send,9);
-            data_to_send[9] = (uint8_t)(CRC_value & 0xFF);; // 将接收到的数据存储到一个新的数组中
+            data_to_send[9] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[10] = (uint8_t)(CRC_value >> 8);
             HAL_UART_Transmit(&huart1, data_to_send, 11, 10); // 发送数据
             flag = 0; // 将标志位重新置为0
         }
         
         if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x02 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x04 ){
-            data_to_send[0] = (uint8_t)initial_address; // 将接收到的数据存储到一个新的数组中
+            data_to_send[0] = (uint8_t)initial_address;
             data_to_send[1] = 0x03;
-            data_to_send[2] = 0x08; // 将接收到的数据存储到一个新的数组中
+            data_to_send[2] = 0x08; 
             data_to_send[3] = 0x00;
             data_to_send[4] = gpiobStatus;
             data_to_send[5] = adc2_byte1;
@@ -389,31 +391,31 @@ int main(void)
             data_to_send[9] = adc1_byte1;
             data_to_send[10] = adc1_byte2;
             CRC_value = calculate_crc(data_to_send,11);
-            data_to_send[11] = (uint8_t)(CRC_value & 0xFF);; // 将接收到的数据存储到一个新的数组中
+            data_to_send[11] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[12] = (uint8_t)(CRC_value >> 8);
             HAL_UART_Transmit(&huart1, data_to_send, 13, 12); // 发送数据
             flag = 0; // 将标志位重新置为0
         }
         
         if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x03 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x02 ){
-            data_to_send[0] = (uint8_t)initial_address; // 将接收到的数据存储到一个新的数组中
+            data_to_send[0] = (uint8_t)initial_address; 
             data_to_send[1] = 0x03;
-            data_to_send[2] = 0x04; // 将接收到的数据存储到一个新的数组中
+            data_to_send[2] = 0x04; 
             data_to_send[3] = adc2_byte1;
             data_to_send[4] = adc2_byte2;
             data_to_send[5] = adc3_byte1;
             data_to_send[6] = adc3_byte2;
             CRC_value = calculate_crc(data_to_send,7);
-            data_to_send[7] = (uint8_t)(CRC_value & 0xFF);; // 将接收到的数据存储到一个新的数组中
+            data_to_send[7] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[8] = (uint8_t)(CRC_value >> 8);
             HAL_UART_Transmit(&huart1, data_to_send, 9, 8); // 发送数据
             flag = 0; // 将标志位重新置为0
         }
         
         if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x03 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x03 ){
-            data_to_send[0] = (uint8_t)initial_address; // 将接收到的数据存储到一个新的数组中
+            data_to_send[0] = (uint8_t)initial_address; 
             data_to_send[1] = 0x03;
-            data_to_send[2] = 0x06; // 将接收到的数据存储到一个新的数组中
+            data_to_send[2] = 0x06; 
             data_to_send[3] = adc2_byte1;
             data_to_send[4] = adc2_byte2;
             data_to_send[5] = adc3_byte1;
@@ -421,27 +423,56 @@ int main(void)
             data_to_send[7] = adc1_byte1;
             data_to_send[8] = adc1_byte2;
             CRC_value = calculate_crc(data_to_send,9);
-            data_to_send[9] = (uint8_t)(CRC_value & 0xFF);; // 将接收到的数据存储到一个新的数组中
+            data_to_send[9] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[10] = (uint8_t)(CRC_value >> 8);
             HAL_UART_Transmit(&huart1, data_to_send, 11, 10); // 发送数据
             flag = 0; // 将标志位重新置为0
         }
         
         if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x04 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x02 ){
-            data_to_send[0] = (uint8_t)initial_address; // 将接收到的数据存储到一个新的数组中
+            data_to_send[0] = (uint8_t)initial_address;
             data_to_send[1] = 0x03;
-            data_to_send[2] = 0x04; // 将接收到的数据存储到一个新的数组中
+            data_to_send[2] = 0x04;
             data_to_send[3] = adc3_byte1;
             data_to_send[4] = adc3_byte2;
             data_to_send[5] = adc1_byte1;
             data_to_send[6] = adc1_byte2;
             CRC_value = calculate_crc(data_to_send,7);
-            data_to_send[7] = (uint8_t)(CRC_value & 0xFF);; // 将接收到的数据存储到一个新的数组中
+            data_to_send[7] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[8] = (uint8_t)(CRC_value >> 8);
             HAL_UART_Transmit(&huart1, data_to_send, 9, 8); // 发送数据
             flag = 0; // 将标志位重新置为0
         }
         
+        if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x06 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x0C && receive_buffer[4] == 0x00 ){
+            update_baudrate(receive_buffer[5]);
+            erase_flash(ADDR_FLASH_PAGE_63);
+            write_flash_Baudrate(receive_buffer);  // 写入Flash
+            data_to_send[0] = (uint8_t)initial_address; // 将接收到的数据存储到一个新的数组中
+            data_to_send[1] = 0x06;
+            data_to_send[2] = 0x00; // 将接收到的数据存储到一个新的数组中
+            data_to_send[3] = 0x0C;
+            data_to_send[4] = 0x00;
+            data_to_send[5] = receive_buffer[5];
+            CRC_value = calculate_crc(data_to_send,6);
+            data_to_send[6] = (uint8_t)(CRC_value & 0xFF);
+            data_to_send[7] = (uint8_t)(CRC_value >> 8);
+            HAL_UART_Transmit(&huart1, data_to_send, 8, 8); // 发送数据
+            flag = 0; // 将标志位重新置为0
+        }
+        
+        if(receive_buffer[0] == 0xFA && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0xAA && receive_buffer[4] == 0x00  && receive_buffer[5] == 0x01 ){
+            data_to_send[0] = 0xFA; 
+            data_to_send[1] = 0x03;
+            data_to_send[2] = 0x02; 
+            data_to_send[3] = 0x00;
+            data_to_send[4] = (uint8_t)initial_address;
+            CRC_value = calculate_crc(data_to_send,5);
+            data_to_send[5] = (uint8_t)(CRC_value & 0xFF); 
+            data_to_send[6] = (uint8_t)(CRC_value >> 8);
+            HAL_UART_Transmit(&huart1, data_to_send, 7, 7); // 发送数据
+            flag = 0; // 将标志位重新置为0
+        }
 //        gpioaStatus = 0;adc1_byte1 =0;adc1_byte2=0;adc2_byte1 =0;adc2_byte2=0;adc3_byte1 =0;adc3_byte2=0;
         HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
     }
@@ -537,6 +568,10 @@ void erase_flash(uint32_t ADDR_FLASH){                //
         if(ADDR_FLASH == ADDR_FLASH_PAGE_65) {
             Adc3_CalibrationValue = 0x0000;  // 清零
         }
+        
+        if(ADDR_FLASH == ADDR_FLASH_PAGE_63) {
+            BaudrateValue = 0xFFFF;  
+        }
     }
 }
 
@@ -602,6 +637,16 @@ void CoverADC(uint32_t ADDR) {
         Value_old_addr3 = Overwrite_Value;
     }
 }
+
+void write_flash_Baudrate(uint8_t* rx_buffer){ //数组位置5进行写入——Baudrate
+    uint8_t newStatus = rx_buffer[5];
+    HAL_FLASH_Unlock();  // 解锁Flash
+    HAL_StatusTypeDef status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ADDR_FLASH_PAGE_63, newStatus);  // 写入PbStatus到Flash
+    HAL_FLASH_Lock();  // 上锁Flash
+    if(status == HAL_OK){
+        BaudrateValue = newStatus;  // 将新状态赋值给pb_status
+    }
+}
 /* USER CODE END 4 */
 
 /**

+ 17 - 0
Core/Src/usart.c

@@ -199,5 +199,22 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
 }
 
 /* USER CODE BEGIN 1 */
+void change_baudrate(uint32_t baudrate){
+   __HAL_UART_DISABLE(&huart1); // 关闭UART
+   huart1.Init.BaudRate = baudrate; // 更改波特率
+   if(HAL_UART_Init(&huart1) != HAL_OK){
+      Error_Handler();
+   }
+   __HAL_UART_ENABLE(&huart1); // 重新打开UART
+}
 
+uint32_t baudrate_list[] = {1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200};
+void update_baudrate(uint16_t temp) {
+    if(temp <= 7) {
+        change_baudrate(baudrate_list[temp]);
+    }
+    if(temp == 0xFFFF) {
+        change_baudrate(9600);
+    }
+}
 /* USER CODE END 1 */

BIN
Doc/新版采集通讯模块的软件设计概要性方案.pdf


File diff suppressed because it is too large
+ 67 - 40
MDK-ARM/iocollect.uvguix.terry


+ 12 - 2
MDK-ARM/iocollect.uvoptx

@@ -135,7 +135,7 @@
         <SetRegEntry>
           <Number>0</Number>
           <Key>DLGUARM</Key>
-          <Name></Name>
+          <Name>d</Name>
         </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
@@ -200,6 +200,16 @@
           <WinNumber>1</WinNumber>
           <ItemText>adc1_byte2</ItemText>
         </Ww>
+        <Ww>
+          <count>9</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>temp</ItemText>
+        </Ww>
+        <Ww>
+          <count>10</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>temp</ItemText>
+        </Ww>
       </WatchWindow1>
       <MemoryWindow1>
         <Mm>
@@ -213,7 +223,7 @@
         <Mm>
           <WinNumber>2</WinNumber>
           <SubType>0</SubType>
-          <ItemText>0x0800F800</ItemText>
+          <ItemText>0x0800F000</ItemText>
           <AccSizeX>0</AccSizeX>
         </Mm>
       </MemoryWindow2>

+ 5 - 5
MDK-ARM/iocollect.uvprojx

@@ -314,7 +314,7 @@
           </ArmAdsMisc>
           <Cads>
             <interw>1</interw>
-            <Optim>1</Optim>
+            <Optim>2</Optim>
             <oTime>0</oTime>
             <SplitLS>0</SplitLS>
             <OneElfS>1</OneElfS>
@@ -329,8 +329,8 @@
             <uC99>1</uC99>
             <uGnu>0</uGnu>
             <useXO>0</useXO>
-            <v6Lang>5</v6Lang>
-            <v6LangP>3</v6LangP>
+            <v6Lang>3</v6Lang>
+            <v6LangP>5</v6LangP>
             <vShortEn>1</vShortEn>
             <vShortWch>1</vShortWch>
             <v6Lto>0</v6Lto>
@@ -740,8 +740,8 @@
   <RTE>
     <apis/>
     <components>
-      <component Cclass="CMSIS" Cgroup="CORE" Cvendor="ARM" Cversion="4.3.0" condition="CMSIS Core">
-        <package name="CMSIS" schemaVersion="1.3" url="http://www.keil.com/pack/" vendor="ARM" version="4.5.0"/>
+      <component Cclass="CMSIS" Cgroup="CORE" Cvendor="ARM" Cversion="5.6.0" condition="ARMv6_7_8-M Device">
+        <package name="CMSIS" schemaVersion="1.7.7" url="http://www.keil.com/pack/" vendor="ARM" version="5.9.0"/>
         <targetInfos>
           <targetInfo name="iocollect"/>
         </targetInfos>

File diff suppressed because it is too large
+ 1119 - 1085
MDK-ARM/iocollect/iocollect.hex


+ 13 - 12
readme.md

@@ -1,13 +1,14 @@
-# iocollect
-
-## function_ v1.0:
-
-<u>Created on May 5th, 2023</u>
-
-GPIOA port level detection;
-GPIOB port level detection;
-GPIOB output level setting;
-ADC 3-way detection (2x 4-20mA, temperature);
-ADC 2-way calibration (2x 4-20mA);
-System software restart;
+# iocollect 
+## function\_ v1.0:
+######<u>Created on May 5th, 2023</u>
+#####GPIOA port level detection;
+#####GPIOB port level detection; 
+#####GPIOB output level setting; 
+#####ADC 3-way detection (2x 4-20mA, temperature); 
+#####ADC 2-way calibration (2x 4-20mA);
+#####System software restart; 
+## function\_ v1.1: 
+######<u>Updated on May 5, 2023 at 13:32</u>
+#####Add View Device Address; 
+#####Software modification baud rate;