68個(gè)可屏蔽中斷通道,包括EXTI,TIM,ADC,USART,SPI,I2C,RTC等多個(gè)外設(shè)(F1系列最多的數(shù)量,以型號(hào)為主);
使用NVIC統(tǒng)一管理中斷,每個(gè)中斷通道都擁有16個(gè)可編程優(yōu)先等級(jí),可以對(duì)優(yōu)先級(jí)進(jìn)行分組,進(jìn)一步設(shè)置搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)。
AFIO內(nèi)部圖
EXTI內(nèi)部圖
中斷和事件的區(qū)別
NVIC的中斷優(yōu)先級(jí)由優(yōu)先級(jí)寄存器的4位(0-15)決定,這四位可以進(jìn)行切分,分為高N位的搶占優(yōu)先級(jí),
和4-n位的響應(yīng)優(yōu)先級(jí);
搶占優(yōu)先級(jí)高的可以中斷嵌套,響應(yīng)優(yōu)先級(jí)高的可以優(yōu)先排隊(duì),搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)均相同的話,
按照中斷號(hào)排隊(duì)。
操作的是NVIC->IPRx寄存器
中斷示例
main
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OUT1.H"
#include "Interrupt.h"
int main(void)
{
OUT1_Init();
Interrupt_Init();
OUT1_OFF();
while(1)
{
Delay_s(5);
OUT1_OFF();
}
}
interrupt.c
#include "stm32f10x.h" // Device header
#include "OUT1.h"
void Interrupt_Init (void)
{
//開(kāi)啟GPIOC的時(shí)鐘控制
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
//開(kāi)啟AFIO的時(shí)鐘控制
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//EXTI的時(shí)鐘控制不需要開(kāi)啟
//NVIC也不需要開(kāi)啟,NVIC是屬于內(nèi)核內(nèi)的外設(shè)
/*配置GPIO */
GPIO_InitTypeDef GPIO_InitStructur;
GPIO_InitStructur.GPIO_Mode=GPIO_Mode_IPU; //設(shè)置成上拉輸入
GPIO_InitStructur.GPIO_Pin=GPIO_Pin_15; //選擇15號(hào)Pin腳
GPIO_InitStructur.GPIO_Speed=GPIO_Speed_50MHz; //不重要
GPIO_Init(GPIOC,&GPIO_InitStructur); //選擇C組的GPIO
/*配置AIFO */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource15); //設(shè)置PC15為外部中斷線
/*配置EXIT */
EXTI_InitTypeDef EXTI_Initstructure;
EXTI_Initstructure.EXTI_Line=EXTI_Line15; //配置中斷線
EXTI_Initstructure.EXTI_LineCmd=ENABLE; //是否開(kāi)啟中斷
EXTI_Initstructure.EXTI_Mode=EXTI_Mode_Interrupt; //配置成中斷
EXTI_Initstructure.EXTI_Trigger=EXTI_Trigger_Rising; //配置成上升沿觸發(fā)
EXTI_Init(&EXTI_Initstructure);
/*配置NVIC 配置中斷分組 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置中斷搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)分組
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1; //配置搶占優(yōu)先級(jí)
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1; //配置響應(yīng)優(yōu)先級(jí)
NVIC_Init(&NVIC_InitStruct);
}
/*編寫(xiě)中斷函數(shù),中斷函數(shù)的名字都是固定的,中斷函數(shù)都是無(wú)參數(shù)無(wú)返回值的 */
/*編中斷函數(shù)的函數(shù)名可以在啟動(dòng)文件startup_stm32f10x_md.s中可以找到 */
/*中斷函數(shù)的名字都是以_IRQHandler結(jié)尾 */
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line15)==SET)
{
/*編寫(xiě)中斷程序 */
OUT1_ON();
EXTI_ClearITPendingBit(EXTI_Line15); //清除中斷標(biāo)志位
}
}
interrupt.h
#ifndef __Interrupt_H
#define __Interrupt_H
void Interrupt_Init (void);
#endif
-
寄存器
+關(guān)注
關(guān)注
31文章
5356瀏覽量
120573 -
STM32
+關(guān)注
關(guān)注
2270文章
10905瀏覽量
356445 -
外部中斷
+關(guān)注
關(guān)注
1文章
132瀏覽量
15837 -
時(shí)鐘控制
+關(guān)注
關(guān)注
0文章
17瀏覽量
6831 -
AFIO
+關(guān)注
關(guān)注
0文章
6瀏覽量
2967
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論