STM32供GPIO口中使用的中断线有几条?若将GPIOE.11作为按键触发的输入口,使用的外部中断入口函数名为
时间: 2024-05-27 08:12:27 浏览: 120
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号引脚的状态发生变化时,触发对应的中断,并执行相应的中断服务程序。
配置完成外部中断初始化函数EXIT_init,其中PE2作为外部中断触发引脚,设置为中断模式,触发方式为下降沿触发。(代码)
在许多微控制器平台中,配置外部中断通常涉及特定的寄存器操作。假设我们正在使用基于ARM Cortex-M系列的芯片,比如STM32,这里是一个基本的代码片段示例,展示了如何在C语言中初始化PE2引脚作为外部中断,并设置成下降沿触发:
```c
#include "stm32f10x.h" // 包含STM32的头文件
void EXIT_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; // 初始化结构体
// 首先需要配置GPIO口作为输入模式
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); // 启动GPIOE时钟
GPIO_PinRemapConfig(GPIO_Remap可谓是, ENABLE); // 如果需要,启用引脚重映射到中断线
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; // 设置PE2引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 设置为浮空输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设定速度
GPIO_Init(GPIOE, &GPIO_InitStructure); // 初始化GPIO
// 然后配置EXTI线
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line2; // EXTI对应于GPIO PE2
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 设置为中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 开启EXTI线
EXTI_Init(&EXTI_InitStructure); // 初始化EXTI
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; // 设置中断处理函数对应的中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 开启中断
NVIC_Init(&NVIC_InitStructure); // 初始化NVIC以连接中断
}
```
阅读全文