STM32完全学习——外部中断

news/2024/11/24 19:47:11/

一、嵌套向量中断控制器

我们在这里使用标准库的方式来处理。因此只需要调用几个函数就可以了。

	NVIC_InitTypeDef NVIC_InitStruct;               NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);  //中断优先级分组 分1组NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);    //使能AFIO时钟NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;          //EXTI Line0 Interrupt  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级设置为0NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;        //次优先级设置为1NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;           //使能中断NVIC_Init(&NVIC_InitStruct);                           //进行行初始化

这里需要注意的是我们需要开启AFIO的时钟,这是因为中断事件需要在AFIO——EXTICRX寄存器里面进行配置。看下图就可明白

二、外部中断的配置

上面的设置只能说明使用了那个中断线,和中断的优先级。对于使用哪个引脚,上升沿还是下降沿触发,我们需要在外部中断里面进行设置。通过下面的设置我们就将GPIOB的端口0绑定到了外部中断线0,这样我们就可以进行外部中断了。但是这个时候我们还没有对GPIOB进行初始化

    EXTI_InitTypeDef EXTI_InitStruct;EXTI_InitStruct.EXTI_Line = EXTI_Line0;                //使用中断线0EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;       //设置为中断模式EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;   //设置为下降沿触发EXTI_InitStruct.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStruct);                           //进行初始化GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);   //将GPIOB绑定到中断线0

三、初始化GPIO

我们这里主要初始化GPIOA和GPIOB,GPIOA主要是控制LED,GPIOB主要是外部中断

    GPIO_InitTypeDef *GPIO_InitStruct = (GPIO_InitTypeDef *)malloc(sizeof(GPIO_InitTypeDef));RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStruct->GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;GPIO_InitStruct->GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct->GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, GPIO_InitStruct);GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);free(GPIO_InitStruct);
    GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);      //打开GPIOB的时钟GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStruct);

四、利用外部中断实现按键控制LED

我们的GPIOA0接LED的负极,GPIOB0接按键的引脚,按键的另一个引脚接GND。

我们只需要将上面的代码先运行,然后在写下面的这个外部中断处理函数就可以了。这个函数放在那里都可以。

void EXTI0_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line0) == 1)  //判断确实是中断线0发生了中断{//实现按一次亮,然后再按灭,一直如此GPIO_WriteBit(GPIOA, GPIO_Pin_1, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1)));}EXTI_ClearITPendingBit(EXTI_Line0);    //清除外部中断线0的标志位
}


http://www.ppmy.cn/news/1549616.html

相关文章

【unity小技巧】unity常用的编辑器扩展

文章目录 1. **自定义 Inspector(Inspector 面板)**示例: 2. **Editor Window(自定义编辑器窗口)**示例: 3. **PropertyDrawer(自定义属性绘制)**示例: 4. **菜单项&…

修改仓库中子模块并推送到远程仓库的指定分支

因为现在修改的是仓库的子模块的东西,我们要先提交子模块,然后在提交主题仓库。 提交的时候我们要 首先,进入 XGBDIM 子模块目录。 cd XGBDIM查看子模块中的更改情况,确认哪些文件需要添加和提交。 git status添加子模块中的文件…

hash表和B树

Hash 表的优缺点 优点: 快速查找:Hash 表可以提供快速的插入操作和查找操作。不论哈希表中有多少数据,插入和删除(有时包括查找)只需要接近常量的时间即 O(1) 的时间级。代码简单:实现哈希表的代码相对简…

python代码制作数据集的测试和数据质量检测思路

前言 本文指的数据集为通用数据集,并不单是给机器学习领域使用。包含科研和工业领域需要自己制作数据集的。 首先,在制作大型数据集时,代码错误和数据问题可能会非常复杂。 前期逻辑总是简单的,库库一顿写,等排查的时…

macOS 无法安装第三方app,启用任何来源的方法

升级新版本 MacOS 后,安装下载的软件时,不能在 ”安全性与隐私” 中找不到 ”任何来源” 选项。 1. 允许展示任何来源 点击 启动器 (Launchpad) – 其他 (Other) – 终端 (Terminal): 打开终端后,输入以下代码回车: …

机器翻译基础与模型 之一: 基于RNN的模型

一、机器翻译发展历程 基于规则的-->基于实例的-->基于统计方法的-->基于神经网络的 传统统计机器翻译把词序列看作离散空间里的由多个特征函数描述的点,类似 于 n-gram 语言模型,这类模型对数据稀疏问题非常敏感。神经机器翻译把文字序列表示…

Linux-Apache静态资源

文章目录 静态资源权限设置 🏡作者主页:点击! 🤖Linux专栏:点击! ⏰️创作时间:2024年11月20日11点21分 静态资源 Apache配置静态资源 可以在网页上配置一个静态的FTP服务器,让用户…

Vue核心特性解析(内含实践项目:设置购物车)

Vue 3 作为前端开发领域的热门框架,为构建用户界面提供了高效且灵活的解决方案。在上一篇博客:深度解析Vue3中,我们了解到了响应式数据、v-on、v-if、v-for、v-bind等Vue相关属性,这篇我们继续探讨Vue的其他属性,为你揭…