最近调试STM8L152R8T6的一个产品,测试中发现跑了一晚上后,单片机卡死,外部复位没用,必须重新上电才有用。花了一天的时间来测试找问题,结果发现了问题,不知是不是芯片有bug。测试主函数如下:
CLK_Configuration();
// WWDG_Config();
// param_config_flag=read_param();
GPIO_Run_Config();
// USART_Config();
// DrvUART_Write(USER_COM,"RESET\r\n",7);
// get_rht();
LCD_GLASS_Init();
Disp_RHT();
Get_Bat();
while(1)
{
WWDG_SetCounter(0xfe) ;
}
烧入程序不停按复位键,正常情况液晶正常显示。大概60多次,液晶不显示,再按复位键也不起作用,芯片卡死。NRST脚一直低电平。
void Get_Bat(void)
{
uint32_t temp;
CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);
ADC_Init(ADC1, ADC_ConversionMode_Single, ADC_Resolution_12Bit, ADC_Prescaler_2);
ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_384Cycles);
ADC_Cmd(ADC1, ENABLE);
ADC_SchmittTriggerConfig(ADC1, ADC_Channel_17, DISABLE);
ADC_ChannelCmd(ADC1, ADC_Channel_17, ENABLE);
ADC_SoftwareStartConv(ADC1);
WWDG_SetCounter(0xfe) ;
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == 0);
temp = ADC_GetConversionValue(ADC1);
ADC_SoftwareStartConv(ADC1);
WWDG_SetCounter(0xfe) ;
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == 0);
temp = temp+ADC_GetConversionValue(ADC1);
ADC_SoftwareStartConv(ADC1);
WWDG_SetCounter(0xfe) ;
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == 0);
temp = temp+ADC_GetConversionValue(ADC1);
ADC_SoftwareStartConv(ADC1);
WWDG_SetCounter(0xfe) ;
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == 0);
temp = temp+ADC_GetConversionValue(ADC1);
temp= (temp*300)>>13;
g_Bat_V=temp;
}
而只要注销掉红色的代码后,再怎么按复位键都不会出现卡死现象。ADC转换触发会引发复位卡死呢? 大家有无遇到过这样的问题。原来的产品用的是STM8L152C8T6都没出现这个问题,怪哉! |