external.h
#ifndef __EXTERNAL_H
#define __EXTERNAL_H
#include "stm32f10x.h"
void External_Init(void);
#endif
external.c
#include "external.h"
#include "IO.h"
/*******************************************************************
* @brief 配置外部中断所需要的管脚
* @retval None
*/
void External_IO_Config(void)
{
//定义结构体
GPIO_InitTypeDef GPIO_InitStructure_Ext;
//打开GPIOB组时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//管脚配置
GPIO_InitStructure_Ext.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure_Ext.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure_Ext.GPIO_Speed = GPIO_Speed_50MHz;
//管脚初始化
GPIO_Init(GPIOA, &GPIO_InitStructure_Ext);
}
/*******************************************************************
* @brief 配置外部中断功能
* @retval None
*/
void External_Config(void)
{
//定义结构体
EXTI_InitTypeDef EXTI_InitStructure;
//打开中断引脚选择(AFIO)时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//选择A组1脚作为外部中断线
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);
//指定要启用或禁用的EXTI线路。
EXTI_InitStructure.EXTI_Line = EXTI_Line1; //EXTI_Line0 ~ EXTI_Line19
//指定选定EXTI线的新状态。
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //启用
// = DISABLE; //禁用
//指定EXTI线的模式
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
// = EXTI_Mode_Event; //事件模式
//指定EXTI线路的触发信号有效沿。
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
// = EXTI_Trigger_Rising; //上升沿触发
// = EXTI_Trigger_Rising_Falling; //上升沿下降沿都触发
//外部中断初始化
EXTI_Init(&EXTI_InitStructure);
}
/*******************************************************************
* @brief 配置中断控制器优先级
* @retval None
*/
void External_NVIC_Config(void)
{
//定义结构体
NVIC_InitTypeDef NVIC_InitStructure;
/**
* @brief 配置优先级分组:抢占优先级和次优先级。
* @param NVIC_优先级组:指定优先级分组位长度。
* 此参数可以是下列值之一:
* @arg NVIC_PriorityGroup_0: 0位用于抢占优先级4位用于次优先级
* @arg NVIC_PriorityGroup_1: 1位用于抢占优先级3位用于次优先级
* @arg NVIC_PriorityGroup_2: 2位用于抢占优先级2位用于次优先级
* @arg NVIC_PriorityGroup_3: 3位用于抢占优先级1位用于次优先级
* @arg NVIC_PriorityGroup_4: 4位用于抢占优先级0位用于次优先级
* @retval None
*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//指定要启用或禁用的IRQ通道。
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //IRQ通道是外部中断1号管脚
//指定NVIC_IRQChannel中定义的IRQ通道是否 将被启用或禁用。
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //启用
// = DISABLE; //禁用
//指定IRQ通道的抢占优先级 在NVIC_IRQChannel中指定 参照下表。
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
//指定IRQ通道的次优先级 在NVIC_IRQ通道中 参照下表。
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
/**
@code
The table below gives the allowed values of the pre-emption priority and subpriority according
to the Priority Grouping configuration performed by NVIC_PriorityGroupConfig function
============================================================================================================================
NVIC_PriorityGroup | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority | Description
============================================================================================================================
NVIC_PriorityGroup_0 | 0 | 0-15 | 0 bits for pre-emption priority
| | | 4 bits for subpriority
----------------------------------------------------------------------------------------------------------------------------
NVIC_PriorityGroup_1 | 0-1 | 0-7 | 1 bits for pre-emption priority
| | | 3 bits for subpriority
----------------------------------------------------------------------------------------------------------------------------
NVIC_PriorityGroup_2 | 0-3 | 0-3 | 2 bits for pre-emption priority
| | | 2 bits for subpriority
----------------------------------------------------------------------------------------------------------------------------
NVIC_PriorityGroup_3 | 0-7 | 0-1 | 3 bits for pre-emption priority
| | | 1 bits for subpriority
----------------------------------------------------------------------------------------------------------------------------
NVIC_PriorityGroup_4 | 0-15 | 0 | 4 bits for pre-emption priority
| | | 0 bits for subpriority
============================================================================================================================
@endcode
*/
//中断控制器初始化
NVIC_Init(&NVIC_InitStructure);
}
/*******************************************************************
* @brief 结合以上函数,进行外部中断完整版初始化
* @retval None
*/
void External_Init(void)
{
External_IO_Config();
External_Config();
External_NVIC_Config();
}
/*******************************************************************
* @brief 中断服务函数,函数名是固定的,怎么选,看启动文件。
* 此函数的内容是:每一次中断,LED取反。
* @retval None
*/
void EXTI1_IRQHandler(void)
{
static char a = 0;
if (EXTI_GetITStatus(EXTI_Line1) == SET) //判断中断标志位是否等于1
{
SetBite_1_0(GPIOB, GPIO_Pin_8, a);
a = !a;
EXTI_ClearITPendingBit(EXTI_Line1); //将标志位清零
}
}
IO.h
#ifndef __IO_H
#define __IO_H
#include "stm32f10x.h"
void IO_Init(void);
void SetBite_1_0(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, char a);
#endif
IO.c
#include "IO.h"
/*************************************************************************/
/**
* @brief IO初始化配置
* @retval None
*/
void IO_Init()
{
//定义结构体,名字自定义
GPIO_InitTypeDef GPIO_InitStruct_Out_PP; //配置管脚输出
GPIO_InitTypeDef GPIO_InitStruct_IPU; //配置管脚输入
//打开管脚时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //打开B组管脚时钟
//管脚配置
//管脚位
GPIO_InitStruct_Out_PP.GPIO_Pin = GPIO_Pin_8; //GPIO_Pin_0 ~ GPIO_Pin_15
//管脚模式
GPIO_InitStruct_Out_PP.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出管脚(组)配置
// = GPIO_Mode_IN_FLOATING; //浮空输入管脚(组)配置
// = GPIO_Mode_IPU; //上拉输入管脚(组)配置
// = GPIO_Mode_IPD; //下拉输入管脚(组)配置
// = GPIO_Mode_Out_OD; //开漏输出管脚(组)配置
// = GPIO_Mode_AIN; //模拟输入管脚(组)配置
// = GPIO_Mode_AF_OD; //复用开漏输出管脚(组)配置
// = GPIO_Mode_AF_PP; //复用推挽输出管脚(组)配置
//管脚速度
GPIO_InitStruct_Out_PP.GPIO_Speed = GPIO_Speed_50MHz; //高速50MHz
// = GPIO_Speed_10MHz; //中速10MHz
// = GPIO_Speed_2MHz; //低速2MHz
//初始化管脚
GPIO_Init(GPIOB, &GPIO_InitStruct_Out_PP);
}
/*************************************************************************/
/**
* @brief 给单个管脚置位0或1
* @param 管脚组:GPIOx: where x can be (A..G) to select the GPIO peripheral.
* @param 单个管脚:GPIO_Pin_x:where x can be (0..16) to select the GPIO peripheral.
* @param 给单个管脚置位0或1
* @retval None
*/
void SetBite_1_0(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, char a)
{
if(a)
GPIO_SetBits(GPIOx, GPIO_Pin); //管脚置高电平函数
else
GPIO_ResetBits(GPIOx, GPIO_Pin); //管脚置低电平函数
}
main.c
#include "stm32f10x.h"
#include "IO.h"
#include "external.h"
int main()
{
//调用IO初始化函数
IO_Init();
//调用外部中断初始化函数
External_Init();
while(1)
{
}
}