完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我的板子使用STM32F072C8, USB电路如图,因为USB只用来充电,所以我想直接用PB1来检测USB是否连接电脑或者充电器,配置好IO口中断线等,可是程序无法中断,读取PB1的状态位也正常,在USB连接时为1,USB无连接时为0。配置代码如下:
void USB_CHECK_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; EXti_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* enable the GPIO Clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); /* Configure GPIO */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_Init(GPIOB, &GPIO_InitStructure); /* enable SYSCFG Clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); /* Connect EXTI Line to GPIO Pin */ SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource1); /* Configure EXTI Line */ EXTI_InitStructure.EXTI_Line = EXTI_Line1; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Enable and set EXTI Interrupt to the lowest priority */ NVIC_InitStructure.NVIC_IRQChannel = EXTI0_1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 0x01; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void EXTI0_1_IRQHandler(void) { //清除中断标志位等其它操作...... if (EXTI_GetITStatus(EXTI_Line1)!=RESET) { //Deal EXTI_ClearITPendingBit(EXTI_Line1); } } |
|
相关推荐
12个回答
|
|
|
|
|
|
本帖最后由 toofree 于 2018-5-15 12:38 编辑
我想问,你是通过USB供电的吗? 如果是的话,PB1上升沿来的时候,MCU还没有启动呢,自然不会在中断。 或许原理这是这样的,但是仅凭目前的描述,不知道是怎么连的 |
|
|
|
可以考虑先用其他管脚供电,让MCU正常工作后,在插入USB线。如果只用USB供电就会发生MCU为启动时上升沿已经过去了。所以无法触发中断,这种情况智能使用查询方式。
|
|
|
|
R16和R17的分压加上GPIOB1的下拉(GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;),
中断输入点满足不了TTL电平变化的中断要求 |
|
|
|
你的:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; 例程: GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING; |
|
|
|
|
|
|
|
|
|
|
|
vyewrewr 发表于 2018-12-24 14:27 有电池供电,是在设备已经正常运行,OLED已经正常显示后,再插入USB的, |
|
|
|
ctwewer 发表于 2018-12-24 14:36 这种情况要怎么解决呢?改变分压电阻? |
|
|
|
建议使用下降沿中断,去除R17, GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_Up; 或者使用上升沿中断,去掉R16 |
|
|
|
找到问题了,同样的中断配置代码,如果没用IAP,直接从0x08000000运行程序,可以进入中断,如果烧了IAP,从配置的地址0x08003000运行程序就进不了中断,APP中我也做了向量中断表重映射,EXTI4_15_IRQHandler这个中断就可以正常进入运行,而EXTI0_1_IRQHandler这个中断就进不去。现在不知道什么回事,迷茫中。 |
|
|
|
中断配置表重被IAP重新定义过了吧。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1129 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1075 浏览 2 评论
2175 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1269 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1693 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 02:36 , Processed in 0.951427 second(s), Total 95, Slave 78 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号