采用STM32CubeMX和HAL库的外部中断设计实例

目录

STM32F1外部中断的硬件设计

STM32F1外部中断的软件设计

通过Keil MDK实现工程 通过Keil MDK实现工程的步骤如下:


中断在嵌入式应用中占有非常重要的地位,几乎每个控制器都有中断功能。中断对保证紧急事件在第一时间处理是非常重要的。 设计使用外接的按键作为触发源,使得控制器产生中断,并在中断服务函数中实现控制RGB彩灯的任务。

STM32F1外部中断的硬件设计

外部中断设计实例的硬件设计同按键的硬件设计,如图所示。 从按键的原理图可知,这些按键在没有被按下的时候,GPIO引脚的输入状态为低电平 (按键所在的电路不通,引脚接地),当按键按下时,GPIO引脚的输入状态为高电平(按键所在的电路导通,引脚接到电源)。轻触按键在按下时会使得引脚接通,通过电路设计可以使得按下时产生电平变化。 在本实例中,我们根据图5-33所示的电路设计一个示例,通过按键控制LED,如下: (1)按下KEY1,LED变亮;再按下KEY1,LED变暗。 (2)按下并弹开KEY2,LED变亮;再按下并弹开KEY2,LED变暗。

STM32F1外部中断的软件设计

下面讲述如何通过STM32CubeMX新建工程、如何通过Keil MDK实现工程。 1. 通过STM32CubeMX新建工程 通过STM32CubeMX新建工程的步骤如下:

(1)新建文件夹   Demo目录下新建文件夹EXTI,这是保存本章新建工程的文件夹。

(2)新建STM32CubeMX工程 在STM32CubeMX开发环境中新建工程。

(3)选择MCU或开发板 Commercial Part Number和MCUs/MPUs List选择STM32F103ZET6,选择Start Project启动工程。

(4)保存STM32Cube MX工程 使用STM32CubeMX菜单File→Save Project,保存工程。

(5)生成报告 使用STM32CubeMX菜单File→Generate Report生成当前工程的报告文件。

(6)配置MCU时钟树 STM32CubeMX Pinout & Configuration子页面下,选择System Core→RCC,High Speed Clock(HSE)根据开发板实际情况,选择Crystal/Ceramic Resonator(晶体/陶瓷晶振)。

STM32CubeMX切换到Clock Configuration子页面下,根据开发板外设情况配置总线时钟。此处配置PLL Source Mux为HSE,PLLMul为9倍频72MHz,System Clock Mux为PLLCLK,APB1 Prescaler为X2,其余默认设置即可。

(7)配置MCU外设 根据LED和KEY电路,整理出MCU连接的GPIO引脚的输入/输出配置,如表所示。

进行GPIO引脚配置。具体步骤如下。 STM32CubeMX Pinout & Configuration子页面下选择System Core→GPIO,对使用的GPIO口进行设置。LED输出端口:LED1_RED(PB5)、LED2_GREEN(PB0)和LED3_BLUE (PB1)。按键输入端口:KEY1(PA0)和KEY2(PC13),配置为GPIO_EXTI模式。 作为中断/时间输入线把GPIO配置为中断上升沿触发模式,这里不使用上拉或下拉,由外部电路完全决定引脚的状态。按键1使用下降沿触发方式,按键2为上升沿触发方式。 PA0配置为下降沿触发方式External lnterrupt Mode with Falling edge trigger detection和不使用上拉或下拉No pull-up and no pull-down,PC13配置为上升沿触发方式External lnterrupt Mode with Rising Trigger detection和不使用上拉或下拉No pull-up and no pull-down

切换到STM32CubeMX Pinout & Configuration子页面下选择System Core→NVIC,修改Priority Group为2 bits for pre-emption priority(2位抢占优先级),Enabled栏勾选EXTI line0 interrupt和EXTI line[15:10] interrupts。修改Preemption Priority(抢占优先级)和Sub Priority(子优先级)

Code Generation 页面Select for init sequence ordering栏勾选EXTI line0 interrupt和EXTI line[15:10] interrupts。NVIC Code Generation配置页面

(8)配置工程 STM32CubeMX Project Manager子页面Project栏下Toolchain/IDE选择MDK-Arm,Min Version选择V5,可生成Keil MDK工程;选择STM32CubeDE,可生成STM32CubeIDE工程。

(9)生成C代码工程 STM32CubeMX主页面,单击GENERATE CODE按钮生成C代码工程。

通过Keil MDK实现工程 通过Keil MDK实现工程的步骤如下:

(1)打开工程   打开EXTI\MDK-Arm文件夹下的工程文件。

(2)编译STM32CubeMX自动生成的MDK工程 在MDK开发环境中通过菜单Project→Rebuild all target files或工具栏      Rebuild按钮编译工程。

(3)STM32CubeMX自动生成的MDK工程 main.c文件中函数main()依次调用了HAL_Init()函数用于复位所有外设,初始化Flash接口和Systick定时器。SystemClock_Config()函数用于配置各种时钟信号频率。MX_GPIO_Init()函数初始化GPIO引脚。 在STM32CubeMX中,为LED和KEY连接的GPIO引脚设置了用户标签,这些用户标签的宏定义在文件main.h里。代码如下:

/* Private defines ---------------------------------------------------*/
#define KEY2_Pin GPIO_PIN_13
#define KEY2_GPIO_Port GPIOC
#define KEY2_EXTI_IRQn EXTI15_10_IRQn
#define KEY1_Pin GPIO_PIN_0
#define KEY1_GPIO_Port GPIOA
#define KEY1_EXTI_IRQn EXTI0_IRQn
#define LED2_GREEN_Pin GPIO_PIN_0
#define LED2_GREEN_GPIO_Port GPIOB#define LED3_BLUE_Pin GPIO_PIN_1
#define LED3_BLUE_GPIO_Port GPIOB
#define LED1_RED_Pin GPIO_PIN_5
#define LED1_RED_GPIO_Port GPIOB
/* USER CODE BEGIN Private defines */
文件gpio.c包含了函数MX_GPIO_Init()的实现代码,如下。
void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOB, 
LED2_GREEN_Pin|LED3_BLUE_Pin|LED1_RED_Pin, GPIO_PIN_SET);/*Configure GPIO pin : PtPin */GPIO_InitStruct.Pin = KEY2_Pin;GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(KEY2_GPIO_Port, &GPIO_InitStruct);/*Configure GPIO pin : PtPin */GPIO_InitStruct.Pin = KEY1_Pin;GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);/*Configure GPIO pins : PBPin PBPin PBPin */GPIO_InitStruct.Pin = LED2_GREEN_Pin|LED3_BLUE_Pin|LED1_RED_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

本实验使用到了中断,因此main()函数调用中断初始化函数MX_NVIC_Init()。MX_NVIC_Init()是在文件main.c中定义的函数,它的代码里调用了HAL_NVIC_SetPriority()和HAL_NVIC_EnableIRQ(),用于设置中断的优先级和使能中断。MX_NVIC_Init()实现的代码如下。

static void MX_NVIC_Init(void) {   /* EXTI0_IRQn interrupt configuration */   HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);   HAL_NVIC_EnableIRQ(EXTI0_IRQn);  /* EXTI15_10_IRQn interrupt configuration */   HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);   HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); }

(4)新建用户文件   在EXTI\Core\Src下新建bsp_led.c和bsp_exti.c,在EXTI\Core\Inc下新建bsp_led.h和bsp_exti.h。将bsp_led.c和bsp_exti.c添加到工程Application/User/Core文件夹下。 (5)编写用户代码 bsp_led.h和bsp_led.c文件实现LED操作的宏定义和LED初始化。 stm32f1xx_it.c中根据STM32CubeMX的NVIC配置,自动生成相应的中断函数。本实例自动生成的外部中断函数,如下。

void EXTI0_IRQHandler(void) {   HAL_GPIO_EXTI_IRQHandler(KEY1_Pin); } void EXTI15_10_IRQHandler(void) {   HAL_GPIO_EXTI_IRQHandler(KEY2_Pin); } bsp_exti.h和bsp_exti.c添加外部中断的回调函数HAL_GPIO_EXTI_Callback()的处理。按键1让LED1翻转其状态,按键2让LED2翻转其状态。

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(GPIO_Pin == KEY1_Pin){// LED1 取反		LED1_TOGGLE;}  else if(GPIO_Pin == KEY2_Pin) {// LED2 取反	LED2_TOGGLE;}  }

main.c文件添加对用户自定义头文件的引用。 /* Private includes ---------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include " bsp_led.h" #include "bsp_exti.h" /* USER CODE END Includes */ main.c文件添加对LED的初始化,按键的处理在中断服务程序中已完成,主函数不再操作。

/* USER CODE BEGIN 2 *//* LED 初始化 */LED_GPIO_Config();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}

(6)重新编译工程   重新编译添加代码后的工程。

(7)配置工程仿真与下载项 在MDK开发环境中通过菜单Project→Options for Target或工具栏     配置工程。 打开Debug选项卡,选择使用的仿真下载器ST-Link Debugger。Flash Download下勾选Reset and Run选项。单击确定。

(8)下载工程   连接好仿真下载器,开发板上电。 在MDK开发环境中通过菜单Flash→Download或工具栏     下载工程。

工程下载完成后,此时RGB彩色灯是暗的。如果按下开发板上的按键1,RGB彩灯变亮,再按下按键1,RGB彩灯又变暗;如果按下开发板上的按键2并弹开,RGB彩灯变亮,再按下开发板上的KEY2并弹开,RGB彩灯又变暗。按键按下表示上升沿,按键弹开表示下降沿,跟软件设置是一样的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/58330.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python酷库之旅-第三方库Pandas(173)

目录 一、用法精讲 796、pandas.Float32Dtype类 796-1、语法 796-2、参数 796-3、功能 796-4、返回值 796-5、说明 796-6、用法 796-6-1、数据准备 796-6-2、代码示例 796-6-3、结果输出 797、pandas.Float64Dtype类 797-1、语法 797-2、参数 797-3、功能 797-…

Bi-LSTM-CRF实现中文命名实体识别工具(TensorFlow)

项目源码获取方式见文章末尾! 回复暗号:13,免费获取600多个深度学习项目资料,快来加入社群一起学习吧。 **《------往期经典推荐------》**项目名称 1.【MobileNetV2实现实时口罩检测tensorflow】 2.【卫星图像道路检测DeepLabV3P…

AI 聊天机器人的兴起:GPT-3 和 BERT 如何重新定义对话体验

一、说明 当我们深入研究 AI 世界时,了解自然语言处理 (NLP) 领域取得的巨大进步非常重要。NLP 是 AI 的一个分支,专注于使计算机能够理解、解释和生成人类语言。GPT-3 和 BERT 等语言模型的开发是这一旅程中的一个重要里程碑&…

1FreeRTOS学习(队列、二值信号量、计数型信号量之间的相同点和不同点)

相同点: (1)传递区间 队列、二值信号量、计数型信号量均可用在任务与任务,任务与中断之间进行消息传递 (2) 传递方式 创建队列--发送队列--接受队列 创建二值信号量--发送二值信号量--接受二值信号量 创建计…

UDP(用户数据报协议)端口监控

随着网络的扩展,确保高效的设备通信对于优化网络功能变得越来越重要。在这个过程中,端口发挥着重要作用,它是实现外部设备集成的物理连接器。通过实现数据的无缝传输和交互,端口为网络基础设施的顺畅运行提供了保障。端口使数据通…

技术成神之路:设计模式(二十三)解释器模式

相关文章:技术成神之路:二十三种设计模式(导航页) 介绍 解释器模式(Interpreter Pattern)是一种行为设计模式,用于定义一种语言的文法表示,并提供一个解释器来处理这种文法。它用于处理具有特定语法或表达…

STM32G4 双ADC模式之同时注入模式

目录 概述 1 认识双ADC模式 2 功能实现 2.1 功能介绍 2.2 实现原理 概述 本文主要介绍STM32G4 双ADC模式之同时注入模式的相关内容,包括ADC模块的功能介绍,实现框架结构,以及注入模式ADC的转换的实现原理。 1 认识双ADC模式 双ADC模式可…

Python数据分析NumPy和pandas(十五、pandas 数据加载、存储和文件格式)

大多数时候,我们要处理分析的数据是存储在不同格式的文件中的,有txt、csv、excel、json、xml以及二进制等磁盘文件格式,还有时候是从数据库以及从Web API中交互获取要处理的数据。现在开始学习如何用pandas从以上内容中输入和输出数据。 读取…

CRC校验 生成多项式选取奇次偶次的问题讨论

目录 问题一:为什么CRC校验码不支持偶次校验码? 问题二:如何判断一个生成多项式是否为偶次多项式? 步骤: 示例: 注意: 问题三:CRC32的生成多项式是什么?是偶次还是…

Docker 常用命令全解析:提升对雷池社区版的使用经验

Docker 常用命令解析 Docker 是一个开源的容器化平台,允许开发者将应用及其依赖打包到一个可移植的容器中。以下是一些常用的 Docker 命令及其解析,帮助您更好地使用 Docker。 1. Docker 基础命令 查看 Docker 版本 docker --version查看 Docker 运行…

python 爬虫 入门 五、抓取图片、视频

目录 一、图片、音频 二、下载视频: 一、图片、音频 抓取图片的手法在上一篇python 爬虫 入门 四、线程,进程,协程-CSDN博客里面其实有,就是文章中的图片部分,在那一篇文章,初始代码的28,29行…

保姆级教程 | 全流程免费:合并多份长宽不同的PDF成相同大小并进行瘦身

背景 由于老板需要,完成不同PDF文件(a,b,c....)合并,同时要求主文件(A)小于6M。合并过程中发现各个PDF大小(长宽)并不相同,造成合并后效果不好也…

Vue3 学习笔记(八)Vue3 语法-Class 与 Style绑定详解

在 Vue.js 中,动态地绑定 CSS 类和样式是一项常见的需求。Vue 提供了几种不同的方法来实现这一点,包括对象语法、数组语法和组件的作用域插槽。 以下是这些方法的详细说明: 一、Class 绑定 1、对象语法 对象语法允许根据表达式的真值动态地切…

java知识管理系统源码(springboot)

项目简介 知识管理系统实现了以下功能: 知识管理系统的主要使用者分为管理员和用户两个角色。管理员功能有个人中心,用户管理,文章分类管理,文章信息管理,资料分类管理,资料下载管理,问答管理…

信捷 PLC C语言 定时器在FC中的使用

传统梯形图的定时器程序写起来简单,本文用C语言写定时器的使用。 定时器在c语言中使用,和普通梯形图中使用的区别之一是既有外部条件,也有内部条件。 1.建全局变量 2.建立FC POU 这个是功能POU程序。 这里的Enable是内部条件 3.调用包含定…

重写(外壳不变)

重写:是子类对父类非静态、非private修饰、非final修饰、非构造方法等的实现过程进行重新编写返回值和形参都不能改变。 重写的好处:子类可以根据需要,定义专属于自己的行为。(子类能够根据需要实现父类的方法) 方法…

大数据日志处理框架ELK方案

介绍应用场景大数据ELK日志框架安装部署 一,介绍 大数据日志处理框架ELK(Elasticsearch、Logstash、Kibana)是一套完整的日志集中处理方案,以下是对其的详细介绍: 一、Elasticsearch(ES) 基本…

Golang | Leetcode Golang题解之第515题在每个树行中找最大值

题目: 题解: func largestValues(root *TreeNode) (ans []int) {if root nil {return}q : []*TreeNode{root}for len(q) > 0 {maxVal : math.MinInt32tmp : qq nilfor _, node : range tmp {maxVal max(maxVal, node.Val)if node.Left ! nil {q …

怎么理解ES6 Proxy

Proxy 可以理解成,在目标对象之前架设一层 “拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。Proxy 这个词的原意是代理,用在这里表示由它来 “代理…

前端知识串联笔记(更新中...)

1.MVVM MVVM 是指 Model - View - ViewModel,Model 是数据与业务逻辑,View 是视图,ViewModel 用于连接 View 和 Model Model ---> View:将数据转化成所看到的页面,实现的方式:Data Bindings -- 数据绑定…