#include "base.h" // #define USE_USB_HS extern osSemaphoreId_t elog_dma_lockHandle; int _write(int fd, char *ch, int len) { // HAL_UART_Transmit(&huart1, (uint8_t *)ch, len, 0xFFFF); if (osOK == osSemaphoreAcquire(elog_dma_lockHandle, osWaitForever)) { HAL_UART_Transmit_DMA(&huart2, (uint8_t *)ch, len); } return len; } // extern struct led led_0; // extern struct led led_1; extern struct ds1302 ds1302; extern SD_HandleTypeDef hsd; extern volatile uint16_t aa ; extern volatile uint16_t bb ; extern volatile uint16_t cc ; extern volatile uint16_t dd ; // extern osTimerId_t myTimer01Handle; // H2s 相关参数 double a0 = 3.149951E+00; double a1 = -1.768957E-01; double a2 = 3.656828E-03; double a3 = -1.176627E-05; double a20 = 7.939553E-03; double Ug = 7.0E+00; double h2s; double phval; double tempval; uint8_t measure_step = 0; uint64_t timebase; float result[3] ; /* H2S T pH */ void MY_INIT( ) { // // 使能 3243 供电 max3243_enable(); uart2_power_enable(); uart3_power_enable(); uart4_power_enable(); uart6_power_enable(); // HAL_TIM_Base_Start_IT(&htim2); // __HAL_TIM_ENABLE_IT(&htim2, TIM_IT_UPDATE); // 使能定时器更新中断 } void measureTimer_Callback(void *argument) { log_i("measure timer begin .... " ); // led_set_state( LED_SEQ_0, LED_STATE_FLICKER_QUICK ); // 打开测量 if (measure_step == 0 ) { led_set_state( LED_SEQ_0, LED_STATE_FLICKER_QUICK ); measure_step = 1; timebase = osKernelGetTickCount(); }else{ log_w(" still measuring .... measurestep -> %d",measure_step); } } /* 判断测量是否完成,完成进行完成操作 */ void measureTask( void *argument ) { for (;;) { if ( measure_step == 0 ) { osDelay(20); } // 开始采集 if ( measure_step == 1 ) { timebase = osKernelGetTickCount(); my_ads1115.start(); // ADS1115 my_pH.start(); // pH measure_step++; // log_i( " ph->state = %d, my_ads1115.state = %d ",ph->state, my_ads1115.state ); osDelay(2); } // 等待数据采集完成 if ( measure_step==2 ) { // log_i( " step == 2 -> %d %d " ,ph->state , my_ads1115.state); if ( ph->state == PH_Status_DATA_OK && my_ads1115.state==ADS1115_WORK_STATE_DATA_OK) { measure_step++ ; continue; } osDelay(20); } // 采集完成,停止,处理数据 if ( measure_step==3 ) { my_ads1115.stop(); my_pH.stop(); measure_step++ ; continue; } // 数据处理 if ( measure_step==4 ) { // log_i( "4444 ph->state = %d, my_ads1115.state = %d ",ph->state, my_ads1115.state ); double temp_h2s_mv = 0.0; uint16_t voltage; uint16_t coeff; coeff = ADS1115_Get_Coeff_BY_128(); // 获得放大系数 * 128 // log_i( " coeff %d, ",coeff ); phval = (my_ads1115.result[0]*256 + my_ads1115.result[1] )/100.0; tempval = (my_ads1115.result[0]*256 + my_ads1115.result[1] )/10.0; voltage = my_ads1115.result[0]*256 + my_ads1115.result[1] ; // 电压整数 temp_h2s_mv = (double)voltage * coeff / 128.0 /1000.0; // 电压毫伏 h2s = ( temp_h2s_mv - Ug) * a20 *( a3*tempval*tempval*tempval+ a2*tempval*tempval + a1*tempval + a0 ); // 温度校正 result[0] = h2s; result[1] = tempval; result[2] = phval; measure_step++ ; continue; } // // send to screen if ( measure_step==5 ) { HAL_UART_Transmit_DMA(&huart1, (uint8_t *)result, 12); measure_step++ ; continue; } // 等发送完成 if ( measure_step==6 ) { osDelay(2); } // 改写 modbus数据 if ( measure_step==7 ) { log_i( " measure_step == 7 ... " ); measure_step++ ; continue; } // // 数据完成 等待 if ( measure_step==8 ) { log_i( " measure_step == 8 ... " ); measure_step = 0; } osDelay(2); } } static void Default_Task_Init() { // measuring_flag = 0; my_led.init(); if ( 0 == my_led.port(200) ) { log_i("Led Port init Ok .... "); }else { log_e("Led Port init Failure .... "); }; led_set_state( LED_SEQ_0, LED_STATE_FLICKER_SLOW ); my_eeprom.init(); if ( 0 == Eeprom_Test( ) ) { log_i("Eeeprom Test Ok .... "); } else { log_e("Eeeprom Test Failure .... "); }; if ( 0 == ds1302_port() ) { log_i("ds1302 init Ok .... "); }else { log_e("ds1302 init Failure .... "); }; /* ads1115 */ if ( 0 == my_ads1115.init() ) { log_i( "ads1115 init Ok .... " ); }else { log_e( "ads1115 init Failure .... " ); } osDelay(10); my_ads1115.port(); osDelay(10); // pH init port if ( 0!= my_pH.init() ) { log_e( "pH init Failure .... " ); }else{ log_i( "pH init ok .... " ); }; my_pH.port(); // // SD_Test(); // // Test_Port(); RTOS_Port( ); Modbus_Port( ); extern osTimerId_t measureTimerHandle; osTimerStart( measureTimerHandle, 3000); // MX_USB_DEVICE_Init(); } void StartDefaultTask(void *argument) { Init_Logger(); log_i( "System is initiating.... " ); Default_Task_Init(); // MX_USB_DEVICE_Init(); /* USB 初始化需要写在任务中 */ for (;;) { // log_i("looo... "); // CDC_Transmit_HS(send_buf, 8); osDelay( 1000 ); // log_i(" aa bb cc dd : %d %d %d %d ",aa, bb,cc, dd); } } void USART1_IRQHandler(void) { if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TC) != RESET) { // log_i(" uart1 tc..... "); // osSemaphoreRelease(elog_dma_lockHandle); measure_step++; huart1.gState = HAL_UART_STATE_READY; __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_TC); } HAL_UART_IRQHandler(&huart1); } void USART2_IRQHandler(void) { if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_TC) != RESET) { // HAL_UART_Transmit(&huart3, (uint8_t*)"tddddd", 6,0xFF); // extern osSemaphoreId_t elog_dma_lockHandle; osSemaphoreRelease( elog_dma_lockHandle ); huart2.gState = HAL_UART_STATE_READY; __HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_TC); } HAL_UART_IRQHandler(&huart2); } // void USART3_IRQHandler(void) // { // if (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_TC) != RESET) // { // log_i(" uart3 tc..... "); // max3160_485_receive_mode(); // // huart3.gState = HAL_UART_STATE_READY; // __HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_TC); // } // if (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE) != RESET) // { // log_i("....huart3 IDLE...."); // __HAL_UART_CLEAR_IDLEFLAG(&huart3); // } // HAL_UART_IRQHandler(&huart3); // } void UART4_IRQHandler(void) { // if (__HAL_UART_GET_FLAG(&huart4, UART_IT_TXE) ==SET ) // { // log_i("....huart4 tc callback...."); // // HAL_GPIO_WritePin(DE485_GPIO_Port, DE485_Pin, SET); // // HAL_GPIO_WritePin(HDPLX_GPIO_Port,HDPLX_Pin, RESET); // __HAL_UART_CLEAR_FLAG(&huart4, UART_IT_TXE); // } HAL_UART_IRQHandler(&huart4); } // void USART6_IRQHandler(void) // { // HAL_UART_IRQHandler(&huart6); // } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == huart2.Instance) { // log_i("....huart2 rx callback...."); __HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_RXNE); } // if (huart->Instance == huart3.Instance) // { // // measure_step++; // pH_rcv_flag = 1; // log_i("....huart3 rx callback.... " ); // // log_i( "rcvbuf : %d %d %d %d %d %d", rcv_buf_2[0], rcv_buf_2[1], rcv_buf_2[2],rcv_buf_2[3], rcv_buf_2[4], rcv_buf_2[5]); // __HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_RXNE); // } } void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) { // if (huart->Instance == huart3.Instance) // { // /* 拷贝数据 到菜单 */ // log_i("huart3 Ex idle...."); // __HAL_UART_CLEAR_IDLEFLAG(&huart3); // // __HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_IDLE); // } } void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { // if (huart->Instance == huart3.Instance) // { // max3160_485_receive_mode(); // // huart3.gState = HAL_UART_STATE_READY; // __HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_TC); // } // if (huart->Instance == huart6.Instance) // { // HAL_UART_Transmit(&huart3, (uint8_t*)"tccccc", 6,0xFF); // // HAL_GPIO_TogglePin(GRN_GPIO_Port,GRN_Pin); // // extern osSemaphoreId_t elog_dma_lockHandle; // osSemaphoreRelease(elog_dma_lockHandle); // __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_TC); // } } void TIM2_IRQHandler(void) { if(__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_UPDATE)) // 更新中断标记被置位 { } HAL_TIM_IRQHandler( &htim2 ); } void Soft_Reboot() { __set_FAULTMASK(1);//关闭总中断 NVIC_SystemReset();//请求单片机重启 } void SD_Test() { // BSP_SD_Init(); // // printf_sdcard_info( ); // if (Init_FatFas_Mount()) // { // log_i("SD mount failure .. "); // } // else // { // log_i(" SD mount success.. "); // } // // extern SD_HandleTypeDef hsd; // if ( open_file( "0:aa.txt") == 0) // { // write_file( (char*)"data\r\n", 6 ); // // close_file(); // } // else // { // log_e(" open file failure .. "); // } } /* log_i("test uart2 .... "); HAL_GPIO_WritePin(UART_EN_GPIO_Port,UART_EN_Pin, SET); HAL_UART_Transmit(&huart2, (uint8_t*)"usart2\r\n", 8,0xFF); HAL_UART_Transmit_IT(&huart4, send_buf, 8 ); // while ( __HAL_UART_GET_FLAG(&huart4, UART_FLAG_TC) == RESET); // HAL_UART_Receive_IT(&huart4, rcv_buf_2, 13 ); // HAL_GPIO_WritePin(UART_EN_GPIO_Port,UART_EN_Pin,RESET); log_i("test uart6 485.... "); HAL_GPIO_WritePin(R_W_GPIO_Port,R_W_Pin, SET); // HAL_UART_Transmit(&huart6, (uint8_t*)"uart66\r\n", 8,0xFF); HAL_UART_Transmit_IT(&huart6, send_buf, 8 ); while ( __HAL_UART_GET_FLAG(&huart6, UART_FLAG_TC) == RESET); HAL_GPIO_WritePin(R_W_GPIO_Port,R_W_Pin,RESET); HAL_UART_Receive_IT(&huart6, rcv_buf, 13 ); // log_i("test uart3 3160 232.... "); // HAL_GPIO_WritePin(SEL_232_485_GPIO_Port,SEL_232_485_Pin, RESET); // HAL_GPIO_WritePin(HDPLX_GPIO_Port,HDPLX_Pin, RESET); // // HAL_UART_Transmit(&huart3, (uint8_t*)"uart3160\r\n", 10,0xFF); // // HAL_UART_Transmit(&huart3, send_buf, 8,0xFF); // HAL_UART_Receive_IT(&huart3, rcv_buf_2, 13 ); // HAL_UART_Transmit_IT(&huart3, send_buf, 8 ); // while ( __HAL_UART_GET_FLAG(&huart3, UART_FLAG_TC) == RESET); // log_i("test uart3 3160 485.... "); // HAL_GPIO_WritePin(SEL_232_485_GPIO_Port,SEL_232_485_Pin, SET); // HAL_GPIO_WritePin(DE485_GPIO_Port, DE485_Pin, RESET); // HAL_GPIO_WritePin(HDPLX_GPIO_Port,HDPLX_Pin, SET); // // HAL_UART_Transmit(&huart3, (uint8_t*)"uart3160\r\n", 10,0xFF); // // HAL_UART_Transmit(&huart3, send_buf, 8,0xFF); // // HAL_UART_Receive_IT(&huart3, rcv_buf_2, 13 ); // HAL_UART_Transmit_IT(&huart3, send_buf, 8 ); // while ( __HAL_UART_GET_FLAG(&huart3, UART_FLAG_TC) == RESET); // HAL_GPIO_WritePin(DE485_GPIO_Port, DE485_Pin, SET); // HAL_GPIO_WritePin(HDPLX_GPIO_Port,HDPLX_Pin, RESET); // // HAL_UART_Receive_IT (&huart3, rcv_buf_2,2 ); // if ( HAL_UART_Receive (&huart3, rcv_buf_2, 2 ,2000) ==HAL_OK) // { // log_i("rcv ok"); // } // log_i( "rcvbuf : %d %d %d", rcv_buf_2[0], rcv_buf_2[1], rcv_buf_2[2]); // HAL_GPIO_WritePin(DE485_GPIO_Port, DE485_Pin, SET); // HAL_GPIO_WritePin(HDPLX_GPIO_Port,HDPLX_Pin, RESET); */ // void measureTimer_Callback(void *argument) // { // log_i("measure timer begin .... " ); // // led_set_state( &led_0, LED_STATE_FLICKER_QUICK ); // // voltage = 0.0; // // H2S = 0.0; // // memset(pH_rcv_buf, 0, 9 ); // // memset(result, 0, 12 ); // // timebase = osKernelGetTickCount(); // // measuring_flag = 1; // // pH_send_flag = 0; // // pH_rcv_flag = 0; // // pH_measuring_flag = 0; // // pH_measure_ok = 0; // // voltage_measure_ok = 0; // // measure_step = 0; // } // void pH_Task(void *argument) // { // max3160_485_receive_mode(); // for(;;) // { // // if ( pH_measure_ok ==0 && pH_send_flag == 0) // // { // // log_i(" send stage ... "); // // HAL_UART_Receive_DMA(&huart3, pH_rcv_buf, 9 ); // // timebase = osKernelGetTickCount(); // // max3160_485_send_mode(); // // pH_send_flag = 1; // // HAL_UART_Transmit_DMA(&huart3, pH_send_buf, 8 ); // // } // // if ( pH_measure_ok ==0 && pH_send_flag == 1 && pH_rcv_flag == 0 ) // // { // // uint64_t time_ticks = osKernelGetTickCount() ; // // // log_i( " time_ticks :%d " , time_ticks); // // if ( (time_ticks - timebase ) >400) // // { // // log_i( " pH timeout ..... " ); // // measureTimer_Callback(NULL); // // } // // } // // if ( pH_measure_ok ==0 && pH_rcv_flag == 1 ) // // { // // log_i( " pH ok ..... " ); // // pH_measure_ok = 1; // // } // // if ( pH_measure_ok ==1 ) // // { // // ; // // } // osDelay(50); // } // } // void Measure_Task(void *argument) // { // for (;;) // { // // /* convert */ // // if ( measure_step==0 && pH_measure_ok == 1 && voltage_measure_ok == 1 ) // // { // // /** TODO ...*/ // // result[1] = (pH_rcv_buf[5]*256 + pH_rcv_buf[6])/10.0; /* Temp /10.0*/ // // result[2] = (pH_rcv_buf[3]*256 + pH_rcv_buf[4])/100.0; /* pH /10.0*/ // // // log_i( " temperature :%.6f pH : %.6f " , temperature ,pH_value); // // get_h2s_2(&H2S_concentration , voltage, result[1]); // // result[0] = H2S_concentration; // // led_set_state(&led_0, LED_STATE_FLICKER_SLOW); // // // log_i( "H2S : %.6f " ,H2S); // // measure_step++; // // } // // /* 写modbus数据 */ // // if ( measure_step==1 ) // // { // // /* 写modbus 临界区 */ // // log_i( "-------> H2S: %.6f TEMP: %.6f pH: %.6f ", result[0] , result[1], result[2]); // // // 数据全反过来 40db851f41a80000402771f2 -》 f2712740......// // // Modbus_Set_HoldingBuff( (uint8_t *)result, 12, 0); // // measure_step++; // // /*pH 686 : 40db851f 41a80000 402771f2 */ // // } // // /* 输出数据 uart1 */ // // if ( measure_step==2 ) // // { // // log_i( "send to screen... " ); // // int ret= HAL_UART_Transmit_IT(&huart1, (uint8_t *)result, 12); // // if( ret==HAL_OK) // // log_i( "send ok.. " ); // // measure_step++; // // } // // if ( measure_step==3 ) // // { // // osDelay(2); // // } // osDelay(20); // } // } // void pHTask(void *argument) // { // for (;;) // { // // log_i(" ph... pH_measure_ok %d", pH_measure_ok); // if ( pH_measure_ok ==0 && pH_send_flag == 0) // { // log_i(" pH send ... "); // HAL_UART_Receive_DMA( &huart3, pH_rcv_buf, 9 ); // timebase = osKernelGetTickCount(); // max3160_485_send_mode(); // pH_send_flag = 1; // HAL_UART_Transmit_DMA( &huart3, pH_send_buf, 8 ); // } // if ( pH_measure_ok ==0 && pH_send_flag == 1 && pH_rcv_flag == 0 ) // { // uint64_t time_ticks = osKernelGetTickCount() ; // log_i( " time_ticks :%d %d" , time_ticks, timebase); // if ( (time_ticks - timebase ) >400) // { // log_i( " pH timeout ..... " ); // measureTimer_Callback(NULL); // } // } // if ( pH_measure_ok ==0 && pH_rcv_flag == 1 ) // { // log_i( " pH ok ..... %d %d " ,pH_rcv_buf[5],pH_rcv_buf[6] ); // pH_measure_ok = 1; // } // if ( pH_measure_ok ==1 ) // { // ; // } // osDelay(50); // } // } // void voltageTask(void *argument) // { // for ( ; ; ) // { // if (voltage_measure_ok ==0) // { // int16_t t = ads1115_read_data( hi2c1 ); // log_i( "ads1115 ttt .... %d ", t ); // // double vol = ads1115_get_voltage_val( hi2c1 , 0x01, CONFIG_REG_H, CONFIG_REG_L ); // // ads1115_get_voltage_val( hi2c1 , 0x01, CONFIG_REG_H, CONFIG_REG_L ); // // int vol = ads1115_get ( hi2c1 , 0x01, CONFIG_REG_H, CONFIG_REG_L ); // // log_w( " voltage :%.6f " , voltage); // voltage_measure_ok = 1; // } // osDelay(20); // } // } // log_i( "ads1115 set **** .... " ); // ads1115_set_state( ADS1115_WORK_STATE_SET_REGISTER ); // osDelay(10); // res = my_ads1115.read( ); // log_i( "ads1115 result .... %d " , my_ads1115.result ); // ads1115_config_register( hi2c1, 0x01, CONFIG_REG_H, CONFIG_REG_L ); // int16_t t = ads1115_read_data( hi2c1 ); // log_i( "ads1115 ttt .... %d ", t ); // float vol; // vol = 100.0/1000; // log_i( " float ... " ); // // log_i(" flaot %.6f" , vol); // // log_i(" fl %.6f ", vol) ; // log_i( " float end " );