H2S stm32F407ZET stm32F407ZGT
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
H2S/Code/base/Src/base.c

654 lines
18 KiB

#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 " );