STM32嵌入式软件面试准备指南

一、STM32的内核型号有哪些?

STM32系列是STMicroelectronics(意法半导体)生产的基于ARM Cortex-M内核的微控制器产品线。这些产品按照不同的内核架构和性能特点分为了主流产品、超低功耗产品和高性能产品。

1.1 主流产品

  • STM32F0 系列:搭载 ARM Cortex-M0 内核。
  • STM32F1 系列:搭载 ARM Cortex-M3 内核。
  • STM32F3 系列:搭载 ARM Cortex-M4 内核,带有FPU和DSP指令。
  • 1.2 超低功耗产品

  • STM32L0 系列:搭载 ARM Cortex-M0+ 内核。
  • STM32L1 系列:搭载 ARM Cortex-M3 内核。
  • STM32L4 和 STM32L4+ 系列:搭载 ARM Cortex-M4 内核。
  • 1.3 高性能产品

  • STM32F2 系列:搭载 ARM Cortex-M3 内核。
  • STM32F4 系列:搭载 ARM Cortex-M4 内核。
  • STM32F7 系列:搭载 ARM Cortex-M7 内核,提供更高的性能和更多的功能。
  • STM32H7 系列:搭载 ARM Cortex-M7 内核或双核架构(Cortex-M7与Cortex-M4)。
  • 二、STM32主频是多少,传感器和单片机总线类型有哪些?

    2.1 主频

    STM32微控制器的主频由硬件和软件编程决定。通常,外部晶振的频率可以通过倍频器来提高到所需的主频水平。具体主频值视系列和型号而定。

    2.2 传感器和单片机总线类型

    STM32微控制器通常支持多种标准和协议,包括:

  • 单总线
  • I2C(IIC)
  • SPI
  • RS485
  • RS232
  • 三、STM32F1和F4的区别?

    特性 STM32F1系列 STM32F4系列
    内核类型 Cortex-M3 Cortex-M4
    主频 最高72MHz 最高168MHz
    浮点运算 无浮点运算单元(FPU) 具有浮点运算单元(FPU)
    功能性能 外设功能相对较简单 外设更丰富、功能更强大
    内存大小 内部SRAM最大64KB 内部SRAM通常为192KB(112+64+16)

    四、介绍STM32启动过程?

    1. 通过Boot引脚设置初始启动地址:STM32的Boot引脚用于选择启动模式,这些模式可以是系统内存、主闪存内存或嵌入式SRAM。
    2. 初始化栈指针(__initial_sp):微控制器首先初始化栈指针,栈指针的初始值通常位于启动时代码的起始部分。
    3. 指向复位处理程序(Reset_Handler):微控制器跳转到Reset_Handler,这是一个启动函数,完成基本的硬件设置工作。
    4. 设置异常和中断处理程序:如HardFault_Handler,处理硬件失败异常。
    5. 设置系统时钟(SystemInit):在Reset_Handler中,调用SystemInit函数,配置微控制器的系统时钟。
    6. 调用C库启动例程(_main 或 main):启动代码会调用C库的初始化代码,然后进入main函数,这是用户程序的入口点。

    五、介绍一下GPIO?

    STM32微控制器的GPIO(通用输入/输出)引脚可以配置为不同的工作模式,以便于它们可以用于不同的应用。下面是STM32 GPIO的8种基本工作模式的说明:

    序号 模式名称 描述
    1 GPIO_Mode_AIN 模拟输入,用于读取模拟信号,如传感器输出。
    2 GPIO_Mode_IN_FLOATING 浮空输入,高阻抗状态,不连接上拉或下拉电阻。
    3 GPIO_Mode_IPD 下拉输入,内部连接下拉电阻,无高电平信号时输出低电平。
    4 GPIO_Mode_IPU 上拉输入,内部连接上拉电阻,无低电平信号时输出高电平。
    5 GPIO_Mode_Out_OD 开漏输出,可输出低电平,高电平需要外部上拉。
    6 GPIO_Mode_Out_PP 推挽输出,可以输出高电平和低电平。
    7 GPIO_Mode_AF_OD 复用开漏输出,用于特定的外设复用功能,如I2C通讯。
    8 GPIO_Mode_AF_PP 复用推挽输出,用于特定的外设复用功能,如USART、TIM等。

    六、UART串行通信方式介绍?

    6.1 同步通信

    1. I2C (Inter-Integrated Circuit) 半双工

    2. I2C是一种串行通信总线,用于连接微控制器和外部设备。它使用两根线(串行数据线SDA和串行时钟线SCL)进行通信。
    3. SPI (Serial Peripheral Interface) 全双工

    4. SPI是一种串行通信协议,用于连接微控制器和外部设备。它通常使用四根线(MOSI、MISO、SCK、SS)。

    6.2 异步通信

    1. RS485 半双工

    2. RS485是一种串行通信标准,通常用于长距离通信和多点通信。
    3. RS232 全双工

    4. RS232是一种常见的串行通信标准,也被称为串口通信。

    6.3 波特率

    UART协议中的波特率(Baud Rate)是指数据传输的速率,即每秒钟传输的比特数(bit/s)。波特率115200表示每秒钟传输115200个比特。

    七、串口如何配置?

    7.1 串口时钟使能,GPIO时钟使能

    首先需要使能串口和GPIO的时钟,确保它们可以正常工作。这可以通过配置相应的时钟控制寄存器来实现。

    7.2 串口复位

    在初始化之前,对串口进行复位操作,以确保其处于初始状态。

    7.3 GPIO端口模式设置

    配置用于串口通信的GPIO引脚的工作模式。通常,TX引脚设置为复用推挽输出模式,而RX引脚设置为浮空输入模式。

    7.4 串口参数初始化

    初始化串口的参数,包括波特率、数据位、停止位、奇偶校验位和数据流控制等。

    7.5 开启中断并初始化NVIC

    如果需要使用中断来处理串口接收或发送事件,则需要开启中断并初始化相应的中断向量控制器(NVIC)。

    7.6 使能串口

    启用串口,使其可以开始工作。这通常涉及设置相应的使能位或控制寄存器。

    7.7 编写中断处理函数

    如果使用了中断,需要编写相应的中断处理函数来处理串口接收或发送中断事件。

    九、I2C总线在传送数据过程中共有三种类型信号?

    9.1 开始信号

    在I2C总线通信中,开始信号表示数据传输的开始。它由SCL(时钟线)为高电平时,SDA(数据线)由高电平向低电平跳变而产生。

    9.2 结束信号

    结束信号表示数据传输的结束。它由SCL为高电平时,SDA由低电平向高电平跳变而产生。

    9.3 应答信号

    在I2C通信中,接收器在接收到8位数据后,需要向发送器发送应答信号,表示已经成功接收数据。应答信号是一个特定的低电平脉冲。

    十、I2C配置主机模式端口该怎么配置?

    10.1 硬件模式

    在硬件模式下,使用了复用开漏输出,这意味着输出引脚既不上拉也不下拉,而是由外部电路控制。这种模式适用于快速模式,即400 Kbit/s的数据传输速率。

    10.2 软件模拟

    在软件模拟模式下,使用了开漏输出。这意味着输出引脚在低电平时输出低电平,而在高电平时不输出电平,这需要外部上拉电阻。这种模式适用于标准模式,即100 Kbit/s的数据传输速率。

    10.3 硬件配置步骤

    1. 启用GPIO时钟和I2C时钟。
    2. 配置GPIO引脚为复用开漏模式。
    3. 初始化I2C参数,包括通信速度、地址模式和数据传输方向等。
    4. 启用I2C外设。

    十一、什么是I2C仲裁机制?

    I2C总线的仲裁机制是指在多主机环境中,多个主机同时尝试占用总线进行通信时,仲裁机制用于决定哪个主机可以优先占用总线。具体实现方法如下:

    1. 检测总线状态:每个主机在发送数据时,都会实时监测SDA线的状态。
    2. 比较数据:如果一个主机发送了低电平,而另一个主机发送了高电平,发送高电平的主机就会认为总线被占用,从而退出仲裁。
    3. 胜者占总线:最终,发送低电平的主机继续占用总线。

    十二、SPI需要几根线?

    SPI通信需要以下四根线:

    1. MOSI (Master Out Slave In):主机输出,设备输入。
    2. MISO (Master In Slave Out):主机输入,设备输出。
    3. SCK (Serial Clock):串行时钟线,由主机提供。
    4. SS (Slave Select):从设备选择线,通常为低电平有效。

    十三、SPI通信的四种模式?

    SPI通信的四种模式取决于时钟极性(CPOL)和时钟相位(CPHA):

    1. 模式0:CPOL=0,CPHA=0。时钟空闲状态为低电平,数据在时钟上升沿采样。
    2. 模式1:CPOL=0,CPHA=1。时钟空闲状态为低电平,数据在时钟下降沿采样。
    3. 模式2:CPOL=1,CPHA=0。时钟空闲状态为高电平,数据在时钟下降沿采样。
    4. 模式3:CPOL=1,CPHA=1。时钟空闲状态为高电平,数据在时钟上升沿采样。

    十四、该如何确定使用哪种模式?

    确定SPI通信模式的方法如下:

    1. 查看设备手册:大多数SPI设备会在数据手册中指定所需的SPI模式。
    2. 实验验证:在不确定的情况下,可以通过实验来验证哪种模式可以成功通信。

    十五、描述一下中断的处理流程?

    1. 中断发生:外部设备或内部事件触发中断请求。
    2. 中断响应:CPU响应中断请求,保存当前执行上下文(如程序计数器和状态寄存器)。
    3. 中断向量跳转:CPU跳转到中断向量表中对应的中断服务程序(ISR)。
    4. 执行ISR:执行中断服务程序,处理中断事件。
    5. 恢复执行:ISR执行完成后,恢复保存的上下文,返回中断前的执行点。

    十六、STM32的中断控制器支持多少个外部中断?

    STM32的嵌套向量中断控制器(NVIC)支持最多240个外部中断源,不同的STM32型号支持的中断数量可能会有所不同。

    十七、STM32有几个时钟源?

    STM32微控制器通常有以下几个时钟源:

    1. 内部高速时钟(HSI)
    2. 内部低速时钟(LSI)
    3. 外部高速时钟(HSE)
    4. 外部低速时钟(LSE)
    5. PLL(Phase-Locked Loop)时钟

    十八、RTOS的任务是怎么写的?如何切出这个任务?

    编写RTOS任务的步骤

    1. 定义任务函数:任务由函数实现,通常包括无限循环,在其中周期性地执行任务代码。
    2. 创建任务:使用RTOS的API函数创建任务。这通常包括指定任务函数、任务优先级、以及可能的任务堆栈大小。
    3. 任务调度:RTOS的调度器负责管理多个任务的执行时间和顺序。任务可以基于优先级或轮询调度来进行切换。
    4. 任务函数示例

      这里是一个简单的RTOS任务示例,使用FreeRTOS作为示例环境:

    5. #include "FreeRTOS.h"
      #include "task.h"
      
      // 任务函数
      void vTaskFunction(void *pvParameters) {
          for (;;) {
              // 任务实际执行的代码
              // 可以包括读取传感器数据、更新状态、发送消息等
      
              // 延时,让出CPU
              vTaskDelay(pdMS_TO_TICKS(1000));
          }
      }
      
      // 创建任务
      int main(void) {
          xTaskCreate(
              vTaskFunction,          // 任务函数
              "Example Task",         // 任务名称
              configMINIMAL_STACK_SIZE,  // 堆栈大小
              NULL,                   // 传递给任务的参数
              tskIDLE_PRIORITY + 1,   // 任务优先级
              NULL                    // 任务句柄
          );
      
          // 启动调度器
          vTaskStartScheduler();
      
          // 如果系统正常运行,不应该到达这里
          for (;;);
      }
      

      任务切换机制

      任务的切换(Context Switching)是RTOS中的核心功能之一。当一个任务处于等待状态(例如等待时间延迟或等待资源),调度器会停止当前任务的执行,并保存其上下文(包括CPU寄存器等状态),然后加载另一个就绪任务的上下文并执行该任务。这种机制确保系统能够高效地响应实时事件。

      切换触发情况:
    6. 时间片轮转:在固定时间片结束后切换到其他相同优先级的任务。
    7. 资源等待:当任务等待系统资源(如信号量、消息队列)时。
    8. 任务优先级:更高优先级的任务就绪时,会抢占当前低优先级任务的执行。

    18.1 任务间切换

  • 任务间切换:UCOS使用任务调度器来管理多个任务,每个任务有自己的优先级。当系统空闲或者当前任务主动放弃CPU执行权时,任务调度器会根据任务的优先级决定下一个要执行的任务。高优先级任务会优先执行,低优先级任务只有在没有更高优先级任务要执行时才能获得CPU执行权。
  • 硬件中断:当硬件中断发生时,系统会保存当前任务相关的变量(通常是通过将这些变量入栈),然后执行中断服务程序。中断服务程序执行完成后,系统会将之前保存的任务相关变量出栈并返回到原来的任务执行点。
  • 任务间切换的触发:为了确保低优先级任务有机会执行,高优先级任务在一定条件下需要放弃CPU执行权,让任务调度器选择其他任务执行。这可以通过插入等待延时、阻塞等待事件等方式来实现。
  • uCOS的任务调度器会根据任务的优先级和任务间的协作情况来决定任务的执行顺序,从而保证系统的稳定性和实时性。

    十九、uCOS-II中任务间的通信方式有哪几种?

    在uC/OS-II中,使用信号量、邮箱和消息队列这些事件来实现任务间的通信是非常常见的。这些事件可以用于实现资源共享、任务同步和消息传递等功能。

    19.1 信号量

  • 用途:控制共享资源的使用权,标志某事件的发生,使两个任务的行为同步。
  • 应用实例:互斥信号量。初始化为1,用于保护共享资源,确保只有一个任务可以访问该资源,从而避免冲突。
  • 19.2 邮箱(消息邮箱)

  • 概念:邮箱用于在任务之间传递消息,类似于一个缓冲区,任务可以将消息放入邮箱中,其他任务则可以从邮箱中获取消息。
  • 应用场景:用于存储外部事件、串口接收程序中的接收缓冲区等场景。
  • 19.3 消息队列

  • 概念:消息队列是多个邮箱的集合,任务和中断可以将消息放入队列中,任务可以按照先进先出的顺序获取消息。
  • 应用场景:用于存储多个任务产生的消息,确保消息按照先进先出的顺序被处理。
  • 这些事件在uC/OS-II中扮演着重要的角色,帮助实现任务间的通信和协作,从而构建出复杂的实时系统。通过合理地使用这些事件,可以提高系统的可靠性和实时性。

    二十、uCOS-II和Linux的差异

    μC/OS-II和Linux都适用于嵌入式系统,但它们有各自的特点和适用场景。

    21.1 μC/OS-II

  • 设计定位:专为嵌入式系统而设计,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点。
  • 特点:最小内核可编译至2KB,适用于资源受限的嵌入式环境,可以在几乎所有知名的CPU上进行移植。
  • 优势:针对嵌入式系统的需求进行了优化,运行效率更高,占用资源更少。
  • 21.2 Linux

  • 适用范围:广泛应用于服务器、嵌入式系统以及家用机等各种场景。
  • 特点:免费、安全、稳定,具有开放源代码的特性,可以灵活定制和修改。
  • 优势:在服务器领域有广泛的应用,如Red Hat Linux等发行版在服务器上使用广泛,具有强大的社区支持和丰富的生态系统。
  • μC/OS-II更适用于对执行效率和资源占用有严格要求的嵌入式系统,而Linux则更适用于需要广泛应用、灵活定制以及在服务器领域有较大市场份额的场景。

    差异比较

    特点 μC/OS-II Linux
    设计定位 专为嵌入式系统设计 广泛应用于服务器、嵌入式系统等
    内核大小 最小内核可编译至2KB 内核较大,常规内核大小较大
    运行效率 执行效率高,占用空间小 在资源充足的系统上通常具有良好的性能
    实时性能 实时性能优良 实时性能取决于硬件和内核配置
    可扩展性 可扩展性强 具有较好的可扩展性
    适用场景 资源受限的嵌入式系统 服务器、嵌入式系统、家用机等
    社区支持和生态系统 社区支持较小,但有专门的嵌入式社区 强大的社区支持和丰富的生态系统

    二十一、uCOS-II和uCOS-III与FreeRTOS比较

    21.1 uC/OS-II vs. FreeRTOS

  • 外延支持:uC/OS-II具有大量外延支持,如FS、USB、GUI、CAN等,而FreeRTOS只支持TCP/IP。
  • 商业应用费用:在商业上,FreeRTOS是免费应用的,而uC/OS-II在商业上的应用是需要付费的。
  • 任务间通讯:FreeRTOS只支持队列、信号量、互斥量,而uC/OS-II除此外还支持事件标志组、邮箱。
  • 任务管理数量:理论上讲,FreeRTOS可以管理超过64个任务,而uC/OS-II只能管理64个。
  • 21.2 uC/OS-II vs. μC/OS-III

  • 优先级管理:μC/OS-III允许几个任务使用同一个优先级,并且在同一个优先级中支持时间片调度。
  • 动态配置内核资源:μC/OS-III允许在程序运行中动态配置实时操作系统内核资源,避免了编译过程中资源不够分配的问题。
  • 资源复用:μC/OS-III对资源复用做了改进,不再受限于最大任务数,而是受限于RAM的可用量。
  • 功能增加:μC/OS-III增加了许多功能,包括更多的任务管理、信号量、互斥型信号量、事件标志、消息队列、定时器等,这些功能在uC/OS-II中是没有的。
  • 比较总结

    特点 uC/OS-II FreeRTOS μC/OS-III
    外延支持 支持大量外延,如FS、USB、GUI、CAN等 仅支持TCP/IP 同样支持大量外延,如FS、USB、GUI、CAN等
    商业应用费用 商业上需付费 商业上免费应用 商业上需付费
    任务间通讯 支持队列、信号量、互斥量、事件标志组、邮箱 仅支持队列、信号量、互斥量 支持队列、信号量、互斥量、事件标志组、邮箱
    任务管理数量 最多管理64个任务 理论上支持超过64个任务 理论上支持超过64个任务
    优先级管理 任务优先级不能重复,不支持时间片调度 支持任务共享同一优先级,支持时间片调度 支持任务共享同一优先级,支持时间片调度
    动态配置内核资源 不支持 不支持 可在程序运行中动态配置内核资源
    资源复用 有限于最大任务数 不受限于最大任务数 不再受限于最大任务数
    功能增加 功能相对较少 功能相对较少 增加了许多功能

    作者:琢瑜

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32嵌入式软件面试准备指南

    发表回复