目录
2. shake.c 震动传感器SW-18010P模块配置源码
ps:第一次发文,如有错误请大家指出,感谢大家啦,大家一起加油努力吧!
一、什么是外部中断
可以想象一个场景:一个人在屋内看书,此时有人敲门,这个人停止看书去开门,后继续回来看书。这个过程就可以看成一个中断过程。将此人看成一个单片机系统,看书看成CPU正在处理的主任务,将始终执行。而有人敲门,需要此人去开门,就是外部改变,需要CPU暂时中断主要任务,去处理中断任务(开门),处理完后继续回到主任务(看书)。
二、STM32外部中断概述
1. 相关控制器(EXTI外设)
1.1 其主要特性
1.2 使用过程
要使用并产生中断,必须首先配置好并使能中断线,中断线与IO口对应关系如下:
通过上如可以观察到,二者映射过程用到了AFIO复用IO寄存器,因此在配置过程中必须使能AFIO复用时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE)。1.041
1.3 中断服务函数
外部中断线与中断函数对应关系如下:
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI9_5_IRQHandler
EXTI15_10_IRQHandler
二、NVIC(内核中的中断总控制)
STM32的NVIC详解_stm32 nvic-CSDN博客
三、STM32外部中断震动传感器控制小灯亮灭源码
1. exti.c外部中断配置源码
#include "stm32f10x.h"
#include "exti.h"
void exti_Init(void)
{
//1.配置GPIO
EXTI_InitTypeDef exti_Init;
NVIC_InitTypeDef nivc_Init;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//AFIO为片上外设,将gpio口与extiline通道进行联通,开启其时钟
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource2);//pa2->EXTI2
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置中断优先级分组
//2.配置EXTI外部中断初始化,EXTI不需要开启时钟,默认开启
exti_Init.EXTI_Line= EXTI_Line2; //中断通道选择
exti_Init.EXTI_Mode= EXTI_Mode_Interrupt;//模式选择中断,另一种为事件
exti_Init.EXTI_Trigger=EXTI_Trigger_Falling;//下降沿触发
exti_Init.EXTI_LineCmd= ENABLE;//使能
EXTI_Init(&exti_Init);
//EXTI产生中断源,进去NVIC,配置NVIC中断控制器 在misc里
//1.设置中断通道 2.设置抢占优先级 3.设置子优先级 4.控制是否能用 或否
nivc_Init.NVIC_IRQChannel=EXTI2_IRQn;
nivc_Init.NVIC_IRQChannelPreemptionPriority=0;
nivc_Init.NVIC_IRQChannelSubPriority=0;
nivc_Init.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&nivc_Init);
}
2. shake.c 震动传感器SW-18010P模块配置源码
#include "stm32f10x.h"
#include "shake.h"
void shake_Init(void)
{
GPIO_InitTypeDef shake_Init;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
shake_Init.GPIO_Pin=GPIO_Pin_2;
shake_Init.GPIO_Speed=GPIO_Speed_10MHz;
shake_Init.GPIO_Mode=GPIO_Mode_IPD;//设置下拉输入
GPIO_Init(GPIOA,&shake_Init);
}
3. led.c源码
#include "stm32f10x.h"
#include "led.h"
//初始化LED灯的函数---定义,声明,调用
void Led_init(void)
{
//初始化LED引脚GPIOA1
GPIO_InitTypeDef led_init;//定义GPIO的结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//初始化时钟,使能APB2下的外设GPIOA的时钟使能
led_init.GPIO_Pin=GPIO_Pin_1;//配置GPIOA1的引脚
led_init.GPIO_Speed=GPIO_Speed_2MHz;//配置引脚输出速度为2MHZ
led_init.GPIO_Mode=GPIO_Mode_Out_PP;//配置引脚的模式为推挽输出
GPIO_Init(GPIOA,&led_init);//初始化GPIO结构体
}
4.主函数main.c
#include "stm32f10x.h"
#include "led.h"
#include "main.h"
#include "shake.h"
#include "exti.h"
void delay(uint16_t time)//延时1ms函数
{
uint16_t i = 0;
while(time --)
{
i=12000;
while(i--);
}
}
//编写中断响应函数
//1.在.s文件中找到中断响应函数
//2.写一个同名函数覆盖它
void EXTI2_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line2)!=RESET)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
delay(500);
GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
EXTI_ClearFlag(EXTI_Line2);
}
int main()
{
Led_init();
Bear_Init();
Key_Init();
Relay_Init();
shake_Init();
exti_Init();
GPIO_SetBits(GPIOA, GPIO_Pin_1);//先初始化灯为关闭状态
while(1)
{
}
}