exti.c文件:
#include "exti.h"
#include "stm32f10x.h"
void exti_init(void)
{
//定义结构体
GPIO_InitTypeDef shake_init;
EXTI_InitTypeDef exti_init;
NVIC_InitTypeDef nvic_init;
//1.配置GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);
GPIO_EXTILineConfig( GPIO_PortSourceGPIOA , GPIO_PinSource2);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
shake_init.GPIO_Mode=GPIO_Mode_IPD;
shake_init.GPIO_Pin=GPIO_Pin_2;
shake_init.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &shake_init);
//配置EXTI外部中断
exti_init.EXTI_Line = EXTI_Line2;
exti_init.EXTI_LineCmd = ENABLE;
exti_init.EXTI_Mode = EXTI_Mode_Interrupt;
exti_init.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_Init(&exti_init);
//配置NVIC中断控制器
nvic_init.NVIC_IRQChannel = EXTI2_IRQn;
nvic_init.NVIC_IRQChannelCmd = ENABLE;
nvic_init.NVIC_IRQChannelPreemptionPriority = 1;
nvic_init.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&nvic_init);
}
main.c文件:
#include "relay.h"
#include "shake.h"
#include "exti.h"
void delay(uint16_t time)
{
uint16_t i=0;
while(time--)
{
i=12000;
while(i--);
}
}
int main()
{
Relay_Init();
Shake_Init();
exti_init();
GPIO_SetBits(GPIOA , GPIO_Pin_3); //关闭继电器
while(1)
{
}
}
void EXTI2_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line2) !=RESET) //判断是否发生中断
{
GPIO_ResetBits(GPIOA , GPIO_Pin_3); //打开继电器
delay(1000);
GPIO_SetBits(GPIOA , GPIO_Pin_3); //关闭继电器
EXTI_ClearITPendingBit(EXTI_Line2); //清除中断
}
}

文章描述了一个基于STM32F10X微控制器的EXTI中断初始化过程,用于控制继电器。在EXTI.c文件中,配置了GPIO、EXTI和NVIC中断控制器,当EXTI2线产生下降沿触发中断时,会打开继电器,延迟一定时间后再次关闭。在main.c文件中,主要调用了初始化函数并实现了中断服务程序EXTI2_IRQHandler,该程序在检测到中断后执行相应的继电器操作。
1432

被折叠的 条评论
为什么被折叠?



