W6 嵌入式基础
嵌入式入门等于学单片机,就是去看江协科技,买xx原子、x火的板子吗?我认为这里漏了一个重要环节就是,认识什么是嵌入式系统,一个对这方面宏观全局的概念,所有的学习建议也会嵌入到对这些宏观认识的理解中。
嵌入式系统是什么
Software and hardware can be customized, suitable for embedded application systems with strict requirements for functionality, reliability, cost, volume, and power consumption
软硬件可裁减,适用于应用系统的(embedded)、对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。
“嵌入”,它与计算机系统的区别
嵌入就是你把软件嵌入(写入)到硬件里去了,你不能很方便地去更改里面的软件,比如电视机、空调遥控器,你很难去更改按钮的逻辑,比如按关机键改为换频道,更重要的是更改它没有必要。所以可以嵌入,而且由于成本、可靠性种种,嵌入也是最优解。
特征 | 通用计算机 | 嵌入式系统 |
---|---|---|
形式和类型 | 看得见的计算机。按其体系结构、运算速度和结构规模等因素分为大、中、小型机和微机。 | 看不见的计算机。形式多样,应用领域广泛,按应用来分。 |
组成 | 通用处理器、标准总线和外设。软件和硬件相对独立。 | 面向应用的嵌入式微处理器,总线和外部接口多集成在处理器内部。软件与硬件是紧密集成在一起的。 |
开发方式 | 开发平台和运行平台都是通用计算机 | 采用交叉开发方式,开发平台一般是通用计算机,运行平台是嵌入式系统。 |
二次开发 | 应用程序可重新编制 | 一般不能再编程 |
“可剪裁”和“专用”意味什么
我的一些同学真的就是跟着那些 STM32 单片机教程完整看下来的,而大多数都会忘记之前讲的代码,比如I2C通讯应该怎么初始化、怎么使用,然后又要回头去看。学完单片机这类教程的课事实上并不能让你真正学会,因为它们并不是每个项目都需要的,嵌入式系统是讲究“专用”的。
想用 STM32 驱动电机,然后你自然会发现单靠芯片无法驱动,需要驱动模块……
(在长达近一学期的万能工科生基础教程完结后,我会开始一个项目一个项目和大家一起做)
了解嵌入式
嵌入式系统的分类
- 初级:以MCS51为代表的8位MCU应用系统 —— C51 单片机
- 中级:以ARM7/Cortex-M3/4为代表的32位机系统,配合轻量级实时操作系统(RTOS)的应用 —— STM32
- 高级:以Cortex-A8/15等为代表的32/64位机系统,应用复杂的操作系统(Linux、Android、WinCE等) —— 树莓派
比如想用 STM32 和树莓派制作一个小车,那么以现有的代码资料等等能很快做出来,而不需要你知道关于 C51 的任何东西。这也是嵌入式学习一大特点:懂原理和会编程使用关联度较低。最后再提。
嵌入式系统组成模型
特点:一切围绕嵌入式处理器,它相当于集成了计算机系统当中的运算器、控制器、存储器。(图中存储器是 TF 卡之类的外设存储设备)
嵌入式处理器的分类
- DSP(数字信号处理器):主要应用于通信、音视频处理、图像处理等领域
- SOC:所有功能做在一个芯片上,工业规模大,成本下降、尺寸减少
刚刚我们划分嵌入式系统的低级中级属于 MCU ,高级属于 MPU,简单粗暴的划分方式就是能否跑操作系统。
核心:怎么排事
毫无疑问,它在硬件上也是用冯诺依曼结构,下面我们将以 STM32 的芯片为例。
从输入开始,有两种分法:内部输入和外部输入;常规输入(日常任务)和异常输入(突发事件)。对于嵌入式来说,他最关心的不是任务来自哪里,而是任务紧急程度以及如何安排。常规的事不必介绍,主要介绍“突发情况”——中断的处理逻辑。
NVIC
嵌套向量中断控制器。举个例子来理解中断和对它的处理:
你安排一个下午来写作业,写着写着,查煤气表的来敲门,于是你停下写作业去开门,等他查完表之后回来继续写作业。
处理查煤气表的事打断了你写作业,这就是中断(外部中断)。处理方法在 STM32 内核中主要用 NVIC 实现。它会根据你要处理事件,告诉你应该怎么做(中断向量表:一段存储在固定地址的代码区域,包含了所有中断处理程序的入口地址;当一个中断发生时,处理器会跳转到中断向量表中相应的中断处理程序地址处执行中断处理代码)。
如果查煤气表的师傅进来的同时,你的电话响了,于是你去接电话,发现是骚扰电话,于是你回来等查煤气表的人。
这就是中断嵌套。
如果在师傅敲门的同时,你发现的番茄钟响了(表示你该休息了)(内部中断:定时器、系统异常等等),你肯定先去开门再休息,这就是中断优先级。
如果送走查煤气表的人,隔壁邻居送鸡蛋来了,STM32 会处理完之后再去写作业,而 C51 会回去写作业的地方再到门口处理邻居送鸡蛋,再回来写作业,这就是 STM32 的末尾连锁机制。
存储器保护单元(MPU)
我们把常规的事(写作业)和中断事件分别叫普通应用程序(线程模式)和中断服务程序(处理模式)。但是同样是常规事件(线程上)也分轻重缓急,于是我们又分为特权级和用户级,特权级有处理模式和线程模式,用户级只有线程模式。
特权级:该级别的程序可以访问所有范围的存储器(如果有MPU,还要在MPU规定的禁地之外),并且可以执行所有指令; 用户级:用户级程序不能直接改写CONTROL寄存器,需执行一条系统调用指令(SVC),由异常服务例程修改CONTROL寄存器,才能在用户级的线程模式下重新进入特权级。(Reset 重启就是特权级线程模式)
特权级线程就是能访问 MPU、NVIC、SCB(系统控制)、STK(系统时钟) 这四个比较特别的单元。
MPU 可以对特权级访问和用户级访问分别施加不同的访问限制,以防止恶意程序对系统的破坏。
核心:怎么干事
刚刚 MPU 和 NVIC 等已经帮我们安排好了要做的事了,那么具体应该怎么做呢?比如写作业,你需要知道要用到的知识(数据),需要写它(执行的代码),还需要知道怎么一步一步做(读懂代码;如何一句句处理)。
两种编排结构
哈佛结构:指令和数据总线分开,无瓶颈;数据(RAM)和指令(ROM:存代码)地址相同,比如地址都是0x30H,但是两个不同小区,完全分开,用不同的指令(比如汇编语言的 MOV,MOVC)来区别这个地址是哪个小区的。
普林斯顿结构:指令和数据总线共用,会出现瓶颈;数据和指令是在一起的,同个小区,但是地址不同。
C语言到汇编语言到指令集
我们在编程时用的C语言是对汇编语言的“封装”,为了减少代码量,编写逻辑更符合人性。但是电脑不懂,它会先把你这个C语言转化为汇编语言,再由汇编语言转化为机器指令。
汇编语言是机器指令的助记符,比如 MOV 就是把一个寄存器的值赋给另一个寄存器,ADD 就是把两个寄存器的值相加,SUB 就是把两个寄存器的值相减。
指令集是指CPU支持的指令种类,比如 ARM指令集、MIPS指令集、x86指令集等等。Cortex-M3 不支持 ARM 指令集,支持 Thumb-2 指令集。
处理指令
文章要一行行看,指令也要一条条读,STM32 采用三级流水的方式来读指令:
想象三个工人,一个取指令,一个译码,一个执行,同时工作:
- 取指令:从 ROM 或者 RAM 取出指令,放到指令寄存器(IR)中。
- 译码:根据指令寄存器中的指令,确定指令的操作数和操作码。
- 执行:根据操作码和操作数,执行指令。
特别地:如果遇到 if 语句这种判断语句怎么办,使用分支预测机构,if 语句的 A 和 B 分支我都取指令,执行完之后丢掉一个分支。
芯片:算什么事
刚刚这些都是那块芯片里面内核干的工作,内核之外的片上资源就只干一件事:告诉内核要做什么事(定义事)。
- RCC-复位和时钟控制:对系统的时钟进行配置,使能各模块的时钟(其他外设在上电的情况下,默认是没有时钟的,不给时钟的情况下,操作外设是无效的,外设不会工作,这样目的是降低功耗;所以在操作外设之前,必须要先使能它的时钟,用RCC完成时钟的使能)
- GPIO—通用IO口:可用于点灯、读取按键等(最基本的功能)
- AFIO-复用IO口:完成复用功能端口的重定义,还有中断端口的配置
- EXTI-外部中断:配置好外部中断后,当引脚有电平变化时,就可以触发中断,让CPU来处理任务
- TIM—定时器:最常用、功能最多的外设分高级定时器,通用定时器,基本定时器三种;最复杂->高级定时器,常用->通用定时器;不仅可以完成定时中断,还可以完成测频率、生成PWM波形(电机驱动、舵机驱动最基本的要求)、配置成专用的编码器接口等功能
- ADC-模数转换器:STM32配置了12位的AD转换器,可以直接读取IO口的模拟电压值,无需外部连接AD芯片,使用方便~~
- DMA—直接内存访问:可帮助CPU完成搬运大量数据这样的繁杂任务
- USART—同步/异步串口通信:平时用的UART是异步串口的意思;此处USART既支持异步串口,也支持同步串口;
- I2C—I2C通信:(与SPI为)两种常用的通信协议。STM32中配置了它们的控制器,可以用硬件来输出时序波形,使用起来高效;(用通用IO口来模拟时序波形也可以)
- SPI-SPI通信:通信协议
- CAN-CAN通信:通信协议,一般用于汽车领域
- USB—USB通信:通信协议,可做模拟鼠标、模拟U盘等设备
- RTC-实时时钟:在STM32内部完成年月日、时分秒的计时功能,可接外部备用电池,计时掉电也能正常运行
- CRC—CRC校验:一种数据的校验方式,用于判断数据的正确性
- PWR-电源控制:可以让芯片进入睡眠模式等状态,以达到省电的目的
- BKP-备份寄存器:存储器,当系统掉电时仍可由备用电池保持数据(这个根据需要可以完成一些特殊功能)
- IWDG-独立看门狗:当单片机因为电磁干扰死机或者程序设计不合理出现死循环时看门狗可以及时复位芯片,保证系统的稳定
- WWDG-窗口看门狗:同上
- DAC-数模转换器:可以在IO口直接输出模拟电压,是ADC模数转换的逆过程
- SDIO-SD卡接口:可以用来读取SD卡
- FSMC-可变静态存储控制器:可以用于扩展内存,或配制成其他总线协议,用于某些硬件的操作
- USB OTG-USB主机接口:用OTG功能,可以让STM32作为USB主机去读取其他USB设备
小结
还记得刚开始我们说,应用方面实现一个东西和理解芯片的原理关系不大,因为每个芯片都帮我干完了三件事:定义事、怎么排事、怎么干事。我们只需要用 C 语言(更高级的语言)告诉它要做什么事,它就能帮我干完。总结一下: