|
如题,近日想用LPTIM结合ADC,令LPTIM每0.5ms进入一次中断,并在每次中断中进行一次ADC的采样处理,0.5ms中断是形成了,但发现一旦加入了bsp_adc_get_poll(FL_ADC_EXTERNAL_CH4);这个函数,中断的时间就不再是0.5ms,变成大概30ms进一次中断了。想问问各位朋友有可能是那些地方出了问题,是不是因为内部处理过慢导致的异常?
下图是ADC的初始化代码
ADC转换部分代码是借鉴了站内大佬的:
static uint32_t bsp_get_vref(void)
{
uint16_t adc_result;
uint8_t i = 0;
FL_RCC_SetADCPrescaler(FL_RCC_ADC_PSC_DIV8);
FL_VREF_EnableVREFBuffer(VREF);//使能VREF BUFFER
FL_ADC_EnableSequencerChannel(ADC, FL_ADC_INTERNAL_VREF1P2);//通道选择VREF
FL_ADC_ClearFlag_EndOfConversion(ADC);//清标志
FL_ADC_Enable(ADC); // 启动ADC
FL_ADC_EnableSWConversion(ADC); // 开始转换
// 等待转换完成
while(FL_ADC_IsActiveFlag_EndOfConversion(ADC) == FL_RESET)
{
if(i >= 5)
{
break;
}
i++;
FL_DelayMs(1);
}
FL_ADC_ClearFlag_EndOfConversion(ADC);//清标志
adc_result = FL_ADC_ReadConversionData(ADC); //获取采样值
FL_ADC_Disable(ADC); // 关闭ADC
FL_ADC_DisableSequencerChannel(ADC, FL_ADC_INTERNAL_VREF1P2);//通道关闭VREF
FL_VREF_DisableVREFBuffer(VREF);//关闭VREF BUFFER
// 转换结果
return adc_result;
}
static uint32_t bsp_get_channel_poll(uint32_t channel)
{
uint16_t adc_result;
uint8_t i = 0;
FL_RCC_SetADCPrescaler(FL_RCC_ADC_PSC_DIV1);
FL_ADC_EnableSequencerChannel(ADC, channel);//通道选择
FL_ADC_ClearFlag_EndOfConversion(ADC);//清标志
FL_ADC_Enable(ADC); // 启动ADC
FL_ADC_EnableSWConversion(ADC); // 开始转换
// 等待转换完成
while(FL_ADC_IsActiveFlag_EndOfConversion(ADC) == FL_RESET)
{
if(i >= 5)
{
break;
}
i++;
FL_DelayMs(1);
}
FL_ADC_ClearFlag_EndOfConversion(ADC);//清标志
adc_result = FL_ADC_ReadConversionData(ADC); //获取采样值
FL_ADC_Disable(ADC); // 关闭ADC
FL_ADC_DisableSequencerChannel(ADC, channel);//通道
// 转换结果
return adc_result;
}
uint32_t bsp_adc_get_poll(uint32_t channel)
{
uint32_t vrefint_data, adc_voltage;
uint64_t adc_data;
//uint32_t adc_voltage;
// if(vrefint_data == 0)
// {
// vrefint_data = bsp_get_vref();
// }
vrefint_data = bsp_get_vref();
adc_data = bsp_get_channel_poll(channel);
adc_voltage = (adc_data * 3000 * (VREFINT_CAL)) / (vrefint_data * 4095);
// 转换结果
return adc_voltage;
}
烦请各位好心人帮帮小菜鸟吧~真的很急着解决这个问题。私以为,肯定还是本人代码上有纰漏,不至于在0.5ms之内没办法完成一次ADC的转换的吧。
|
|