嵌入式 STM32(一)

目录:

1.什么是GPIO?

2.什么是中断?工作原理是什么?

3.中断的优先级有哪些?区别是什么?

4.定时器和计数器区别是什么?

5.你用过外部中断吗?在STM32中配置外部中断步骤有哪些?

6.中断和事件怎么理解?

7.请你讲讲裸机编程是什么?

内容:

1.什么是GPIO?

  • GPIO 是通用输入/输出的缩写,它是一种在计算机系统中用于与外部设备进行数字信号交互的通用接口。每个 GPIO 引脚可以被配置为输入或输出,并且可以通过编程来读取或写入数据。

输入功能

上拉输入

上拉输入是一种输入状态,该状态下,输入引脚连接一个上拉电阻,使其保持高电平状态。(将一个不确定的信号,通过一个电阻与电源VCC相连)当没有外部信号输入时,输入引脚会被上拉电阻拉高。

注:IO口接了上拉电阻,如果IO口外部没有信号输入,IO默认的电平为高电平,如果IO口输入低电平,此时读到IO口电平状态为低电平。

下拉输入

下拉输入是一种输入状态,该状态下,输入引脚连接一个下拉电阻,使其保持低电平状态。(通过一个电阻与地GND相连,固定在低电平,IO口为低电平)有外部信号输入时,输入引脚会被下拉电阻拉低。

注:IO口接了下拉电阻,如果IO口外部没有信号输入,CPU读到的引脚为低电平,当外部输入一个高电平时候,CPU读到高电平。

浮空输入

既不接上拉电阻,也不接下拉电阻,这种情况下 IO引脚的电平状态完全由外部输入所绝对,此时CPU可以通过读取数据的操作来获取外部电路的工作状态。

注:浮空输入状态下,IO引脚的电平信号直接进入到数据寄存器,CPU直接去读取IO口的电平,IO的电平状态是不确定的,完全由外部输入决定。

模拟输入

模拟输入用于ADC的采集电压时,配置的输入IO口。在模拟输入中,TTL肖特基触发器以及上拉电阻和下拉电阻都处于关闭状态。即使配置上拉或下拉模式,不会影响到模拟信号的输入输出。

输出功能

开漏输出

不输出电压 CPU往外写低电平0时 ,此时引脚接VSS(GND)相当于接地CPU外外写高电平1时 此时引脚的电平状态由上下拉电阻决定。

注:

  • 在开漏输出模式下只有N-MOS管工作,当控制输出为0时,N-MOS导通,P-MOS关,IO端口为低电平。
  • 在开漏模式下,无法真正输出高电平,需要借助外部上拉电阻完成对外驱动。

推挽输出

CPU往外写高电平(1)时,此时引脚输出一个高电平,CPU往外写低电平(0)时,此时引脚输出一个低电平。

注:在推挽输出模式下,N-MOS管和P-MOS管都工作,控制输出为0,N-MOS管导通P-MOS管关闭,为低电平,控制输出为1,则N-MOS关闭,P-MOS导通,为高电平。

8种GPIO端口模式

4种输入:

  • 模拟输入
  • 浮空输入
  • 上拉输入
  • 下拉输入

4种输出:

  • 开漏输出
  • 推挽输出
  • 复用开漏输出
  • 复用推挽输出

2.什么是中断?工作原理是什么?

在STM32中,中断是一种硬件机制,它打断了正常的程序执行流程,用于响应需要优先处理的事件或请求。对于单片机来说,中断是指CPU正在处理某个事件A,发生了另一件事件B,请求CPU迅速去处理(中断发生);CPU暂时停止当前的工作(中断响应),转去处理事件B(中断服务);待CPU处理事件B完成后,再回到原来的事件A(断点)继续执行,这一过程称之为中断。中断可以是来自硬件设备的信号或软件生成的信号,在系统发生某种特定事件时触发。

  • 硬件中断:由外部硬件设备或外部事件触发。当某个硬件外设(如传感器、定时器、按键、串口等)完成某个任务或发生某个事件时,会发送一个中断信号给处理器,处理器接收到信号后立即暂停当前任务,转而执行中断服务程序。
  • 软件中断:由程序代码触发。程序在执行过程中主动发出中断请求,通常用于实现特定的功能或模拟硬件中断。

中断的工作原理

STM32有多种中断源,包括外部中断(例如按键触发)、定时器中断、串口通信中断等。当一个中断源发生特定事件时(例如输入信号的变化,计时器溢出等),该中断源会触发中断信号。此时中断响应,中断信号被送入中断控制器(NVIC)。(中断信号可能具有不同的优先级。系统根据优先级决定哪个中断信号最先响应。)当中断信号被确认时,CPU会暂停当前的程序执行,跳转到与该中断源关联的中断服务程序(ISR)执行。

中断的优势:

  • 通过中断,系统可以迅速响应外部事件,而不需要不断轮询检查条件,节省了CPU的处理时间。
  • 中断只在有事件发生时才激活,避免了持续占用CPU资源进行轮询。

3.中断的优先级有哪些?区别是什么?

中断优先级:STM32的NVIC允许为每个中断分配优先级。中断优先级通常分为多个等级(例如,0到15)。优先级数值越低,响应越优先。还可以设置中断的抢占优先级和响应优先级。

  • 抢占优先级:决定哪个中断可以抢占当前正在执行的中断。抢占优先级较高的中断可以打断低优先级的中断。比如去医院看病,现在医院门口排队有人,我的抢占优先级高,我就可以插队看病,看完那些排队的人才可以看。
  • 响应优先级:当两个中断具有相同的抢占优先级时,响应优先级决定了哪个中断先被响应。比如去医院看病,现在有人排队,我俩病情一样(相应优先级一样),那就必须等前面的看完才能轮到我。

注意:

  • 高抢占优先级可以打断正在执行的低抢占优先级。
  • 当抢占优先级相同时,相应优先级高的先执行,注意相应优先级不能相互打断。
  • 数值越小,优先级越高。0的优先级最高。

4.定时器和计数器区别是什么?

  • 定时器是一种工作在计数模式下,只计数固定周期脉冲的计数器。由于脉冲周期固定,由计数的值可以计算出时间,所以定时器有定时功能。
  • 定时和计数只是触发来源不同(触发源:时钟信号和外部脉冲),其他方面是一样的。单片机里的寄存器可以看成每一个的电子开关,用来切换不同的功能、信号。

5.讲讲你对NVIC的理解?

NVIC(嵌套向量中断控制器):负责处理和管理STM32的所有中断请求。NVIC允许设置每个中断的优先级,并根据优先级决定中断的响应顺序。

NVIC 的工作原理

  • 中断触发:当某个外部事件或内部条件(如定时器溢出、外部外设请求等)满足时,触发一个中断信号。
  • 中断屏蔽与使能:在 NVIC 中,每个中断都有一个使能位和一个优先级设置。只有使能的中断会被 CPU 处理,且中断会按照优先级顺序进行处理。
  • 中断响应:当 CPU 正在执行程序时,如果发生中断并且该中断的优先级高于当前执行的任务,CPU 会自动暂停当前任务,保存现场,并转到对应的 ISR 执行。
  • 嵌套和抢占:如果在当前中断服务过程中发生了比当前中断更高优先级的中断,CPU 会根据嵌套优先级重新调度中断执行顺序。

工作过程:

  • 当外部被触发时,首先进入ICER、ISER寄存器,用于控制是否开对应的中断,打开的中断进入IPR寄存器,进行中断优先级的判断,IPR寄存器受AIRCR寄存器控制,最后按照中断优先级依次进入CPU被执行。
  • 内核中断由SHPR寄存器控制,SHPR与IPR寄存器属于同一级别。

NVIC 优点

  1. 快速响应:NVIC 使得中断的响应时间非常短。
  2. 高效的优先级管理:通过对中断进行优先级管理,系统可以确保关键任务(如实时处理)优先执行,避免低优先级任务延迟。
  3. 灵活的中断控制:NVIC 支持动态地使能和禁用中断。

例子

比如,假设你有两个中断源:一个来自定时器溢出的中断(低优先级),另一个来自外部传感器的中断(高优先级)。如果这两个中断几乎同时发生,NVIC 会优先处理中断源来自传感器的高优先级中断,而定时器的中断则会被暂时挂起,直到高优先级的 ISR 执行完成。

5.你用过外部中断吗?在STM32中配置外部中断步骤有哪些?

外部中断的配置

  • 外部总线时钟配置(开启GPIO和AFIO时钟并使能)。

  • GPIO的配置,配置输入模式(上拉,下拉,浮空输入)。

  • EXTI配置(选择边沿触发方式,选择响应方式等)。

  • 配置NVIC(指定抢占优先级和响应优先级并使能)。

  • 定义处理特定中断事件的代码逻辑。
  • 设置中断服务函数,用于判断是否触发中断。(注意清除中断标志位)

注:(补充)

  • EXTI支持触发的方式:上升沿触发,下降沿触发,双边沿触发,软件触发
  • AFIO功能:用于复用功能引脚重映射和中断引脚的选择。

6.中断和事件怎么理解?

中断

中断是指计算机处理器(CPU)在执行程序时被外部或内部事件打断,暂时停止当前的工作,转而去处理更为紧急或优先的任务。中断通常由硬件或软件触发,目的是让系统响应即时的需求,如硬件设备需要服务、定时器事件等。

  1. 硬件中断:由外部硬件设备触发,例如键盘输入、鼠标点击、网络数据到达等。
  2. 软件中断:由程序本身发出,通常用于请求操作系统服务(例如系统调用)。
  3. 中断要进入NVIC,有相应的中断服务函数,需要CPU处理。

事件

事件通常指的是在系统中某个条件或状态的变化,可能是外部的输入(如用户点击、硬件信号)或者系统内部的状态变化(如定时器触发)。在许多编程模型中,事件用于驱动异步操作和回调机制。

  1. 事件处理:事件通常是通过某种方式(如消息队列、回调函数)来处理的。
  2. 事件不进入NVIC,仅用内部硬件自动控制,TIM,DMA,ADC等。

7.请你讲讲裸机编程是什么?

概念

裸机编程是指在没有操作系统支持的情况下,直接与硬件交互进行编程的方式。也就是说,裸机编程不依赖于操作系统提供的中间层或抽象层,开发者需要直接控制硬件资源,如处理器、内存、外设等。

  • 没有操作系统代码直接运行在硬件上,不依赖于操作系统(如 Linux、Windows、RTOS 等)。程序员需要手动管理硬件的初始化、外设的驱动、内存的管理等。
  • 由于没有操作系统的支持,程序员需要直接控制和配置硬件资源,如微处理器(CPU)、内存、外设(GPIO、USART、SPI、I2C 等)和中断等。

流程

  • 硬件初始化:在程序的开始,首先需要初始化硬件,如设置时钟、配置外设的输入/输出引脚、初始化定时器等。
  • 主循环:程序的核心部分通常是一个主循环,负责执行主要任务。在裸机编程中,这个主循环通常是“无限循环”,在其中处理所有需要执行的任务。
  • 中断处理:在裸机编程中,通常需要编写中断服务例程(ISR),以响应硬件事件或外部信号的变化(如定时器溢出、外部按键按下等)。
  • 任务调度:如果需要并发处理多个任务,开发者需要自己编写调度程序(例如使用轮询或其他调度方法),因为没有操作系统提供的多任务调度功能。
  • 硬件访问:所有硬件的访问都通过寄存器、内存映射等方式直接进行,开发者需要熟悉硬件文档和规格手册来编写代码。

优点

  • 没有操作系统的开销,裸机编程的执行效率非常高,特别适合实时性要求高的场合(例如嵌入式系统、实时控制等)。
  • 裸机编程没有操作系统,因此程序的内存占用非常少。
  • 裸机编程避免了操作系统的复杂性,代码通常更加简单明了。

缺点

  • 由于没有操作系统提供的抽象层,开发者需要自己管理所有硬件和任务调度,开发难度较大。比如,调试外设驱动、中断和硬件相关的BUG都比较麻烦。
  • 裸机编程没有操作系统的调度机制,开发者需要自己实现多任务或并发执行的功能。如果需要多任务,必须手动编写调度程序或使用简单的时间片轮转等方法。
  • 裸机编程通常是针对特定硬件编写的,移植到不同的硬件平台上需要做大量的修改和适配工作。

应用场景

  • 裸机编程广泛应用于嵌入式系统中,尤其是资源有限的小型设备中。例如,单片机(MCU)常常运行裸机程序来控制硬件。
  • 在开发硬件驱动程序时,裸机编程是必须的,因为驱动程序需要直接访问硬件资源。
  • 用于开发简单的控制系统,如LED显示、按键输入、传感器读取等。
#硬件##春招##秋招##嵌入式##面经#
嵌入式/C++八股 文章被收录于专栏

本人双飞本,校招上岸广和通。此专栏覆盖嵌入式常见面试题,有C/C++相关的知识,数据结构和算法也有嵌入式相关的知识,如操作系统、网络协议、硬件知识。本人也是校招过来的,大家底子甚至项目,可能都不错,但是在面试准备中常见八股可能准备不全。此专栏很适合新手学习基础也适合大佬备战复习,比较全面。最终希望各位友友们早日拿到心仪offer。也希望大家点点赞,收藏,送送小花。这是对我的肯定和鼓励。 持续更新

全部评论

相关推荐

评论
2
8
分享

创作者周榜

更多
牛客网
牛客企业服务