STM32完全学习——外部停止

[复制链接]
发表于 2025-12-23 19:18:42 | 显示全部楼层 |阅读模式
一、嵌套向量停止控制器

我们在这里利用标准库的方式来处置处罚。因此只必要调用几个函数就可以了。
  1.         NVIC_InitTypeDef NVIC_InitStruct;               
  2.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);  //中断优先级分组 分1组
  3.        
  4.        
  5.         NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);    //使能AFIO时钟
  6.        
  7.         NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;          //EXTI Line0 Interrupt  
  8.         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级设置为0
  9.         NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;        //次优先级设置为1
  10.         NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;           //使能中断
  11.         NVIC_Init(&NVIC_InitStruct);                           //进行行初始化
复制代码
这里必要留意的是我们必要开启AFIO的时钟,这是由于停止变乱必要在AFIO——EXTICRX寄存器内里举行设置。看下图就可明白

二、外部停止的设置

上面的设置只能阐明利用了谁人停止线,和停止的优先级。对于利用哪个引脚,上升沿照旧降落沿触发,我们必要在外部停止内里举行设置。通过下面的设置我们就将GPIOB的端口0绑定到了外部停止线0,如许我们就可以举行外部停止了。但是这个时间我们还没有对GPIOB举行初始化
  1.     EXTI_InitTypeDef EXTI_InitStruct;
  2.     EXTI_InitStruct.EXTI_Line = EXTI_Line0;                //使用中断线0
  3.         EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;       //设置为中断模式
  4.         EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;   //设置为下降沿触发
  5.         EXTI_InitStruct.EXTI_LineCmd = ENABLE;
  6.         EXTI_Init(&EXTI_InitStruct);                           //进行初始化
  7.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);   //将GPIOB绑定到中断线0
复制代码
三、初始化GPIO

我们这里重要初始化GPIOA和GPIOB,GPIOA重要是控制LED,GPIOB重要是外部停止
  1.     GPIO_InitTypeDef *GPIO_InitStruct = (GPIO_InitTypeDef *)malloc(sizeof(GPIO_InitTypeDef));
  2.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  3.         GPIO_InitStruct->GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
  4.         GPIO_InitStruct->GPIO_Speed = GPIO_Speed_50MHz;
  5.         GPIO_InitStruct->GPIO_Mode = GPIO_Mode_Out_PP;
  6.         GPIO_Init(GPIOA, GPIO_InitStruct);
  7.         GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
  8.     free(GPIO_InitStruct);
复制代码
  1.     GPIO_InitTypeDef GPIO_InitStruct;
  2.        
  3.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);      //打开GPIOB的时钟
  4.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
  5.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  6.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  7.         GPIO_Init(GPIOB, &GPIO_InitStruct);
复制代码
四、利用外部停止实现按键控制LED

我们的GPIOA0接LED的负极,GPIOB0接按键的引脚,按键的另一个引脚接GND。
我们只必要将上面的代码先运行,然后在写下面的这个外部停止处置处罚函数就可以了。这个函数放在那里都可以。
  1. void EXTI0_IRQHandler(void)
  2. {
  3.         if (EXTI_GetITStatus(EXTI_Line0) == 1)  //判断确实是中断线0发生了中断
  4.         {
  5.          //实现按一次亮,然后再按灭,一直如此
  6.          GPIO_WriteBit(GPIOA, GPIO_Pin_1, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1)));
  7.         }
  8.         EXTI_ClearITPendingBit(EXTI_Line0);    //清除外部中断线0的标志位
  9. }
复制代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表