STM32外部中断及串口(基于stm32f4系列)

1.外部中断的类型

外部中断可以分为电平触发和边缘触发两种

1.电平触发:(1)低电平触发中断检测到引脚为低电平就触发从而进入中断函数中处理这个中断,并且在高或低电平保持的时间内持续触发,假设是低电平触发,只要引脚为低电平时间内中断一直有效,那么就会一直进入中断,直到电平变化为高电平。

(2)高电平触发:检测到引脚为高电平就触发

2.边缘触发:

(1)上升沿触发:电压由低到高触发中断

(2)下降沿触发:电压由高到低触发中断

终端只会触发一次在下次电平发生变化时才会重新触发中断

2.GPIO外部中断的配置

EXTI中断/事件线(查看stm32f4xx中文参考手册)

STM32外部中断及串口(基于stm32f4系列)_第1张图片

配置外部中断的步骤:

1)使用IO口时钟初始化IO口为输入

2)开启SYSCFG时钟设置IO口与中断线的映射关系

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能 SYSCFG 时钟

该函数将 GPIO 端口与中断线映射起来,使用范例是:

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);

3) 初始化线上中断,设置触发条件等。 中断线上中断的初始化是通过函数 EXTI_Init()实现的。EXTI_Init()函数的定义是:

 void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);

结构体 EXTI_InitTypeDef 的 成员变量:

typedef struct { uint32_t EXTI_Line;
 EXTIMode_TypeDef EXTI_Mode; 
EXTITrigger_TypeDef EXTI_Trigger;
 FunctionalState EXTI_LineCmd; }EXTI_InitTypeDef;

有 4 个参数需要设置。第一个参数是中断线的标号,这个函数配置的是某个中断线上的中断参数,对于我们的外部中断, 取值范围为 EXTI_Line0~EXTI_Line15。第二个参数是中断模式,可选值为中断 EXTI_Mode_Interrupt 和事件 EXTI_Mode_Event。第三个参数是触发方式,可以是下降沿触发 EXTI_Trigger_Falling,上升沿触发 EXTI_Trigger_Rising,或者任意电平(上升沿和下降沿)触 发 EXTI_Trigger_Rising_Falling,最后一个参数就是使能中断线了。

4)配置中断分组(NVIC)并使能中断

设置中断线 2 的中断优先级。
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //使能按键外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级 2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //响应优先级 2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure); //中断优先级分组初始化

5)编写中断服务函数

EXPORT EXTI0_IRQHandler 
EXPORT EXTI1_IRQHandler 
EXPORT EXTI2_IRQHandler 
EXPORT EXTI3_IRQHandler 
EXPORT EXTI4_IRQHandler 
EXPORT EXTI9_5_IRQHandler 
EXPORT EXTI15_10_IRQHandler 

中断线 0-4 每个中断线对应一个中断函数,中断线 5-9 共用中断函数 EXTI9_5_IRQHandler,中 断线 10-15 共用中断函数 EXTI15_10_IRQHandler。

在编写中断服务函数的时候会经常使用到两 个函数,第一个函数是判断某个中断线上的中断是否发生(标志位是否置位):

 ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);

这个函数一般使用在中断服务函数的开头判断中断是否发生。另一个函数是清除某个中断线上 的中断标志位:

void EXTI_ClearITPendingBit(uint32_t EXTI_Line); 

这个函数一般应用在中断服务函数结束之前,清除中断标志位。

3.串口的介绍

STM32F407 最小系统板 所使用的 STM32F407ZGT6 最多可提供 6 路串口,有分数波特率发生器、支持同步单线通信和 半双工单线通讯、支持 LIN、支持调制解调器操作、智能卡协议和 IrDA SIR ENDEC 规范、具有 DMA 等。

4.串口的配置方法

 串口设置的一般步骤可以总结为如下几个步骤:

1) 串口时钟使能,GPIO 时钟使能。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能 USART1 时钟
假设我们使用的是串口 1,串口 1 对应着芯片引脚 PA9,PA10,
所以这里我们只需要使能 GPIOA 时钟即可:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能 GPIOA 时钟

2) 设置引脚复用器映射:调用 GPIO_PinAFConfig 函数。

GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //PA9 复用为 USART1
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//PA10 复用为 USART1

3) GPIO 初始化设置:要设置模式为复用功能。

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9 与 GPIOA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度 50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化 PA9,PA10

4) 串口参数初始化:设置波特率,字长,奇偶校验等参数。

USART_InitStructure.USART_BaudRate = bound;//一般设置为 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为 8 位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式
USART_Init(USART1, &USART_InitStructure); //初始化串口

5) 开启中断并且初始化 NVIC,使能中断(如果需要开启中断才需要这个步骤)。

6) 使能串口。

USART_Cmd(USART1, ENABLE); //使能串口

7) 编写中断处理函数:函数名格式为 USARTxIRQHandler(x 对应串口号)。

参考资料:正点原子《STM32F407最小系统板教程》

你可能感兴趣的:(stm32,单片机)