我在外部中斷中,設定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);
}
uj5u.com熱心網友回復:
不用在中斷函式中加延時,這是常識。uj5u.com熱心網友回復:
首先一個是一定不要在中斷服務函式里面加延時函式。然后你的外部函式設定的是下降沿觸發,你的主函式里面沒有電平的變化,你的外部中斷肯定也不會觸發。最后你卻在中斷函式里面進行了一個電平的變化,你的功能肯定是無法實作的。uj5u.com熱心網友回復:
考慮下一狀態機的架構。中斷服務中僅僅設定狀態。狀態的任務處理,在主程式中做。
盡可能避免在中斷服務中執行耗時較長的操作。
uj5u.com熱心網友回復:
我設定的是上升延,而且外部中斷是單獨通過外部的一個高電平出發的uj5u.com熱心網友回復:
網上找到的一個解釋:假設中斷加了延時,那當在中斷延時子程式里,下個中斷來了,那就調到下一個中斷,下一個中斷延時子程式里又會來下一個中斷………如此,這是個死嵌套,匯編里面會更好理解
uj5u.com熱心網友回復:
中斷里怎么可以加延時,首先會影響別的任務運行,其次,該中斷中延時還沒到,該中斷又發生了怎么辦。uj5u.com熱心網友回復:
茍富貴法規風帆股份uj5u.com熱心網友回復:
額。。發錯了外部中斷不能加是因為外部隨時可能中斷,所以不能加延時函式。那定時器中斷里面為什么不能加?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/104207.html
標籤:單片機/工控
上一篇:vivado編譯問題
下一篇:全網首發國行內邦學習框架研究
