第三个实验 通过中断方式让按键控股按键控制LED

本文介绍STM32单片机的外部中断配置过程,包括GPIO初始化、外部中断线配置及中断服务函数实现等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "stm32f10x.h"
#define LED1 1
void Delay_ms( uint16_t time_ms );
void LEDXToggle(uint8_t ledx);
int main()
{
 
    GPIO_InitTypeDef  GPIO_InitStructure; 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
    GPIO_InitStructure.GPIO_Pin =GPIO_Pin_13;//?????GPIO??
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
    GPIO_Init(GPIOC, &GPIO_InitStructure);//?????,???GPIO

 
  GPIO_InitTypeDef  GPIO_InitStructure1;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  
  GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_14;//?????GPIO?? 
  GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_IPU; //?????????????    
  GPIO_Init(GPIOB, &GPIO_InitStructure1); //?????,???GPIO  
  
 
 
   
   /*查看外部中断/事件线路映像
    PA0、PB0、PC0、PD0、PE0、PF0、PG0 ————>映像于 EXTI0
    PA1、PB1、PC1、PD1、PE1、PF1、PG1 ————>映像于 EXTI1
    PA2、PB2、PC2、PD2、PE2、PF2、PG2 ————>映像于 EXTI2
    PA3、PB3、PC3、PD3、PE3、PF3、PG3 ————>映像于 EXTI3
    .......依次类推,每个外部中断都有一个事件线路映射*/
    //定义一个EXTI_InitTypeDef 类型的结构体
    EXTI_InitTypeDef EXTI_InitStructure;
    //使能AFIO功能的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
   
    //设置PB14,PB15,PB5作为中断线路
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
    //选择中断线路14,15,5
    EXTI_InitStructure.EXTI_Line = EXTI_Line14 ;
    //设置为中断请求触发模式
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    //设置为下降沿触发
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
    //设置为使能中断线
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    //调用库函数,初始化中断
    EXTI_Init(&EXTI_InitStructure);
   NVIC_InitTypeDef NVIC_InitStructure; //定义一个NVIC_InitTypeDef 类型的结构体
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //选择中断分组0 
   
    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//配置选中的中断向量,指定中断源
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1; //配置抢占优先级:抢占式中断优先级设置为0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //配置响应优先级:响应式中断优先级设置为0
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断向量
    NVIC_Init(&NVIC_InitStructure);  //初始化NVIC
}
 void EXTI15_10_IRQHandler(void)
  {  
    /*检查指定的EXTI线路出发请求发生与否*/
    if (EXTI_GetITStatus(EXTI_Line14) != RESET)
    {
   /*清除EXTI线路挂起位*/
   EXTI_ClearITPendingBit(EXTI_Line14);
     /*D1状态翻转*/
     LEDXToggle(LED1);
    }
  }
  
 void LEDXToggle(uint8_t ledx)
  {
   if(ledx==1)
    {
      GPIOC->ODR^=GPIO_Pin_13;
    }
  }
 void Delay_ms( uint16_t time_ms )
  {
   uint16_t i,j;
   for( i=0;i<time_ms;i++ )
   {
    for( j=0;j<10309;j++ );//??1ms
   }
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值