当前课程知识点:智能车制作:嵌入式系统 > 第三章 MCU基础 > 3.7 小结:MCU的总体结构和程序运行机制 > 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
-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
-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
-5 智能车视角的嵌入式设计
--Video