开发一个项目用到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\r\n",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\r\n",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 \r\n",board_data.ad_ntc);
return 0;
}
函数单独使用没有问题,但是传递结构体board_data.ad_ntc,就出现问题!!
最终发现问题是我的结构体用了1字节对齐,在编译器自己对齐方式下,正常调用没有问题。
总结:
1、后面调用结构体地址时候,最好不要改变对齐方式
2、用了对齐方式的结构体,最好整个地址调用,不要单独调用结构体内的数值,容易出现硬件故障。