STM32
直播中

廉鼎琮

7年用户 900经验值
私信 关注
[问答]

STM8L151内部比较器COMP1怎么用?为什么唤醒不了?

如题,使用STM8L151G4U6的COMP1作为比较器检测外部输入电压是否高于内部参考1.24V的时候,在单片机没有休眠的情况下,可以正常触发中断,也可以读取比较器输出结果,但是一旦单片机进入halt();就无法中断唤醒了,又或者一直触发中断,不知道是哪里没设置好,有大神能帮忙分析下吗?下面贴出相关初始化代码:
GPIO_Init(GPIOA,GPIO_Pin_5,GPIO_Mode_In_FL_No_IT);

static void COMP_Config(void)
{
  CLK_PeripheralClockConfig(CLK_Peripheral_COMP, ENABLE);
  /* Connect internal reference voltage to COMP1 inverting input */
  COMP_VrefintToCOMP1Connect(ENABLE);
  /* close the analog switch number 0 */
  SYSCFG_RIAnalogSwitchConfig(RI_AnalogSwitch_0, ENABLE);
  /* close the analog switch number 1 */
  SYSCFG_RIAnalogSwitchConfig(RI_AnalogSwitch_14, ENABLE);
  /* close the I/O switch number 2 */
  SYSCFG_RIIOSwitchConfig(RI_IOSwitch_2, ENABLE);// PA5
  
  COMP_EdgeConfig(COMP_Selection_COMP1, COMP_Edge_Rising);
  
  /* Enable COMP1 Interrupt */
  COMP_ITConfig(COMP_Selection_COMP1, ENABLE);
  /* Configure the event detection */
}

INTERRUPT_HANDLER(ADC1_COMP_IRQHandler,18)
{
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
  COMP_ClearITPendingBit(COMP_Selection_COMP1);
}

回帖(1)

孙成红

2024-5-8 17:43:26
STM8L151内部比较器COMP1的使用涉及到几个关键步骤,包括GPIO初始化、比较器配置、中断配置等。从您提供的代码片段来看,您已经完成了GPIO初始化和比较器配置。但是,为了确保单片机在进入halt()后能够被唤醒,还需要进行一些额外的设置。

以下是一些建议和可能的问题:

1. 确保比较器中断使能:在配置比较器中断时,需要确保比较器中断使能。这可以通过设置COMP1的CR寄存器中的C1EN位来实现。例如:

   ```c
   COMP1->CR |= COMP_CR_C1EN;
   ```

2. 配置NVIC:为了使比较器中断能够在halt()状态下唤醒单片机,需要配置嵌套向量中断控制器(NVIC)。这包括设置NVIC的优先级和使能对应的中断。例如:

   ```c
   void NVIC_Configuration(void)
   {
       /* 设置比较器中断优先级 */
       NVIC_PriorityGroupConfig(NVIC_PriorityGroup);
       NVIC_Init(NVIC_COMP1_IRQChannel, NVIC_Priority, 0);
       NVIC_ClearPendingIRQ(NVIC_COMP1_IRQChannel);
       NVIC_EnableIRQ(NVIC_COMP1_IRQChannel);
   }
   ```

   其中,`NVIC_COMP1_IRQChannel`是对应的比较器中断通道,`NVIC_Priority`是设置的优先级。

3. 检查halt()函数:确保halt()函数不会影响中断。在STM8L系列中,halt()函数通常用于降低功耗,但它可能会影响中断。您可以尝试使用`sleep()`或`wait_for_interrupt()`函数,这些函数在STM8L系列中通常用于进入低功耗模式,同时允许中断唤醒。

4. 检查中断服务程序:确保您的中断服务程序(ISR)正确处理了比较器中断。在ISR中,您需要清除中断标志,以便再次触发中断。例如:

   ```c
   void COMP1_IRQHandler(void) interrupt 2
   {
       /* 清除比较器中断标志 */
       COMP1->ICR = COMP_ICR_C1IF;
       /* 其他处理 */
   }
   ```

5. 检查电源和时钟配置:确保您的电源和时钟配置正确,以确保比较器和其他相关模块正常工作。

6. 检查外部电路:确保外部输入电压和内部参考电压的电路连接正确,以避免比较器无法正确触发中断。

综上所述,您需要检查和配置比较器中断使能、NVIC、halt()函数、中断服务程序、电源和时钟配置以及外部电路。希望这些建议能帮助您解决问题。
举报

更多回帖

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