/* 用中断来监测按键,实现LED灯的顺序和逆序闪烁控制
@程序功能说明: Key1按下,四个LED灯顺序亮,Key2按下,四个LED灯逆序亮@
@LED与端口对应关系:LED1-----PC6; LED2-----PC7@
@ LED3-----PC8; LED4-----PC9@
@按键与端口对应关系:Key1-----PC13;Key2-----PB5@
*/
#include "stm32f10x.h"
char flag=1;//按键标识位:0-按键0;1-按键1
void RCC_Configuration(void);
void GPIO_Configuration(void);
void EXTI_Configuration(void);
void NVIC_Configuration(void);
void delay_nms(u16 time);
#define LED1(x) x ? GPIO_SetBits(GPIOC, GPIO_Pin_6): GPIO_ResetBits(GPIOC, GPIO_Pin_6)
#define LED2(x) x ? GPIO_SetBits(GPIOC, GPIO_Pin_7): GPIO_ResetBits(GPIOC, GPIO_Pin_7)
#define LED3(x) x ? GPIO_SetBits(GPIOC, GPIO_Pin_8): GPIO_ResetBits(GPIOC, GPIO_Pin_8)
#define LED4(x) x ? GPIO_SetBits(GPIOC, GPIO_Pin_9): GPIO_ResetBits(GPIOC, GPIO_Pin_9)
int main(void)
{
RCC_Configuration();//配置时钟
GPIO_Configuration();//配置GPIO
EXTI_Configuration();//配置外部中断源
NVIC_Configuration();//配置向量中断控制器
while(1)
{
if (flag)
{
LED1(0);LED2(1);LED3(1);LED4(1);//亮LED1
delay_nms(1000);
LED1(1);LED2(0);LED3(1);LED4(1);//亮LED2
delay_nms(1000);
LED1(1);LED2(1);LED3(0);LED4(1);//亮LED3
delay_nms(1000);
LED1(1);LED2(1);LED3(1);LED4(0);//亮LED4
delay_nms(1000);
}
else{
LED1(1);LED2(1);LED3(1);LED4(0);//亮LED4
delay_nms(1000);
LED1(1);LED2(1);LED3(0);LED4(1);//亮LED3
delay_nms(1000);
LED1(1);LED2(0);LED3(1);LED4(1);//亮LED2
delay_nms(1000);
LED1(0);LED2(1);LED3(1);LED4(1);//亮LED1
delay_nms(1000);
}
}
}
void RCC_Configuration(void)//时钟配置子程序
{
SystemInit(); //72MHz
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOB的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能GPIOC的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO的时钟
}
void GPIO_Configuration(void)//配置GPIO口
{
GPIO_InitTypeDef GPIO_InitStructure;//声明GPIO初始化结构变量。
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; //配置管脚6-9
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //IO口配置为推挽输出口
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure); //初始化PC口
LED1(1);LED2(1);LED3(1);LED4(1);//关闭所有LED灯
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5; //配置管脚15
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU ; //IO口配置为上拉输入
GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化PA15口
//GPIO_SetBits(GPIOB,GPIO_Pin_5);//ODR对应位设置为1,激活上拉配置
GPIOB->ODR|=1<<5; //PB5设置为上拉(需要往对应ODR位设置1)
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13; //配置管脚5
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU ; //IO口配置为上拉输入
GPIO_Init(GPIOC,&GPIO_InitStructure); //初始化PC5口
//GPIO_SetBits(GPIOC,GPIO_Pin_13);//ODR对应位设置为1,激活上拉配置
GPIOC->ODR|=1<<13; //PC13上拉 (需要往对应ODR位设置1)
}
void EXTI_Configuration(void) //配置外部中断源
{
EXTI_InitTypeDef EXTI_InitStructure; //声明外部中断初始化结构体
EXTI_InitStructure.EXTI_Line=EXTI_Line13|EXTI_Line5; //外部中断线Line15 | Line5
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; // 选择中断模式
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; //下降沿触发
EXTI_InitStructure.EXTI_LineCmd=ENABLE; //使能中断
EXTI_Init(&EXTI_InitStructure); //初始化外部中断
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource13); //PA15配置为外部中断源(本质利用AFIO_EXTICR寄存器)
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource5); //PC5配置为外部中断源(本质利用AFIO_EXTICR寄存器)
}
void NVIC_Configuration(void) //嵌套向量中断初始化
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//中断优先级分组配置分组1:1位抢占优先级、3位子优先级
NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn; //EXTI9_5中断源
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //占先优先级设定,取值为0-1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //从优先级设计定,取值为0-7
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn; //EXTI9_5中断源
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //占先优先级设定,取值为0-1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //从优先级设计定,取值为0-7
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI9_5_IRQHandler(void) //外部中断源9-5的中断子程序
{
if (EXTI_GetITStatus(EXTI_Line5)!=RESET)
{
flag=1;
EXTI_ClearFlag(EXTI_Line5);
}
}
void EXTI15_10_IRQHandler(void) //外部中断源15-10的中断子程序
{
if (EXTI_GetITStatus(EXTI_Line13)!=RESET)
{
flag=0;
EXTI_ClearFlag(EXTI_Line13);
}
}
//@延时子程序@
void delay_nms(u16 time)
{
u16 i=0;
while(time--)
{
i=4000; //@自己定义@
while(i--) ;
}
}
用中断来监测按键,实现LED灯的顺序和逆序闪烁控制stm32
最新推荐文章于 2024-04-06 18:56:01 发布