基于C语言利用STM32外部中断,将任意按键作为中断源触发中断,实现按键按下LED灯亮,不按不亮灯的效果。的代码
时间: 2024-03-08 20:48:26 浏览: 14
好的,以下是基于C语言利用STM32外部中断,实现按键按下LED灯亮,不按不亮灯的代码:
```c
#include "stm32f10x.h"
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
void GPIO_Configuration(void);
void EXTI_Configuration(void);
void NVIC_Configuration(void);
int main(void)
{
GPIO_Configuration();
EXTI_Configuration();
NVIC_Configuration();
while (1)
{
// 程序进入死循环
}
}
void GPIO_Configuration(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOB时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // PB0设为输入引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; // 输入下拉模式
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // PB1设为输出引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最大输出速率为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void EXTI_Configuration(void)
{
EXTI_ClearITPendingBit(EXTI_Line0); // 清除PB0上的中断标志位
EXTI_InitStructure.EXTI_Line = EXTI_Line0; // PB0对应的中断线路
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能中断线路
EXTI_Init(&EXTI_InitStructure);
}
void NVIC_Configuration(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); // 中断优先级分组为1
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; // PB0对应的中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 抢占优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 子优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能中断通道
NVIC_Init(&NVIC_InitStructure);
}
void EXTI0_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line0) != RESET) // 判断中断标志位是否被触发
{
GPIO_SetBits(GPIOB, GPIO_Pin_1); // PB1输出高电平,LED灯亮
EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断标志位
}
}
```
代码解释:
1. 首先,我们需要对GPIO口进行配置,将PB0设置为输入引脚,PB1设置为输出引脚。
```c
void GPIO_Configuration(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOB时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // PB0设为输入引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; // 输入下拉模式
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // PB1设为输出引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最大输出速率为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
```
2. 接下来,我们需要对外部中断进行配置,将PB0设置为中断源,当PB0上升沿触发中断时,执行中断服务程序。
```c
void EXTI_Configuration(void)
{
EXTI_ClearITPendingBit(EXTI_Line0); // 清除PB0上的中断标志位
EXTI_InitStructure.EXTI_Line = EXTI_Line0; // PB0对应的中断线路
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能中断线路
EXTI_Init(&EXTI_InitStructure);
}
```
3. 最后,我们需要对中断服务程序进行配置,当PB0上升沿触发中断时,将PB1输出高电平,LED灯亮。
```c
void EXTI0_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line0) != RESET) // 判断中断标志位是否被触发
{
GPIO_SetBits(GPIOB, GPIO_Pin_1); // PB1输出高电平,LED灯亮
EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断标志位
}
}
```
以上就是基于C语言利用STM32外部中断,实现按键按下LED灯亮,不按不亮灯的代码。