当前课程知识点:智能车制作:嵌入式系统 >  第三章 MCU基础 >  3.7 小结:MCU的总体结构和程序运行机制 >  Video

返回《智能车制作:嵌入式系统》慕课在线视频课程列表

Video在线视频

Video

下一节:Video

返回《智能车制作:嵌入式系统》慕课在线视频列表

Video课程教案、知识点、字幕

各位同学大家好

我是清华大学工程物理系的曾鸣老师

欢迎大家回到

我们ARM微控制器与嵌入式系统的MOOC课堂

这个单元是我们第三章基础知识的

最后一个单元

在这个单元里我会简单讲讲外设

但是更重要的是

把我们基础知识部分的内容给融会贯通起来

让大家建立对于这样一个嵌入式系统

真正开发和程序运行的一个宏观的概念

让大家建立一个更加清晰的蓝图

对于我们接下来

真正真刀真枪做的开发充满信心

那么我们仍然回到

我们最开始讲过的这张图

这张图在前面讲过CPU 讲过了复位

讲过了时钟 讲过存储器

最最重要是在上一个单元

花了点时间讲完总线这样一个概念以后

我们终于能够把它联系起来了

从一个CPU的视角在总线的连接下

它可以向外看 会看到这个芯片

一个麻雀虽小 五腑俱全的

片上计算机系统里头

除了独立的时钟和复位部分通过电路

与它连接外 它主要通过总线

与地址的视角能够看到很多存储设备

这些存储设备包括掉电丢失的RAM内存

掉电不丢失的flash ROM 相当于我们硬盘

这样一种不丢失存储器

而更重要的是还会有很多挂接在总线上的

各种各样的外设

来构成一个完整的计算机系统

一个没有外设的计算机系统是没有办法

真正的用于实际的开发和功能的

那我们来看看外设 说到外设

那么在我们计算机系统里头

我们把这些外设都称为Peripheral

那么实际上一个裸的CPU是不能

做任何事情的 我们所有计算机系统

包括我们微控制器里头这个CPU

他一定要是通过外设

来跟我们外界的物理世界进行连接

而这里的外设我需要说明的是

广义上的外设 我们讲的绝大多数外设

实际仍然是我们这个MCU

这个芯片的一部分

他只是相对于CPU而言是外设

当然如果这个MCU片内的这些设备

不具备的功能

我们确实也可以通过外围电路

来真正的进行外扩

那么这些外设有很多很多种 在第四章

第五章的学习里我会带着大家逐一认识

比如说进行输入输出的设备的

IO开关量的控制 PWM脉冲的控制

比如说对于模拟量转换得到的模拟电压

进行输入或者输出这样的模拟数字变换ADC

和数字模拟变换DAC来控制一个模拟量

一个温度值 一个音量值的采集和控制

还有与别的计算机

别的外设之间进行通讯的SCI通讯

SPI通讯 I2C通讯等等各种各样的通讯外设

这都是逐一会讲的

但是在这样一个概述的基础知识章节里

我最想跟大家强调的一个基本概念

是在MCU各家各户通用的嵌入式系统

MCU里头 外设一般是通过一系列的片外

或者叫CPU外的寄存器来加以完成和设置的

这个时候 要注意几个基本的概念

第一 与CPU内部的寄存器不一样

它是在CPU外部的寄存器

那么它直接决定了

各个外设设备的电路的功能

所以CPU对于这些寄存器的访问

同样它的名字叫Register

不再是简单的通过CPU自身的指令

来加以访问 而是必须通过

映射在地址上的地址空间来加以访问

换言之我们在下一张图里会给大家讲

所有的寄存器都映射到了我们总线上

给他们编上号 按照地址对他们进行访问

其次 与CPU内部寄存器

叫这个名字是一样的 它叫寄存器

所以它可以存储0或者1

但它并不仅仅用来存储0或者1

大家都还记得我们对于指令的解析

说指令的0或者1

最终用来控制了一些开关的导通

或者关闭 一些功能的选通

而在于我们的外设里头

会有一系列的寄存器

它映射到总线上 我们从编程的角度

可以给它编写0或者1的值

这些值既是我们编程语言的值

但是更重要的是电压上的高电压

或者低电压 3.3V或者0V

最终体现在电路里来控制我们这些外设设备

根据我们需要进行有序的工作

这是寄存器一个重要的核心概念

它是电路与编程的接口

它是映射在地址上

被CPU访问的带有存储功能的电路单元

那么我们站在一个完整的CPU的

构架视角上来看 会发现在这一个章节里

我们一开始拉过的内容

我们已经基本上学过了 我们知道CPU

知道了存储器 知道了外设

知道了把他们连起来的总线

那么把刚才讲过的这些内容宏观起来

再来看一看 我们会发现

它是一个什么特点

我们会发现所有的东西

都被映射在了刚才所讲到

地址总线映射的这个地址空间里

所以如果我们

针对我们所学习的KL25Z128

这样一款MCU 这样一款ARM Cortex MCU

查它的芯片手册

把那张地址映射表画成图

就是我右边这张图

你会发现在这样一款芯片里

我们从0x0000 0000地址到0X0800 0000这样一个地址段

放的是我们flash存储器

而flash这样一个非易失的像硬盘一样的

存储器的最前端是我们的中断向量表

决定了我们上电复位从哪里执行

决定了我们每一个中断发生可以到

哪里调用程序 而在这个flash里头

大家可以想象 可以存储我们自己

所编写的程序的代码 一条一条的指令

可以存储我们所编写程序用到的那些常量

然后 从0x1FFF F000一直到0x2000 0000中间的

这段绿色的地址段是我们的RAM

相当于我们的内存 它是掉电丢失

但是读写很方便的

所以我们可以想象它的上部分

将是我们的堆 存储我们的全局变量

它的最下面这个部分从底部

开始往上使用的话 可以是我们的栈

方便我们进行函数的调用

和中断响应时候的内存的

开销 出栈 入栈

而刚才讲外设的时候

所讲到那个部分我们的register space

我们的片外的外设的寄存器组

映射到了底下黄色的部分

他们分别从0x4000 0000地址段开始

和0xC000 0000地址段开始

各自划分了一个非常大的区块

那么日后学习我们会发现这每个区块

都多达512兆个字节之多

所以我们寄存器远远没有那么多

没有把它用充分 但是它被定义在了

这个区块里可以随意使用

所以我们刚才讲到那么多种外设

包括我们后面第四章

第五章要学习行行总总的外设

归根结底都是在这个区块里去学习

这些寄存器 每一个各自相异的功能

它们分别带有什么含义

分别如何控制一个一个的外设

完成它各自差异的功能

但是作为CPU的视角来看

我们仍然是通过地址对这些寄存器进行

0和1的读写来完成对于外设电路的控制

这是从现在这个时间点必须建立的一个概念

如果我们站在一个更加抽象的角度

来把刚才所说的这个内容加以总结

我们就会发现对于嵌入式微控制器

它的精髓其实就在于对于存储器的使用

或者说它的特点

也是对于存储器的使用

我们来仔细想一想

在一个微控制器的开发领域里头

我们的代码是存储在非易失的

存储器就刚才的Flash里头的

我们的变量 我们的堆栈

也是存储在易失的存储器

也就是刚才的RAM里头的

我们所有功能的实现

包括日后要学习的点个灯

做个通讯 做个机器人

是通过映射为了存储器

映射在了地址上的

这些0和1的读写来实现

对于外设的控制的

这件事情日后通过学习

大家会理解越来越深

所以你会发现我们整个编程的过程

都是在完成对于存储器

或者类似于存储器的这些电路的访问

那么作为嵌入式的这样一种系统

特别是我们ARM Cortex M

这样的微处理器的开发

它还有什么特点呢

我在这里给大家提几条

大家可以慢慢的理解

第一他是一个平坦的内存模型

我们称为统一地址映射

我们能够有32位的地址总线

从0x0000 0000到0xFFFF FFFF 4G字节的地址编码

于是这个地址空间

就像刚才那样一张表就能呈现出来

而在这张表里头从0x0000 0000地址到0xFFFF FFFF地址

在任何一个芯片设计完成的时候

每个地址要么没有用

要么就已经赋予了明确的功能

他们是在一个平坦的结构里逐一的

在一个维度里赋予了它的功能

所以我们指向一个地址

就是一个确定的功能

这叫 flat memory model

平坦地址的统一映射

那么我们学习一些高级的计算机

或者更高阶的微控制器

微处理器的嵌入式系统的时候

我们可能还会接触到MMU内存管理单元

接触到虚拟地址

出现这些地址之间的跟实际物理存储空间

之间的非一对一的映射关系

这在日后大家可以学习

第二是我们这样一个系统

虽然有4G的地址可以用

但是限于芯片的成本和面积

我们的存储器其实是有限的

比如说我们的flash是只有128K

我们的RAM只有16K到20K

那么我们在日后的开发中会牢牢记住

我们的存储器是有限的这样一个概念

他不同于windows的计算机编程

可以使用虚拟硬盘

可以使用虚拟内存

这是大家一定要记住的

最后就是刚才提到的那件事

我们虽然都是好像在访问存储器

访问RAM 访问flash 访问外设

他们在本质上是有差异的

有的可读写 有的只能读不能写

有的快 有的慢 有的写进去的是数据

有的写进去的是数据 发挥作用的是电压

这件事情大家日后会慢慢的加深印象

言而总之 总而言之

经过第三章基础知识的学习

我特别希望给大家

建立一个宏观蓝图是什么呢

就是这样一张图

那么在这样一张图里

我们左边是一个完整的

刚才那张抽象的由总线连接起来的

MCU内部的CPU 存储器 时钟 复位

和各个外设的联络图

但是从编程模型的视角上来讲

我们很多时候看到是右边这样一张地址图

在这样一个地址空间里

我们反复已经出现若干次了

最顶端是flash 是掉电不丢失存储器

存储我们的程序 绿色的是RAM

是我们内存相当于我们计算机上内存条

存储着我们掉电会丢失的东西

所以可以跑变量可以放堆栈

而黄色是我们的外设

日后我们还会讲这个外设里头

第一段是留给各家厂商设计芯片时候

所开发的外围设备

第二段所谓的private

这个外设是由ARM公司所定义的

各家统一的标准外设

但是无论如何像这样一个模型里头

我们建立我们程序放进去

究竟是怎么运行的

回顾我们讲过的复位

在中断向量表的最顶端

也就是0000和0004这两个地址

放着我们的PC指针寄存器

和堆栈指针寄存器应该赋予的初值

上电之后CPU自动的把它加载给

这两个寄存器 所以导致我们的PC指针

寄存器指向了flash里头某一条指令

也就是我们所要运行的第一个函数的

第一个指令

而堆栈指针寄存器呢

也成功的指向了内存的某一个位置

是我们堆栈的起始地址 之后

沿着它往上可以开始使用我们的堆栈

之后在整个时钟的驱动下

这些指令一条一条的执行

自动的往下跑 进入了一个有序的状态

所以在这个执行的过程当中

我们在flash里头

会不断执行指令来运行

我们所写好的程序

而在程序跳转过程当中

会使用我们堆栈来保存函数的

返回地址完成各种跳转

而在我们程序当中如果使用了全局变量

会在顶部的堆开始使用我们的内存

如果使用了我们局部变量会更加多的使用

我们堆栈来进行使用内存

而如果我们程序足够的复杂

要完成一些跟物理世界的交互

无论是点个灯还是做个通讯

还是做个机器人

它又会不断的通过地址的映射来

访问下面的寄存器

来控制不同的外设模块

实现它所要的功能

输出电压或者完成通讯

那么这样一种程序一个指令

一个指令的执行跳转 使用内存

控制外设的流程 就是从上电启动到

我们的程序当中 每一条指令

每一个几纳秒周期里头所做的事情

如果第三章节

经过我们这么多个单元的学习

大家对这件事情建立一个清晰的蓝图

那我认为我们这个单元的学习目的

就达到了 而在接下来的章节

我会详细的真刀真枪

教大家这些微控制器 ARM的开发方法

和底下这每一种外设的特点

它所具有的代表性

如何使用它完成各种酷炫的功能

最终做出自己的作品

那么这就是我们整个第三章节基础知识

要给大家讲的内容

那么在基础知识讲完之后作为

这个单元的一个扩充

我想给大家提示一点是

我们学习的是MKL25Z128

这样一个微处理器

它是ARM Cortex M0+的其中的一款MCU

那么会有很多的同一厂商不同型号

也会有不同厂商生产

ARM Cortex M0的MCU

为什么说他们都是ARM

我用这样一张图来给大家

留下一个最后的印象

左边的图是ARM公司

在设计ARM Cortex M0 MCU时候

给出的标准地址映射表

它定义了从0000 2000 4000和C000开始的地址段

分别必须是flash RAM

外部外设和ARM自己定义的外设

那么它约定了芯片设计厂商

可以根据自己设计芯片

放置不同大小的flash

不同大小的RAM

和自己任意愿意搭配的外设

放在这个厂商外设的地址空间里

这就好像给了CPU你来攒一个电脑一样

而右边这张图是我们现在所使用的MKL25Z128

这一个具体型号的地址映射表

就是刚才我反复讲到的

大家会发现他们略有差异

但在很大程度上遵循了ARM公司

所定义的规范 所以大家今天学会

这一个型号 当你要学习同一厂商不同型号

或者是意法 德州任何一个半导体厂商

别的ARM处理器的时候

你会发现他们具有高度的互通和一致性

当然另外一个互通性是他们指令集的兼容

在前面我们已经讲过

所以希望大家能够学着 本着学一通百

更加通用的精神来深入理解这些知识

走上ARM嵌入式学习的阳光大道

智能车制作:嵌入式系统课程列表:

第一章 概览

-1.1 课程概览

--Video

-1.2 进入嵌入式系统的世界

--Video

-1.3 如何学好嵌入式系统

--Video

第二章 绪论

-2.1 计算机的基本概念、发展历史

--Video

-2.2 从晶体管到CPU

--Video

-2.3 概念CPU、微控制器MCU和嵌入式系统

--Video

-2.4 八卦计算机史

--Video

-2.5 不同领域、不同系列的嵌入式系统

--Video

-2.6 ARM历史与MKL25Z128 MCU

--Video

第三章 MCU基础

-3.1 CPU的基本结构和运行机制

--Video

-3.2.1 堆栈的概念

--Video

-3.2.2 堆栈的概念-头脑体操

--Video

-3.3.1 ARM的体系结构

--Video

-3.3.2 ARM的体系结构-头脑体操

--Video

-3.4 中断的概念和机制

--Video

-3.5 中断子程的概念和编程

--Video

-3.6 复位、时钟、存储器和总线

--Video

-3.7 小结:MCU的总体结构和程序运行机制

--Video

第四章 MCU外设与开发

-4.1 第一种外设:IO

--Video

-4.2 IO外设的编程实操-点亮LED

--Video

-4.3 IO外设的进阶知识

--Video

-4.4 嵌入式开发的基本概念与工具链

--Video

-4.5 嵌入式开发的进阶知识

--Video

-4.6 嵌入式开发中的C语言(上)

--Video

-4.7 嵌入式开发中的C语言(下)

--Video

-E0.1 实验零 开发板的初步认识与工具链的安装

--Video

-E0.2 实验零 体验一个例程的编译与下载

--Video

-E0.3 实验零 编写第一个程序:点亮核心板LED

--Video

-E1 实验一 点灯秘籍

--Video

第五章 MCU与嵌入式系统设计

-5 智能车视角的嵌入式设计

--Video

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。