【单片机】
【嵌入式八股】一、语言篇https://www.nowcoder.com/creation/manager/columnDetail/mwQPeM
【嵌入式八股】二、计算机基础篇https://www.nowcoder.com/creation/manager/columnDetail/Mg5Lym
【嵌入式八股】三、硬件篇(本专栏)https://www.nowcoder.com/creation/manager/columnDetail/MRVDlM
【嵌入式八股】四、嵌入式Linux篇https://www.nowcoder.com/creation/manager/columnDetail/MQ2bb0
单片机
单片机基础
基础
01.STM32F1和F4有什么区别
-
更先进的内核。STM32F4采用Cortex M4内核,带FPU和DSP指令集,而STM32F1采用的是Cortex M3内核,不带FPU和DSP指令集。
-
更多的资源。STM32F4拥有多达192KB的片内SRAM,带摄像头接口(DCMI)、加密处理器(CRYP)、USB高速OTG、真随机数发生器、OTP存储器等。
-
增强的外设功能。对于相同的外设部分,STM32F4具有更快的模数转换速度、更低的ADC/DAC工作电压、32位定时器、带日历功能的实时时钟(RTC)、IO复用功能大大增强、4K字节的电池备份SRAM以及更快的USART和SPI通信速度。
-
更高的性能。STM32F4最高运行频率可达168Mhz,而STM32F1只能到72Mhz;STM32F4拥有ART自适应实时加速器,可以达到相当于FLASH零等待周期的性能,STM32F1则需要等待周期;STM32F4的FSMC采用32位多重AHB总线矩阵,相比STM32F1总线访问速度明显提高。
-
更低的功耗。STM32F40x的功耗为:238uA/Mhz,其中低功耗版本的STM32F401更是低到:140uA/Mhz,而STM32F1则高达421uA/Mhz。
02.MCU启动流程
MCU启动流程可以概括为以下几个步骤:
- 上电复位:当MCU上电时,它会执行一次硬件复位。此时,所有寄存器被初始化为默认值,程序计数器(Program Counter,PC)被设置为复位向量所指向的地址。
- 复位向量表(Reset Vector Table):MCU在复位后,会跳转到复位向量表中的地址执行。复位向量表是一个存储着不同中断向量地址的特殊内存区域,其中包含了复位中断向量的地址。
- 系统时钟初始化:接下来,MCU会初始化系统时钟。这意味着选择合适的时钟源、配置时钟分频器和倍频器等设置,以确保正确的时钟频率。
- 初始化外设和寄存器:MCU启动后,需要根据应用程序的需求初始化各种外设和寄存器。这包括但不限于GPIO(通用输入输出)、UART(串行通信)、SPI(串行外设接口)、I2C(串行总线接口)、ADC(模数转换器)等。
- 主循环(Main Loop):完成初始化之后,MCU进入主循环,等待事件的发生。主循环通常包含各种任务或代码块,用于处理输入、执行操作、控制外设等。
03.STM32的启动地址
启动地址为0x08000000
理论上,CM3中规定上电后CPU是从0地址开始执行,但是这里中断向量表却被烧写在0x0800 0000地址里(Flash memory启动方式),那启动时不就找不到中断向量表了?既然CM3定下的规矩是从0地址启动,SMT32当然不能破坏ARM定下的“规矩”,所以它做了一个启动映射的过程,就是和芯片上总能见到的BOOT0和BOOT1有关了,当选择从主Flash启动模式后,芯片一上电,Flash的0x0800 0000地址被映射到0地址处,不影响CM3内核的读取,所以这时的CM3既可以在0地址处访问中断向量表,也可以在0x0800 0000地址处访问中断向量表,而代码还是在0x0800 0000地址处存储的。
04.DSP指令
DSP处理器有什么特点?
你可以把DSP处理器想象成一个科学计算器。它非常擅长做运算。
1、并行性。某些型号的DSP处理器内部有两个独立的乘法器,可以把其中一个专门做FIR滤波器用,而且可以脱离ALU单独运行。
这样,FIR滤波器的滤波特性不受ALU影响。这一点,用ARM是做不到的。
2、快速查表。DSP处理器内部ROM固化了很多数学上使用的各种常量、表格。如:正弦表等。
3、有16位、32位、64位的DSP处理器。
4、某些型号的DSP处理器支持硬件浮点运算单元。
5、可以使用厂家提供的算法库。
6、某些型号的DSP处理器支持VLIW,即超长指令集字,并行度非常高。
7、某些型号的DSP处理器内部是DSP+ARM。
8、有多核DSP。
9、价格较贵。
05.嵌入式微处理器和DSP有什么区别?
嵌入式微处理器和DSP(数字信号处理器)都是用于处理数据的芯片,但它们的设计和应用有所不同,具体区别如下:
- 用途不同:嵌入式微处理器主要用于通用用途的计算和控制任务,例如实现操作系统、网络通信、多媒体处理、机器视觉等;而DSP主要用于数字信号处理和嵌入式控制领域,例如音频处理、图像处理、视频编解码、机器人控制等。
- 硬件结构不同:嵌入式微处理器通常采用高速缓存、分支预测、乱序执行等技术,以优化处理器的通用计算能力;而DSP通常采用专用的硬件结构,如乘法累加器(MAC)、硬件加速器、DMA等,以优化数字信号处理的效率和速度。
- 算法和指令集不同:嵌入式微处理器通常采用通用算法和指令集,以支持通用计算和控制任务,如ARM、MIPS、x86等;而DSP通常采用专用的算法和指令集,如FFT、FIR滤波器、卷积等,以优化数字信号处理的效率和速度。
- 开发工具不同:由于嵌入式微处理器和DSP的用途和硬件结构不同,因此它们的开发工具也有所不同。嵌入式微处理器通常使用C语言和汇编语言进行开发,支持通用的开发工具和IDE,如Keil、Eclipse等;而DSP通常使用专门的开发工具和库,如MATLAB、LabVIEW、TI Code Composer等。
06.用的MCU的RAM多大,flash多大?
例:STM32F103C8T6的RAM和Flash大小如下:
- RAM大小:20KB
- Flash大小:64KB
07.MCU 外部RAM和内部RAM区别,怎么分配
MCU中通常存在两种类型的RAM,即外部RAM和内部RAM。它们有以下区别:
- 内部RAM(Internal RAM):也称为片上静态随机存取存储器(Static Random Access Memory,SRAM),是MCU芯片内部集成的一块RAM。它具有快速的访问速度和低功耗特性。内部RAM通常用于存储代码段、数据段和堆栈等临时数据。
- 外部RAM(External RAM):也称为片外动态随机存取存储器(Dynamic Random Access Memory,DRAM),是通过外部接口连接到MCU的额外存储器。外部RAM容量比内部RAM更大,可以存储更多的数据。由于外部RAM需要额外的接口和控制线路,因此其访问速度相对较慢。
分配内部RAM和外部RAM的具体方法取决于MCU的架构和编程环境。一般来说,内部RAM的分配是由编译器自动处理的,而外部RAM则需要手动进行分配。
对于内部RAM的分配,开发者只需在程序中定义变量并进行初始化即可。编译器会根据变量的类型和作用域自动分配内部RAM空间。
而对于外部RAM的分配,则需要通过编程方式进行配置。这通常涉及设置MCU的存储器映射或地址映射机制,以将外部RAM的地址范围映射到合适的内存空间。具体的操作方法和步骤会因MCU型号和开发环境而有所不同,可以参考MCU的文档和相关编程手册来了解详细信息。
总结起来,内部RAM是MCU芯片内部集成的存储器,由编译器自动分配;而外部RAM需要手动配置并通过外部接口连接到MCU,通常容量较大。
08.MCU上的固件,数据是怎么分配的
在MCU上,固件和数据的分配是通过链接器脚本(Linker Script)来完成的。链接器脚本定义了程序和数据的内存布局和分配方式。
链接器脚本指定了各个程序段(Code Segment)和数据段(Data Segment)在内存中的起始地址和大小。它还可以定义其他特定的段,如只读数据段(Read-Only Data Segment)和堆栈段(Stack Segment)等。
当编译和链接代码时,链接器将使用链接器脚本来确定每个段的位置和大小,并生成最终的可执行文件或固件。
以下是一个示例链接器脚本的简化版本:
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 64K
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 20K
}
SECTIONS
{
.text :
{
*(.text)
} > FLASH
.data :
{
*(.data)
*(.bss)
} > RAM
}
上述示例中,.text
段包含了可执行代码,被分配到Flash的起始地址0x08000000处,长度为64K。.data
段包含了初始化的全局变量和静态变量,被分配到RAM的起始地址0x20000000处,长度为20K。
请注意,具体的链接器脚本会根据芯片型号、封装和编程环境等因素而有所不同。因此,在实际开发中,应该参考MCU的文档和相关编程手册,以获取准确的链接器脚本或相关配置信息。
09.用过哪些功能?
- 内存管理:MCU提供内部RAM和Flash等内存资源,用于存储程序代码、数据和变量等。
- 输入/输出(I/O):MCU具有各种输入输出接口,如通用输入输出口(GPIO)、串行通信接口(UART/SPI/I2C)和模拟输入输出(ADC/DAC)等,用于连接和交互外部设备。
- 定时器和计数器:MCU包含了定时器和计数器模块,可以产生精确的时间延迟、脉冲和周期信号等。
- 中断控制器:MCU通过中断控制器模块来管理中断请求和优先级,使得系统能够及时响应外部事件。
- 时钟和时序控制:MCU提供时钟源和时序控制器,用于生成并管理系统时钟,并对外设进行同步控制。
- 电源管理:MCU通常具有电源管理单元,用于控制和调节供电电压和功耗。
- 通信接口:MCU支持各种通信协议和接口,如以太网、USB、CAN、SPI、I2C等,用于与其他设备进行数据交换和通信。
- 安全和加密功能:一些MCU提供硬件加密引擎和安全模块,用于保护敏感数据和执行加密算法。
- 调试和编程接口:MCU提供调试接口(如JTAG/SWD)和编程接口(如ISP/ICP),用于程序下载、调试和测试。
14.M系列的处理器支持什么异常、都有哪些寄存器?
- M系列的处理器支持哪些异常? Cortex-M系列处理器支持以下异常:
- 重置异常(Reset)
- 非屏蔽中断(NMI,Non-Maskable Interrupt)
- 数据终止异常(HardFault)
- 访问未定义指令异常(Undefined Instruction)
- 非法状态异常(Fault)
- 系统调用异常(SVCall)
- 系统调试异常(Debug Monitor)
- PendSV异常
- SysTick定时器异常
- Cortex-M3处理器有哪些寄存器? Cortex-M3处理器有多个寄存器,包括:
- 通用寄存器(General-Purpose Registers):R0-R12,主要用于通用数据存储和运算。
- 程序计数器(Program Counter,PC):指向当前正在执行的指令的地址。
- 堆栈指针(Stack Pointer,SP):指向当前堆栈的顶部。
- 帧指针(Frame Pointer,FP):用于支持函数调用和局部变量的访问
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
查阅整理上千份嵌入式面经,将相关资料汇集于此,主要包括: 0.简历面试 1.语言篇 2.计算机基础 3.硬件篇【本专栏】 4.嵌入式Linux (建议PC端查看)