stm32 hardfault_handler 故障 -结构体传地址

开发一个项目用到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、用了对齐方式的结构体,最好整个地址调用,不要单独调用结构体内的数值,容易出现硬件故障。