STM32F103-固件库开发-keil一些警告解决-中断机制-NVIC-简单按钮电灯流程及其代码;

news2024/9/21 4:35:57

1、固件库和HAL库

固件库(Standard Peripheral Library,通常被称为SPL)和HAL库(Hardware Abstraction Layer,硬件抽象层)都是STMicroelectronics(ST)为STM32系列微控制器提供的软件开发库,

固件库(SPL)HAL库
定义与特点底层函数库,直接访问寄存器高级别抽象层,简化开发
学习难度较高,需要深入理解硬件较低,易于上手
控制精度精细控制,允许直接操作寄存器较少直接操作寄存器,控制较为抽象
代码效率通常生成更小、更快的代码可能生成较大和/或较慢的代码
可移植性较差,不同型号间差异大较好,支持跨型号移植
社区支持相对较少较多,ST主要推广和支持
更新与支持已停止更新持续更新和支持

 2、外设和内核:

外设是内核以外的设备;

3、keil5的一些报错原因:

1、未加入宏定义(建议选中c99标准)

2、要求函数无参数时需要void;

3、最后一个花括号期待一个换行

在STM32中配置GPIO端口模式的一般步骤如下:

  1. 选择GPIO端口和引脚:确定要配置的GPIO端口(如GPIOA、GPIOB等)和具体的引脚号。

  2. 配置MODER寄存器:通过写入MODER寄存器来设置GPIO引脚的模式。每个引脚的模式由MODER寄存器中的两位决定,这些位可以设置为输入模式、输出模式、复用功能模式或模拟模式等。

  3. 配置其他相关寄存器(如果需要):根据所选模式,可能需要配置其他寄存器,如输出速度寄存器(OSPEEDR)、上拉/下拉寄存器(PUPDR)、复用功能选择寄存器(AFRx)等。

  4. 启用GPIO时钟:在配置GPIO之前,需要确保该GPIO端口的时钟已经使能。

  5. 编写代码:根据所选的STM32系列和使用的开发环境(如HAL库、LL库或寄存器直接操作),编写相应的代码来配置GPIO端口。

4、使用固件库

1、keil5导入stm32头文件:

 

2、可以一个RCC使能函数开两个引脚;

5、中断机制 

MCU执行A,中断B出现,NVIC捕获到,通知MCU去处理事件C,c结束后,返回继续执行A;

1、NVIC(嵌套向量中断控制器

):

 

NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)是ARM Cortex-M系列微控制器中的一个关键组件,它负责管理中断和异常。NVIC提供了中断的优先级管理、中断的嵌套、中断的使能和禁用等功能,使得开发者能够高效地控制中断的响应和处理。

NVIC的主要功能

  1. 中断优先级管理
    • NVIC支持多个中断优先级,通常包括抢占优先级和子优先级。抢占优先级用于决定哪个中断可以打断当前正在执行的中断服务例程(ISR),而子优先级则用于在抢占优先级相同的情况下决定中断的响应顺序。
    • 开发者可以通过编程设置每个中断的优先级,以优化系统的响应时间和中断处理效率。
  2. 中断嵌套
    • NVIC支持中断嵌套,即一个中断可以在另一个中断的服务例程执行过程中被触发并抢占执行。这允许系统根据中断的紧急程度动态地调整中断的响应顺序。
  3. 中断使能和禁用
    • NVIC允许开发者通过编程使能或禁用特定的中断。这有助于在不需要中断响应时节省系统资源,或在特定条件下避免中断的干扰。
  4. 中断挂起和清除
    • NVIC维护了一个中断挂起寄存器,用于记录哪些中断已经发生但尚未被处理。当中断被触发时,相应的中断挂起位会被置位。中断服务例程执行完毕后,需要清除该位以允许后续的中断响应。
  5. 系统控制和状态寄存器
    • NVIC还包含了一系列系统控制和状态寄存器,用于控制中断的使能、优先级分组、系统复位等。

使能中断,中断屏蔽;

捕获中断,通知MCU;

2、中断的优先级

设置中断优先级,比较中断优先级;

数字越小(非负整数),优先级越高;最高0;

多个中断同时产生:

单核在一个时刻上只能执行一条指令;

1、优先级:

优先级分为抢占式优先级和响应式优先级;//先比较抢占再比较响应;

抢占优先级相同时再比较响应优先级;

2、优先级分组:

优先级分组时可以更改的,默认是第0组;

        

一、中断优先级分组的概念

STM32的中断优先级分组是通过NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)来实现的。NVIC将中断优先级分为抢占优先级和子优先级两部分,而中断优先级分组则决定了这两部分在优先级寄存器中的位数分配。

二、中断优先级分组的配置

中断优先级分组是通过配置NVIC的AIRCR(Application Interrupt and Reset Control Register)寄存器中的PRIGROUP字段来实现的。这个字段决定了中断优先级寄存器(IPR,Interrupt Priority Register)中哪些位用于表示抢占优先级,哪些位用于表示子优先级。

STM32的中断优先级分组通常有五种不同的级别(注意:并非所有STM32系列都支持所有分组级别,具体取决于微控制器型号):

分组级别抢占优先级位数子优先级位数
组004
组113
组222
组331
组440

三、抢占优先级与子优先级的关系

  • 抢占优先级:决定了中断的响应顺序。如果一个中断的抢占优先级比当前正在执行的中断服务例程(ISR)的抢占优先级高,那么当前的中断服务例程将被挂起,新的中断将被响应。
  • 子优先级:在抢占优先级相同的情况下,用于决定哪个中断先被执行。子优先级只在抢占优先级相同的中断之间进行比较。

四、中断优先级分组的配置步骤

  1. 选择中断优先级分组:根据应用需求,选择合适的分组级别。这通常涉及到对系统响应时间和中断处理效率的综合考虑。
  2. 配置AIRCR寄存器:通过设置AIRCR寄存器中的PRIGROUP字段来配置中断优先级分组。这通常涉及到对寄存器的直接操作或使用库函数。
  3. 设置中断优先级:在确定了中断优先级分组后,为各个中断设置具体的抢占优先级和子优先级。这通常通过配置NVIC的IPR寄存器或使用库函数来实现。

常见的三大中断;

外部中断;串口中断;定时器中断;

时钟的初始化:

 


6、使用固件库代码案例:

1、使用固件库代码操作寄存器赋值:

2、使用固件库引入头文件,使用函数操作:


1、写使能 

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

uint32_t RCC_APB2Periph:

FunctionalState NewState

2、通过结构体赋值初始化并设置引脚工作模式:

设置工作模式:

GPIO_InitStruct.GPIO_Mode =GPIO_Mode_IN_FLOATING;

浮空输入模式(Floating Input Mode)

GPIO_Mode_IN_FLOATING

在浮空输入模式下,GPIO引脚既不连接到内部上拉电阻,也不连接到内部下拉电阻。这意味着引脚的电平状态完全由外部电路决定,如果外部没有明确的电平信号连接到该引脚,那么它的电平状态是不确定的,可能会受到周围环境的噪声影响,导致电平在高低之间随机变化,即所谓的“浮动”。

确认对应的引脚pin_0:

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;

配置GPIO引脚时指定引脚的速度(输出速率):

GPIO_InitStruct.GPIO_Speed =GPIO_Speed_10MHz;

调用GPIO_Init函数完成配置:

GPIO_Init(GPIOA,&GPIO_InitStruct);

3、设置输出:

GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)

用于读取指定GPIO引脚的输入数据位的状态。这个函数允许你检查一个GPIO引脚当前是处于高电平(通常为1)还是低电平(通常为0)。

GPIO_ResetBits(GPIOA,GPIO_Pin_1);

GPIO_ResetBits 是STM32标准外设库(SPL)中的一个函数,用于将指定的GPIO端口上的一个或多个引脚输出低电平(0)。这个函数是控制GPIO引脚状态的一种直接方式,通常用于将引脚设置为低电平或清除引脚上的高电平信号。

GPIO_SetBits(GPIOA,GPIO_Pin_1);

GPIO_SetBits 是STM32标准外设库(SPL)中的一个函数,用于将指定的GPIO端口上的一个或多个引脚输出高电平(1)。这个函数是控制GPIO引脚状态的一种直接方式,通常用于将引脚设置为高电平或激活引脚上的高电平信号。

void pushPullIutputPA0(){
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitStruct.GPIO_Mode =GPIO_Mode_IN_FLOATING;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStruct.GPIO_Speed =GPIO_Speed_10MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
}
void pushPullOutputPA1(){
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
}
int main(){
	pushPullOutputPA1();
	while(1){
//		if(1==GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6))
//			{
//				GPIO_ResetBits(GPIOB,GPIO_Pin_2);//输出低电平
//			}else{
//			 GPIO_SetBits(GPIOB,GPIO_Pin_2);//输出高电平
//			}	
		if(1 == GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)){
			GPIO_ResetBits(GPIOA,GPIO_Pin_1);
		}else{
			GPIO_SetBits(GPIOA,GPIO_Pin_1);
		}
		}

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

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

相关文章

腾讯云AI代码助手:智能编程的新篇章,大家的代码开发伙伴

文章目录 一、前言二、开发环境介绍三、腾讯云AI代码助手使用实例1、案例一:代码补全2、案例二:代码注释和解释等3、案例三:与AI对话实现需求 四、获得的帮助与提升五、建议六、结语 一、前言 随着人工智能技术的飞速发展,其在各…

SWIPT综述

TS PS Hybrid TSPS ρ 和 α 的最优值以及确定继电器的最优位置可以最小化系统的 OP。 SWIPT CoR with non-linear EH, the hybrid protocol performs better than TSR as well as PSR protocols in terms OP. 波束成形:多天线 SWIPT CoR NETWORKS 多天线系统在 5…

自制神之嘴: fish-speech 容器镜像 (文本转语音 AI 大模型)

穷, 没有 N 卡 ! 穷, 没有 N 卡 ! 穷, 没有 N 卡 !! (重要的事情说 3 遍. ) 最近发现了一个很新的 AI (神经网络) 文本转语音大模型: https://speech.fish.audio/ fish-speech 可以根据输入的文本, 生成高质量的人类说话声音, 效果挺好的. fish-speech 官方已经提供了容器 (d…

2.3 不同数据库管理系统的比较与应用场景

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: 工💗重💗hao💗:野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

[LitCTF 2024]浏览器也能套娃?

题目有标志SSRF SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相…

背包九讲(灵魂版)

文章目录 背包九讲[题库 - AcWing](https://www.acwing.com/problem/search/1/?search_content背包九讲&show_algorithm_tags0)01背包朴素代码一维优化代码 完全背包朴素代码一维优化代码 多重背包I 模板题代码 多重背包 II 二进制优化代码 多重背包 III 单调队列优化代码…

[算法题]01 矩阵

题目链接: 01 矩阵 多源BFS类型题, 即给定多个起点, 判断从哪个起点走到终点距离最短, 一般解题思路为将所有起点看成一个"起点", 由此"起点"做bfs得到题解, 实际代码编写将所有起点都入队列, 每次都对所有起点做一层扩展. 题解思路: 从1往0处走寻找最短…

kali-linux 常用命令大集合(目录、文件查看与编辑,登录、电源、帮助等相关命令详解)

目录 目录查看-ls 帮助命令 帮助命令:whatis 帮助命令:help 帮助命令:man 帮助命令:info 登录命令 登录命令:login 登录命令:last 登录命令:exit 切换用户:su/sudo 命令-…

嵌入式学习day17(顺序表)

大纲 线性表是最基本、最简单、也是最常用的一种数据结构,可以存储逻辑关系为线性的数据。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。 分类: 顺序表、单向链表、单向循环…

WhatsApp代理地址:如何成功连接WhatsApp?

所有外贸人都非常需要通过WhatsApp与客户沟通,简直是搞钱“生命线”!但是,很多老板在后台抱怨说自己一直登不进去,99.99%是你网络问题。很多外贸人找的代理IP来路不明或者滥竽充数,要和很多人一起共用IP或者IP地址总是…

【PGCCC】使用 Postgres 递归 CTE 进行图形检索

您是否知道可以将 Postgres 用作某些用例的图形数据库? 假设您有如下图表: 我们可以在 NetworkX 中构建此图: 1import networkx as nx23G nx.Graph()45G.add_edges_from([6 ("A", "B"),7 ("A", "…

HAproxy 七层负载均衡调度器详解及配置

HAproxy 七层负载均衡 负载均衡技术 负载均衡(Load Balance):一种服务,或基于硬件设备实现的高可用的反向代理技术,是指将特定的业务流量分摊给一个或多个后端的特定服务器或设备,实现高并发处理业务流量…

KNN算法原理

KNN(K-Nearest Neighbors,K最近邻)算法是一种基本且广泛使用的分类与回归方法。在分类任务中,KNN的输入为实例的特征向量,对应于特征空间的点;输出为实例的类别,可以取为类别集合中任意一个类别…

深入解析Java设计模式之中介者模式

一、什么是中介者模式 中介者模式(Mediator Pattern)是Java设计模式中的一种行为型模式。在中介者模式中,一个中介者对象封装了一系列对象之间的交互,使对象之间不直接相互通信,而是通过中介者对象进行通信。这种模式有…

VM——深度学习算子GPU版本耗时不稳定

1、问题:使用3080TI显卡4台130万相机,GPU版本算子,耗时不稳定,15ms-150ms波动 2、方法: 1)参考海康提供的问题手册

Java面试题--JVM大厂篇之JVM 内存管理深度探秘:原理与实战

目录 引言: 正文: 1. JVM内存管理的基本原理 痛点一:频繁的Minor GC 2. 内存分配与回收案例 3. 避免内存泄漏的技巧 痛点二:未关闭的资源 痛点三:静态集合类持有对象引用 4. 优化内存使用的技巧 痛点四:对象过多占用内存…

超越自我——带你学haproxy算法一遍过!!!

文章目录 前言介绍 静态算法static-rrfirst 动态算法roundrobinleastconn 其他算法source算法map-base 取模法一致性hashuriurI_param 取模法hdr 总结本文相关连接如下: 前言 本文相关连接如下: 如果想更多了解haproxy的相关知识,请点击&am…

考试:操作系统知识(03)

分区存储管理 所谓分区存储组织,就是整存,将某进程运行所需的内存整体一起分配给它,然后再执行。有三种分区方式: 固定分区:静态分区方法,将主存分为若干个固定的分区,将要运行的作业装配进去…

ArcGIS Pro 实现人口分布栅格TIFF数据的网格提取与可视化

这里在分享一个人口1km精度栅格数据,LandScan是由美国能源部橡树岭国家实验室(ORNL)提供的全球人口分布数据集,具有最高分辨率的全球人口分布数据,是全球人口数据发布的社会标准,是全球最为准确、可靠&…

架构设计-分层思想

一、为什么要分层设计? 分层设计是为了剥离硬件环境的依赖,使软件系统更好复用,当更换硬件方案时,只需要修改底层函数的初始化,抽象层和服务层完全不需要改动,这样极大的减小时间成本,平台能够很…