使用GD32F470时写一个原来的项目,原来的项目是使用STM32F4完成的,现在直接移植到GD32F470时出现跑着跑着重启的问题,原因就是进入定时器中断时没有第一时间清除中断标志位。
void TIMER2_IRQHandler(void)
{
double sum = 0;
u8 i;
static u8 cnt = 0;
if(timer_interrupt_flag_get(TIMER2,TIMER_INT_FLAG_UP) != RESET)
{
timer_interrupt_flag_clear(TIMER2, TIMER_INT_UP); //必须第一时间清除中断标志位
if(ChargePara.flag == 1)
{
ChargePara.cnt++;
if(ChargePara.cnt > ChargePara.period)
{
ChargePara.cnt = 0;
}
if(ChargePara.cnt < ChargePara.duty)
{
gpio_bit_set(CHARGE_PORT,CHARGE_PIN);
SysInfo.charge_vol[SysInfo.charge_vol_cnt] = adc_value[1]; //太阳能板电压
SysInfo.charge_vol_cnt++;
if(SysInfo.charge_vol_cnt == 10)
{
SysInfo.charge_vol_cnt = 0;
sum = 0;
for(i = 0; i < 10;i++)
{
sum += SysInfo.charge_vol[i];
}
sum = sum / 10;
SysInfo.real_charge_vol = (double)(sum * 3.3 * 10.918) / 4096;
if(SysInfo.real_charge_vol > SysInfo.max_charge_vol)
{
SysInfo.max_charge_vol = SysInfo.real_charge_vol;
}
// SysInfo.real_charge_vol = RtuInfo.rtu_vol;
}
}
else
{
gpio_bit_reset(CHARGE_PORT,CHARGE_PIN);
}
}
else
{
SysInfo.battery_vol[SysInfo.battery_vol_cnt] = adc_value[1]; //蓄电池电压
SysInfo.battery_vol_cnt++;
if(SysInfo.battery_vol_cnt == 10)
{
SysInfo.battery_vol_cnt = 0;
sum = 0;
for(i = 0; i < 10;i++)
{
sum += SysInfo.battery_vol[i];
}
sum = sum / 10;
RtuInfo.rtu_vol = (double)(sum * 3.3 * 10.918) / 4096;
SysInfo.real_charge_vol = RtuInfo.rtu_vol;
}
}
}
}