开发一个项目用到NTC电阻,在获取温度值时候,传入结构体地址,发现出错,出现硬件故障!
故障代码
main函数代码如下,程序故障在tsp_BinaryTableSearch(AD_ntc,&(board_data.ad_ntc));//获取NTC电阻温度 里面
while(1) { if(BMS_rxStC.rx_flag == 1) { BMS_send_com(BMS_rxStC.tx_data, &BMS_rxStC.tx_len, BMS_IDAddr); // tt = (BMS_rxStC.BMS_rx_len ); // printf("BMS_receive_deal = %d ",BMS_receive_deal(&BMS_rxStC)); HAL_UART_Transmit(&huart3, BMS_rxStC.rx_data ,BMS_rxStC.rx_len ,0xFFFF); BMS_rxStC.rx_flag = 0; } get_adc(g_adc_data); tsp_BinaryTableSearch(AD_ntc,&(board_data.ad_ntc));//获取NTC电阻温度 printf("board_data.ad_ntc = %d ",board_data.ad_ntc); }
tsp_BinaryTableSearch函数原型
/** * @brief NTC二分查表法,精确到0.1 * @param adc_val: AD采样后的数据 * @param *temp: 计算出的温度值 * @retval 返回 0 正确;1短路;2开路;3、4超测量范围 */ uint8_t tsp_BinaryTableSearch( uint16_t adc_val, int32_t *temp) { uint16_t start = 0U, end = 0U, mid = 0U; /* Get the arry length */ end = ( sizeof( NTC_adc_table )/ sizeof( NTC_adc_table[0] ) ) - 1U; /* Data anomaly judgment */ if( adc_val <= TSP_SHORT_CIRCUIT_THRESHOLD ) { return 1; } else if( adc_val >= TSP_OPEN_CIRCUIT_THRESHOLD ) { return 2; } else if( adc_val > NTC_adc_table[0] ) { return 3; } else if( adc_val < NTC_adc_table[end - 1U] ) { return 4; } else { /* MISRA-C coding rules */ } while ( start <= end ) { /* Get the mid value */ mid = (start + end) >> 1; /* Just find */ if( adc_val == NTC_adc_table[mid] ) { break; } /* Right in between two temperature points */ if( ( adc_val < NTC_adc_table[mid] ) && ( adc_val > NTC_adc_table[mid+1U] ) ) { break; } /* The current AD value less than the middle of the array indicates * the second half of the number to look for */ if( adc_val < NTC_adc_table[mid] ) { start = mid + 1U; } /* The current AD value greater than the middle of the array indicates * that the number to be found is in the first half */ else if( adc_val > NTC_adc_table[mid] ) { end = mid - 1U; } else { /* MISRA-C coding rules */ } } // *temp = ( (int32_t)NTC_temperature_table[mid] * 100 + (int32_t)(( NTC_adc_table[mid] - adc_val )* 100) / (int32_t)( NTC_adc_table[mid]-NTC_adc_table[mid+1] ) ); //整数+小数部分 *temp = ( NTC_temperature_table[mid] * 100); //整数部分 // board_data.ad_ntc = NTC_temperature_table[mid]; //整数部分 printf(" NTC_temperature_table[mid] = %d ",board_data.ad_ntc); return 0; }
函数单独使用没有问题,但是传递结构体board_data.ad_ntc,就出现问题!!
最终发现问题是我的结构体用了1字节对齐,在编译器自己对齐方式下,正常调用没有问题。
总结:
1、后面调用结构体地址时候,最好不要改变对齐方式
2、用了对齐方式的结构体,最好整个地址调用,不要单独调用结构体内的数值,容易出现硬件故障。