#include "stm32f10x.h" #include "Motor.h" #include "PWM.h" int16_t IRSensor_Count; int8_t Leftspeed; int8_t Rightspeed; void IRSensor_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1| GPIO_Pin_2|GPIO_Pin_3; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource2); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3); EXTI_InitTypeDef EXTI_InitStructure; //定义结构体变量 EXTI_InitStructure.EXTI_Line = EXTI_Line1 | EXTI_Line2|EXTI_Line3 ; //选择配置外部中断的0号线和1号线 EXTI_InitStructure.EXTI_LineCmd = ENABLE; //指定外部中断线使能 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //指定外部中断线为中断模式 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //指定外部中断线为下降沿触发 EXTI_Init(&EXTI_InitStructure); //将结构体变量交给EXTI_Init,配置EXTI外设 /*NVIC中断分组*/ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); //配置NVIC为分组2 //即抢占优先级范围:0~3,响应优先级范围:0~3 /*NVIC配置*/ NVIC_InitTypeDef NVIC_InitStructure; //定义结构体变量 NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //选择配置NVIC的EXTI0线 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //指定NVIC线路使能 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //指定NVIC线路的抢占优先级为1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //指定NVIC线路的响应优先级为1 NVIC_Init(&NVIC_InitStructure); //将结构体变量交给NVIC_Init,配置NVIC外设 NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //选择配置NVIC的EXTI1线 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //指定NVIC线路使能 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //指定NVIC线路的抢占优先级为1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //指定NVIC线路的响应优先级为2 NVIC_Init(&NVIC_InitStructure);问
时间: 2025-06-27 09:11:06 浏览: 18
### STM32F10x EXTI 和 NVIC 的配置解析
在STM32F10x系列微控制器中,外部中断/事件线(EXTI)和嵌套向量中断控制器(NVIC)是实现外部设备触发中断的核心模块。对于红外传感器的应用场景,通常需要通过GPIO引脚捕获信号变化并触发相应的中断处理程序。
#### GPIO 配置
为了使能外部中断功能,首先需将对应的GPIO引脚设置为输入模式,并启用上拉或下拉电阻以稳定电平状态[^1]。以下是典型的GPIO初始化代码:
```c
void GPIO_Init_EXTI(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; // 假设使用PA0作为外部中断源
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; // 设置为上拉输入模式
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
```
#### EXTI 配置
接下来配置EXTI线路与指定的GPIO引脚关联。每条EXTI线路对应一个特定的端口位号,例如EXTI Line 0 对应 PA0 引脚。以下是一个基本的EXTI初始化函数:
```c
void EXTI_Init(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 使能AFIO时钟
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); // 将PA0映射到EXTI Line 0
EXTI_InitTypeDef EXTI_InitStruct;
EXTI_StructInit(&EXTI_InitStruct);
EXTI_InitStruct.EXTI_Line = EXTI_Line0; // 使用EXTI Line 0
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; // 中断模式
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发
EXTI_InitStruct.EXTI_LineCmd = ENABLE; // 启用EXTI Line
EXTI_Init(&EXTI_InitStruct);
}
```
#### NVIC 配置
最后一步是在NVIC中注册该中断优先级并向量表位置。这决定了当多个中断请求发生时如何调度执行顺序[^2]。下面展示了一个简单的NVIC设定方法:
```c
void NVIC_Configuration(void) {
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设定抢占优先级分组
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn; // EXTI0中断通道
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;// 抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; // 子优先级
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; // 开启此IRQ通道
NVIC_Init(&NVIC_InitStruct);
}
```
以上三部分共同构成了基于STM32F10x平台上的红外传感器硬件中断机制的基础框架。实际应用过程中可能还需要考虑更多细节问题比如去抖动处理等额外逻辑设计[^3]。
阅读全文
相关推荐


















