#include "user.h" //串口2为485接口 volatile uint8_t usart2_count = 0; //串口接收数据个数 uint8_t Rx2_Buff[BUFF_LEN] = {0}; //串口接收缓冲区 uint8_t Tx2_Buff[BUFF_LEN] = {0}; //串口发送缓冲区 uint8_t u2_Buff[BUFF_LEN] = {0}; //用户缓冲区 //串口3为lora通讯口 volatile uint8_t usart3_count = 0; //串口接收数据个数 uint8_t Rx3_Buff[BUFF_LEN] = {0}; //串口接收缓冲区 uint8_t Tx3_Buff[BUFF_LEN] = {0}; //串口发送缓冲区 uint8_t u3_Buff[BUFF_LEN] = {0}; //用户缓冲区 volatile uint8_t usart1_count = 0; //串口接收数据个数 uint8_t Rx1_Buff[BUFF_LEN] = {0}; //串口接收缓冲区 uint8_t Tx1_Buff[BUFF_LEN] = {0}; //串口发送缓冲区 uint8_t u1_Buff[BUFF_LEN] = {0}; //用户缓冲区 uint8_t ADC_Wavedata[512] ={ 0}; volatile uint16_t RS485ADDR = 1; int16_t user_register[10] ={0}; void user_init(void) { bsp_InitTimer(); __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE); __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_TC); __HAL_UART_CLEAR_IDLEFLAG(&huart1); HAL_UART_DMAStop(&huart1);//复位DMA //串口DMA接受 HAL_UART_Receive_DMA(&huart1,(uint8_t *)Rx1_Buff,sizeof(Rx1_Buff)); __HAL_UART_ENABLE_IT(&huart3,UART_IT_IDLE); __HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_TC); __HAL_UART_CLEAR_IDLEFLAG(&huart3); HAL_UART_DMAStop(&huart3);//复位DMA //串口DMA接受 HAL_UART_Receive_DMA(&huart3,(uint8_t *)Rx3_Buff,sizeof(Rx3_Buff)); // __HAL_UART_CLEAR_IT(&huart2,UART_CLEAR_IDLEF|UART_CLEAR_TCF); } void Usart_Receive() { if( (uint16_t)u3_Buff[0] == RS485ADDR && usart3_count == 8) { switch(u3_Buff[1]) { case 0x03: //读传感器数据 MODBUS_03H(); break; case 0x06: MODBUS_06H(); break; default:break; } } } void MODBUS_03H() { //接收到的数据帧 //485地址 功能位 寄存器地址 寄存器个数 crc低位 crc高位 uint8_t crch,crcl; uint16_t crcack; uint16_t addr = (uint16_t)u3_Buff[2]<<8 | u3_Buff[3]; //寄存器地址 uint16_t number = (uint16_t)u3_Buff[4]<<8 | u3_Buff[5]; //寄存器数量 uint16_t crc = crc16_modbus(u3_Buff,6); //计算CRC crch = crc>>8; crcl = crc&0x00FF; user_register[1] = (int16_t)Vol*Kv; user_register[2] = (int16_t)IA*Ki; if( (addr+number) <= 3 && crcl == u3_Buff[6] && crch == u3_Buff[7]) { uint8_t cnt = 0; Tx3_Buff[cnt++] = u3_Buff[0]; Tx3_Buff[cnt++] = u3_Buff[1]; Tx3_Buff[cnt++] = number*2; //数据个数,单位/字节 for(uint8_t i =0;i>8; Tx3_Buff[cnt++] = user_register[addr+i] & 0xFF; } crcack = crc16_modbus(Tx3_Buff,cnt); Tx3_Buff[cnt++] = crcack & 0xff; Tx3_Buff[cnt++] = crcack >>8; HAL_UART_Transmit_DMA(&huart3,Tx3_Buff,cnt); } } void MODBUS_06H(void) { int16_t data = ((int16_t)u3_Buff[4]<<8)|u3_Buff[5]; //要修改的数据 uint16_t reg = ((int16_t)u3_Buff[2]<<8)|u3_Buff[3]; //寄存器地址 uint16_t crc = crc16_modbus( u3_Buff,6); //计算CRC for(uint8_t i = 0; i<6; i++) { Tx3_Buff[i] = u3_Buff[i]; } Tx3_Buff[6] = crc&0xff; Tx3_Buff[7] = crc>>8; //修改地址 if(reg == 0x0001 && Tx3_Buff[6]== u3_Buff[6] && Tx3_Buff[7]== u3_Buff[7]) { Kv = data/Vol; HAL_UART_Transmit_DMA(&huart3,Tx3_Buff,8); } if(reg == 0x0002 && Tx3_Buff[6]== u3_Buff[6] && Tx3_Buff[7]== u3_Buff[7]) { Ki = data/IA; HAL_UART_Transmit_DMA(&huart3,Tx3_Buff,8); } } /************************************************************ * Name: CRC-16/MODBUS x16+x15+x2+1 * Poly: 0x8005 * Init: 0xFFFF * Refin: True * Refout: True * Xorout: 0x0000 * Note: **********************************************************/ uint16_t crc16_modbus(uint8_t *data, uint16_t length) { uint8_t i; uint16_t crc = 0xffff; // Initial value while(length--) { crc ^= *data++; // crc ^= *data; data++; for (i = 0; i < 8; ++i) { if (crc & 1) crc = (crc >> 1) ^ 0xA001; // 0xA001 = reverse 0x8005 else crc = (crc >> 1); } } return crc; } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { uint16_t tmp16; uint8_t tmp8 = 0; uint8_t data[5] = {0}; uint8_t data1[300]; static uint8_t cnt =0; if(GPIO_Pin == IRQ_Pin) { tmp8 = READ_SPI(WAVE_IF,1); sprintf(Tx3_Buff,"WAVE_IF:0x%x",tmp8); HAL_UART_Transmit_DMA(&huart3,Tx3_Buff,strlen(Tx3_Buff)); if(tmp8 & 0x02) { // SPI_CS_LOW(); // data[0] = 0xEA; // data[1] = 0xAC; // data[2] = ~(data[0]+data[1]); // HAL_SPI_Transmit(&hspi1,data,3,SPI_TIMEOUT); // HAL_SPI_Receive(&hspi1,data1,300,SPI_TIMEOUT); // SPI_CS_HIGH(); cnt++; } if((tmp8&0x01) == 0 && (tmp8 & 0x02) ==1) { cnt++; SPI_CS_LOW(); //连续读波性数据 // data[0] = 0xEA; // data[1] = 0xAE; // data[2] = 0; // data[3] = 0xff; // data[4] = ~(data[0]+data[1]+data[2]+data[3]); // HAL_SPI_Transmit(&hspi1,data,3,SPI_TIMEOUT); // HAL_SPI_Receive(&hspi1,ADC_Wavedata,256,SPI_TIMEOUT); // SPI_CS_HIGH(); } } tmp16 = READ_SPI(WAVE_IF,1); }