MCU介绍
架构以一个Cortex-M内核的STM32 MCU为例,架构如图:
整体可以分成几个层次:
内核
内核是MCU的大脑。Cortex‐M3是一个32位处理器内核,内部的数据路径、寄存器和存储器接口是32位的。CM3采用了哈佛结构,拥有独立的指令总线和数据总线,可以让取指与数据访问同时进行。拥有R0‐R15的寄存器组,R13是堆栈指针SP,R15是程序计数寄存器,指向当前的程序地址。简化视图如下,包括中断控制器NVIC,取指单元,解码单元,算数运算单元,寄存器组,调试系统,总线接口等。
时钟与复位系统
时钟对于嵌入式系统来说等同于人类的心脏。同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也会越弱,所以复杂的MCU一般都采用多时钟源,为了保持低功耗工作,主控默认不开启这些外设功能。用户可以根据自己的需要决定芯片要使用的功能,这个功能开关就在各个外设的时钟。
时钟源从哪来?以STM32F1为例,包括:
(1)2个外部时钟源:高速外部振荡器 HSE (High Speed External Clock signal)外接石英/陶瓷谐振器,频率为4MHz~16MHz。低速外部振荡器LSE(Low Speed External Clock signal)外接32.768kHz石英晶体,主要作用于RTC的时钟源。
(2)2个内部时钟源:高速内部振荡器HSI(High Speed Internal Clock signal)由内部RC振荡器产生,频率为 8MHz。低速内部振荡器LSI(Low Speed Internal Clock signal)由内部RC振荡器产生,频率为40kHz,可作为独立看门狗的时钟源。
芯片上电时默认由内部的HSI时钟启动,=可根据用户配置切换到对应的外部时钟源。
锁相环是自动控制系统中常用的一个反馈电路,在STM32主控中,锁相环的作用主要包括输入时钟净化和倍频。前者是利用锁相环电路的反馈机制实现,后者用于使芯片在更高且频率稳定的时钟下工作。在STM32中,锁相环的输出也可以作为芯片系统的时钟源。
复位控制器 (Reset Controller):处理上电复位、看门狗复位、软件复位等。
电源与模拟模块
电对于嵌入式系统等于血液之于人类。嵌入式常见的低压电源有3个:
5V
5V通常用作开发板的主要电源输入,它是一个通用的电压标准,适用于大多数电源适配器和USB电源。可以通过降压转换器生成其他所需的电压,如 3.3V 和 1.8V。
外部接口:某些外部接口和外设,如 USB、一些传感器模块和显示模块,可能需要 5V 电源。
3.3V
IO 电压:大部分FPGA和SoC的GPIO引脚使用3.3V电压标准。3.3V是一个常见的电平,可以与很多外部设备和外围器件兼容,如SPI、I2C和UART接口。
外设供电:许多外设如闪存、SRAM、一些传感器和通信模块,也使用 3.3V 电源。
1.8V
内核电压:MCU和SoC的内核逻辑通常使用更低的电压,以减少功耗和发热。Xilinx Zynq设备的内核逻辑电压通常为1.8V或更低。
高速接口:某些高速接口,如DDR内存和高速串行通信,可能需要1.8V电源。
STM32的工作电压(VDD)为2.0~3.6V。通过内置的电压调节器提供所需的1.8V电源。
安全与控制模块
看门狗:包括独立看门狗和窗口看门狗,用于在系统卡住时复位。
错误校验模块 (ECC, Parity, CRC):保证数据传输和存储可靠。循环冗余校验(CRC)计算单元是根据固定的生成多项式得到任一32位全字的CRC计算结果。
调试接口
调试接口 (SWD, JTAG)
总线
总线是嵌入式系统的神经网络,各部件靠它通信。常见的总线有AHB,APB,AXI。AHB/APB桥在AHB和APB总线间提供同步连接。APB操作速度一般最高36MHz,APB2速度一般最高72MHz。在每一次复位以后,所有除SRAM和FLITF以外的外设都被关闭,在使用一个外设之前,必须设置寄存器来打开该外设的时钟。
Cortex-M内核挂在AHB(Advanced High-performance Bus)上。大部分低速外设(GPIO、USART、I²C、SPI、定时器等)挂在APB(Advanced Peripheral Bus)上,通过总线与Cortex内核通信。一些高速外设(DMA、以太网、USB、FMC等)挂在AHB或AXI总线上,直接和内核或DMA高效交互。AHB和APB通过桥接器连接,形成分层总线结构。
在程序里访问外设寄存器,Cortex-M内核发出一个AHB总线访问请求,AHB总线解码器识别目标地址属于APB外设区。请求通过AHB-APB桥转换成APB协议,最终到达外设寄存器。外设控制器根据写入的值驱动I/O引脚变化。
外设
UART、SPI、I²C、GPIO等。
存储器映射
STM32F10xxx内置64K字节的静态SRAM。它可以以字节、半字(16位)或全字(32位)访问。
SRAM的起始地址是0x2000 0000。
512K字节闪存存储器(flash)。
程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个4GB的线性地址空间内。数据字节以小端格式存放在存储器中。一个字里的最低地址字节被认为是该字的最低有效字节,而最高地址字节是最高有效字节。
在MCU中,虽然片上实际的Flash、SRAM、外设寄存器都只有几十KB到几MB,但ARM内核定义了一个统一的32位地址空间(4GB,地址范围0x0000_0000 ~ 0xFFFF_FFFF),把所有资源都映射进去,形成一个线性地址空间。典型的 Cortex-M 存储器映射:
地址范围 |用途
0x0000_0000 ~ 0x1FFF_FFFF 代码区(Code),存放 Flash、ROM
0x2000_0000 ~ 0x3FFF_FFFF SRAM(Data)
0x4000_0000 ~ 0x5FFF_FFFF 外设寄存器(Peripheral,APB/AHB)
0x6000_0000 ~ 0x9FFF_FFFF 外部 RAM/设备(External RAM/Device)
0xA000_0000 ~ 0xDFFF_FFFF 外部设备(External Device)
0xE000_0000 ~ 0xE00F_FFFF 系统控制空间(System Control Space,NVIC,SysTick 等)
0xE010_0000 ~ 0xFFFF_FFFF 保留(Reserved)
这样设计能够统一寻址,内核用相同的Load/Store指令就能访问Flash、SRAM、寄存器和I/O端口。也不需要区分“内存访问”和“I/O 访问”。外设厂商只要把新的寄存器或存储器映射到空闲的地址区间即可。
外设(UART、SPI、I2C、GPIO 等)挂在APB总线上,Cortex内核访问外设时,不是直接跟外设打交道,而是像访问内存一样,通过总线去读写外设的寄存器。
这些外设寄存器被映射(memory-mapped I/O)到MCU的统一地址空间(比如Cortex-M是4GB的地址空间),程序里 (volatile uint32_t)0x40011000 = 0x01; 这种写操作,就是通过总线把数据写到外设控制器的寄存器,从而控制外设。
其他
DMA控制器,中断控制器NVIC等。
NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器) 是Cortex-M内核里的一个组件,用来管理和响应中断。NVIC不是一个单独挂在总线上的外设,它是Cortex-M内核里的一部分,和内核紧密耦合。外设通过APB总线把中断信号线拉高/拉低通知NVIC,NVIC根据配置(优先级等)决定是否打断内核当前正在执行的代码,并跳转到向量表里该中断的 ISR(中断服务函数)。
作用
中断响应:当外设(比如 UART、SPI、定时器)产生中断请求时,NVIC负责接收、判优和调度。
优先级管理:支持中断的优先级配置,可以嵌套(高优先级中断打断低优先级中断)。
中断屏蔽:可以动态使能/失能某个中断。
异常向量表支持:和内核一起使用向量表(Vector Table)来找到每个中断对应的服务函数入口地址。
如何控制中断
常见的NVIC寄存器(这些寄存器在 System Control Space (SCS) 里,属于内核区域,不是普通 APB 外设):
ISER (Interrupt Set-Enable Register):使能某个中断
ICER (Interrupt Clear-Enable Register):关闭某个中断
ISPR / ICPR:设置/清除中断挂起状态
IABR:查看中断是否正在执行
IPR (Interrupt Priority Register):设置中断优先级
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]