完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
如题,使用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个回答
|
|
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()函数、中断服务程序、电源和时钟配置以及外部电路。希望这些建议能帮助您解决问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1786 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1622 浏览 1 评论
1089 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
730 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1680 浏览 2 评论
1942浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
739浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
576浏览 3评论
598浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
560浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 16:22 , Processed in 1.243278 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号