用中断服务函数配置按键(PA0,PE2-4)控制LED(PC4-7)状态翻转
1)中断初始化
void interrupt_config(void)
{
//打开时钟
RCC->AHB1ENR |= (1<<0);//打开GPIOA的外设时钟使能
RCC->AHB1ENR |= (1<<4);//打开GPIOE的外设时钟使能
//打开中断时钟
RCC->APB2ENR |= (1<<14);//打开SYSCFG时钟
//配置EXTI的IMR/RTSR/FTSR寄存器,中断屏蔽置1,选择上升沿或下降沿触发
EXTI->IMR |= 0x1d;//0234位置1
EXTI->RTSR |= (1<<0);//PA0设置成上升沿触发
EXTI->FTSR |= (7<<2);//PE2/3/4设置成下降沿触发
//配置按键的外部中断线
SYSCFG->EXTICR[0] &= ~(15<<0);//将PA0映射到EXTI0线上
SYSCFG->EXTICR[0] |= (0x44<<8);//将PE2/3映射到EXTI2/3线上
SYSCFG->EXTICR[1] |= (4<<0);//将PE4映射到EXTI4线上
//设置中断号和中断优先级
NVIC_SetPriority(6,3);//设置中断号为EXTI0_IRQn,抢占优先级为0,响应优先级为3
NVIC_SetPriority(8,4);//设置中断号为EXTI2_IRQn,抢占优先级为1,响应优先级为0
NVIC_SetPriority(9,5);//设置中断号为EXTI3_IRQn,抢占优先级为1,响应优先级为1
NVIC_SetPriority(10,6);//设置中断号为EXTI4_IRQn,抢占优先级为1,响应优先级为2
//使能按键中断
NVIC_EnableIRQ(6);//使能EXTI0_IRQn
NVIC_EnableIRQ(8);//使能EXTI2_IRQn
NVIC_EnableIRQ(9);//使能EXTI3_IRQn
NVIC_EnableIRQ(10);//使能EXTI4_IRQn
}
LED配置初始化
void led_config(void)
{
//打开LED时钟
RCC->AHB1ENR |= (1<<2);//打开GPIOC的外设时钟使能
//配置GPIOC的端口输出
GPIOC->MODER |= (0x55<<8);//PC4-7配置为通用输出模式
GPIOC->OTYPER &= ~(15<<4);//PC4-7配置为推挽模式
GPIOC->ODR &= ~(15<<4);//输出数据寄存器配置为低,初始为灯亮
}
按键初始化
//按键初始化
void key_config(void)
{
GPIOA->MODER &= ~(3<<0);//设置为输入模式
GPIOA->PUPDR &= ~(3<<0);//设置为无上下拉模式
GPIOA->IDR &= ~(1<<0);
GPIOE->MODER &= ~(0x3f<<4);//PE2-4设置为输入模式
GPIOE->PUPDR &= ~(0x3f<<4);//设置为无上下拉模式
GPIOE->IDR &= ~(7<<2);
}
按键1/2/3/4中断服务函数
按下灯状态翻转
//EXTI0中断服务函数
void EXTI0_IRQHandler(void)
{
if(EXTI->PR & (1<<0))
{
EXTI->PR |= (1<<0);
LED1_TURN;
}
}
//EXTI2中断服务函数
void EXTI2_IRQHandler(void)
{
if(EXTI->PR & (1<<2))
{
EXTI->PR |= (1<<2);
LED2_TURN;
}
}
//EXTI3中断服务函数
void EXTI3_IRQHandler(void)
{
if(EXTI->PR & (1<<3))
{
EXTI->PR |= (1<<3);
LED3_TURN;
}
}
//EXTI4中断服务函数
void EXTI4_IRQHandler(void)
{
if(EXTI->PR & (1<<4))
{
EXTI->PR |= (1<<4);
LED4_TURN;
}
}
.h文件声明函数和宏定义
#include "stm32f4xx.h"
#define LED1_TURN GPIOC->ODR ^= (1<<4)
#define LED2_TURN GPIOC->ODR ^= (1<<5)
#define LED3_TURN GPIOC->ODR ^= (1<<6)
#define LED4_TURN GPIOC->ODR ^= (1<<7)
void interrupt_config(void);
void led_config(void);
void key_config(void);
主函数设置中断优先级和调用函数
NVIC_SetPriorityGrouping(2);//设置优先级分组为2,抢占优先级为2位,响应优先级为2位
interrupt_config();
led_config();
key_config();
while(77)
{
}