通过STM32外部中断完成小灯的震动感应开与关
1.所需硬件:
STM32F103C8T6,USB灯,继电器,震动传感器
2.硬件接线:
3.代码编写
(1)配置继电器结构体
#include "relay.h"
#include "stm32f10x.h"
void Relay_Init(void)
{
GPIO_InitTypeDef Relay_init;//定义继电器结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//打开串口时钟
Relay_init.GPIO_Mode = GPIO_Mode_Out_PP;//输出模式配置成推挽输出
Relay_init.GPIO_Pin = GPIO_Pin_3;//端口选择A3
Relay_init.GPIO_Speed = GPIO_Speed_10MHz;//配置引脚传输速度为10MHz
GPIO_Init(GPIOA,&Relay_init);//初始化串口
}
(2)中断配置
#include "exti.h"
#include "stm32f10x.h"
void Exti_Init(void)
{
GPIO_InitTypeDef Shake_Init;//定义震动传感器结构体
EXTI_InitTypeDef exti_init;//定义EXTI中断结构体
NVIC_InitTypeDef nvic_init;//定义NVIC中断结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能GPIOB的APB2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//使能AFIO的APB2
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource9);//选择GPIO管脚用作外部中断线路
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置优先级组为第二组
GPIO_InitTypeDef Shake_Init;//定义震动传感器结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//打开串口时钟
Shake_Init.GPIO_Mode = GPIO_Mode_IPD;//输入模式配置成下拉输入模式
Shake_Init.GPIO_Pin = GPIO_Pin_9;//端口选择B9
Shake_Init.GPIO_Speed = GPIO_Speed_10MHz;//配置引脚传输速度为10MHz
GPIO_Init(GPIOB,&Shake_Init);//初始化串口
exti_init.EXTI_Line = EXTI_Line9;//选择中断线9
exti_init.EXTI_Mode = EXTI_Mode_Interrupt;//设置为中断请求
exti_init.EXTI_Trigger = EXTI_Trigger_Falling;//触发方式下降沿触发
exti_init.EXTI_LineCmd = ENABLE;//中断线使能
EXTI_Init(&exti_init);//中断初始化
nvic_init.NVIC_IRQChannel = EXTI9_5_IRQn;//中断通道 指定IRQ通道 这里指定外部中断线9-5中断 因为使用的是EXTI9
nvic_init.NVIC_IRQChannelCmd = ENABLE;//设定指定IRQ通道中断使能
nvic_init.NVIC_IRQChannelPreemptionPriority = 1;//设定指定IRQ通道的先占优先级
nvic_init.NVIC_IRQChannelSubPriority = 1;//设定指定IRQ通道的从优先级
NVIC_Init(&nvic_init);//初始化NVIC中断
}
(3)主函数编写
#include "stm32f10x.h"
#include "relay.h"
#include "exti.h"
void delay(uint16_t time)//延时程序
{
uint16_t i=0;
while(time--)
{
i=12000;
while(i--);
}
}
int main()
{
Relay_Init();//初始化函数
Exti_Init();
GPIO_SetBits(GPIOA,GPIO_Pin_3);//初始化一直高电平
while(1)//无限循环
{
}
}
void EXTI9_5_IRQHandler(void)//外线路5-9的中断处理程序
{
if (EXTI_GetITStatus(EXTI_Line9) != RESET)//检测制定的EXTI9线路触发请求是否发生。
{//发生输出低电平并延时1000ms再输出高电平并延时1000ms
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
delay(1000);
GPIO_SetBits(GPIOA,GPIO_Pin_3);
delay(1000);
}
EXTI_ClearFlag(EXTI_Line9);//清除中断标志位
}
初学小白,请多指教