蓝桥杯嵌入式备赛(四)—— 中断 + UART

目录

  • 一、STM32 NVIC中断系统
    • 1、NVIC介绍
    • 2、Cortex-M4优先级设置
  • 二、UART介绍
    • 1、原理图介绍
    • 2、原理图介绍及编程步骤
      • (1)CubeMX设置
      • (2)UART 发送
      • (3)UART 接收

一、STM32 NVIC中断系统

1、NVIC介绍

  STM32G431总共有111个中断源,所以有时难免有两个或者两个以上的中断一起来临,或者正在处理一个中断服务函数时突然又有一个中断来临,以上种种情况微控制器要怎样运行呢?所以微控制器都有一个处理中断的机制。STM32系列芯片用到的机制是:NVIC
  NVIC即嵌套向量中断控制器(Nested Vectored Interrupt Controller)。STM32的中有一个强大而方便的NVIC,它是属于CM4内核的器件。NVIC 控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是各个芯片厂商在设计芯片的时候会对CM4内核里面的NVIC进行裁剪,把不需要的部分去掉,所以说STM32的NVIC是CM4的NVIC的一个子集。
  NVIC寄存器定义在core_cm4.h文件中,CM4内核支持256个中断,其中包含了16个系统异常和240个外部中断,并且具有256级的可编程中断设置。但 STM32并没有使用CM4内核的全部东西,而是只用了它的一部分。 stm32G431芯片有111个中断,包括9个内核中断和102个可屏蔽中断,具有16级可编程的中断优先级, 我们常用的就是这102个可屏蔽中断。

2、Cortex-M4优先级设置

  1. STM32中有两个优先级的概念:抢占式优先级和响应优先级,响应优先级也称子优先级,每个中断源都需要被指定这两种优先级。每个中断的优先级由一个8位的寄存器来设定,分为高低两个位段。高位段表示抢占优先级,低位段表示响应(子)优先级。
  2. 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套在低抢占式优先级的中断中。
  3. 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理
  4. 如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个。
  5. 如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断向量表中的排位顺序决定先处理哪一个。

在这里插入图片描述

二、UART介绍

1、原理图介绍

  如图所示,UART1的收发引脚分别是PA10和PA9。具体关于UART的具体内容可以查看之前文章—— 嵌入式硬件学习(五)——定时器和UART 进行学习。
在这里插入图片描述

2、原理图介绍及编程步骤

  一般在UART的程序设计中,发送功能在主程序的while()中进行发送,而接收功能一般使用的是中断。 所以本次代码分为两部分,以下是实现步骤:

(1)CubeMX设置

  1. 将RCC中的HSE配置为晶振,时钟配置为80MHz
  2. 在GPIO中设置PA9和PA10为UART的收发模式。
    在这里插入图片描述
  3. 之后在Connectivity中选择USART1,首先将模式设置为异步(Asynchronous)模式,在下面参数中设置所需波特率、数据位宽、校验位和停止位(这里保留默认),之后在NVIC Settings中选择中断使能。
    在这里插入图片描述
    在这里插入图片描述
  4. 最后保存项目。 在这里插入图片描述

(2)UART 发送

(1) 定义一个变量str表示要发送的数据;

char str[24];

(2)在while(1)循环中使用sprintf函数将字符串写入str中;

sprintf(str, "hello world, num: %d", i++);

(3)使用发送函数发送str。

HAL_UART_Transmit(&huart1, str, strlen(str), 50);

(4)完整代码

#include "main.h"
#include "usart.h"
#include "gpio.h"
#include "stdio.h"
#include "string.h"void SystemClock_Config(void);char str[24];int main(void)
{int i = 0;HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();while (1){sprintf(str, "hello world, num: %d", i++);HAL_UART_Transmit(&huart1, str, strlen(str), 50);HAL_Delay(1000);}
}

(5)实验结果
在这里插入图片描述

(3)UART 接收

(1) 定义一个变量num表示要接收的数据;

uint8_t num;

(2)在main主函数中使用HAL_UART_Receive_IT初始化中断,表明将接收到的数据写入num中;

HAL_UART_Receive_IT(&huart1, &num, sizeof(num));

(3)编写回调函数HAL_UART_RxCpltCallback表示接收到中断后要做什么。

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{LED_Disp((unsigned char)num);HAL_UART_Receive_IT(&huart1, &num, sizeof(num));
}

(4)完整代码

#include "main.h"
#include "usart.h"
#include "gpio.h"
#include "stdio.h"
#include "string.h"void SystemClock_Config(void);uint8_t num;int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();HAL_UART_Receive_IT(&huart1, &num, sizeof(num));while (1){}
}void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{LED_Disp((unsigned char)num);HAL_UART_Receive_IT(&huart1, &num, sizeof(num));
}

(5)实验结果
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/794c960da1c841799f3d6e85d7281e6c.png
在这里插入图片描述

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

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

相关文章

AI前端开发的学习成本与回报——效率革命的曙光

近年来,人工智能技术飞速发展,深刻地改变着各行各业。在软件开发领域,AI写代码工具的出现更是掀起了一场效率革命。AI前端开发,作为人工智能技术与前端开发技术的完美结合,正展现出巨大的发展潜力,为开发者…

AI前端开发的持续学习策略:拥抱变化,精进技艺

在飞速发展的科技浪潮中,AI前端开发领域正经历着日新月异的变化。作为一名AI前端开发者,你是否感到技术更新迭代之快,对自身持续学习能力提出了更高的要求? 想要在竞争激烈的行业中保持领先地位,持续学习不再是一种选择…

sql盲注脚本

在sqli-labs中的第8题无回显可以尝试盲注的手法获取数据 发现页面加载了3秒左右可以进行盲注 布尔盲注数据库名 import requestsdef inject_database(url):datanamefor i in range(1,15):low 32high 128mid (low high) // 2while low < high:path "id1 and asci…

DeepSeekR1 苹果macbook M1本地可视化运行!

过年了&#xff0c;就带了一台 macbook air 8g&#xff0c;DeepSeekR1的消息还是铺天盖地的来&#xff0c;我就想着在这台电脑上也装一个吧。 经过简单的配置&#xff0c;最终也运行起来了&#xff0c;速度还可以。 我这是首款M系列笔记本&#xff0c;也是现在最低配的 M 系列…

centos 10 离线安装dnf 和 设置dnf镜像源

离线安装dnf可用kimi搜索, centos 使用curl 下载dnf 的rpm包 mkdir ~/dnf_packages cd ~/dnf_packages# CentOS 7 示例 curl -O http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/dnf-0.6.4-2.sdl7.noarch.rpm curl -O http://springdale.math.ias.edu/data/pu…

Vivado生成edif网表及其使用

介绍如何在Vivado中将模块设为顶层&#xff0c;并生成相应的网表文件&#xff08;Verilog文件和edif文件&#xff09;&#xff0c;该过程适用于需要将一个模块作为顶层设计进行综合&#xff0c;并生成用于其他工程中的网表文件的情况。 例如要将fpga_top模块制作成网表给其它工…

【Python网络爬虫】爬取网站图片实战

【Python网络爬虫】爬取网站图片实战 Scrapying Images on Website in Action By Jackson@ML *声明:本文简要介绍如何利用Python爬取网站数据图片,仅供学习交流。如涉及敏感图片或者违禁事项,请注意规避;笔者不承担相关责任。 1. 创建Python项目 1) 获取和安装最新版…

Python从0到100(八十八):LSTM网络详细介绍及实战指南

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

window patch按块分割矩阵

文章目录 1. excel 示意2. pytorch代码3. window mhsa 1. excel 示意 将一个三维矩阵按照window的大小进行拆分成多块2x2窗口矩阵&#xff0c;具体如下图所示 2. pytorch代码 pytorch源码 import torch import torch.nn as nn import torch.nn.functional as Ftorch.set_p…

python013-基于Python的智能停车系统的设计与实现(源码+数据库+论文+部署讲解等)

&#x1f495;&#x1f495;作者&#xff1a; 爱笑学姐 &#x1f495;&#x1f495;个人简介&#xff1a;十年Java&#xff0c;Python美女程序员一枚&#xff0c;精通计算机专业前后端各类框架。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xf…

gitlab无法登录问题

在我第一次安装gitlab的时候发现登录页面是 正常的页面应该是 这种情况的主要原因是不是第一次登录&#xff0c;所以我们要找到原先的密码 解决方式&#xff1a; [rootgitlab ~]# vim /etc/gitlab/initial_root_password# WARNING: This value is valid only in the followin…

无线4G多联机分户计费集中控制系统

拓森无线4G多联机集中控制系统应用于宝龙广场多联机计费集中控制节能改造项目&#xff0c;包括多联机集中控制&#xff0c;分户计费&#xff0c;空调监控管理、告警管理、节能管控、统计报表、能效分析、空调远程开关机等功能。项目的成功实施&#xff0c;不仅提升了维护管理效…

oracle多次密码错误登录,用户锁住或失效

多次输入错误账号查询状态&#xff1a; select username,account_status from dba_users; TEST EXPIRED(GRACE) 密码错误延迟登录&#xff0c;延迟登录还能登录 或者 TEST LOCKED(TIMED) 密码错误锁 TEST EXPIRED(GR…

连通两台VMware虚拟机

连通两台VMware虚拟机 Fairing Winds and Following Seas VMware各模式的区别 在尝试连接之前&#xff0c;我们要搞清楚各模式的区别 简单来说就是&#xff0c;只有桥接模式和NAT模式是可以实现虚拟机联通的&#xff0c;而桥接模式和NAT模式分别对应了 V M w a r e VMware VM…

C++ 容器适配器

文章目录 1. 适配器2. stack和queue2.1 deque2.1.1 deque的底层结构2.1.2 deque如何实现头插和随机访问 2.2 用deque实现栈和队列2.3 deque的优缺点 3. priority_queue 1. 适配器 适配器是什么&#xff1f; 适配器是一种设计模式&#xff0c;实质上就是一种复用&#xff0c;即…

DeepSeek R1本地部署解决,DeepSeek服务繁忙

DeepSeek 本地部署是指将DeepSeek模型下载到本地电脑上&#xff0c;利用电脑的显卡进行数据处理和推理&#xff0c;可以减少网络延迟&#xff0c;提高数据处理和响应速度&#xff0c;从而避免将数据传输到云端&#xff0c;增强了数据的主权和控制&#xff0c;减少了因网络连接可…

GPT和BERT

笔记来源&#xff1a; Transformer、GPT、BERT&#xff0c;预训练语言模型的前世今生&#xff08;目录&#xff09; - B站-水论文的程序猿 - 博客园 ShusenWang的个人空间-ShusenWang个人主页-哔哩哔哩视频&#xff08;RNN模型与NLP应用&#xff09; 一、GPT 1.1 GPT 模型的…

深入浅出Java反射:掌握动态编程的艺术

小程一言反射何为反射反射核心类反射的基本使用获取Class对象创建对象调用方法访问字段 示例程序应用场景优缺点分析优点缺点 注意 再深入一些反射与泛型反射与注解反射与动态代理反射与类加载器 结语 小程一言 本专栏是对Java知识点的总结。在学习Java的过程中&#xff0c;学习…

JDK 14,15,17的一些新特性(部分常用)

1&#xff1a;instanceof&#xff08;后&#xff0c;使用不再需要墙转&#xff09; 2&#xff1a;switch语句增强 1&#xff1a;支持lmbda&#xff0c;自动防击穿&#xff0c;有返回值 2&#xff1a;支持case多个值&#xff0c;复杂逻辑结果支持yield返回 3&#xff1a;字符串…

活字格使用说明书

字格设计使用说明书 目录 1. 数据 2. 页面 3. 组件 4. 命令 一、数据 1.表数据创建(鼠标移动到表右击点击创建表) ‘ 图表 1 鼠标移至表1右击可重命名,添加字段输入所需字段名(一般数据类型的要注意:日期格式字段---日期、ID或者字典字段---整数、金…