功能描述:使用STM32F405RGT6的EXTI功能,对PA10引脚的上升沿进行计数,并在OLED上显示。
- main.c文件内容如下
#include "stm32f4xx.h" // Device header
#include "OLED.h"
#include "MyEXTI.h"
uint16_t cnt = 0;
int main(void)
{
OLED_Init(); //初始化OLED
MyEXTI_Init(); //初始化EXTI
while(1)
{
OLED_ShowNum(0,0,cnt,10,3,8); //显示cnt
OLED_Refresh(); //刷新OLED
}
}
//10~15号外部中断线中断服务函数
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line10) == SET) //判断是否是相应中断线
{
EXTI_ClearITPendingBit(EXTI_Line10); //清除中断挂起标志位
cnt++; //cnt自增1
if(cnt > 999) //如果cnt大于999则重置
cnt = 0;
}
}
- MyEXTI.c文件内容如下
#include "MyEXTI.h"
/**
* @摘要 初始化EXTI
* @参数 无
* @返回值 无
* @说明 无
*/
void MyEXTI_Init(void)
{
//开启GPIOA的时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
//定义GPIO初始化结构体
GPIO_InitTypeDef GPIO_InitStructure;
//初始化上述结构体
GPIO_StructInit(&GPIO_InitStructure);
//配置GPIO模式为输入模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
//配置GPIO输出类型为推挽输出(此处无用)
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
//指定GPIO引脚为Pin10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
//配置GPIO输入类型为下拉输入
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
//配置GPIO的速度为快速50MHZ
GPIO_InitStructure.GPIO_Speed = GPIO_Fast_Speed;
//初始化对应的GPIO
GPIO_Init(GPIOA, &GPIO_InitStructure);
//开启系统配置的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
//指定GPIOA的Pin10连接到外部中断线10
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource10);
//定义EXTI(外部中断)初始化结构体
EXTI_InitTypeDef EXTI_InitStructure;
//初始化上述结构体
EXTI_StructInit(&EXTI_InitStructure);
//配置外部中断线为10号线
EXTI_InitStructure.EXTI_Line = EXTI_Line10;
//配置外部中断线为使能状态
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
//配置外部中断线为中断请求(而非事件请求)
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
//配置外部中断线为上升沿触发
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
//初始化EXTI
EXTI_Init(&EXTI_InitStructure);
//NVIC优先级分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//定义NVIC初始化结构体
NVIC_InitTypeDef NVIC_InitStructure;
//选择NVIC通道为TIM2_IRQn
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
//配置该通道为使能状态
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//配置抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
//配置响应优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
//初始化NVIC
NVIC_Init(&NVIC_InitStructure);
}
/**
* @摘要 外部中断线的中断开关
* @参数 EXTI_Line:外部中断线编号,EXTI_Linex——x可以为0~22
* @参数 NewState:新的状态,ENABLE 或者DISABLE
* @返回值 无
* @说明 无
*/
void MyEXTI_InterCmd(uint32_t EXTI_Line, FunctionalState NewState)
{
if(NewState != DISABLE)
EXTI->IMR |= EXTI_Line;
else
EXTI->IMR &= ~EXTI_Line;
}
/**
* @摘要 外部中断线的事件开关
* @参数 EXTI_Line:外部中断线编号,EXTI_Linex——x可以为0~22
* @参数 NewState:新的状态,ENABLE 或者DISABLE
* @返回值 无
* @说明 无
*/
void MyEXTI_EventCmd(uint32_t EXTI_Line, FunctionalState NewState)
{
if(NewState != DISABLE)
EXTI->EMR |= EXTI_Line;
else
EXTI->EMR &= ~EXTI_Line;
}
- MyEXTI.h文件内容如下
#ifndef __MYEXTI_H
#define __MYEXTI_H
#include "stm32f4xx.h" // Device header
void MyEXTI_Init(void);
void MyEXTI_InterCmd(uint32_t EXTI_Line, FunctionalState NewState);
void MyEXTI_EventCmd(uint32_t EXTI_Line, FunctionalState NewState);
#endif