求解stm32外部中断内加延时,出问题

蜜丝特潮 2017-08-15 09:13:01
我在外部中断中,设置led亮了1s然后灭掉,但是实验时led却一直是亮的,求解Why?

代码:
#include <stm32f10x.h>
#include "stm32f10x_exti.h"
#include "delay.h"
//外部中断 0 服务程序
void EXTIX_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

//管教配置
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA, ENABLE); //使能PB,PC端口时钟

//SoftWare Serial TXD
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//设置成上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
// GPIO_ResetBits(GPIOB,GPIO_Pin_10);

//SoftWare Serial TXD
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择输入模式为浮空输入 //推挽输出
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
//
// GPIO_Init(GPIOB, &GPIO_InitStructure);
// GPIO_SetBits(GPIOB,GPIO_Pin_9);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择输入模式为浮空输入 //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_10);



//SoftWare Serial TXD
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_8);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //②开启 AFIO 时钟
//GPIOE.2 中断线以及中断初始化配置,下降沿触发
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource10);//③
EXTI_InitStructure.EXTI_Line=EXTI_Line10;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //④初始化中断线参数
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //使能按键外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级 2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级 2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure);//⑤初始化 NVIC
}
//⑥外部中断 2 服务程序

u8 text=1;
void EXTI15_10_IRQHandler(void)
{

if(EXTI_GetITStatus(EXTI_Line10)!=RESET){
GPIO_SetBits(GPIOB,GPIO_Pin_8);
delay_ms(100);
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
delay_ms(100);
text=1;
delay_ms(1000);
text=0;
EXTI_ClearITPendingBit(EXTI_Line10); //清除 LINE 上的中断标志位

}
}


int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
EXTIX_Init();

while(1);
}

...全文
2805 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ost happy 2019-08-07
  • 打赏
  • 举报
回复
额。。发错了
外部中断不能加是因为外部随时可能中断,所以不能加延时函数。那定时器中断里面为什么不能加?
ost happy 2019-08-07
  • 打赏
  • 举报
回复
苟富贵法规风帆股份
TCangi 2017-08-21
  • 打赏
  • 举报
回复 1
中断里怎么可以加延时,首先会影响别的任务运行,其次,该中断中延时还没到,该中断又发生了怎么办。
蜜丝特潮 2017-08-18
  • 打赏
  • 举报
回复
网上找到的一个解释: 假设中断加了延时,那当在中断延时子程序里,下个中断来了,那就调到下一个中断,下一个中断延时子程序里又会来下一个中断………如此,这是个死嵌套,汇编里面会更好理解
蜜丝特潮 2017-08-18
  • 打赏
  • 举报
回复
引用 2楼JohnnyTim 的回复:
首先一个是一定不要在中断服务函数里面加延时函数。然后你的外部函数设置的是下降沿触发,你的主函数里面没有电平的变化,你的外部中断肯定也不会触发。最后你却在中断函数里面进行了一个电平的变化,你的功能肯定是无法实现的。
我设置的是上升延,而且外部中断是单独通过外部的一个高电平出发的
of123 2017-08-17
  • 打赏
  • 举报
回复 3
考虑下一状态机的架构。 中断服务中仅仅设置状态。状态的任务处理,在主程序中做。 尽可能避免在中断服务中执行耗时较长的操作。
JohnnyTim 2017-08-16
  • 打赏
  • 举报
回复
首先一个是一定不要在中断服务函数里面加延时函数。然后你的外部函数设置的是下降沿触发,你的主函数里面没有电平的变化,你的外部中断肯定也不会触发。最后你却在中断函数里面进行了一个电平的变化,你的功能肯定是无法实现的。
Acuity. 2017-08-15
  • 打赏
  • 举报
回复
不用在中断函数中加延时,这是常识。

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧