0%

一些单片机基础概念

鉴于大家对单片机/嵌入式了解都不多,我们先从一些基础概念说起.

💬 如有任何疑问可以随时问我 (以下许多内容抄自维基)


嵌入式与单片机的区别

首先说说为什么我更倾向于称之嵌入式培训而非单片机培训. 实际上车队目前的嵌入式系统中不止有单片机, 目前也打算引进树莓派, 日后也必定会更多的使用单板机, 这个寒假的以了解为主的培训我打算不止将单片机的内容, 也会和大家一起探索些别的. 因此这次培训称作嵌入式培训而不是单片机培训.

嵌入式

🚩 嵌入式系统的维基百科 (需要翻墙)

一般说嵌入式都是指嵌入式系统,IEEE(InsTItuteof Electrical and ElectronicsEngineers,美国电气和电子工程师协会)对嵌入式系统的定义:“用于控制、监视或者辅助操作机器和设备的装置”。

单片机

🚩 单片机的维基百科

单片机,全称单片微型计算机(single-chip microcomputer),但通常缩写为MCU (Micro Controller Unit), 又称微控制器, 是把中央处理器、存储器、定时/计数器(timer/counter)、各种输入输出接口等都集成在一块集成电路芯片上的微型计算机.

举例及相关链接

由以上两个定义我们可以看出嵌入式系统和单片机是不同层面的概念, 实际上并不应该相提并论.
一个嵌入式系统中可以包含单片机,
也可以没有单片机.
比如我们的赛车的电气部分是一个嵌入式系统, 因为它是我们根据车检规则专门设计的系统, 而这个系统中包含了k60, XC2267M等单片机. 当然如果我们的系统中只有树莓派 (树莓派是一种单板机) 的话,这个系统中明显就没有单片机了.

以下几个链接应该可以帮助理解单片机, 单板机和嵌入式, 当然你也可以在网上做更多搜索.

大家一定要辩证的看待网上的内容, 谁都有可能说错. 软件方面的内容更是要关注文章发布时间, 很有可能因为版本问题你遇到的情况并不能用别人的方法解决.


目前车上用到的,将要用到的几种开发板

英飞凌 (infineon) 的 XC2267M

这个单片机是目前的主力,放在驾驶舱脚附近的一个铁盒子里,作为VCU.
有关这个单片机的资料不多,但也够我们利用. 它的优点是为了稳定性屏蔽了大量接口, 在板子上应该还有一些滤波电路. 缺点就是正因为屏蔽了大量接口, 可拓展性很差.

飞思卡尔 (Freescale) 的 k60

k60在18年的车上放在车头部,从VCU读取数据并显示在车手的显示器上. 但实际上这个单片机功能并不比
XC2367M差, 甚至可拓展性更强, 功能上足以充当VCU. 但因为别的车队用类似单片机作VCU 出现了
CAN通信掉线等信号受干扰问题, 我们担心k60的屏蔽做的不够好, 也可能出现类似情况.

树莓派 (RaspberryPi)3b+

目前这块板子的具体用途还没定, 但预计会利用它在车上搭建一个网站, 发送车的各种数据, 也负责显示屏的输出.

树莓派相对上述两个板子性能要强大一些,应用也更智能一些. 但尴尬的是树莓派本身不具备CAN通信接口,需要转换.
树莓派是一个微型电脑,但和电脑上常见的x86, x64等
指令集
不同, 采用的是
ARMv8
架构, 因此不管是装系统还是装软件都需要安装ARM版.

值得一提的是树莓派是可以安装操作系统的,而且可以安很多种系统. 常见系统有以下几种:

Raspbian

这是树莓派官方系统, Debian系的Linux系统. 相关资源最多, 使用的人也最多.

Windows 10 IoT Core

这几年IoT (物联网) 很火, 而树莓派因为足够智能, 入门不难被很多极客喜爱, windows的这个IoT系统就很火啦

Ubuntu Mate

Ubuntu是一个很多人用的Linux发行版, 其中也有机器人界公认的操作系统ROS是基于Ubuntu开发的原因.
但我自己的体验是ARM架构的Ubuntu系统体感并不好, 相关资源很少,使用的人也不那么多.

更多

当然树莓派还能装更多奇奇怪怪的系统, 比如 Windows 10 (ARM版), Mac OS, Android等.


一些重要概念

烧录

参见:

波特率

波特(Baud)即调制速率,即单位时间内载波调制状态变化的次数。它是对符号传输速率的一种度量,1波特即指每秒传输1个符号,而通过不同的调制方式,可以在一个码元符号上负载多个
bit位信息。波特本身已是速率,所以不需要写成 Baud Rate(Rate 是赘字)。单位“波特”本身就已经是代表每秒的调制数,以“波特每秒”(Baud per second)为单位是一种常见的错误,但是在一般中文口语化的沟通上还是常以“波特率”来描述“波特”(Baud)。

波特率有时候会同比特率混淆,实际上后者是对信息传输速率(传信率)的度量。波特率可以被理解为单位时间内传输符号的个数(传符号率),通过不同的调制方法可以在一个符号上负载多个比特信息。因此信息传输速率即比特率在数值上和波特率有这样的关系:

$I=S \cdot \log _{2}{N}$

其中I 为传信率,S 为波特率,N 为每个符号负载的信息量,而 $\log _{2}{N}$
以比特为单位。因此只有在每个符号只代表一个比特信息的情况、或一些简单的调制方式下,波特率与比特率才在数值上相等,但是它们的意义并不相同。

🚩RS232 (一种串口接口) 为例

常用的波特率有300, 1200, 2400, 9600, 19200, 38400, 115200等 (虽然我也不知道为什么).
假设目前波特率为 9600, 则此RS232的比特率计算为

$I=S\cdot \log {2}{N}=9600\cdot \log {2}{2}=9600bit/s$

常有人把RS232的 N 误以为是每个符号所夹带的讯息量为$2^{8}$,但实际上每一个比特即为一个符号

晶振

晶振是给单片机提供工作信号脉冲的. 这个脉冲就是单片机的工作速度, 比如12M晶振的单片机工作速度就是每秒12M.

参见:

中断

中断
是计算机领域一个很重要的概念, 在单片机中应用也非常多.

中断是用以提高计算机工作效率、增强计算机功能的一项重要技术。最初引入硬件中断,只是出于性能上的考量。如果计算机系统没有中断,则处理器与外部设备通信时,它必须在向该设备发出指令后进行忙等待(Busy waiting),反复轮询该设备是否完成了动作并返回结果。这就造成了大量处理器周期被浪费。引入中断以后,当处理器发出设备请求后就可以立即返回以处理其他任务,而当设备完成动作后,发送中断信号给处理器,后者就可以再回过头获取处理结果。这样,在设备进行处理的周期内,处理器可以执行其他一些有意义的工作,而只付出一些很小的切换所引发的时间代价。后来被用于CPU外部与内部紧急事件的处理、机器故障的处理、时间控制等多个方面,并产生通过软件方式进入中断处理(软中断)的概念。

串口与并口

串口

串行端口, 即 COM口 (Communication port), 是以串行 (在计算机总线或其他数据信道上,每次传输一个比特数据,并连续进行以上单次过程的通信方式), 的方式传输数据的接口.
常见接口标准有RS-232USB (Universal Serial Bus, 即通用串行总线接口, 这很明显是串口了😏)、
RS-422、RS485等.

要注意接口标准只对接口的电气特性做出规定,不涉及接插件、电缆或协议。而连接器 (Connector) 才是我们常说的插头.
比如大名鼎鼎的雷电 (Thunderbolt) 1, 2代以mini DP连接器实现而雷电3以type-C形式实现.

并口

并行端口, 又称 LPT (Logical Parallel Port). 是计算机上数据以并行方式 (多比特数据同时通过并行线进行传送)
传递的接口,也就是说至少有两条线用于传递数据. 这样数据传送速度大大提高,但并行传送的线路长度受到限制,因为长度增加,干扰就会增加,数据也就容易出错.

因此虽然按原理看并口可以达到比串口更高的速度, 但并口由于8位通道之间的互相干扰,传输受速度就受到了限制,
当传输出错时,要同时重新传8个位的数据。串口没有干扰,传输出错后重发一位就可以了。所以目前串口通常比并口快。

以下几个链接应该可以帮助理解串口与并口

上位机, 下位机

参见:


常用通信协议

目前车上主要用到CAN通信, 树莓派因为没有CAN接口, 目前采用用模块将CAN转为SPI的方式接受CAN总线里的数据

CAN

参见:

SPI

UART

IIC

参考: 百度文库-多种工业应用串行总线特性及比较


单片机开发大致流程

编写程序单片机程序一般使用C/C++语言编写,因为这两个语言能保证运行速度

(比如可以参考以下这个).
编写完程序并且可以通过编译后我们会得到一个hex文件 (一个十六进制文件), 这个文件正是我们要烧录到单片机的文件.

但也有例外, 有的单片机执行的文件是bin文件 (二进制文件), 这类单片机也不需要烧录软件来把执行文件烧录进去, 电脑会将其识别为一个储存设备,直接将文件放进去就可以了.

Keil

单片机开发最常用的就是Keil了, Keil, 从链接中可以看到, Keil对应各种芯片内核推出了 MDK-Arm, C51, C251, C166 四个版本.
比如我们的XC2267M属于C166系列, 那就该用 Keil C166, 而k60属于Arm系列, 因此该用 Keil MDK-Arm,
而如果你想玩51, 就得用Keil C51. 实际上不需要这么麻烦. 这四个版本之间的差别其实只是分别对另三个系列芯片的功能进行了锁死, 用破解软件的我们只需要对这几个版本都破解以下就可以了😏.

Visual Studio Code

VSC也是我现在用的很顺手的代码工具. 它虽然只是个编辑器 (也就是记事本那种东西) , 但得益于热心网友们开发的丰富插件, VSC几乎可以用于任何语言的开发 (虽然有些语言的调试功能还是没有IDE强大),
因此现在很多人在用. 但VSC不是那么容易上手, 尤其C/C++语言支持的配置有点麻烦, 如果大家有兴趣可以来找我.

正如上面说到的, 目前单片机开发面临一个很尴尬的局面, 要开发不同单片机通常需要用不同工具.
针对这个问题, 一个叫 PlatformIO
的项目出现了. 这个项目致力于创造一个统一的单片机开发工具, 目前已经支持绝大多数单片机,
这里
是支持的单片机列表. (实际上它不止支持单片机, 也支持很多单板机). 虽然PlatformIO已经推出了专门的IDE, 但它也有VSC插件版
目前我正在使用这个插件, 体验良好😄

其他

Keil只有Windows版, 但VSC是跨平台的, 在Windows, Linux, Mac OS 下都有, 因此我觉得PlatformIO
的出现极大的方便了Linux, Mac OS的单片机开发者们. 在这之前在Linux, Mac OS下当然是可以开发单片机的,
但需要一定的水平, 总之很麻烦, 也没什么成熟的软件.

烧录到单片机

一般操作步骤如下:

  1. 打开烧录软件 (也有的单片机就用Keil就可以烧录),选择单片机型号和单片机连在电脑上哪个COM端口,选择刚生成那个hex文件
  2. 点击下载
  3. 打开单片机电源,注意不是等下载完成才打开, 开始下载后过几秒就可以按 (有的单片机如果不先断开电源烧录是无法完成的. 但也有的没有电源键的单片机是在烧录完成后需要按重启键重启单片机).

在Keil下烧录程序到51的具体操作可以参考
这个

调试

相比电脑上开发, 单片机开发有个令人很头疼的地方是不好调试, 也就是我们不是那么容易找出程序哪里出错了.

使用Keil的话我们可以对单片机进行在线调试,
这是个很方便的功能, 允许我们打断点等. VSC下的PlatformIO也提供
许多调试功能不过我并没有体验过.

至于其他方式… 目测吧.


一些问题

看到最后, 希望大家现在已经能对以下几个问题做出回答

  • 嵌入式和单片机到底有什么区别?
  • 为什么我们还在用看起来很麻烦的XC2267M?
  • 为什么不能直接给树莓派安装电脑常用的Windows 10系统?
  • 烧录为什么叫烧录?
  • 如何写一个C语言中断函数?
  • 串口和并口有什么区别? 哪些常见连接器是串口/并口?
  • CAN通信的大致原理是什么?
  • 在Linux平台下可以作单片机开发吗?
  • 你猜我还想问什么?😏