STM32
直播中

王磊

8年用户 1637经验值
私信 关注
[问答]

STM8S103F2P程序一直进入读ADC中断,为什么?

   我正在使用STM8S103F2P这个芯片, CPU没有使用外部晶振, 功能主要是读取电池电压, 我使用是 PD3 / AIN4 这个引脚,
程序一直进入读ADC中断。进入中断读到采集值为0.
程序如下:
main.c
--------------------------------------------------------
/* Includes ------------------------------------------------------------------*/
#include  quot;stm8s.h quot;
  uint16_t Conversion_Value = 0;
static void ADC_Config()
{
  GPIO_Init(GPIOC, (GPIO_Pin_TypeDef)GPIO_PIN_7, GPIO_MODE_OUT_PP_HIGH_FAST);
  GPIO_Init(GPIOC, (GPIO_Pin_TypeDef)GPIO_PIN_6, GPIO_MODE_OUT_PP_HIGH_FAST);
  
  /*  Init GPIO for ADC2 */
  GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_IN_FL_NO_IT);
  
  /* De-Init ADC peripheral*/
  ADC1_DeInit();

  /* Init ADC2 peripheral */
  ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_9, ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL9, DISABLE);

  /* Enable EOC interrupt */
  ADC1_ITConfig(ADC1_IT_EOCIE, ENABLE);

  /* Enable general interrupts */  
  enableInterrupts();
  
  /*Start Conversion */
  ADC1_StartConversion();
}
void main(void)
{
  ADC_Config();
  /* Infinite loop */
  while (1)
  {
  }
}

------------------------------------------------------------
stm8s_it.c
----------------------------------------------------------------
INTERRUPT_HANDLER(ADC1_IRQHandler, 22)
{
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
     /* Get converted value */
    Conversion_Value = ADC1_GetConversionValue();
    ADC1_ClearITPendingBit(ADC1_IT_EOC);  
}

回帖(2)

陈霞玻

2024-5-17 15:54:53
Conversion_Value = ADC1_GetConversionValue();
ADC1_ClearITPendingBit(ADC1_IT_EOC);  
楼主将这两句顺序调一下,先清除标志位,再读数据
ADC1_ClearITPendingBit(ADC1_IT_EOC);
Conversion_Value = ADC1_GetConversionValue(); 
举报

贾永世

2024-5-17 18:18:01
根据您提供的代码片段和描述,您的程序一直在进入ADC中断,可能是因为以下几个原因:

1. ADC配置问题:请确保您已经正确配置了ADC。在STM8S103F2P中,您需要设置ADC的触发源、时钟分频、分辨率等参数。请检查您的ADC_Config()函数,确保所有相关参数都已正确设置。

2. 中断使能:请检查您的程序是否使能了ADC中断。如果使能了ADC中断,当ADC转换完成时,程序会自动进入中断服务程序。您可以在中断服务程序中添加一些调试信息,以确定是否真的是因为ADC转换完成而进入中断。

3. 中断优先级:请检查您的中断优先级设置。如果ADC中断优先级较高,它可能会优先于其他中断执行。您可以在中断向量表中调整中断优先级,以确保程序按照预期的顺序执行。

4. ADC通道选择:您提到使用的是PD3/AIN4引脚,但请确保您在ADC_Config()函数中正确选择了这个通道。例如,您可能需要设置ADC通道选择寄存器,以选择AIN4作为ADC输入。

5. 外部晶振:虽然您提到没有使用外部晶振,但请确保您的系统时钟设置正确。STM8S103F2P的ADC性能可能受到系统时钟的影响。如果系统时钟不稳定或不准确,可能会导致ADC转换结果不准确或不稳定。

6. 电池电压问题:您提到程序一直进入读ADC中断,并且读到的采集值为0。这可能是因为电池电压为0,或者电池电压低于ADC的可测量范围。请检查您的电池电压,确保它在ADC的可测量范围内。

7. 硬件连接问题:请检查您的硬件连接,确保PD3/AIN4引脚与电池电压正确连接。如果连接不正确,可能会导致错误的ADC读数。

8. 代码错误:请仔细检查您的代码,确保没有逻辑错误或语法错误。这些错误可能会导致程序无法正常执行。

综上所述,要解决这个问题,您需要逐步检查和调试您的程序。首先,从ADC配置和中断设置开始,然后检查硬件连接和电池电压。最后,确保您的代码没有错误。通过这些步骤,您应该能够找到问题的原因并解决它。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分