STM32(暫存器)學習筆記——實驗五:外部中斷
阿新 • • 發佈:2018-12-16
儲備知識:
(1)STM32F103ZET6(CM3核心)共有256箇中斷,需要進行管理
首先,要對STM32進行分組,組0~4,同時要對每個中斷設定一個搶佔優先順序和響應優先順序
(搶佔優先順序:是指打斷其它中斷的級別,高的搶佔優先順序可以打斷低的搶佔優先順序的工作
相應優先順序:是指在搶佔屬性相同的情況下,當兩個中斷向量的搶佔優先順序相同時,
如果兩個中斷同時到達,則先處理響應優先順序高的中斷
)
其級別編號越小,表明它的優先級別越高
暫存器設定函式
MY_NVIC_INIT(搶佔,響應,EXIT外部中斷引腳口對應分組_IRQn,分組)
(2)設定外部中斷觸發條件
外部中斷觸發函式
Ex_NVIC_Config(GPIO_X,引腳口,觸發條件(暫存器))
RTIR:上升沿觸發
FTIR:下降沿觸發 (3)外部中斷函式
函式:void EXITx_IRQHandler(void)
引腳口為0,1,2,3,4時
外部中斷函式為
void EXIT0(1/2/3/4)_IRQHandler(void)
引腳口為5,6,7,8,9時
外部中斷函式為
void EXIT9_5_IRQHandler(void)
引腳口為10,11,12,13,14,15時
外部中斷函式為
void EXIT15_10_IRQHandler(void)
編寫程式
1、初始化I/O輸入。
GPIOA->CRL&=0XFFFFFFF0; //PA0設定成輸入,預設下拉
GPIOA->CRL|=0X00000008;
GPIOE->CRL&=0XFFF00FFF; //PE3/4設定成輸入
GPIOE->CRL|=0X00088000;
GPIOE->ODR|=3<<3; //PE3/4 上拉*/
2、開啟I/O口複用時鐘,設定I/O口與中短線的對映關係
3、初始化線上中斷,設定觸發條件
Ex_NVIC_Config(GPIO_A,0,RTIR); //上升沿觸發 Ex_NVIC_Config,4.設定中斷分組,並且使能中斷MY_NVIC_Init Ex_NVIC_Config(GPIO_E,3,FTIR); //下降沿觸發5.設定中斷分組 Ex_NVIC_Config(GPIO_E,4,FTIR); //下降沿觸發
這個函式就完成了2,3步
4、配置中斷分組(NVIC),並使能中斷
MY_NVIC_Init(2,3,EXTI0_IRQn,2); //搶佔2,子優先順序3,組2
MY_NVIC_Init(2,1,EXTI3_IRQn,2); //搶佔2,子優先順序1,組2
MY_NVIC_Init(2,0,EXTI4_IRQn,2); //搶佔2,子優先順序0,組2
5、編寫中斷服務函式
void EXTI0_IRQHandler(void)//EXTI9_5_IRQHandler(void)
{
delay_ms(10); //消抖
if(WK_UP==1) //WK_UP按鍵
{
BEEP=!BEEP;
}
EXTI->PR=1<<0; //清除LINE0上的中斷標誌位 PR掛起暫存器,1表示外部中斷線上發生了選擇的邊沿事件。通過向該暫存器的對應位寫入 1 可以清除該位。
}
//外部中斷3服務程式
void EXTI3_IRQHandler(void)
{
delay_ms(10); //消抖
if(KEY1==0) //按鍵KEY1
{
LED1=!LED1;
}
EXTI->PR=1<<3; //清除LINE3上的中斷標誌位
}
//外部中斷4服務程式
void EXTI4_IRQHandler(void)
{
delay_ms(10); //消抖
if(KEY0==0) //按鍵KEY0
{
LED0=!LED0;
LED1=!LED1;
}
EXTI->PR=1<<4; //清除LINE4上的中斷標誌位
}
PR是EXIT結構體的暫存器,PR為1,清除中斷標誌位,PR為0