ARM Cortex M3共有256個中斷。
STM32F103CB共有43個外部中斷和16個內部中斷。
具有相同數值編號的IO口被分配為同一組,共用一條中斷請求線,如下圖:
所以共有15條中斷線,另外
●EXTI線16連接到PVD輸出
●EXTI線17連接到RTC鬧鐘事件
●EXTI線18連接到USB喚醒事件
寄存器:1、外部中斷配置寄存器 AFIO_EXTxCR1------->用于選擇輸入中斷源 Pin 0..3
AFIO_EXTxCR2------->用于選擇輸入中斷源 Pin 0..7
AFIO_EXTxCR2------->用于選擇輸入中斷源 Pin 8..11
AFIO_EXTxCR2------->用于選擇輸入中斷源 Pin 12..15
(說明:5個端口PORTA..E,每個端口各有16位可供選擇)
2、中斷屏蔽寄存器 EXTI_IMR----------->屏蔽線上的中斷請求 共19路
3、事件屏蔽寄存器 EXTI_EMR----------->屏蔽線上的事件 共19路
4、上升沿觸發選擇寄存器 EXTI_RTSR---------->設置相應線為上升沿觸發 19位
5、下降沿觸發選擇寄存器 EXTI_FTSR---------->設置相應線為上升沿觸發 19位
6、掛起寄存器 EXTI_PR------------>中斷線上發生了選擇的邊沿事件時置1 19位
7、軟件中斷事件寄存器 EXTI_SWIER--------->寫該位可以將EXTI_PR中相應的位值高,如果EXTI_IMR或EXTI_EMR使能,則可以產生相應的中斷
配置流程:中斷在使用前必須對中斷線進行配置并激活
1、配置相應的IO口為輸入,浮空輸入時一定要加上拉或者是下拉
2、開啟IO口復用時鐘,設置IO與中斷線的映射關系---->AFIO_EXTxCR1
3、設置相應中斷觸發條件---------->EXTI_IMR、EXTI_RTSR、EXTI_FTSR
4、在NVIC中開啟并使能中斷,對中斷分組進行配置
5、編寫中斷服務函數
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------>
編寫中斷程序的步驟:(庫函數版)
1.初始化系統時鐘和端口時鐘,在此需注意設置完端口時鐘外還須將端口設置為功能復用IO時鐘。RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE)
2.初始化GPIO。
3.中斷配置,包括兩部分(兩個函數),中斷配置和中斷優先級配置。
中斷配置:結構體:EXTI_InitTypeDef 。清空中斷線、中斷線映射CPU、中斷線選擇、中斷模式、觸發方式、使能。
優先級配置:結構體:NVIC_InitTypeDef。選組、選擇IRQ通道、設置搶占優先級、設置從優先級、使能。
EG: EXTI_Configuration() 和 NVIC_Configuration()
分組情況:
優先級組別 | 搶占式優先級 | 副優先級 |
4 | 4位/16級 | 0位/0級 |
3 | 3位/8級 | 1位/2級 |
2 | 2位/4級 | 2位/4級 |
1 | 1位/2級 | 3位/8級 |
0 | 0位/0級 | 4位/6級 |
4.中斷服務程序。比如0號中斷線對應函數 void EXTI0_IRQHandler(void)
示例:按鍵改變LED的狀態
1.主要功能是按鍵響應中斷從而改變LED的狀態。
2.按鍵所屬端口:GPIOB,LED所屬端口:GPIOB
3.按鍵管腳:PB0~PB7
4.LED管腳:PB8~PB15
5.PB0~PB5分別依次控制PB8~PB13
1 #include "pbdata.h"
2 #include "led.h"
3 #include "key.h"
4 #include "misc.h"
5 #include "stm32f10x_exti.h"
6
7 void RCC_Configration(void)
8 {
9 SystemInit();
10 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
11 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //功能復用IO時鐘
12 }
13
14 void GPIO_Configration(void)
15 {
16 GPIO_LED_Configration();
17 GPIO_KEY_Configration();
18 }
19
20 /*
21 *中斷配置*
22 */
23 void EXTI_Configuration(void)
24 {
25 EXTI_InitTypeDef EXTI_InitStructure;
26
27 EXTI_ClearITPendingBit(EXTI_Line0); //清空中斷線
28 EXTI_ClearITPendingBit(EXTI_Line1);
29 EXTI_ClearITPendingBit(EXTI_Line2);
30 EXTI_ClearITPendingBit(EXTI_Line3);
31 EXTI_ClearITPendingBit(EXTI_Line4);
32 EXTI_ClearITPendingBit(EXTI_Line5);
33 EXTI_ClearITPendingBit(EXTI_Line6);
34 EXTI_ClearITPendingBit(EXTI_Line7);
35
36 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);//映射
37 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);
38 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource2);
39 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource3);
40 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource4);
41 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource5);
42 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource6);
43 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource7);
44
45 EXTI_InitStructure.EXTI_Line=EXTI_Line0 | EXTI_Line1 | EXTI_Line2 | EXTI_Line3 | EXTI_Line4 | EXTI_Line5 | EXTI_Line6 | EXTI_Line7; //選擇中斷線
46
47 EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //設置模式
48 EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; //設置觸發方式
49 EXTI_InitStructure.EXTI_LineCmd=ENABLE; //使能
50
51 EXTI_Init(&EXTI_InitStructure);
52 }
53
54 void NVIC_Configuration0(void) //優先級設置函數
55 {
56 NVIC_InitTypeDef NVIC_InitStructure;
57
58 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
59
60 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //選擇IRQ通道
61 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //搶占優先級設置
62 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //次優先級設置
63 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
64 NVIC_Init(&NVIC_InitStructure);
65 }
66
67 void NVIC_Configuration1(void)
68 {
69 NVIC_InitTypeDef NVIC_InitStructure;
70
71 // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
72
73 NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
74 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
75 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
76 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
77 NVIC_Init(&NVIC_InitStructure);
78 }
79
80 void NVIC_Configuration2(void)
81 {
82 NVIC_InitTypeDef NVIC_InitStructure;
83
84 // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
85
86 NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
87 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
88 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
89 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
90 NVIC_Init(&NVIC_InitStructure);
91 }
92
93 void NVIC_Configuration3(void)
94 {
95 NVIC_InitTypeDef NVIC_InitStructure;
96
97 // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
98
99 NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
100 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
101 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
102 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
103 NVIC_Init(&NVIC_InitStructure);
104 }
105
106 void NVIC_Configuration4(void)
107 {
108 NVIC_InitTypeDef NVIC_InitStructure;
109
110 // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
111
112 NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
上一篇:PWM控制led漸變
下一篇:SysTick 定時器的使用
推薦閱讀
史海拾趣