Cortex-M3 入门指南(一):体系概述

作者:Andy Lok
原文首发知乎:https://zhuanlan.zhihu.com/p/52235675

Cortex-M3 入门指南 是本专栏新的系列文章,与 Rust 嵌入式开发系列不同,本系列文章将着重于讲解Cortex-M3的架构设计、寄存器组成、时钟与总线的概念、各种外设的功能与使用方法等等。

文章中会使用适量 Rust 代码辅助讲解,但并不着重于Rust语言之于嵌入式的应用,而且为了更好地解释底层原理,代码都会基于寄存器进行底层操作。

对于生产代码,我们推荐使用更高级别的硬件抽象层 (HAL, Hardward Abstrat Layer) 进行操作,而这部分将留在Rust 嵌入式开发系列文章中再详细介绍。

概览

嵌入式领域内有着众多五花八门的处理器架构,比如 Cortex-A , Cortex-M , Cortex-R , MSP430 , RISCV 等等。

其中 Cortex-A 属于高性能处理器,定位于物联网,路由器设备等,Cortex-M 系列主打低功耗低成本和较强性能设备,Cortex-R 系列主打低时延实时应用,适用于无线基站,手机基带等。

Cortex-M 系列中又分为 Cortex-M0 , Cortex-M3 , Cortex-M4 , Cortex-M7 等架构,我们使用的 STM32F103 单片机就是意法半导体 (ST) 公司基于 Cortex-M3 架构生产的处理器,这款处理器成本低廉而性能强大,最重要的是它在全世界范围有着非常广泛的应用,教学资料随处可见,非常适合用于嵌入式入门,而且 Cortex-M3 的架构设计非常经典,只要掌握了它,要转到其他嵌入式平台也是非常简单的。

外设与寄存器

单片机系统 (MCU) 是指除了核心处理器 CPU ,还在同一芯片内集成了内存、计数器、定时器、数模转换、通用串口等周边外设的微型处理器。

CPU 和内存以外的其他设备统一被称为外设 (Peripheral),外设与 CPU 之间通过总线连接。(注:外设虽然带有外字,但指代的都是单片机内部的功能部件)

外设的配置一般由生产厂商设计,因此不同的 Cortex-M3 MCU 会拥有不同数量/配置的外设,比如说 STM32F103 型号单片机提供了:

  • 2x SPI (串行外设接口)
  • 3x USART (通用串行接收/发送器)
  • 2x I2C (双向二线制同步串行总线)
  • 1x CAN (Controller Area Network,控制器局域网络总线)
  • 1x USB
  • 2x ADC (数模转换器)
  • 37x GPIO (通用引脚)

然而我们不会直接操作总线来控制外设,而是通过单片机提供的称为 寄存器 (Register) 的特殊功能来间接控制。

这里说的寄存器与我们所熟知的 CPU 寄存器不同,它指代的是一段特殊的内存地址区域,但是它没有实际对应的 SRAM (Static Random-Access Memor, 静态随机存取存储器) 存储,对寄存器的操作与对内存的操作完全一致,可以将寄存器当作内存来读写,而对寄存器内存段的读写将会被转化为总线上与外设的数据交换。

寄存器的地址与具体功能由芯片生产厂商设计,并在生产时已经固定下来了。因此每款单片机一般都会提供一份寄存器数据手册。在之后讲解 STM32F103 这款单片机的时候也会频繁翻查这本手册,学会如何查阅寄存器手册也是嵌入式开发的重要技能。

中断与 NVIC (嵌套中断向量控制器)

中断是嵌入式系统的重要功能,它类似于系统编程里的事件,不同的是中断由硬件产生,而且程序可以进行中断响应,进行响应时现场保护和恢复也是由硬件完成的。其实桌面 CPU 也有中断功能,只是这些中断一般都由操作系统处理,而在裸机单片机编程中,中断将全权由我们控制。

中断产生的原因有很多种,比如说:

  • 时钟计时完成
  • 外部引脚电平发生改变
  • 串口数据发送完成
  • 收到串口信息
  • 单片机重启复位

产生中断时,中断处理函数可以打断主程序的执行,并且在处理完成后重新交回给主程序。同样的,高优先级的中断信号也可以打断低优先级的中断处理函数,这就是嵌套中断的含义。

NVIC (嵌套中断向量控制器) 是 Cortex-M3 架构下的中断控制中心,它负责全部中断相关的操作,比如说中断优先级判断,现场保护与恢复,中断使能等等。NVIC 提供了一组寄存器,我们将通过 NVIC 寄存器对它进行设置。

SysTick 系统时钟

SysTick 系统时钟是内嵌于 Cortex-M3 架构内的特殊时钟,它可以产生与核心频率相等的节拍,或者也可以设置为八分频,产生八分之一核心频率的节拍。区别于其它通用计时器,SysTick 是由 Cortex-M3 标准规定的,因此 SysTick 的使用方法和配置不会因生产厂商而改变,可移植性更好。

时间总线与 TIM 计时器/计数器

STM32F103 提供了 8 个通用定时器,其中有两个高级定时器 TIM1 和 TIM8 ,能够产生 3 对 PWM 互补输出,常用于三相电机的驱动。TIM2 – TIM5 是普通定时器,TIM6和 TIM7 是基本定时器(区别在于有无比较通道,这一点暂时不用理会)。

计时器与其他需要时序的外设(比如说串行设备,SPI 接口等)都会将时钟信号挂靠到 外设总线 (APB, Advanced Peripheral Bus) 上。STM32 有两条外设总线:APB1 和 APB2 , APB2 运行在满速率上,而 APB1 只有核心的一半速率 (36 MHz)。不同外设会挂靠在不同总线上,而具体挂在哪个总线上在设计时已经固定了,可以在手册上查到。

GPIO 通用接口

GPIO (General Purpose Input Output, 通用输入/输出)可以通俗地理解为单片机的引脚,基本上单片机上大部分的引脚(电源或接地等引脚除外)都可以通过程序直接控制输出高低电平,或者读取输入电平。直接操作引脚电平是最低级别的引脚控制方法。有一些外设会将输入输出绑定到特定引脚上,叫作管脚复用,比如说从下图可以看出,PA10 和 PA9 引脚还可以作为串行外设的接收和发送端口 (TXD, RXD)。

STM32F103C8T6 管脚图

发表评论

邮箱地址不会被公开。 必填项已用*标注