嵌入式一战成神

嵌入式系统与应用开发


参考资料
《嵌入式系统设计与开发 第二版 中国矿业大学出版社》


成神导航

  • 嵌入式系统与应用开发
  • 前言
  • 一、学习路线
    • 1、学习路线
    • 2、书籍推荐
  • 二、《嵌入式系统设计与开发》学习
    • 1、嵌入式系统概述
      • 1.1 概念定义
      • 1.2 系统组成
        • 1.2.1 嵌入式微处理器
        • 1.2.3 外围设备
        • 1.2.3 嵌入式软件简介
      • 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处理器基础
      • 2.1 优势
      • 2.2 ARM微处理器的应用选型
        • 2.2.1 微处理器内核
        • 2.2.2 系统工作频率
        • 2.2.3 芯片内存储器容量
        • 2.2.4 片内外围电路
      • 2.3 存储器格式
      • 2.4 工作模式和工作状态
        • 2.4.1 线程模式
        • 2.4.2 处理模式
        • 2.4.3 Thumb状态
        • 2.4.4 调试状态
      • 2.5 ARM Cortex-M3处理器组件
      • 2.6 ARM Cortex-M3寄存器
        • 2.6.1 通用寄存器
        • 2.6.2 特殊寄存器
      • 2.7 指令系统
        • 2.7.1 数据传送指令
        • 2.7.2 数据处理指令
      • 2.8 存储系统
        • 2.8.1 存储器映射
        • 2.8.2 位带操作
      • 2.9 异常及其处理
        • 2.9.1 异常优先级
      • 2.10 SysTick定时器
      • 2.11 STM32 的时钟源和时钟树
        • 2.11.1 时钟源
        • 2.11.2 时钟树
    • 3、开发环境
    • 4、STM32-A开发基础
      • 4.1 通用端口控制
        • 4.1.1 GPIO的位带操作
      • 4.2 按键与中断
      • 4.3 串行接口程序设计
        • 4.3.1 串行通信原理
      • 4.4 模/数转换器
        • 4.4.1 原理
      • 4.5 定时器和看门狗
        • 4.5.1 原理
  • 三、考试心得


前言

个人认为嵌入式开发是比互联网软开(如Java后端开发)开发是要难一些的。Java开发基本上是用户态的,但是嵌入式很多东西都深入了内核态,难度就上去了。
博主认为嵌入式的繁琐与难主要体现在以下几个方面

  • 底层要求高
    嵌入式偏向底层,软件、硬件都要了解与熟悉,对能力要求高了不少。
  • 学习门槛高
    嵌入式学习的门槛也是比较高,一是需要硬件,二是需要嵌入式专门的软件开发;学习门槛和学习成本高一些。
  • 正向反馈慢
    嵌入式正向反馈可能比较慢,前期学习阶段,可能会没有什么成就感就坚持不下去了。

博主小见
越往底层对人能力的锻炼就越高,对于能力来说是在升维


一、学习路线

嵌入式成神路线
基础学习
应用编程
嵌入式底层深入
通用编程基础
硬件基础
平台系统
内存管理
多任务编程
文件IO
网络编程
内核开发
驱动开发

1、学习路线


2、书籍推荐

嵌入式一战成神_第1张图片
整理不易,麻烦动动小手一键三连哈!!!

二、《嵌入式系统设计与开发》学习

嵌入式系统设计与开发
嵌入式系统概述
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大功能部件

  • 存储设备

    • 静态易失型存储器
      RAM、SRAM
    • 动态存储器
      DRAM
    • 非易失型存储器
      ROM、FLASH、EPROM、EEPROM


    其中FLASH非易失型存储器】凭可擦除次数多成本低速度快容量大得到了广泛应用。


  • 通信设备
    大多数的通信设备都可以直接在嵌入式系统中使用。

    • RS-232接口(串行通信接口)
    • SPI(串行外围设备接口)
    • IrDA(红外接口)
    • I2C (现场总线)
    • USB(串行总线接口)
    • Ethernet(以太网接口)

  • 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张图片

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
    嵌入式一战成神_第3张图片

功能部件原理及功能介绍

  • 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指令
    数据传送
    格式
MOV R8,R3//把R3数据传送给R8

功能

  • 两个寄存器之前传送数据
  • 寄存器和特殊功能寄存器之间传
  • 寄存器和存储器之间传
  • 把一个立即数加载到寄存器

  • LDR指令
    加载指令
    格式
LDR Rd,[Rn,#offset]   //从地址Rn+offset处读取一个字送到Rd
//延伸
LDRB ……      //……字节
LDRH ……      //……半字,两个字节

功能
加载指令LDR把存储器中的内容加载到寄存器中。


  • STR指令
    存储指令
    格式
STR Rd,[Rn,#offset]   //把Rd的低字存储到地址Rn+offset处
//延伸
STRB ……      //……字节
STRH ……      //……半字,两个字节
STRD Rd1,Rd2,[Rn,#offset]      //把Rd1(低32位,低字)和Rd2(高32位,高字)的双字存储到地址 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; //Rd=Rn+Rm
SUB Rd,Rn.Rm;//Rd=Rn-Rm
MUL Rd,Rn.Rm;//Rd=Rn*Rm
UDIV Rd,Rn.Rm;//Rd=Rn/Rm

功能
用于算术四则运算


  • 逻辑运算指令
    用于逻辑运算
    格式
ADD(按位与)ORR(按位或)BIC(位段清零)ORN(按位或反码)EOR(按位异或)指令
AND Rd,Rn,Rm;//Rd=Rn&Rm
OCC Rd,Rn,Rm;//Rd=Rn|Rm
BIC Rd,Rn,Rm;//Rd=Rn&~Rm
ORN Rd,Rn,Rm;//Rd=Rn|~Rm
EOR Rd,Rn,Rm;//Rd=Rn^Rm

功能
逻辑运算


  • 子程序调用和无条件跳转指令
    程序代码跳转
    格式
B Lable  //跳转到Lable对应的地址    
BX reg // 跳转到由寄存器reg给出的地址

BL Lable  //跳转到Lable对应的地址,并将跳转前的下条指令地址保存在链接寄存器中LR
BLX reg  //跳转到由寄存器reg给出的地址,并将跳转前的下条指令地址保存在链接寄存器中LR

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的位带操作

  • 位操作
11,与00
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技术的沉浸娱乐型无人驾驶汽车。集无人驾驶、情绪感知、虚拟沉浸为一体的智能车。
如果能够到达贾维斯时代,那该多好呀。

你可能感兴趣的:(嵌入式,嵌入式硬件,经验分享)