当前课程知识点:ARM微控制器与嵌入式系统 > 第四章 ARM微控制器的开发 > 4.4 嵌入式开发的基本概念与工具链 > 4.4 嵌入式开发的基本概念与工具链
各位同学大家好
我是清华大学工程物理系的曾鸣老师
欢迎大家回到ARM微控制器
与嵌入式系统的慕课课程
我们继续我们第四个章节
ARM微控制器开发的学习
那么在过去的课程中
我们已经学习了嵌入式的历史渊源
以及ARM微处理器
微控制器内核的结构
以及它的基本开发方法
就如前几节课我们所说
在第四个章节呢
我们选了最最简单的一类外设
也是最最经典在所有嵌入式系统当中
都最基本的IO这一类外设
来学习ARM嵌入式开发的一些基本思路和方法
了解如何通过计算机的编程
使这样一个外设工作起来跟外界发生关系
或者用个通俗一点的说法
就是如何真正地在学了那么多
好像很有意思的历史或者是很酷的知识之后
我们真正能够把这样一个嵌入式系统给玩起来
那么前面三个小节我们学了IO外设的寄存器
它的地址映射以及如何用三个步骤来进行编程
点个灯 读个按键
那么实际的编程开发怎么做
以及我们刚刚写的那些C语言代码
它背后的含义和依据是什么
是我们接下来几节课要给大家深入探讨
相信通过这种学习
我们对于整个ARM的嵌入式开发会有更好的理解
那么从开发的角度来讲
这一个小节呢
我想给大家拉一拉
我们在嵌入式开发里头
所具备的一些常见的基本知识和名词
或者说
我们建立对于嵌入式开发的一个基本概念
日后谈论起嵌入式开发的时候我们至少不怵
并且对于我们做的每件事用的每个工具
有一个基本的概念
那么我们说起嵌入式开发的时候
会提到很多很多词汇
比如大家会听到说有
开发板
然后呢会有这个最小系统板
会有我们的电路板
然后会有编译
汇编 链接
还有集成开发环境 软件
模拟器 仿真器 调试器 烧写器
等等这样很多很多的词汇
然后还有一些英文的术语
比如BDM JTAG
还有大家现在很好奇的USBDM是什么
OpenSDA是什么
那么这些东西我们把它梳理梳理
它会构成一个工具链
那么最简单的呢
首先我们完成一个嵌入式开发
我们一定要有一个嵌入式的系统电路板
我们一般来讲做为学习入门
很少会说是拿着一个现成的产品来做代码开发
从学习的角度我们都会有一个更加通用
更加common的这样一个板子
那么在我们这个行当里
一般会把它称为EVB
那么很多厂商都会提供官方的EVB
EVB是Evaluation Board的缩写
也就是评估板
那么任何一个厂商
大家想一想
一个芯片厂商它做了个芯片
它其实最担心的是大家用不起来这个芯片
它不会把这芯片上的很多技术
像秘密一样捂着
而是它会努力的把它open出来
让每个人都尽可能去尝试和体验它
能够把它的功能发挥出来
所以呢
很多厂商会提供这样EVB板
它会把这个芯片
做在这个板子上
把它所有可能用到的外设
和功能都引出来
那么这个板子相应而言
这个体积一般就不会太小
那么这样的板子
它会有很多的优点
比如它是官方的
它是很reliable很可信的
然后呢它是一个很好的测试系统
并且它的常见功能都完善的引出了
更重要的是你在这个板子上可以
尝试一个芯片
是否合适或者很轻松搭建测试电路
尝试你想要的一个功能是否能够调通
而当你调通你要做产品设计
或者自己的科创设计的时候呢
你可以从官方的
资料上把这一部分电路给扣出来
加以学习
所以EVB板是个非常好的工具
那么作为我们初学者
EVB板有时候可能会很贵
有时候会很大
更重要的是
它有时候可能不方便灵活的调试
那么在我们嵌入式开发里头
经常还会有一类概念
就是我们有时候叫Startup Board
有时也会叫Minimum System最小系统板
那么一个嵌入式系统
我们之前学过微处理器
微控制器
麻雀虽小 五腑俱全
它是一个微型的计算机系统
所以它只需要非常少的外围器件
就能够工作起来
比如一个微处理器
或者一个微控制器
片内有存储器
有时钟 有电源调理 有外设
那么我们在编程开发起来的时候
我们只用给它设计一个最小的外围电路
比如说外围的电压接口
通讯接口
编程调试接口
特别是晶振这个时钟接口
这样一些接口以后
我们把它所有没有用到的外设和IO
都以标准的接插件
双排针
或者双排座引出来
这样就会构成了一个
体积非常小巧非常灵活的
最小系统板
比如说大家可以注意看到的
像我们8位的16位的
XS128在第二届到第四届
的智能车比赛广泛使用
再比如说这个ARM
Cortex M4
Cortex M0
甚至乃至power pc
这样的32位核
都可以开发出最小系统板
那么这样的板子它实际上是刚才我们提到的
EVB的一个高度凝炼只保留了它当中
最核心的一部分系统
那么它的好处就是
一旦你学习使用的时候
你只用关注这个最小部分
而需要拓展你额外功能的时候
你可以非常自由地给它设计一个外围电路
那么你只需要把这块板
扣在你设计的外围电路上
自行设计周边的部分
就可以调通你要的功能
而外围电路的设计
如果出现了偏差
你只需要去更改底下的设计
而不用担心核心系统对于初学者来讲可能很难
它的设计是否有问题
而一旦你的设计最终定型
你只需要把这部分电路
拷贝给 down到你的底板上
你的一个完整系统
就设计完成了
所以说这样的最小系统板
它能够提供一个可靠的适合初学者上手的Minimum System
大家可以放心大胆的
去调外围电路
即使你的外围电路画得很失败
把这个核心板烧了
因为它是分离的设计
你只要把它扣下来换一块就可以
继续学习和调试
成本也非常的低
那么在我们这个课程里头
从第一节课我们就讲过
我们有一个开源的这样一个硬件教学系统
它的图纸资料在网上都可以找着
然后愿意的同学
也可以通过淘宝很容易买得到它的成品的套件
那么它的背面如果大家看
就是一个mini的最小系统板
而它的主板
和它前面的屏幕就是它的一个扩展电路
所以我们这门课程呢
把一些好玩的功能
都聚集在了这个系统板上
这么一个Blazar系统上
但是实际上
我很希望大家通过我们后面第五章
乃至第四章IO这些模块的学习
具备更多的十八般武艺
你会点灯
你会放音乐
你会用显示屏
最后把它很酷很炫的玩儿起来
乃至用它的Arduino这个接口
去扩展各种各样的功能
但是最终大家具备
把这个最小系统拎出来
自己设计系统的能力
那么以上的这一些就我们在嵌入式开发里头
会接触到你要学习嵌入式系统
你一定要有个芯片
但一个裸芯片大家没法玩儿
一定会有一个平台一个板
那么各种各样的板
大概就这么一些名词的概念
那么作为开发的软件就是另外一件事儿
我们往往会听到两个词汇
一个叫做IDE集成开发环境
另外一个呢
就是Tool Chain我们称为工具链
实际上我们写了一个程序
就像我们上节课所学
要把灯点起来
我们写了个main函数
几句话C语言
那么下来以后
变成一个我们微处理器
可以使用的程序
那么这个过程当中我们需要若干个步骤的
软件开发工具
那么对于任何一个微处理器
内核是不一样的
都有不同的指令集
都有不同的寄存器组
都有不同的内存映射
那么我们想想刚才讲的这些东西
在第一章的时候讲它是什么
它是我们不同型号微处理器的编程模型
所以这样一种编程模型的不同
就会要求它需要不同的开发工具
所以我们熟悉计算机开发的同学
会觉得我们或者用GCC
或者用Visual C
或者用Turbo C就在计算机上
就可以写我们的程序了
而嵌入式开发的环境里头
我们如果使用的是
比如说不同厂商不同内核的嵌入式微处理器
我们可能会使用不同的开发工具链
而如果使用的都是ARM
比如说我们现在学的是
Freescale或者是NXP的ARM
Cortex这样的核
那么它很有可能它的工具链与意法
比如说ST
比如TI的
ARM的微处理器是通用的
但它仍然是一个独特的
适用ARM的工具链
那么这样一个工作链的构成
大概需要最少以下几个部件
我们需要一个汇编器
它具备把我们写出来的汇编代码一一对应
具有映射关系的变成机器码的
这样一种汇编能力 我们会需要一个编译器
本门课程不会去学编译器原理这些知识
但是我们知道编译器能够帮助我们
解析高级语言
包括C语言这样的语法
把它进行语素上和逻辑上的拆解
最后翻译成中间语言或者变成这个汇编语言
那么编译器根据设计思想的不同
它有可能最终直接变成机器码
也可能变成别的中间码
但是现代的绝大多数编译器
它会选择
以对应这个CPU的汇编码作为它的中间步骤
所以我们可以理解编译器变成汇编码
汇编器再进一步把它变成机器码
然后最后我们还会有一个linker叫链接器
它会把我们编译的绝对地址定位的代码段
也就是目标代码根据我们的内存的地址映射
哪些地址段是代码 哪些地址段是内存
把它像乐高玩具一样组装起来
最终形成一个可执行的
可以互相调用的
完整的程序
最后呢偶尔会用到
大家可能感觉不深的是Disassembler反汇编
我们拿到一段机器码
想知道它的对应的含义是什么
读0和1的机器码是很难的
反汇编可以帮我们
把它反向变成汇编代码
然后有经验的程序员可以加以阅读
了解程序的构架
那么很多同学会说
那老师我C语言其实我也学过呀
我写了个main函数
我一点
按F5或者按F9
它就开始运行了
我说printf我就看到结果了
我没有感觉到这些步骤啊
那么这些步骤
背后的故事在下一个小节
我们会试着给大家来加以展开
但是呢
这些步骤确实大家感觉不到的原因
从软件的角度有两个
一个呢在LINUX平台
或者在一些工具链
Tool Chain的平台里头
我们会用很多的脚本工具
让它进行一些自动的连续调用
直接得到最终的目标码
那么这样子依赖脚本编写对于入学者
或者WINDOWS平台上大家可能会不习惯
那么我们更多会使用的东西叫做
Integrated Develop Environment也就是IDE
那么IDE是一个集成开发环境
一说好像很高大上
我举几个例子
比如说非常有名的Visual C++
它就是一个很典型的IDE环境
在这个里头它后台集成了通过
其实也是脚本驱动下对于汇编
编译 链接
这些步骤地调用
但是我们在它的界面里
写好一个main函数以后
你只用点一下它的按键
程序就运行起来了
那与之类似的
在我们学习使用NXP公司或者是Freescale公司
这些ARM
Cortex器件的时候
我们也有很多集成开发环境可以用
比如说著名的KEIL还有IAR这样的开发环境
包括NXP公司原来独立的一个产品
叫CodeWarrior
CodeWarrior这个开发工具
它适用了很多很多的嵌入式平台
可能很多微处理器大家不熟
我说两个大家熟的
比如最早的任天堂的N64的游戏机
包括Play Station游戏机的开发环境
它的集成都是用的CodeWarrior
来作为集成开发环境
那么这样的集成开放环境
把这些工具整合起来
就构成了我们的一个开发平台
那么除了集成开发环境呢
在我们一点鼠标或者点一下以后
我们去CodeWarrior上面小甲壳虫
这么一个简单操作的背后
有一些是我们学习课程一定要知道的故事
有一个概念就是交叉编译
那么交叉编译这个词
就是Cross Compiler那么这个词
在我们很多时候
我们自己并不觉得
我们做过很多计算机的开发
都是在个人电脑上写一个程序
编译生成一个个人电脑上可以使用的软件
那么这种都是普通的编译
交叉编译是什么
我们看看维基百科上的解释
说它是
在某个系统平台下产生另一个系统平台的
可执行文件的这样一种编译器
这句话我觉得不用太多解释
因为它还是挺直白的
对吧
一个平台产生另一个平台的
那什么时候
需要使用交叉编译
为什么讲嵌入开发的时候要说交叉编译呢
看看维基百科上另外一句解释
它也很直白
它说在对象平台
难以或者不容易进行编译和编程时
我们需要交叉编译
这个大家很好想象
我们现在已经有个概念了
说我们的微控制器是个黑黑的小方块儿
有一对银色的腿是芯片
即使做在电路板上
也就是一个巴掌大的小板子
那么没有进行编程的时候
它既没有键盘
也没有显示器
我们怎么让它给自己编程呢
所以绝大多数的嵌入式开发
都是使用计算机的平台来进行编程
最终得到在我们的嵌入式平台上
可以使用的这样一种程序
那么这就是交叉编译的环境
那么我们必须建立的一个概念
是在计算机体系从第一章第二章
我就一直给大家建立的概念
也就是计算机程序就是指令的集合
而指令的依据也就是这个计算机的体系结构
不同的CPU有不同的指令集
不同的寄存器组
所以它们的机器码
它们的程序是不可以通用的
所以呢
我们所谓的非交叉的编译
是在本平台编译
生成本平台可以使用的执行文件
而我们一旦
进入了嵌入式开发领域大家
此执行文件非彼执行文件
会建立个概念
写的c语言得到了一个可执行文件
点个灯
这个程序并不能在你的计算机上使用
而是必须烧写到我们的微控制器对应的
正确的型号里才能加以使用
这个系列这个型号
都是唯一
都是关键的
那么这样一种交叉编译的环境
就决定了我们的开发方式
一定是在计算机上
编程 编译 甚至汇编
得到链接 可执行文件
最终要想办法
把它放到我们的嵌入式平台里去执行
那么这样一个环节
就决定了我们的工具链
又比普通的方式要更加麻烦
那么下一个要引入的东西呢
就是Simulator
或者Emulator
如果大家看看这两张图
你们很多同学
年轻人就会觉得很兴奋
啊这个我熟
为什么呢Emulator大家很熟悉呀
不就是模拟器吗
特别是大家最熟悉的模拟器
不外乎两种 就是图上的
一个是我Emulator出来一个这个
游戏机 任天堂 我就可以玩超级玛丽
可以玩魂斗罗 或者呢就是说
有同学我喜欢做手机app
这个app写完了
甚至我见过有些同学非常 叫非常穷
非常囊中羞涩
我写的程序我都买不起很好的手机验证
怎么办呢
很多开发环境会提供一个这个
Emulator的平台
我可以把我的程序放在iPhone
或者放在Android的平台上去试运行
看看效果是怎么样
那么这些东西我们称为
Emulator
那么实际上
更加底层的本质是
因为我们的目标是一个嵌入式平台
它的CPU它的指令集与我们计算机是不一样的
那么我们在做纯软件和算法的验证的时候
甚至乃至一些硬件验证的时候
有些时候
可以借助Emulator
也就是你完全通过C语言
通过计算机的编程语言
写出一个虚拟的CPU的构架
完成它所有指令的功能解析
甚至完成它所有对于存储和外设的调用
最高阶的时候
把它的声光电这些外设的功能
也全部与电脑链接起来加以实现
于是我就可以让我们的程序
误以为自己在一个硬件的平台上跑
这样一种概念大约是在过去十五年里
慢慢出现的
因为从那个时候起
计算机才有足够的计算能力
完整的虚拟出
一台别的硬件平台
但是这种概念一旦产生
就一发不可收拾
最早大家就像现在这样玩游戏
后来做做嵌入式的手机开发
那么到今天
我们会发现有VMware 有Visual PC
甚至包括有大型的虚拟服务器
先在一个硬件平台上
虚拟出若干个硬件平台
再运行服务使整个服务变得更加鲁棒(Robust)
那么放在嵌入式的环境里头
我们在很多开发工具链里头
也能看到Emulator Simulator
它会方便我们的硬件工程师和软件工程师
分头干活
甚至在智能车比赛的环节里
有的同学说我做了个很酷很炫的算法
可是我的伙伴不给力
硬件老出不来
其实你可以尝试把你的算法在模拟平台上
先跑一跑
那么除了模拟平台
我们还有个很tricky的事情
非常挠头的事情
就是写好的程序
如何才能放到我们的芯片里
或者说
如何才知道我们的程序在电路里
在这样一个硬件平台上也能工作正常
这是嵌入式开发的要点
软硬件协同
不是说软件跑好了就一定好了
那么老式的开发往往会使用一种
叫做仿真器的概念
仿真器一般
我们有时候也会把它称为Simulator
那么它的最基本概念就是
嵌入式处理器是很贵的
而且编写程序烧写程序
在早期要借助高压或者紫外灯
是非常麻烦的事
甚至只能一次烧写
那么聪明的人类
我们的前辈们想了一个什么办法呢
就是我做一个极其复杂的电路
这个电路
它的引脚跟芯片
跟我最终要用的微处理器
是一模一样的
这个电路背后
有一堆程序的支持
最后连在电脑上
电脑写好的程序发给这个电路
这个电路
对于外围的引脚
可以模拟得像一个微处理器
像一个芯片一样工作
把程序的
对外的电路反应给体现出来
然后如果这种方式
工作正常了
ok那这个程序就没有问题
我再把这个程序一次性的烧写到芯片上
再把芯片插接或者焊接到电路板上
那么这个程序就应该可以工作了
那么发展到今天这样一种思路已经逐渐过时了
因为很显然这样的编程
这样的仿真模式
你每一个专用器件
对应每一个专用的芯片
它都要专门的设计
每个都不一样
而且随着芯片的密度越来越高
封装越来越追求集成度
它也越来越难以制作
和成本昂贵
而且最重要的是
你在一个模拟的电路上调整你的程序
它的电学特性
特别是现在这么高性能
百兆赫兹的嵌入式系统
它的时序特性很难做到完全一样
那么当代的嵌入式开发方法逐渐走到了什么呢
走到了在线开发
也就是在芯片设计的时候
内部留下了一个符合某种工业标准的
编程调试模块
它可以有序地在后台
向我们的程序流水中打入一些调序时序
来获得寄存器的值
来打断CPU的执行
并且把这些信息用非常小的通讯
非常快的速度
传给我的上位机
那么我们会使用串口
或者使用USB来用这个调试接口加以连接
这个时候我们所说的这个调试器
不是大家看到的C51
或者很多老的书里头所说的
那个仿真器
它确确实实就是个debugger
是个调试器
那么这样的通讯接口有很多种标准
比如摩托罗拉时代一直下来的
Background Debugging Mode
BDM标准
比如很著名的工业标准
IEEE (I triple-E)的JTAG标准
它用五根线 十根线
然后比如说我们现在在
ARM Cortex的
这样一种微处理器结构里
用的很广的SWD的标准
那么在我们学习的范畴里
不管这是哪种标准
大家都记住
它只是使用一根两根或者五根
有限的通讯线非常高效的与CPU
与我们的微处理器内置的调试模块接口
进行通讯
然后获得和发送我们调试所需的信息
和控制信息它只是一个通信协议
那么这些接口之间的比较非常的多
我这里举了个例子
是TI公司发布的
一个标准文档
那么现在的像SWD
这样的调试接口
它虽然跟原来传统的JTAG
比从五根调试引脚的需求
变成了只要两个引脚
但是它的速度比原来快了一倍都不止
那么这就是调试技术的发展
那么今天我们用的微处理器都非常小
引脚数都非常有限
所以绝大数ARM Cortex
处理器都使用的是SWD的调试接口
也就是我们现在所常用的调试器
所选用的通信协议
那么通讯协议是一件事儿
我们想把程序真正烧到这个芯片里
要用什么呢
很多同学知其然不知其所以然
说我在淘宝上
买一个USBDM或者买个OSBDM
那么所有的所说的USBDM
或者OSBDM
乃至后面会说现在更流行的OpenSDA
它都是调试器
它在底层会使用刚才所说的
BDM或者JTAG或者是SWD这些通讯协议
那么最典型的像USBDM
是一个开源的硬件项目
那么它主要采用的是BDM通讯协议
或者SWD的通信协议
它的优点是广泛支持
从摩托罗拉Freescale
一直到现在NXP下来的各种产品线
包括8位的08的核
16位的12的核
ColdFire 32位的核
乃至现在SWD接口的
ARM Cortex M4 M0各种系列的MCU
能够很好的通过它这个标准10Pin口进行兼容
那么USBDM的制作
我这里就不展开讲了
不在本门课的范畴
大家在网上能找它的
所有开源硬件资料
然后呢也能在淘宝上
很容易买到廉价的调试器
那么它是个非常好的工具
能够CodeWarrior
做很好的链接
那么现在
更常用的一个开发工具呢
是OpenSDA
OpenSDA分为V1
V2甚至V2.1
V1是一个闭源的调试工具
我们现在所常用的
大家网上说的开源的OpenSDA
主要指的它的V2
V2开始它的代码彻底公开
它的构架呢
就如这个上图所示
在一个K20的标准MCU里头
用它来做一个调试器
程序分成两个部分
标准动作的是一个BootLoader
可以使这个调试器变成了一个
能够驱动一个SWD调试接口的小底层
以及一个具有USB的存储器的一个
底层的这个BooLoader
那么在上层
我们可以给它放一个Application应用程序
放在这个调试器里头
因为这种灵活的构架
大家可以看到下面这张表
我们常见的包括USBDM
包括P&E的调制器
也包括大家很喜欢用Jlink
乃至OpenSDA这个开源项目
自己所带来的SWD的这个调试模块
都是它的应用程序之一
我们把哪种固件
放在它的里头
它就可以当那种调试器用
在我们开发工具里可以装对应的驱动
所以它非常的灵活
你拥用一个OpenSDA
你希望它是Jlink
希望它是USBDM都是可以的
那么我用这张表中
我自己尝试的这些黑点标出了
它与不同开发工具的普适性和适用性
那么大家可以看到比如Jlink是最通用的
但是最后一列我也告诉大家
这当中哪些项目是开源的
哪些项目是免费使用但不开源的
或者哪些项目是可以商业使用
哪些项目是不能商业使用
大家可以了解它的知识产权信息
那么有了这样的各种各样的调试器
我们虽然还没有特别贯通开发的方法
我们大概有了个概念
我们可以写C程序
用工具链编译得到目标代码
然后我们需要交叉编译得到我们所用的
那个CPU上的程序
然后我们再通过一些仿真器
可以验证它的运行
然后我们通过调试器
可以把程序以某种方式某种通讯协议
放到我们的芯片里
让它去执行
那最后还有一类工具呢
是批量的编程烧写工具
Programmer或者Burner
它的特点是我们可以把编好的
某一个程序放在它里头
然后批量的更换芯片
几十片几百片的烧写程序
这在很多产品的量产里曾经非常的火爆
非常的常用
但是现在它的使用越来越少 为什么
因为在线开发工具实在太方便太便宜了
所以呢这是一类工具
所以我们要学习一个嵌入式
我们就需要拥有一个自己的工具链
那么所幸的是在今天的门槛越来越低的情况下
当然我拉了一张表
我们可以自己掰着数一数
我们需要一个开发工具链
我们在网上可以找到特殊版本的CodeWarrior
IAR或者是KEIL 能够免费的使用这些开发工具
我们需要一个调试器
然后我在网上可以找到
开源的USBDM
也可以找到开源的OpenSDA
而且它们在淘宝上都能买到非常便宜的
然后我们需要一个调试电路板
那么在学习本门课程的时候
有兴趣的同学
你可以只学习知识
找出你手头任何一个方便的
开发板来调试
也可以获取我们在网上Blazar
这样一个教学系统资料
然后自己做一个板子
或者在淘宝上非常便宜的买到已经制成的
这样的板子来进行调试
那么把调试器
程序都具备
万事俱备
那就只欠能力了
我们就可以开始尝试动手
真正把它玩儿起来
那么这节课给大家讲的呢
就是我们做这样一个
ARM Cortex M0+的嵌入式开发
所需要的一些工具链
以及它在嵌入式开发这个行当里我们常听的词汇
和基本概念
那么这节课就到这结束
下节课我会给大家介绍
我们的编译开发背后的知识
-1.1 课程概览
--1.1 课程概览
-1.2 如何学好嵌入式系统
-2.1 计算机的基本概念、发展历史
-2.2 从晶体管到CPU
-2.3 概念CPU、微控制器MCU和嵌入式系统
-2.4 八卦计算机史
-2.5 不同领域、不同系列的嵌入式系统
-2.6 ARM历史与MKL25Z128 MCU
--2.6 ARM历史与MKL25Z128 MCU【习题】
-3.1 CPU的基本结构和运行机制
-3.2.1 堆栈的概念
--3.2.1 堆栈的概念【习题】
-3.2.2 堆栈的概念-头脑体操
-3.3.1 ARM的体系结构
--3.3.1 ARM的体系结构【习题】
-3.3.2 ARM的体系结构-头脑体操
-3.4.1 中断的概念和机制
-3.4.2 中断子程的概念和编程
-3.5 复位、时钟、存储器和总线
--3.5 复位、时钟、存储器和总线【习题】
-3.6 小结:MCU的总体结构和程序运行机制
--3.6 小结:MCU的总体结构和程序运行机制【习题】
-4.1 第一种外设:IO
-4.2 IO外设的编程实操-点亮LED
-4.3 IO外设的进阶知识
-4.4 嵌入式开发的基本概念与工具链
-4.5 嵌入式开发的进阶知识
-4.6 嵌入式开发中的C语言(上)
--4.6 嵌入式开发中的C语言(上)【习题】
-4.7 嵌入式开发中的C语言(下)
--4.7 嵌入式开发中的C语言(下)【习题】
-E0.1 实验零 开发板的初步认识与工具链的安装
-E0.2 实验零 体验一个例程的编译与下载
-E0.3 实验零 编写第一个程序:点亮核心板LED
-E1 实验一 点灯秘籍
-5.1 ARM微控制器外设学习概述
-5.2.1 ARM微控制器外设:通讯
-5.2.2 ARM微控制器外设:异步串行通讯UART的原理(上)
--5.2.2 ARM微控制器外设:异步串行通讯UART的原理(上)
--5.2.2 ARM微控制器外设:异步串行通讯UART的原理(上)【习题】
-5.2.3 ARM微控制器外设:异步串行通讯UART的原理(下)
--5.2.3 ARM微控制器的外设:异步串行通讯UART的原理(下)
--5.2.3 ARM微控制器外设:异步串行通讯UART的原理(下)【习题】
-5.2.4 ARM微控制器外设:RS-232串口与USB虚拟串口
--5.2.4 ARM微控制器外设:RS-232串口与USB虚拟串口
-5.2.5 ARM微控制器外设:UART的寄存器编程(上)
--5.2.5 ARM微控制器外设:UART的寄存器编程(上)
-5.2.6 ARM微控制器外设:UART的寄存器编程(下)
--5.2.6 ARM微控制器外设:UART的寄存器编程(下)
--5.2.6 ARM微控制器外设:UART的寄存器编程(下)【习题】
-E2 实验二 UART编程实操
-5.3.1 ARM微控制器外设:IO的中断编程(上)
-5.3.2 ARM微控制器外设:IO的中断编程(下)
-5.4.1 ARM微控制器外设:定时器的原理
-5.4.2 ARM微控制器外设:定时器的编程
--5.4.2 ARM微控制器外设:定时器的编程【习题】
-E3 实验三 定时器中断编程实操
-5.5.1 ARM微控制器外设:PWM的原理
-5.5.2 ARM微控制器外设:PWM寄存器与编程
-5.5.3 ARM微控制器外设:PWM编程实例—电子音乐
--5.5.3 ARM微控制器外设:PWM编程实例—电子音乐
-E4 实验四 数码管显示编程实操
-5.6.1 ARM微控制器外设:SPI通讯简介
--5.6.1 ARM微控制器外设:SPI通讯简介【习题】
-5.6.2 ARM微控制器外设:SPI寄存器与编程
-5.6.3 ARM微控制器外设:SPI编程实例—OLED显示屏驱动
--5.6.3 ARM微控制器外设:SPI编程实例—OLED显示屏驱动
-5.7.1 ARM微控制器外设:I2C通讯简介
-5.7.2 ARM微控制器外设:I2C的通讯协议
-5.7.3 ARM微控制器外设:I2C寄存器与编程
--5.7.3 ARM微控制器外设:I2C寄存器与编程【习题】
-5.7.4 ARM微控制器外设:I2C编程实例—加速度传感器
--5.7.4 ARM微控制器外设:I2C编程实例—加速度传感器
-5.8.1 ARM微控制器外设:ADC简介
-5.8.2 ARM微控制器外设:ADC基础
-5.8.3 ARM微控制器外设:ADC寄存器与编程
-E5 实验五 ADC编程实操
-E6 挑战实验
--E6 挑战实验
-6.1 嵌入式系统的接口与设计
-6.2 嵌入式系统的实例