嵌入式系统与应用开发
参考资料 《嵌入式系统设计与开发 第二版 中国矿业大学出版社》
前言
个人认为嵌入式开发是比互联网软开(如Java后端开发)开发是要难一些的。Java开发基本上是用户态 的,但是嵌入式 很多东西都深入了内核态 ,难度就上去了。 博主认为嵌入式的繁琐与难主要体现在以下几个方面
- 底层要求高
嵌入式偏向底层,软件、硬件都要了解与熟悉,对能力要求高了不少。 - 学习门槛高
嵌入式学习的门槛也是比较高,一是需要硬件,二是需要嵌入式专门的软件开发;学习门槛和学习成本高一些。 - 正向反馈慢
嵌入式正向反馈可能比较慢,前期学习阶段,可能会没有什么成就感就坚持不下去了。
?博主小见 越往底层对人能力的锻炼就越高 ,对于能力来说是在升维 。
一、学习路线
嵌入式成神路线
基础学习
应用编程
嵌入式底层深入
通用编程基础
硬件基础
平台系统
内存管理
多任务编程
文件IO
网络编程
内核开发
驱动开发
1、学习路线
2、书籍推荐
整理不易 ,麻烦动动小手一键三连 哈!!!
二、《嵌入式系统设计与开发》学习
嵌入式系统设计与开发
嵌入式系统概述
ARM Cortex-M3微处理器基础
嵌入式开发环境
STM32-A平台开发基础
概念
特点
应用
趋势
概述
微控制器简介
处理器组件
寄存器
指令系统
存储系统
异常及其处理
SysTick定时器
STM32F10系列处理器简介
开发环境简介
开发环境配置
Keil μVersion基础使用
通用端口控制
按键与中断
串行接口程序设计
无线通信
TFT-LCD应用
IIC设计与应用
定时器和看门狗
485和CAN通信应用
1、嵌入式系统概述
1.1 概念定义
嵌入式系统是以应用 为中心、计算机技术 为基础 、软硬件可裁减 、适用于应用系统 对功能、可靠性、成本、功耗、体积 严格要求的专用计算机系统 。
本质是计算机系统,不过是专用计算机系统(满足应用系统特殊要求的计算机系统,特别针对某种功能 而设计 出来的)。 由此可知,嵌入式系统有两个重要特点
- 以应用为中心,不能脱离应用而存在
- 以计算机技术为基础,计算机系统由软件和硬件构成,嵌入式系统也不例外
便于开发者进行嵌入式项目开发,嵌入式系统具有交叉编译的功能。 ? 交叉编译
- 运行在
一种计算机环境 下的编译程序 - 能够
编译 出在另一种计算机环境下运行 的代码 - 称此编译程序
支持 交叉编译
1.2 系统组成
嵌入式系统和计算机系统一样,都是由软件和硬件 组成。
- 硬件包括
微处理器 和外围设备 ,其中以微处理器 为核心 - 软件包括
固件 、嵌入式操作系统 和应用程序 等
此博客主要介绍硬件的组成。
1.2.1 嵌入式微处理器
是嵌入式系统的核心 ,一般只保留与用户紧密相关 的功能部件 ,因此具有体积小 、重量轻、成本低 、可靠性高 等特点
- 嵌入式CPU大多数工作在为特定用户群所专门设计的系统中(专用计算机系统的定义)
- 将
通用CPU 中许多由主板 完后的任务集成 到芯片 内部,小型化 、高效率 、高可靠
两个关键词
嵌入式微处理器的分类
- 嵌入式微控制器 【早期流行 MCU】 单片机
- 嵌入式微处理器 【基于通用微处理器 EMPU】
- 嵌入式DSP处理器 【Embedded Digitial Signal Processor ,即EDSP】
实时数字信号处理器 适合执行DSP算法 - 嵌入式片上系统 【System on Chip 即SoC】
将微处理器、模拟IP核、数字IP核和存储器集成 到单一芯片 上
几款常用的嵌入式微处理器系列
- ARM系列
- MIPS系列
- PowerPC
- x86
- Motorola 68000
1.2.3 外围设备
除了中心控制部件 (MCU、DSP、EMPU、SoC,也就是几种微处理器),其它部件 都可以算作嵌入式外围设备 。 主要有存储 、通信 、IO 、调试 、显示 5大功能部件
- IO设备
- CRT(阴极射线管)
- LCD(液晶显示器)
- Touch Panel(触摸板)
1.2.3 嵌入式软件简介
嵌入式软件可以分为 固件、嵌入式操作系统和应用程序等。
- 嵌入式操作系统
- 负责
分配 、回收 、控制 和协调 全部软硬件资源的并发活动 - 提供应用程序的
运行环境 与接口 - 是应用程序
运行 的基础 - 嵌入式应用程序
- 服务于某种
专用应用领域 - 基于某一特定的
嵌入式硬件平台 - 达到用户
预期 功能的计算机软件
目前大部分嵌入式操作系统都是实时操作系统,而且大多是实时多任务 系统(Real-Time Operating System ,即RTOS)。 ? 简单介绍
- 当外界事件或数据
产生时 ,能够接受并以足够快 的速度予以处理 ,其处理的结果 又能在规定的时间之内来控制生产过程或 对处理系统做出快速响应 ,调度一切可利用的资源完成实时任务 ,并控制所有实时任务协调一致运行 的操作系统。 - 统的响应速度不依赖于系统任务的多少,负载的轻重,而
只依赖于优先级的设计
常用的RTOS系统
- VxWorks操作系统
- 嵌入式Linux操作系统
- Android系统
- Windows CE嵌入式操作系统
- μC/OS-II实时操作系统
1.3 特点
1.3.1 专用性
专用于特定任务
1.3.2 多支持
多类型处理器和处理器系统支持
1.3.3 成本低
通常极其关注成本
1.3.4 实时性
一般是实时性系统
1.3.5 剪裁性
可剪裁性比较好
1.3.6 可靠性
嵌入式系统的可靠性比较高。 由于部分嵌入式系统所承担的计算任务涉及产品质量、人身安全……,嵌入式系统对可靠性的要求极高。
1.3.7 功能约束
大多有功能约束。
2、ARM Cortex-M3处理器基础
ARM是嵌入式领域中使用最为广泛的32位微处理器结构。 ARM微处理的系列
- ARM7、ARM9、ARM9E、ARM10E、ARM11
- Intel的Xscale和StrongARM
- Cortex系列
自ARM11后,ARM的产品改用Cortex命名并分成M、R、A类。
2.1 优势
ARM微处理器采用RISC架构
- 体积小
- 功耗低
- 成本低
- 性能高
- 支持Thumb(16位)/ARM或Thumb-2(32位)指令集,兼容8位和16位
- 大量使用寄存器,速度快
- 数据操作在寄存器中完成
- 寻址方式简单灵活
- 指令长度固定
2.2 ARM微处理器的应用选型
2.2.1 微处理器内核
不同系列的微处理器内核结构适应不同的应用领域 示例
- 希望使用WInCE或者Linux操作系统,建议使用ARM720T以上的有MMU(Memory Mangement Unit)功能的ARM芯片
- 对成本和功耗敏感的MCU和终端应用的混合信号设备,可以考虑Cortex-M系列
- 嵌入式系统有较高的计算性能的要求的话,可以考虑Cortex-R系列
- 能效的可伸缩性比较重要的设备或者高效低功耗的移动平台,可以考虑Contex-A系列
2.2.2 系统工作频率
系统的工作频率 很大程度上决定了ARM微处理器 的处理能力 。 不同芯片对时钟的处理不同,有的芯片只需要一个主时钟频率 ,有的芯片内部时钟控制器 可以为不同的部件提供不同的频率的时钟 。
2.2.3 芯片内存储器容量
到多数ARM的微处理器的芯片内部存储器的容量都不太大,很多时候需要用户在设计系统是连接外部存储器 以满足存储空间的要求。
2.2.4 片内外围电路
几乎所有的ARM芯片根据各自不同的引用领域扩展相关功能模块 ,并集成 在芯片中,称为片内外围电路 。
2.3 存储器格式
ARM体系结构将存储器看做是从零开始的字节的线性组合。 32位处理器很多情况下是以字为单位进行处理的(一个字为4个字节,8位二进制代表一个字节,2位16进制代表一个字,4位8进制代表一个字,32位2进制代表一个字) ARM为处理器支持两种方式存储字数据
- 大端模式 【
低地址存放高字节 ,即字转换成字节后,左端放在低地址中,形成大端】 - 小端模式 【
低地址存放低字节 ,即字转换成字节后,右端放在低地址中,形成小端】 注:大端和小端都是针对低地址 而言的,便于记忆
2.4 工作模式和工作状态
ARM Cortex-M支持两种工作模式
2.4.1 线程模式
复位时 、异常返回时 会进入此模式,其中特权模和用户(非特权)模式代码 能够在线程模式下运行。
2.4.2 处理模式
出现异常时 ,微处理器进入处理模式 ,在处理模式下,所有代码 都是特权 访问的。
ARM Cortex-M有两种工作状态
2.4.3 Thumb状态
Thumb状态是16位和32位“半字对齐”的Thumb和Thumb-2指令 的执行状态
2.4.4 调试状态
处理器停止 并进行调试 时所进入的状态
2.5 ARM Cortex-M3处理器组件
- 处理器
内核 (Cortex-M3 Core) - 嵌套向量
中断 控制器 NVIC - 总线矩阵
存储器保护 单元 MPU- 系统
调试组件 和调度端口 唤醒中断 控制器WIC
功能部件 的原理 及功能介绍
- NVIC
NVIC是嵌套向量中断控制器。在中断发生 时,自动取出 对应的服务例程入口地址 ,直接进入 相应的服务例程,为缩短中断延迟 做出了比较大的贡献。 NVIC支持中断嵌套 ,允许通过提高中断的优先级 对某个中断进行提前处理 。 微处理器使用一个可以重定位的向量表 ,表中包含处理各个中断将要执行的函数的入口地址 ,可供具体的中断处理器使用。在复位 时向量表 指向零 ,通过编程 控制寄存器 可以使向量表重新定位到指定位置 。 - SysTick
系统滴答定时器,是一个基本的倒计时定时装置,用于在每隔一定的时间产生一个中断,即使是系统在睡眠的模式下也能够工作。 - 总线矩阵
一个AHB互联 的网络 ,通过它可以让数据 在不同的总线 之间并行传送 。
2.6 ARM Cortex-M3寄存器
通用寄存器R0~R15和一些特殊功能的寄存器 其中,R0~R12 是通用目的寄存器,都可以被32位指令 访问,而大多数16位指令 只能访问 R0~R7 。
2.6.1 通用寄存器
- 低寄存器
R0~R7寄存器,可以被指定通用寄存器的所有指令 访问,复位 后的初始值不确定 - 高寄存器
R8~R12寄存器,可以被指定通用寄存器的所有32位指令 访问,复位 后的初始值不确定 - 堆栈指针
寄存器R13用作堆栈寄存器(SP)。堆栈指针对应两个物理寄存器,SP_main和SP_process,处理模式下始终使用SP_main,线程模式下可配置SP_mai或者SP_process,但在某个时刻只能看到其中的一个。 - 链接寄存器
寄存器R14是子程序的链接寄存器(LR)。在执行分支和连接 指令(BL)或带有交换的分支和链接 指令(BLX)时,LR用于接收来自PC的返回地址。LR也用于异常返回 。 - 程序计数器
寄存器R15是程序计数器 ,指向当前的程序地址 。改变程序计数器的值,就能实现改变程序执行流程的目的。
2.6.2 特殊寄存器
- 程序状态寄存器
系统的处理器状态可以分为3类,因为每个处理器状态需要一个程序状态寄存器,所以有3个程序寄存器。统称为xPSR。
- 应用PSR(A PSR)
应用PSR包含条件代码标志。 进入异常之前,ARM Cortex-M3处理器将条件代码标志保存在堆栈内。 用户可以使用MSR(2)和MRS(2)l指令来访问APSR。 - 中断PSR(I PSR)
包含当前的激活的异常的ISR标识。 - 执行PSR(E PSR)
包含两个重叠的区域和状态位
- 可中断-可持续指令(ICI)区
用于被打断的多寄存器加载和存储指令。 - 用于If -Then(IT)指令的执行状态区
- T位(Thumb状态位)
- 中断屏蔽寄存器组
用于控制异常 的使能 和禁止
- PRI MASK寄存器(primask)
屏蔽除NMI (不可屏蔽中断)外的所有中断 - FAULT MASK寄存器(fault )
屏蔽所有错误 ,但是NMI 依然不受影响 - BASE PRI寄存器
屏蔽优先级不高于某个数值 的中断 - 控制寄存器
控制寄存器CONTROL 主要用于定义特权级别 和堆栈指针的选择
2.7 指令系统
指令系统向后兼容
2.7.1 数据传送指令
MOV R8,R3
功能
- 两个寄存器之前传送数据
- 寄存器和特殊功能寄存器之间传
- 寄存器和存储器之间传
- 把一个立即数加载到寄存器
LDR Rd,[Rn,#offset]
LDRB ……
LDRH ……
功能 加载指令LDR把存储器 中的内容加载到寄存器 中。
STR Rd,[Rn,#offset]
STRB ……
STRH ……
STRD Rd1,Rd2,[Rn,#offset]
功能 存储指令STR把寄存器的内容存到存储器中
MRS <gp_reg>,<special_reg>
MSR <special_reg>,<gp_reg>
2.7.2 数据处理指令
对数据的各种运算处理
有ADD(加)、SUB(减)、MUL(乘)、UDIV/SDIV(除)这四种指令
ADD Rd,Rn,Rm;
SUB Rd,Rn.Rm;
MUL Rd,Rn.Rm;
UDIV Rd,Rn.Rm;
功能 用于算术四则运算
有ADD(按位与)、ORR(按位或) 、BIC(位段清零)、 ORN(按位或反码)、 EOR(按位异或)指令
AND Rd,Rn,Rm;
OCC Rd,Rn,Rm;
BIC Rd,Rn,Rm;
ORN Rd,Rn,Rm;
EOR Rd,Rn,Rm;
功能 逻辑运算
B Lable
BX reg
BL Lable
BLX reg
2.8 存储系统
ARM Cortex-M3支持4GB的寻址长度
2.8.1 存储器映射
只有一个的单一固定 的存储器映射 。
- 代码区 ?大小是512G\MB,用于让芯片制造上连接片上的Flash存储器
- 片上SRAM区 ?连接片上的SRAM,这个区通过系统总线来访问。
底部有一个1MB的位带区,该位带区还有一个对应的32MB的位带别名区,容纳了8M个位变量。位带别名区的每个字对应位带区的一个比特,32位对应1位 在使用时,真正起作用的是位带区的位,对该位的操作都可以变成对该位对应字的操作。 - 片上外设区 ?512MB区域由片上外设(寄存器)使用
- 片上RAM去和片外外设区 ?分别是两个1GB的区域,用于连接外部RAM和外部设备
- 私有外设区 ?大小为1MB,内核的系统控制空间就在此
- 芯片商指定区 ?通过系统总线访问,不允许其中有可执行的指令
2.8.2 位带操作
许多情况下,某种工作模式或者状态只需要1个二进制位来表示即可,ARM Cortex-M3 将这种位操作对应的存储单元集中 起来,构成了位带。 在程序中,可以个、访问位带别名区或者直接访问位带区来达到访存信息的目的。 位带区 :SRAM-0x20000000~0x200FFFFFF 和片内外设- 0x40000000~0x400FFFFF 位带别名区 :SRAM-0x22000000~0x23FFFFFF 和片内外设-0x42000000~0x43FFFFFF
映射公式
-
根据位带中的位计算其在位带别名区的字的地址 位带别名区中相应字的字节偏移量=【(所在字节在位带区中的地址-位带区的首地址)*8+位在该字节中的编号】*4 对位带区进行运算,求字节偏移量 片内外设 简化公式 外设位带别名区地址 = 0x4200 0000 + (A-0x40000000)X8X4+nX4 A是外设位带区某个比特 , n是位序号,范围是0~7 SRAM 简化公式 SRAM位带别名区地址 = 0x2200 0000 + (A-0x20000000)X8X4+nX4 A是外设位带区某个比特 , n是位序号,范围是0~7 位带区的首地址是0x20000000 -
根据别名区的字的地址计算位带中的位的位置 需要计算出所在字节的地址和位在该字节的编号 位编号=(字的地址-位带别名区首地址)/4 首地址为0x42000000 字节偏移量 =取整(位编号/8) 位在字节中的序号 字节内序号=位编号-字节偏移量*8 字节绝对地址=字节偏移量+位带首地址 -
直接访问别名区 向位带别名区写入一个字与对位带区对应的位所在的字执行【读-修改-写】的操作具有相同的作用 写入别名区的字的第0位决定了写入位带区的目标位的值,提高效率 -
直接访问位带区 能使用常规的读和写操作对该区域进行访问
2.9 异常及其处理
当正常的程序执行流程发生暂时的停止时,称为异常。 处理异常之前,当前处理器的状态必须保留。
- ARM Cortex-M3内核所产生的异常
- (在硬件支持下)外部事件导致的程序流程中断
前者称为内部异常,后者称为外部中断。 对于内部异常 ,在指令执行和访问存储器时产生,是可以预知的,对于ARM Cortex-M3内核来说是同步 的。 对于外部中断 ,相应事件的发生是不可预知的,对于内核来说是异步 的。
- ARM Cortex-M3处理异常的特性
- 自动的状态保存和回复
- 优先级屏蔽支持临界区
- 自动读取代码存储器和SRAM中包含ISR地址的向量表入口
- 支持末尾连锁,在末尾连锁中,处理器在两个ISR之间没有对寄存器进行出栈和压栈操作的情况下处理背对背中断
- 中断优先级可动态重新设置
- ARM Cortex -M3和NVIC之间采用紧密耦合接口
- 中断数目可以配置为1~240
- 中断优先级的数目可以配置为1~8位
- 处理模式和线程模式具有独立的堆栈和特权等级
- 使用C/C++标准的调用规范
2.9.1 异常优先级
异常的优先级数值越小 ,则优先级越高 。
2.10 SysTick定时器
- 工作原理
当SysTick定时器从1计到0时,它将把控制和状态寄存器STCSR中的COUNTFLAG位置位。
- 读取SysTick控制和状态寄存器(STCSR)
- 往SysTick当前值寄存器(STCVR)中写任何数据
- 功能
定期产生异常请求 ,周期性的异常请求可以作为系统的时间基准。
2.11 STM32 的时钟源和时钟树
2.11.1 时钟源
STM32支持多种内部和外部时钟源,任何一个都可以独立开启或者关闭,以优化芯片的能耗
- HSE 高速外部时钟 8MHz
- LSE 低速外部时钟 40kHZ
- HSI 高速内部时钟
- LSI 低速内部时钟
- PLL 锁相环时钟
HSE(高速外部时钟) 和HSI(高速内部时钟) 可以作为PLL(锁相环时钟) 的输入 ,形成PLL时钟源 的输入。
2.11.2 时钟树
每一个外设模块在这些寄存器中有相应的时钟使能位 ,当该位为1 时,对应的时钟开启 且相应的外设开始工作 ,当该位为0 时,对应的时钟关闭 从而相应的外设停止工作 。
3、开发环境
后续整理
4、STM32-A开发基础
4.1 通用端口控制
STM32 的通用输入/输出 (GPIO )端口可以驱动LED 、产生PWD 、驱动蜂鸣器 等。 STM32F103VBT6总共有5组输入/输出(GPIO)端口,分别是GPIOA、GPIOB……GPIOE,每组IO口有16个IO,一共有16*5=80个IO端口。 每个端口可通过的最大电流是25mA,建议单个端口最好不要超过10mA。 特点
- 通用的输入/输出
- 单独的位设置或者位清除
- 所有端口都有外部中断能力
- 复用功能
- 软件重新映射IO复用功能
- GPIO锁定机制
使用IO口可以把软件配置成8种模式
- 输入浮空
- 输入上拉
- 输入下拉
- 模拟输入
- 开漏输出
- 推挽输出
- 推挽式复用
- 开漏复用
每个IO口有7个相关寄存器来控制
- 配置模式的2个端口配置寄存器CRL和CRH
- 2个32位的数据寄存器IDR和ODR
- 1个32位的置位复位寄存器
- 1个16位复位寄存器BRR
- 1个32位的锁存寄存器LCKR
常用的IO端口寄存器只有4个:CRL\CRH\IDR\ODR
- CRL
控制着每个IO端口(A~G)低8位的模式 每个IO端口占用CRL的4个位 其中高2位为CNF 低2位为MODE - CRH
作用和CRL完全一样 控制着每个IO端口高8位的模式
- 常用模式
- 0x4 模拟输入
- 0x3 推挽输出(做输出口用,50M速率)
- 0x8 上/下拉输入
- 0xB 复用输出
- IDR 端口输入数据寄存器
只读寄存器 ,对应16个IO (一组IO口)- 以
16 位形式读出 - 要知道某个IO口的状态,只要读这个寄存器,再看
某个位的状态 就行 - ODR端口输入数据寄存器
可读写 - 读出来的数据可以用于判断当前IO口的
输出状态
4.1.1 GPIO的位带操作
或1置1,与0置0
AHB1ENR |= 1<<2;
1<<2 应该读作1向左移动2位,即AHB1ENR寄存器的第2位置1。
MODER &= ~(3<<(11*2));
- 位带操作
STM32的寄存器都是32位的,如果想要“精确”访问某个寄存器的某一位,则可以将32位 的每一位都映射为一个地址 ,对寄存器的某一位的读-修改-写操作可以简化为把字 直接写入位带别名区对应地址
4.2 按键与中断
CM3内核支持256个中断,其中包含16个内核中断 和240个外部中断 STM32有84个中断,其中包括16个内核中断 和68个可屏蔽中断 键盘扫描方式有交叉扫描 和直接扫描 中断分组设置表
4.3 串行接口程序设计
4.3.1 串行通信原理
- 数据
按位顺序 进行传输,将传输的数据的每个字符一位一位的传输 通用异步收发传输器 (UART)是目前广泛使用的一种通用串行数据通信接口- 处理器可以通过
数据总线 向UART的控制寄存器写入控制字 ,对UART进行初始化 。 发送器 从处理器接收 并行数据,然后通过移位寄存器 把数据以串行异步 方式发出。接收器 可以从串行通信链路 接收串行数据,用移位寄存器 转换成8位并行数据 ,送往接收寄存器 ,等待处理器读取 。- 处理器也可以通过
读取UART状态寄存器 的信息获得当前UART的状态 并由此产生相应的控制逻辑 。
4.4 模/数转换器
模数转换器(ADC)是将连续变化的模拟信号 转换为离散的数字信号 的器件。
4.4.1 原理
通常的模数转换器 是把经过与标准量比较处理后 的模拟量 转换成以二进制数值 表示的离散信号的 转换器。故任何一个模数转换器都需要一个参考模拟量 作为转换的标准,比较常见的参考标准为最大的可转换信号大小 。而输出的数字量则表示输入信号相对于参考信号的大小。
4.5 定时器和看门狗
看门狗(WDT)是嵌入式系统中的一个重要组成部分,实际上是一个计数器 。
4.5.1 原理
- 给看门狗一个数字,程序开始运行后看门狗开始
倒计数 - 如果程序运行正常,过一段时间
CPU发指令 给看门狗让其复位 重新 开始倒计数 - 如果看门狗计数器
倒数到0 就认为程序没有正常工作 ,强制复位系统 - 看门狗对嵌入式系统提供了
独立的保护功能 ,当系统出现故障时,在可控的时钟周期 内,看门狗将系统复位 或者将系统从休眠中唤醒 - 看门狗的时钟是
内部RC时钟 ,并不是准确的40kHZ
三、考试心得
只能说这份卷子我圧对了部分题,但是选择题可以说考的比较偏,比如哪些是ACD器件,哈佛结构和冯诺依曼结构的区别,其它还好,只是有点可惜,自己着重看的它没咋考。 简答题难度较低,都大差不差的答出来了。可是程序题,有一部分没压对,其实还好。也是对自己基础的一个警醒。 论述题格局打开,构想了一个集Aiot和5G技术的沉浸娱乐型无人驾驶汽车。集无人驾驶、情绪感知、虚拟沉浸为一体的智能车。 如果能够到达贾维斯时代,那该多好呀。
|