STM32供GPIO口中使用的中断线有几条?若将GPIOE.11作为按键触发的输入口,使用的外部中断入口函数名为
时间: 2024-05-27 14:12:27 浏览: 115
STM32的GPIO口中,每个I/O口都可以使用外部中断线,即每个I/O口都有一个对应的外部中断线。因此,STM32的GPIO口中使用的中断线的数量与GPIO口的数量是相等的。
若将GPIOE.11作为按键触发的输入口,使用的外部中断入口函数名为EXTI15_10_IRQHandler。该函数是处理外部中断线15~10的中断服务函数,因为GPIOE.11对应的外部中断线是EXTI_Line11,而11在15~10的范围内,因此该函数可以用来处理GPIOE.11的中断。
相关问题
#include "stm32f10x.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ void GPIO_Configuration(void); void NVIC_Configuration(void); void EXTI_Configuration(void); int main(void) { GPIO_Configuration(); NVIC_Configuration(); EXTI_Configuration(); GPIO_SetBits(GPIOC,GPIO_Pin_0);//GPIOC Pin0输出高电平即熄灭LED while(1) { } } void GPIO_Configuration() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//可以以或方式添加多个引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//下拉输入 GPIO_InitStructure.GPIO_Speed= GPIO_Speed_2MHz;//配置为输入模式时,可不配置速度 GPIO_Init(GPIOA, &GPIO_InitStructure);//以GPIO_InitStructure变量的值作为配置信息,初始化GPIOA RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//使能GPIOE时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//可以以或方式添加多个引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入 GPIO_InitStructure.GPIO_Speed= GPIO_Speed_2MHz;//配置为输入模式时,可不配置速度 GPIO_Init(GPIOE, &GPIO_InitStructure);//以GPIO_InitStructure变量的值作为配置信息,初始化GPIOE RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能GPIOC时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//可以以或方式添加多个引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed= GPIO_Speed_2MHz;//引脚的输出速度为2MHz GPIO_Init(GPIOC, &GPIO_InitStructure);//以GPIO_InitStructure变量的值作为配置信息,初始化GPIOC } void NVIC_Configuration() { NVIC_InitTypeDef NVIC_InitStructure; NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); } void EXTI_Configuration() { EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line=EXTI_Line0|EXTI_Line3; EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling ; EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_Init(&EXTI_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);// GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource3);// }根据程序画一个流程图
很抱歉,我无法画流程图,但是我可以为您解释一下这个程序的主要流程:
1. 在main函数中,先调用GPIO_Configuration()函数、NVIC_Configuration()函数和EXTI_Configuration()函数来配置GPIO、中断向量表和外部中断。
2. 在GPIO_Configuration()函数中,先使能AFIO、GPIOA、GPIOE和GPIOC的时钟,然后分别配置它们对应的引脚的模式(下拉输入、上拉输入和推挽输出)和速度(2MHz)。
3. 在NVIC_Configuration()函数中,先设置中断向量表的位置为FLASH,然后设置中断优先级分组为2。接着分别配置EXTI0和EXTI3对应的中断通道的中断优先级和使能中断。
4. 在EXTI_Configuration()函数中,先配置外部中断的触发方式为上升和下降沿触发。然后使能EXTI0和EXTI3对应的中断线,最后配置GPIOA的0号引脚和GPIOE的3号引脚对应的中断源。
5. 在while(1)循环中,程序一直运行等待外部中断的触发。当GPIOA的0号引脚或GPIOE的3号引脚的状态发生变化时,触发对应的中断,并执行相应的中断服务程序。
stm32f107vct6配置PE5中断
要配置STM32F107VCT6的PE5引脚中断,你可以按照以下步骤进行操作:
1. 首先,在代码中包含相应的头文件:
```c
#include "stm32f10x.h"
```
2. 初始化GPIOE时钟,并配置PE5引脚为输入模式:
```c
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; // 设置为上拉输入
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStruct);
```
3. 配置中断线和触发方式:
```c
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource5);
EXTI_InitTypeDef EXTI_InitStruct;
EXTI_InitStruct.EXTI_Line = EXTI_Line5; // 使用PE5引脚作为中断线
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发中断
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
```
4. 配置中断优先级并使能中断:
```c
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn; // 使用EXTI9_5中断通道
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x01; // 设置抢占优先级为1
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00; // 设置子优先级为0
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
```
5. 编写中断处理函数EXTI9_5_IRQHandler,并在其中处理中断事件:
```c
void EXTI9_5_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line5) != RESET)
{
// 处理中断事件
// ...
EXTI_ClearITPendingBit(EXTI_Line5); // 清除中断标志位
}
}
```
6. 最后,确保在主函数中开启全局中断使能:
```c
NVIC_EnableIRQ(EXTI9_5_IRQn); // 开启中断向量表
```
这样,当PE5引脚的电平发生下降沿时,中断就会被触发,并执行EXTI9_5_IRQHandler中的代码。你可以在中断处理函数中编写你想要执行的操作。记得在处理完中断事件后,要清除中断标志位。
阅读全文