设计一个利用P3.3接一个外部中断输入,控制8个LED灯循环点亮的程序
时间: 2024-03-16 17:41:56 浏览: 55
好的,以下是基于 STM32Fxxx 系列芯片的程序示例:
```c
#include "stm32fxxx.h"
void EXTI3_IRQHandler(void) { // 中断服务函数
if (EXTI_GetITStatus(EXTI_Line3) != RESET) {
static uint8_t led = 0x01;
GPIO_Write(GPIOA, led);
led = (led << 1) | (led >> 7); // 循环左移
EXTI_ClearITPendingBit(EXTI_Line3); // 清除中断标志位
}
}
int main() {
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 使能 GPIOA 时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置为输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最大输出速率为 50 MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 不使用上下拉电阻
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); // 使能 SYSCFG 时钟
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource3); // 将 EXTI3 与 GPIOA3 关联
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line3; // EXTI3
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能 EXTI3
EXTI_Init(&EXTI_InitStructure);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; // EXTI3 中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; // 抢占优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; // 子优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能 EXTI3 中断
NVIC_Init(&NVIC_InitStructure);
while (1) {} // 空循环,等待中断
}
```
该程序利用了 GPIOA 的 8 个引脚分别连接了 8 个 LED 灯,并使用了 PA3 引脚作为外部中断输入。当 PA3 上升沿触发时,进入中断服务函数 EXTI3_IRQHandler(),依次点亮 LED 灯并循环左移。注意在中断服务函数中要清除中断标志位,否则将一直触发中断。
阅读全文