新手入门
- 积分
- 8
- 金钱
- 8
- 注册时间
- 2026-3-17
- 在线时间
- 2 小时
|
5金钱
我想学习外部中断函数,本来是在主程序里写了一个PA0白色led闪烁。中断触发后PB13蓝色led亮,PA0白色led保持触发时的状态。中断结束后PB13蓝色led灭,PA0白色led继续闪烁。可是发现中断结束后PB13蓝色led灭,PA0白色led仍然保持触发时的状态。debug时发现程序在中断结束后会卡死在Delay()里。我把Delay()注释掉,发现没问题,这是怎么回事?恳请各位大佬出手相救。(PB14控制中断)
#include "stm32f10x.h"
#include "Delay.h"
int main()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitTypeDef gpioa;
gpioa.GPIO_Mode=GPIO_Mode_Out_PP;
gpioa.GPIO_Pin=GPIO_Pin_0;
gpioa.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitTypeDef gpiob;
gpiob.GPIO_Mode=GPIO_Mode_Out_PP;
gpiob.GPIO_Pin=GPIO_Pin_13;
gpiob.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&gpioa);
GPIO_Init(GPIOB,&gpiob);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
EXTI_InitTypeDef exit;
exit.EXTI_Line=EXTI_Line14;
exit.EXTI_LineCmd=ENABLE;
exit.EXTI_Mode=EXTI_Mode_Interrupt;
exit.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_Init(&exit);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef nvic;
nvic.NVIC_IRQChannel=EXTI15_10_IRQn;
nvic.NVIC_IRQChannelCmd=ENABLE;
nvic.NVIC_IRQChannelPreemptionPriority=1;
nvic.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&nvic);
GPIO_SetBits(GPIOB,GPIO_Pin_13);
while(1){
//GPIO_SetBits(GPIOA,GPIO_Pin_0);
//Delay_s(2);
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
//Delay_s(2);
}
}
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line14)==SET){
GPIO_SetBits(GPIOA,GPIO_Pin_0);
GPIO_ResetBits(GPIOB,GPIO_Pin_13);
Delay_s(10);
GPIO_SetBits(GPIOB,GPIO_Pin_13);
EXTI_ClearITPendingBit(EXTI_Line14);
}
}
//不用Delay
------------------------------------------------------------------------------------
#include "stm32f10x.h"
#include "Delay.h"
int main()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitTypeDef gpioa;
gpioa.GPIO_Mode=GPIO_Mode_Out_PP;
gpioa.GPIO_Pin=GPIO_Pin_0;
gpioa.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitTypeDef gpiob;
gpiob.GPIO_Mode=GPIO_Mode_Out_PP;
gpiob.GPIO_Pin=GPIO_Pin_13;
gpiob.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&gpioa);
GPIO_Init(GPIOB,&gpiob);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
EXTI_InitTypeDef exit;
exit.EXTI_Line=EXTI_Line14;
exit.EXTI_LineCmd=ENABLE;
exit.EXTI_Mode=EXTI_Mode_Interrupt;
exit.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_Init(&exit);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef nvic;
nvic.NVIC_IRQChannel=EXTI15_10_IRQn;
nvic.NVIC_IRQChannelCmd=ENABLE;
nvic.NVIC_IRQChannelPreemptionPriority=1;
nvic.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&nvic);
GPIO_SetBits(GPIOB,GPIO_Pin_13);
while(1){
GPIO_SetBits(GPIOA,GPIO_Pin_0);
Delay_s(2);
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
Delay_s(2);
}
}
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line14)==SET){
//GPIO_SetBits(GPIOA,GPIO_Pin_0);
GPIO_ResetBits(GPIOB,GPIO_Pin_13);
Delay_s(10);
GPIO_SetBits(GPIOB,GPIO_Pin_13);
EXTI_ClearITPendingBit(EXTI_Line14);
}
}
//用Delay
-------------------------------------------------------------
https://www.bilibili.com/video/BV1yfAJzsE5x/?vd_source=14a517e9b18e30a20f3e5ca9272514c3
https://www.bilibili.com/video/BV1yfAJzsEtN/?vd_source=14a517e9b18e30a20f3e5ca9272514c3
https://www.bilibili.com/video/BV1PfAJzxEBD/?vd_source=14a517e9b18e30a20f3e5ca9272514c3
|
|