float TempratureTest() { uint8_t tmp_str[30]={0}; /* 启动AD转换并使能AD中断 */ HAL_ADC_Start_IT(&hadcx); float ADC_ConvertedValueLocal[Nave]={0};// 用于保存转换计算后的电压值 float SUM,begin,temp,tempc,templ,Ave,area; uint16_t ADC_ConvertedValue; int i,j; SUM=0; templ=0; area=0; /*初始温度测量*/ for(i=0;i<Nave;i++) { SUM+=(float)ADC_GetSampleAvgN(8); HAL_Delay(10);//10ms测量一次 } begin=SUM/Nave*3.3/4095;//初始电压值 RELAY_OFF();//输出高电平,继电器(公共端——常开),打开激光 HAL_Delay(50); /*温度测量*/ SUM=0; for(i=0;i<N/Nave;i++) { for(j=0;j<Nave;j++) { SUM-=ADC_ConvertedValueLocal[j]; ADC_ConvertedValue=ADC_GetSampleAvgN(8); ADC_ConvertedValueLocal[j]=(float)ADC_ConvertedValue*3.3/4095; SUM+=ADC_ConvertedValueLocal[j]; if(i==0) { Ave=SUM/(j+1); } else { Ave=SUM/Nave; } /*lmt86*/ temp=Ave*1000*(-0.092)+193.56;//实际温度 tempc=(Ave-begin)*1000*(-0.092);//温度变化量 area+=(templ+tempc)/2*0.01; templ=tempc; HMI_curve_setting(1,0,(int)(tempc*16)); sprintf((char *)tmp_str,"%s.txt=\"%.4f\"","t2",23.768); HAL_Delay(100); } } RELAY_ON();//输出低电平,激光关闭 HAL_ADC_DeInit(&hadcx);//关闭AD转换 return area; } 同一个程序,在调用该函数在sprintf((char *)tmp_str,"%s.txt=\"%.4f\"","t2",23.768);句进入HardFault_Handler() 调用下面这个函数时没有任何错误 float RealTest() { /* 启动AD转换并使能AD中断 */ HAL_ADC_Start_IT(&hadcx); float temp; uint8_t tmp_str[30]={0}; temp=3.3*ADC_GetSampleAvgN(8)/4095*1000*(-0.092)+192.93578;//LMT86 sprintf((char *)tmp_str,"%s.txt=\"%.4f\"","t2",23.768); return temp; } 这两个函数均在int main中有调用。 |
第二,检查一下 SCB 里面的几个错误状态寄存器,你会看到是哪里出问题的。
评分
查看全部评分
请把堆、栈开大,可以避免很多问题。
评分
查看全部评分
评分
查看全部评分
在程序打了断点,执行到了sprintf这个函数。把ADC_ConvertedValueLocal[Nave]这个数组改小没有任何问题了,但是查看了Cstack,并没有满
运行的时候查看了Cstack,没有满,但是硬件错误中断是报Cstack越界
那就还是超了呗