光敏传感器
光敏传感器需要设置为上拉输入 (GPIO_Mode_IPU)
1 2 3 4 5
| GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOX, &GPIO_InitStructure);
|
一般0(Bit_RESET)为亮、1(Bit_SET)为暗
中断
GPIO -> AFIO -> EXIT -> NVIC
开启时钟
1 2 3
| RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
|
AFIO选择中断引脚
1 2
| GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);
|
EXTI初始化
1 2 3 4 5 6 7
| EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line0 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_Init(&EXTI_InitStructure);
|
NVIC中断分组
抢占优先级越高越先中断,相应优先级越高越先排队
| 分组 |
抢占优先级 |
相应优先级 |
| 0 |
0 取值0 |
4位 取值0~15 |
| 1 |
1 取值0~1 |
3位 取值0~7 |
| 2 |
2 取值0~3 |
2位 取值0~3 |
| 3 |
3 取值0~7 |
1位 取值0~1 |
| 4 |
4 取值0~15 |
0位 取值0 |
1 2 3 4 5 6
|
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
|
NVIC配置
1 2 3 4 5 6
| NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_Init(&NVIC_InitStructure);
|
中断函数
中断函数的名字是 EXTI0_IRQHandler ,也就是NVIC_IRQChannel的值去掉n再加Handler
如果是Line是范围的话,需要在中断函数里二次判断是不是我们连的那条线 EXTI_GetITStatus
记得在函数结束时清除标志位 EXTI_ClearITPendingBit
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line0) == SET) {
EXTI_ClearITPendingBit(EXTI_Line0); } }
|
完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| #include "stm32f10x.h" #include "Delay.h"
void Encoder_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);
EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line0 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_Init(&EXTI_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_Init(&NVIC_InitStructure);
}
void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line0) == SET) {
EXTI_ClearITPendingBit(EXTI_Line11); } }
void EXTI1_IRQHandler(void);
...
void EXTI4_IRQHandler(void);
|