0.引言1.串行接口2.USB3.单片机4.BootLoader5.PWM(脉宽调制PulseWidthModulation)6.EEPROM7.LCD16028.蜂鸣器、喇叭9.直流电机(directcurrentmachine)10.USB接口芯片11.arduino系列产品12.ICSP(In-CircuitSerialProgramming在线串行编程)13.人体传感器14.CMOS15.HID/BADUSB16.Bootloader烧写17.USBKeylogger
0.引言
0x1:硬件(片上)编程和在PC的ring3/ring0编程的异同
在PC上编程函数之间调用,尤其是在用户态,API之间的调用全都是"虚拟"的概念,即你调用的所有仅仅只是一个逻辑上的黑盒子,它会返回一个确定的逻辑结果(数字)。但是到了硬件这个层面,用电路的思维模式去理解函数调用和执行会更贴近实际一些,在硬件层面的API调用常常被翻译为对某些器件的操作,再往底层就是电路的与非门/锁存器/高低电位/译码的操作
程序员在进行硬件编程的时候,不能只专注于逻辑算法的构建和思考,更多地时候需要使用面向硬件器材特征/引脚/使能进行编程,更多的时候我们的代码是在对指定器材的管脚写入高低电位,并根据返回结果进行AD/DA/纯数字的判断,代码更专注的是使用硬件器材的"输入使能特征"并根据"响应电气特征"判断执行的结果(这点在进行传感器编程时尤其明显)
0x2:UART、SPI、I2C、CAN区别
1.SPI(SerialPeripheralInterface:串行外设接口)
SerialPerheralInterface,是一种全双工同步串行接口标准,串行通信的双方用四根线进行通信,这四根连线分别是
如果用通用IO口(GPIO)模拟SPI总线,必须要有一个输出口(SDO),一个输入口(SDI),另一个口则视实现的设备类型而定,如果要实现主从设备,则需输入输出口,若只实现主设备,则需输出口即可,若只实现从设备,则只需输入口即可在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。在多个从器件的系统中,每个从器件需要独立的使能信号,硬件上比I2C系统要稍微复杂一些
SPI接口在内部硬件实际上是两个简单的移位寄存器,传输的数据为8位,在主器件产生的从器件使能信号和移位脉冲下,按位传输,高位在前,低位在后。如下图所示,在SCLK的下降沿上数据改变,同时一位数据被存入移位寄存器
SPI接口内部硬件图示
PI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据(这点和UART的frame校验相比就差了不少)
这种接口的特点是快速,高效,并且操作起来比I2C要简单一些,接线也比较简单,TLC2543提供SPI接口
SPI传输自带了用于同步的时钟信号,所以不需要像UART那样在通信双方之间约定一个固定长度的frame格式2.UART(UniversalAsynchronousReceiverTransmitter:通用异步收发器)(TTL)
UART总线是异步串口,因此一般比前两种同步串口的结构要复杂很多,一般由波特率产生器(产生的波特率等于传输波特率的16倍)、UART接收器、UART发送器组成,硬件上由两根线,一根用于发送,一根用于接收如果用通用IO口模拟UART总线,则需一个输入口RX,一个输出口TX
3.I2C(INTERICBUS)
Inter-IntegratedCircuit(集成电路之间),I2C总线是一种由PHILIPS公司开发的两线式双向串行总线,用于连接微控制器及其外围设备
1.SCL2.SDA串行、多主控(multi-master)接口标准,具有总线仲裁机制,非常适合在器件之间进行近距离、非经常性的数据通信
4.CAN
ControllerAreaNetwork(区域网络控制器),CAN全称为ControllerAreaNetwork,即控制器局域网,由德国Bosch公司最先提出,是国际上应用最广泛的现场总线之一。CAN是一种多主方式的串行通讯总线,基本设计规范要求有高的位速率、高抗电磁干扰性,而且要能够检测出总线的任何错误。当信号传输距离达10Km时CAN仍可提供高达50Kbit/s的数据传输速率。现场总线是当今自动化领域技术发展的热点之一,被誉为自动化领域的计算机局域网。它的出现为分布式控制系统实现各节点之间实时、可靠的数据通信提供了强有力的技术支持。CAN属于现场总线的范畴,它是一种有效支持分布式控制或实时控制的串行通信网络。较之目前许多RS-485基于R线构建的分布式控制系统而言,基于CAN总线的分布式控制系统具有明显的优越性RelevantLink:
1.串行接口
串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口
0x1:定义
0x2:特点
1.数据位的传送,按位顺序进行,最少只需一根传输线即可完成2.成本低但传送速度慢。串行通讯的距离可以从几米到几千米3.根据信息的传送方向,串行通讯可以进一步分为1)单工2)半双工3)全双工三种0x3:接口划分标准
串口通信的两种最基本的方式
1.同步串行通信方式:同步串行是指SPI(SerialPeripheralinterface)的缩写,顾名思义就是串行外围设备接口。SPI总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息2.异步串行通信方式:异步串行是指UART(UniversalAsynchronousReceiver/Transmitter),通用异步接收/发送。UART使一个并行输入成为串行输出的芯片,通常集成在主板上。UART包含1)TTL电平的串口:TTL电平是3.3V的2)RS232电平的串口:RS232是负逻辑电平,它定义+5~+12V为低电平,而-12~-5V为高电平//MDS2710、MDSSD4、EL805等是RS232接口,EL806有TTL接口串行接口按电气标准及协议来分包括RS-232-C、RS-422、RS485等。RS-232-C、RS-422与RS-485标准只对接口的电气特性做出规定,不涉及接插件、电缆或协议
1.RS-232
也称标准串口,最常用的一种串行通讯接口。它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是"数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准"。传统的RS-232-C接口标准有22根线,采用标准25芯D型插头座(DB25),后来使用简化为9芯D型插座(DB9),现在应用中25芯插头座已很少采用RS-232采取不平衡传输方式,即所谓单端通讯。由于其发送电平与接收电平的差仅为2V至3V左右,所以其共模抑制能力差,再加上双绞线上的分布电容,其传送距离最大为约15米,最高速率为20kb/s。RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为3~7kΩ。所以RS-232适合本地设备之间的通信
2.RS-422
标准全称是"平衡电压数字接口电路的电气特性",它定义了接口电路的特性。典型的RS-422是四线接口。实际上还有一根信号地线,共5根线。其DB9连接器引脚定义。由于接收器采用高输入阻抗和发送驱动器比RS232更强的驱动能力,故允许在相同传输线上连接多个接收节点,最多可接10个节点。即一个主设备(Master),其余为从设备(Slave),从设备之间不能通信,所以RS-422支持点对多的双向通信。接收器输入阻抗为4k,故发端最大负载能力是10x4k+100Ω(终接电阻)。RS-422四线接口由于采用单独的发送和接收通道,因此不必控制数据方向,各装置之间任何必须的信号交换均可以按软件方式(XON/XOFF握手)或硬件方式(一对单独的双绞线)实现RS-422的最大传输距离为1219米,最大传输速率为10Mb/s。其平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能达到最大传输距离。只有在很短的距离下才能获得最高速率传输。一般100米长的双绞线上所能获得的最大传输速率仅为1Mb/s
3.RS-485
是从RS-422基础上发展而来的,所以RS-485许多电气规定与RS-422相仿。如都采用平衡传输方式、都需要在传输线上接终接电阻等。RS-485可以采用二线与四线方式,二线制可实现真正的多点双向通信,而采用四线连接时,与RS-422一样只能实现点对多的通信,即只能有一个主(Master)设备,其余为从设备,但它比RS-422有改进,无论四线还是二线连接方式总线上可多接到32个设备RS-485与RS-422的不同还在于其共模输出电压是不同的,RS-485是-7V至+12V之间,而RS-422在-7V至+7V之间,RS-485接收器最小输入阻抗为12kΩ、RS-422是4kΩ;由于RS-485满足所有RS-422的规范,所以RS-485的驱动器可以在RS-422网络中应用RS-485与RS-422一样,其最大传输距离约为1219米,最大传输速率为10Mb/s。平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能使用规定最长的电缆长度。只有在很短的距离下才能获得最高速率传输。一般100米长双绞线最大传输速率仅为1Mb/s
0x4:串口的应用
1.如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位,1个停止位,8个数据位),这时的波特率为240Bd,比特率为10位*240个/秒=2400bps2.如每秒钟传送240个二进制位,这时的波特率为240Bd,比特率也是240bps(但是一般调制速率大于波特率,比如曼彻斯特编码)波特率,可以通俗的理解为一个设备在一秒钟内发送(或接收)了多少码元的数据。它是对符号传输速率的一种度量,1波特即指每秒传输1个码元符号(通过不同的调制方式,可以在一个码元符号上负载多个bit位信息)而比特链是对bit位的度量单位,1比特每秒是指每秒传输1比特(bit)单位"波特"本身就已经是代表每秒的调制数,以"波特每秒"(Baudpersecond)为单位是一种常见的错误
RelevantLink:
2.USB
0x1:软件结构
每个USB只有一个主机,它包括以下几层
1.USB总线接口:USB总线接口处理电气层与协议层的互连2.USB系统:USB系统用主控制器管理主机与USB设备间的数据传输,它与主控制器间的接口依赖于主控制器的硬件定义。同时,USB系统也负责管理USB资源,例如带宽和总线能量,这使得客户访问USB成为可能3.USB客户软件:位于软件结构的最高层,负责处理特定USB设备驱动器。客户程序层描述所有直接作用于设备的软件入口。当设备被系统检测到后,这些客户程序将直接作用于外围硬件0x2:硬件结构
从硬件结构来说,USB系统采用级联星型拓扑(菊花链),该拓扑由三个基本部分组成:主机(Host)、集线器(Hub)和功能设备
1.主机,也称为根、根结点或根Hub,做在计算机主板上或作为适配卡安装在计算机上。主机包含有主控制器和根集线器(RootHub),控制USB总线上数据和控制信息的流动,每个USB系统只能有一个根集线器,它连接在主控制器上2.集线器是USB结构中的特定部分,它提供端口(Port),以便将设备连接到USB接口上,同时检测连接在总线上的设备,并为这些设备提供电源管理,负责总线的故障检测和恢复。3.功能设备通过端口与总线连接0x3:数据传输模式
主控制器负责主机与USB设备间数据流的传输,这些传输数据被当作连续的比特流。每个设备提供了一个或多个可以与客户程序通信的接口,每个接口由0个或多个管道组成,它们分别独立地在客户程序与设备的特定终端间传输数据。通用串行总线驱动程序(USBD)为主机软件的现实需求建立了接口和管道,当提出配置请求时,主控制器根据主机软件提供的参数提供服务USB支持四种基本的数据传输模式:控制传输、等时传输、中断传输、数据块传输。每种传输模式应用到同名终端,则具有不同的性质
对于单片机,微控制器片上系统来说,出于通用性的考虑,一般都采用串口方式进行通信,而我们的编程环境大多支持USB方式通信,因此就需要转接器充当中间人的角色,将USB数据转换为串口可接受的信号。单片机和PC进行串口通信的时候,单片机接收来自PC的串行bit数据流,同时需要模拟生成USB信号流发给PC、而PC接收来自单片机的USB信号流,同时需要利用设备驱动(COM模拟驱动)生成串行bit流发给单片机
需要明白的是,串口只是单片机上其中一个外接引脚,AVR单片机上有十几个不同功能的外接引脚
1.卫星机顶盒升级2.路由器固件升级3.收集系统刷机4.硬盘固件修复5.单片机程序下载1.TTLSerial/UARTs
MostmicrocontrollersthesedayshavebuiltinUARTs(universallyasynchronousreceiver/transmitter)thatcanbeusedtoreceiveandtransmitdataserially.UARTstransmitonebitatatimeataspecifieddatarate(i.e.9600bps,115200bps,etc.).ThismethodofserialcommunicationissometimesreferredtoasTTLserial(transistor-transistorlogic).SerialcommunicationataTTLlevelwillalwaysremainbetweenthelimitsof0VandVcc,whichisoften5Vor3.3V.Alogichigh('1')isrepresentedbyVcc,whilealogiclow('0')is0V.
1.常见的微控制器中(例如arduinounor3),都有了内置的UART(UniversallyAsynchronousReceiver/Transmitter)2.UART可以用来作为串行方式收发数据3.UART是,以固定的某个速率(1200bps、9600bps、115200bps等),一次只能只传输一个bit比特位(所以叫做串行传输)4.这种串行通信的方法,有时候也被叫做TTL(Transistor-TransistorLogic)Serial,因为本质上是通过高低电位的不同状态表示bit位的5.这种串行通信,在TTL级别上来说,对应的物理电平,始终是在0V和Vcc之间,其中常见的Vcc是5V或3.3V1)逻辑高电平=='1'==Vcc2)逻辑低电平=='0'==0V2.RS-232
Theserialportonyourcomputer(ifit'sluckyenoughtohaveone,they'requicklybecomingarelic)complieswiththeRS-232(RecommendedStandard232)telecommunicationsstandard.RS-232signalsaresimilartoyourmicrocontroller'sserialsignalsinthattheytransmitonebitatatime,ataspecificbaudrate,withorwithoutparityand/orstopbits.Thetwodiffersolelyatahardwarelevel.BytheRS-232standardalogichigh('1')isrepresentedbyanegativevoltage–anywherefrom-3to-25V–whilealogiclow('0')transmitsapositivevoltagethatcanbeanywherefrom+3to+25V.OnmostPCsthesesignalsswingfrom-13to+13V.ThemoreextremevoltagesofanRS-232signalhelptomakeitlesssusceptibletonoise,interference,anddegradation.ThismeansthatanRS-232signalcangenerallytravellongerphysicaldistancesthantheirTTLcounterparts,whilestillprovidingareliabledatatransmission.
1.台式机,笔记本等中的串口,是和RS232(通信标准)所兼容的(所一致的)=>不是和TTL的标准所一致的,即通过正负电压来传输bit位3.RS-232和TTL的区别
对于同样传输0b01010101来说,RS232和TTL的时序对比
1.RS232和TTL在软件协议层面是一样的2.RS232的标准中,和微控制器中的串行信号是一样的,有1)一次只传输一个bit比特位->表示是serial2)以某个固定的速率去传输的->baudrate3)带或不带,parity极性->即校验位4)带或不带,停止位stopbit(s)3.RS232和TTL唯一不同在于硬件:电平表示的逻辑含义不同(相反)1)TTL逻辑高电平=='1'==Vcc==3.3V或5V逻辑低电平=='0'==0V==0V2)RS232逻辑高电平=='0'==负电压==-3V~-25V==常为:-13V逻辑低电平=='1'==正电压==3V~25V==常为:13V4.为何RS232中要用负电压表示逻辑高电平,因为此设计(用负电压表示逻辑1,正电压表示逻辑0)相对来说,更加1)抗(外界的电磁)干扰2)抗外界的(电磁信号)噪音干扰3)抗(信号的)衰减4)使得和同样的TTL信号相比,RS232信号可以传输的更远,由此使得信号传输,相对更加稳定和可靠RelevantLink:
3.单片机
单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词:"智能型",如智能型洗衣机等
0x2:应用分类
单片机(Microcontrollers)作为计算机发展的一个重要分支领域,根据发展情况,从不同角度,单片机大致可以分为通用型/专用型、总线型/非总线型及工控型/家电型
1.通用型:这是按单片机(Microcontrollers)适用范围来区分的。例如,80C51式通用型单片机,它不是为某种专门用途设计的2.专用型:针对一类产品甚至某一个产品设计生产的,例如为了满足电子体温计的要求,在片内集成ADC接口等功能的温度测量控制电路3.总线型:这是按单片机(Microcontrollers)是否提供并行总线来区分的。总线型单片机普遍设置有并行地址总线、数据总线、控制总线,这些引脚用以扩展并行外围器件都可通过串行口与单片机连接4.非总线型:许多单片机已把所需要的外围器件及外设接口集成到片内,因此在许多情况下可以不要并行扩展总线,大大减省封装成本和芯片体积,这类单片机称为非总线型单片机5.控制型:这是按照单片机(Microcontrollers)大致应用的领域进行区分的。一般而言,工控型寻址范围大,运算能力强6.专用型:用于家电的单片机多为专用型,通常是小封装、低价格,外围器件和外设接口集成度高上述分类并不是惟一的和严格的。例如,80C51类单片机既是通用型又是总线型,还可以作工控用
0x3:发展历史
单片机(Microcontrollers)诞生于1971年,经历了SCM、MCU、SoC三大阶段,早期的SCM单片机都是8位或4位的。其中最成功的是INTEL的8051,此后在8051上发展出了MCS51系列MCU系统。基于这一系统的单片机系统直到现在还在广泛使用。随着工业控制领域要求的提高,开始出现了16位单片机,但因为性价比不理想并未得到很广泛的应用。90年代后随着消费电子产品大发展,单片机技术得到了巨大提高。随着INTELi960系列特别是后来的ARM系列的广泛应用,32位单片机迅速取代16位单片机的高端地位,并且进入主流市场。而传统的8位单片机的性能也得到了飞速提高,处理能力比起80年代提高了数百倍。高端的32位Soc单片机主频已经超过300MHz,性能直追90年代中期的专用处理器,而普通的型号出厂价格跌落至1美元,最高端的型号也只有10美元当代单片机系统已经不再只在裸机环境下开发和使用,大量专用的嵌入式操作系统被广泛应用在全系列的单片机上。而在作为掌上电脑和手机核心处理的高端单片机甚至可以直接使用专用的Windows和Linux操作系统
4.BootLoader
1.引导加载程序。包括固化在固件(firmware)中的boot代码(可选),和BootLoader两大部分2.Linux内核。特定于嵌入式板子的定制内核以及内核的启动参数3.文件系统。包括根文件系统和建立于Flash内存设备之上文件系统。通常用ramdisk来作为rootfs。4.用户应用程序。特定于用户的应用程序。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式GUI有:MicroWindows和MiniGUI等通常,BootLoader是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的BootLoader几乎是不可能的。尽管如此,我们仍然可以对bootloader归纳出一些通用的概念来,以指导用户特定的BootLoader设计与实现
0x1:操作模式
1.自启动模式:在这种模式下,bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入2.交互模式:在这种模式下,目标机上的bootloader将通过串口或网络等通行手段从开发主机(Host)上下载内核映像等到RAM中。可以被bootloader写到目标机上的固态存储媒质中,或者直接进入系统的引导。也可以通过串口接收用户的命令0x2:启动过程
Bootloader启动大多数都分为两个阶段
4.1Redboot4.2ARMboot4.3U-Boot4.4Blob4.5Bios-lt4.6Bootldr4.7vivi4.8DSP的BootLoader0x4:arduinobootloader
在arduino的板子上,作为核心的avr单片机往往都会烧录一个bootloader,这个叫做bootloader的东东其实是arduino研发团队针对arduino板子开发的一小段代码,借助于这段代码,我们可以在不用外部烧录工具的情况下来把我们自己的代码下载到AVR单片机中。为了使一些朋友更容易理解,不妨打个比方,bootloader类似于我们电脑中的windows操作系统,而我们的代码则类似于运行于windows上的各种程序一般而言,arduino板的卖家都会把每块板的bootloader都烧好后再出售,这样买家直接收到板后就能够把自己在arduinoIDE中编写的程序借助PC的USB口来下载到arduino单片机内
类比于操作系统的本质作用是驱动硬件,完成上层应用的需求,对于单片机的bootloader也一样,不同的bootloader具备不同的能力,例如机器人和自动工控设备、模拟键盘上的bootloader肯定是不一样的,这可以理解为bootloader内核提供了不同的系统调用接口0x5:Bootloader的各个版本
0x6:Bootloader运行原理
ArduinoIDE菜单里的"BurnBootloader"命令使用的是一款开源工具:avrdude,共有4步
1.解锁芯片上的Bootloader区2.设置芯片的熔丝位3.下载Bootloader程序到芯片上4.锁住芯片上的Bootloader区这些步骤由Arduino配置文件中的一些设置决定,以ATmega8为例,决定以上步骤的设置是
1.bootloader.atmega8.programmer(默认:stk500):bootloader使用的协议2.bootloader.atmega8.unlock_bits(默认:0xFF)为解锁Bootloader区而向ATmega8锁位写入的值3.bootloader.atmega8.high_fuses(默认:0xca)写入Atmega8熔丝位中的高位值4.bootloader.atmega8.low_fuses(默认:0xdf)写入Atmega8熔丝位中的低位值5.bootloader.atmega8.path(默认:bootloader)包含编译好的bootloader路径(相对于Arduino的安装目录)6.bootloader.atmega8.file(默认:ATmegaBOOT.hex)编译好的Bootloader文件名(在bootloader.path目录里)7.bootloader.atmega8.lock_bits(默认:0x0F)锁住Bootloader区时向Arduino锁位写的值(这样Bootloader才不会被新上传的程序覆盖)ATmegaBOOT.c
5.PWM(脉宽调制PulseWidthModulation)
0x1:分类
随着电子技术的发展,出现了多种PWM技术,其中包括
0x2:原理(冲量守恒原理)
0x3:优点
1.PWM的一个优点是从处理器到被控系统信号都是数字形式的,无需进行数模转换。让信号保持为数字形式可将噪声影响降到最小。噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,也才能对数字信号产生影响2.对噪声抵抗能力的增强是PWM相对于模拟控制的另外一个优点,而且这也是在某些时候将PWM用于通信的主要原因。从模拟信号转向PWM可以极大地延长通信距离。在接收端,通过适当的RC或LC网络可以滤除调制高频方波并将信号还原为模拟形式3.PWM既经济、节约空间、抗噪性能强,是一种值得广大工程师在许多设计应用中使用的有效技术RelevantLink:
6.EEPROM
EEPROM(ElectricallyErasableProgrammableRead-OnlyMemory),电可擦可编程只读存储器,一种掉电后数据不丢失的存储芯片。EEPROM可以在电脑上或专用设备上擦除已有信息,重新编程。一般用在即插即用EEPROM(带电可擦写可编程只读存储器)是用户可更改的只读存储器(ROM),其可通过高于普通电压的作用来擦除和重编程(重写)。不像EPROM芯片,EEPROM不需从计算机中取出即可修改。在一个EEPROM中,当计算机在使用的时候可频繁地反复编程,因此EEPROM的寿命是一个很重要的设计考虑参数。EEPROM是一种特殊形式的闪存,其应用通常是个人电脑中的电压来擦写和重编程EEPROM一般用于即插即用(Plug&Play),常用在接口卡中,用来存放硬件设置数据,也常用在防止软件非法拷贝的"硬件锁"上面
0x1:基本原理
由EPROM操作的不便,后来出的主板上BIOSROM芯片大部分都采用EEPROM(ElectricallyErasableProgrammableROM,电可擦除可编程ROM)。EEPROM的擦除不需要借助于其它设备,它是以电子信号来修改其内容的,而且是以Byte为最小修改单位,不必将资料全部洗掉才能写入,彻底摆脱了EPROMEraser和编程器的束缚。EEPROM在写入数据时,仍要利用一定的编程电压,此时,只需用厂商提供的专用刷新程序就可以轻而易举地改写内容,所以,它属于双电压芯片。借助于EEPROM芯片的双电压特性,可以使BIOS具有良好的防毒功能,在升级时,把跳线开关打至"on"的位置,即给芯片加上相应的编程电压,就可以方便地升级;平时使用时,则把跳线开关打至"off"的位置,防止CIH类的病毒对BIOS芯片的非法修改。所以,至今仍有不少主板采用EEPROM作为BIOS芯片并作为自己主板的一大特色
7.LCD1602
0x1:显示原理
通过电压来改变填充在两块平行板之间的液晶材料内部分子的排列状况,以达到遮光和透光的目的来显示深浅不一,错落有致的图象,而且只要在两块平板间再加上三元色的滤光层,就可实现显示彩色图象。液晶是具有流动特性的物质,所以只需外加很微小的力量即可使液晶分子运动,以最常见普遍的向列型液晶为例,液晶分子可轻易的借着电场作用使得液晶分子转向,由于液晶的光轴与其分子轴相当一致,故可借此产生光学效果,而当加于液晶的电场移除消失时,液晶将借着其本身的弹性及黏性,液晶分子将十分迅速的回撤消来未加电场前的状态
0x2:显示特点
1.显示质量高:由于1602LCD每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,画质高且不会闪烁2.数字式接口:1602液晶屏都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便3.体积小、重量轻:1602液晶模块通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示屏要轻得多4.功耗低:相对而言,1602液晶显示屏的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示屏要少得多0x3:电路图
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如下表所示:
1602液晶模块引脚说明:
第1脚:VSS为地电源。第2脚:VDD接5V正电源第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生"鬼影",使用时可以通过一个10K的电位器调整对比度第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令第7~14脚:D0~D7为8位双向数据线第15脚:背光源正极第16脚:背光源负极0x4:指令说明及时序
1602液晶模块内部的控制器共有11条控制指令,如下表所示
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)
指令1:清显示,指令码01H,光标复位到地址00H位置。指令2:光标复位,光标返回到地址00H。指令3:光标和显示模式设置I/D:光标移动方向,高电平右移,低电平左移S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。指令4:显示开关控制。D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:控制光标的开与关,高电平表示有光标,低电平表示无光标B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。指令5:光标或显示移位S/C:高电平时移动显示的文字,低电平时移动光标。指令6:功能设置命令DL:高电平时为4位总线,低电平时为8位总线N:低电平时为单行显示,高电平时双行显示F:低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。指令7:字符发生器RAM地址设置。指令8:DDRAM地址设置。指令9:读忙信号和光标地址BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。指令10:写数据。指令11:读数据。0x5:1602LCD的RAM地址映射及标准字库表
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,下图是1602的内部显示地址(汇编编程思想)
例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如图10-58所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码RelevantLink:
8.蜂鸣器、喇叭
0x1:蜂鸣器
1.电磁式蜂鸣器:电磁式蜂鸣器由振荡器、电磁线圈、磁铁、震动膜片及外壳组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,震动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声2.压电式蜂鸣器:压电式蜂鸣器主要由多谐振荡器、压点蜂鸣片、阻抗匹配器及共鸣箱、外壳组成。有的压电式蜂鸣器外壳上还装有发光二极管。多谐振荡器由晶体管或集成电路构成,当接通电源后(5V~15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声蜂鸣器在电路中用字母"H"或"HA"(旧标准用"FM"、"LB"、"JD"等)表示
0x2:有源蜂鸣器与无源蜂鸣器的区别这里的“源”不是指电源。而是指震荡源。也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K~5K的方波去驱动它有源蜂鸣器往往比无源的贵,就是因为里面多个震荡电路。无源蜂鸣器的优点是:1.便宜,2.声音频率可控,可以做出“多来米发索拉西”的效果。3.在一些特例中,可以和LED复用一个控制口有源蜂鸣器的优点是:程序控制方便0x3:扬声器
喇叭又叫扬声器,是一种十分常用的电声换能器件,在出声的电子电路中都能见到它喇叭的种类繁多,而且价格相差很大。音频电能通过电磁、压电或静电效应,使其纸盆或膜片振动周围空气造成音响。按换能机理和结构分为
1.动圈式(电动式):电动式喇叭具有电声性能好、结构牢固、成本低等优点,应用广泛2.电容式(静电式)3.压电式(晶体或陶瓷)4.电磁式(压簧式)5.电离子式6.气动式喇叭等按声辐射材料分为
1.纸盆式2.号筒式3.膜片式按纸盆形状分圆形、椭圆形、双纸盆和橡皮折环;按工作频率分低音、中音、高音,有的还分成录音机专用、电视机专用、普通和高保真喇叭等;按音圈阻抗分低阻抗和高阻抗;按效果分直辐和环境声等.
0x4:扬声器(喇叭)工作原理
不同的喇叭工作原理是不一样的最常见最典型的是纸盆式喇叭又称为动圈式喇叭它由三部分组成
1.振动系统:包括锥形纸盆、音圈和定心支片等2.磁路系统:包括永义磁铁、导磁板和场心柱等3.辅助系统:包括盆架、接线板、压边和防尘盖等。当处于磁场中的音圈有音频电流通过时,就产生随音频电流变化的磁场,这一磁场和永久磁铁的磁场发生相互作用,使音圈沿着轴向振动,由于喇叭结构简单、低音丰满、音质柔和、频带宽,但效率较低RelevantLink:
9.直流电机(directcurrentmachine)
直流电机(directcurrentmachine)是指能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。它是能实现直流电能和机械能互相转换的电机。当它作电动机运行时是直流电动机,将电能转换为机械能;作发电机运行时是直流发电机,将机械能转换为电能
0x1:组成结构
直流电机的结构应由"定子"和"转子"两大部分组成
1.直流电机运行时静止不动的部分称为定子,定子的主要作用是产生磁场,由机座、主磁极、换向极、端盖、轴承和电刷装置等组成2.运行时转动的部分称为转子,其主要作用是产生电磁转矩和感应电动势,是直流电机进行能量转换的枢纽,所以通常又称为电枢,由转轴、电枢铁心、电枢绕组、换向器和风扇等组成1.定子
1.电枢铁心:电枢铁心是主磁路的主要部分,同时用以嵌放电枢绕组,一般电枢铁心采用由0.5mm厚的硅钢片冲制而成的冲片叠压而成,以降低电机运行时电枢铁心中产生的涡流损耗和磁滞损耗。叠成的铁心固定在转轴或转子支架上。铁心的外圆开有电枢槽,槽内嵌放电枢绕组。2.电枢绕组:电枢绕组的作用是产生"电磁转矩"和"感应电动势",是直流电机进行能量变换的关键部件,所以叫电枢。它是由许多线圈按一定规律连接而成,线圈采用高强度漆包线或玻璃丝包扁铜线绕成,不同线圈的线圈边分上下两层嵌放在电枢槽中,线圈与铁心之间以及上、下两层线圈边之间都必须妥善绝缘。为防止离心力将线圈边甩出槽外,槽口用槽楔固定。线圈伸出槽外的端接部分用热固性无纬玻璃带进行绑扎3.换向器:在直流电动机中,换向器配以电刷,能将外加直流电源转换为电枢线圈中的交变电流,使电磁转矩的方向恒定不变;在直流发电机中,换向器配以电刷,能将电枢线圈中感应产生的交变电动势转换为正、负电刷上引出的直流电动势。换向器是由许多换向片组成的圆柱体,换向片之间用云母片绝缘4.转轴:转轴起转子旋转的支撑作用,需有一定的机械强度和刚度,一般用圆钢加工而成RelevantLink:
10.USB接口芯片
ArduinoUNO上搭载ATmega8U2/ATmega16U2USB接口芯片,其特征包括
11.arduino系列产品
0x1:ArduinoLeonardoatmega328p-pu
ArduinoLeonardo是基于ATmega32u4一个微控制器板。它有20个数字输入/输出引脚(其中7个可用于PWM输出、12个可用于模拟输入),一个16MHz的晶体振荡器,一个MicroUSB接口,一个DC接口,一个ICSP接口,一个复位按钮。它包含了支持微控制器所需的一切,你可以简单地通过把它连接到计算机的USB接口,或者使用AC-DC适配器,再或者用电池来驱动它。Leonardo不同于之前所有的arduino控制器,他直接使用了ATmega32u4的USB通信功能,取消了USB转UART芯片。这使得Leonardo不仅可以作为一个虚拟的(CDC)串行/COM端口,还可以作为鼠标或者键盘连接到计算机。它还有很多不同的地方,我们会在入门页面中介绍
微控制器ATmega32u4工作电压5V输入电压(推荐)7-12V输入电压(限制)6-20V数字I/O引脚20PWM通道7模拟输入通道12每个I/O直流输出能力40毫安3.3V端口输出能力50毫安Flash32KB(ATmega32u4)其中4KB由引导程序使用SRAM2.5KB(ATmega32u4)EEPROM1KB(ATmega32u4)时钟速度16MHz1.电源
ArduinoLeonardo可以通过MicroUSB接口或外接电源供电。电源可以自动被选择外部(非USB)电源可以用AC-DC适配器(wall-wart)或电池。适配器可以插在一个2.1毫米规格中心是正极的电源插座上,以此连接到控制器电源。从电池的信息,可以插在电源连接器的GND和VIN引脚头可以输入6V-20V的外部电源。但是,如果低于7V,5V引脚将提供小于5V的电源,控制板可能会不稳定。如果使用大于12V的电源稳压器可能过热,从而损坏电路板。推荐的范围是7V-12V电源引脚如下
1.VIN使用外接电源(而不是从USB连接或其它稳压电源输入的5V)。可以通过此引脚提供的电压,或者,通过该引脚使用电源座输入的电压2.5V稳压电源是供给电路板上的微控制器和其他组件使用的电源。可以从VIN输入通过板上稳压器,或通过USB或其他5V稳压电源提供3.3V3板上稳压器产生一个3.3V的电源。最大电流为50毫安4.GND接地引脚5.IOREF电压板的I/O引脚工作(连接到板子上的VCC,在Leonardo上为5V)2.存储空间
ATmega32u4具有32KB的Flash(其中4KB被引导程序使用)。它还有2.5KB的SRAM和1KB的EEPROM
3.输入和输出
通过使用pinMode(),digitalWrite(),anddigitalRead()函数,Leonardo上的20个I/O引脚中的每一个都可以作为输入输出端口。每个引脚都有一个20-50千欧的内部上拉电阻(默认断开),可以输出或者输入最大40ma的电流。此外部分引脚还有专用功能
1.UART:0(RX)和1(TX):使用ATmega32U4硬件串口,用于接收(RX)和发送(TX)的TTL串行数据。需要注意的是,Leonardo的Serial类是指USB(CDC)的通信,而引脚0和1的TTL串口使用Serial1类2.TWI:2(SDA)和3(SCL)通过使用Wire库来支持TWI通信3.外部中断:2和3,这些引脚可以被配置4.PWM:3、5、6、9、10、11、13能使用analogWrite()函数支持8位的PWM输出5.SPI:ICSP引脚。能通过使用SPI库支持SPI通信。需要注意的是,SPI引脚没有像UNO连接到任何的数字I/O引脚上,他们只能在ICSP端口上工作。这意味着,如果你的扩展板,没有连接6脚的ICSP引脚,那它将无法工作6.LED:13。有一个内置的LED在数字脚13上,当引脚是高电平事,LED亮,引脚为低电平时,LED不亮4.模拟输入
1.A0~A5、A6~A11(数字引脚4,6,8,9,10,12),Leonardo有12个模拟输入,A0到A11,都可以作为数字I/O口1)引脚A0-A5的位置上与UNO相同2)引脚A6-A11分别是数字I/O引脚4,6,8,9,10和12每个模拟输入都有10位分辨率(即1024个不同的值)。默认情况下,模拟输入量为0-5V,也可以通过AREF引脚改变这个上限2.AREF:模拟输入信号参考电压通过analogReference()函数使用3.Reset:通过置低该线路来复位arduino,通常用在带复位按键的扩展板上5.通信
要让Leonardo与电脑、其他arduino或者其他的微控制器通信,有多种设备。在I/O上ATmega32u4提供了UARTTTL(5V)的通信方式,32u4还允许通过USB在电脑上虚拟COM端口来进行虚拟串行(CDC)通信。这个芯片使用标准的USB串行驱动(在Windows上需要一个.inf文件),可以作为一个全速USB2.0设备。arduino软件包含了一个串口监视器,可以与arduino板子相互发送或者接收简单的数据。当使用USB传输数据时,板子上RX、TXLED会闪烁SoftwareSerial库能让任意的数字I/O口进行串行通信ATmega32u4还支持TWI(I2C)和SPI通信。arduino软件有一个用于简化TWI(I2C)通信的wire库。SPI通信可以使用SPI库Leonardo可以作为鼠标、键盘出现,也可以通过编程来控制这类键盘鼠标输入设备
6.编程
Leonardo可以通过arduino软件来编程,选择Tool>board>ArduinoLeonardo(根据你的控制器型号选择)Leonardo的ATmega32u4芯片烧写了一个引导程序(运行于bootloader上的一个专门用于上传程序的程序,相当于应用层程序,可以把arduino看成一个ring0/1/2/3分层的软硬件架构),使得你可以不通过外部的硬件编程器也可以上传新的程序到Leonardo。bootloader使用AVR109协议通信除此之外,也可以以绕过引导程序,使用外部编程器通过ICSP(在线串行编程)引脚烧写程序(在bootloader损坏的情况下可以采取该方法)
//自动复位和引导程序的启动1.在Leonardo中被设定为在上传时,软件建立连接让控制器复位,从而免去了我们手动按下复位按钮的操作2.当Leonardo作为虚拟(CDC)串行/COM端口以1200波特率运行时,复位功能将被促发,串口也将关闭。此时,处理器会复位,USB连接会断开(即虚拟(CDC)串行/COM端口会断开)3.处理器复位后,引导程序紧接着启动,大概要等待8秒来完成这个过程。引导程序也可以通过按板子上复位按钮来启动//注意当板子第一次通电时,如果有用户程序,他将直接跳转到用户程序区,而不启动bootloaderLeonardo最好的复位处理方式是在上传程序前让arduino软件端试图启动复位功能,而不是你手动点击复位按钮。如果软件没有让控制板自动复位,你也可以通过手动按下复位按钮从而让板子复位运行引导程序
12.ICSP(In-CircuitSerialProgramming在线串行编程)
ICSP是一种编程方法,也就是说是一种烧写手段。这种手段可以在线烧写,即不需要将芯片取下就可以在板子上烧写。而这种烧写方法使用串行的数据。我们熟悉的TI的DSP,一向可以使用JTAG口进行烧写,那就是标准的在线烧写MC的ICSP,使用起来极为方便,应用ICSP进行烧写,只需要使用芯片上的5个脚就可以,其中包括
用ICSP升级PIC以支持新的PIC的ICSPRelevantLink:
13.人体传感器
人体感知器模块是集成度比较高的模块,很多请款不需要单片机就可以独立工作,把这个信号引入单片机是为了以后可以综合控制多种传感器和设备。需要明白的是,程序和硬件部分是此消彼长的关系,硬件复杂,程序就简单,硬件简单,同样的功能热释电效应同压电效应类似,是指由于温度的变化而引起晶体表面荷电的现象。热释电传感器是对温度敏感的传感器。它由陶瓷氧化物或压电晶体元件组成,在元件两个表面做成电极,在传感器监测范围内温度有ΔT的变化时,热释电效应会在两个电极上会产生电荷ΔQ,即在两电极之间产生一微弱的电压ΔV。由于它的输出阻抗极高,在传感器中有一个场效应管进行阻抗变换。热释电效应所产生的电荷ΔQ会被空气中的离子所结合而消失,即当环境温度稳定不变时,ΔT=0,则传感器无输出。当人体进入检测区,因人体温度与环境温度有差别,产生ΔT,则有ΔT输出;若人体进入检测区后不动,则温度没有变化,传感器也没有输出了。所以这种传感器检测人体或者动物的活动传感。由实验证明,传感器不加光学透镜(也称菲涅尔透镜),其检测距离小于2m,而加上光学透镜后,其检测距离可大于7m,程序就会复杂
0x1:基于红外感知
自然界中的一切物体,只要它的温度高于绝对温度(-273℃)就存在分子和原子无规则的运动,其表面就不断地辐射红外线。红外线是一种电磁波,它的波长范围为760nm~1mm,不为人眼所见。红外成像设备就是探测这种物体表面辐射的不为人眼所见的红外线的设备。它反映物体表面的红外辐射场,即温度场对于电力设备,红外检测与故障诊断的基本原理就是通过探测被诊断设备表面的红外辐射信号,从而获得设备的热状态特征,并根据这种热状态及适当的判据,作出设备有无故障及故障属性、出现位置和严重程度的诊断判别
0x2:热释红外人体感知器
热释电效应同压电效应类似,是指由于温度的变化而引起晶体表面荷电的现象。热释电传感器是对温度敏感的传感器。它由陶瓷氧化物或压电晶体元件组成,在元件两个表面做成电极,在传感器监测范围内温度有ΔT的变化时,热释电效应会在两个电极上会产生电荷ΔQ,即在两电极之间产生一微弱的电压ΔV。由于它的输出阻抗极高,在传感器中有一个场效应管进行阻抗变换。热释电效应所产生的电荷ΔQ会被空气中的离子所结合而消失,即当环境温度稳定不变时,ΔT=0,则传感器无输出。当人体进入检测区,因人体温度与环境温度有差别,产生ΔT,则有ΔT输出;若人体进入检测区后不动,则温度没有变化,传感器也没有输出了。所以这种传感器检测人体或者动物的活动传感。由实验证明,传感器不加光学透镜(也称菲涅尔透镜),其检测距离小于2m,而加上光学透镜后,其检测距离可大于7m
14.CMOS
15.HID/BADUSB
BadUSB主要依靠USB驱动器的构建方式,USB通常有一个大容量的可重写的内存芯片(Flash)用于实际的数据存储,以及一个独立的控制器芯片(ATMEGA32U4)。控制芯片实际上是一个低功耗计算机,并且与你的笔记本电脑或台式机一样,它通过从内存芯片加载基本的引导程序(bootloader)来启动,类似于笔记本电脑的硬盘驱动器包含一个隐藏的主引导记录(MasterBootRecord)
可重复编程的外设
USB攻击场景
攻击方式总结
我们从一段简单的程序中逐层向底层分析,弄清我们的程序代码是如何从Flash被调入SRAM内存执行,并通过AtmegaUSB的提供的USB设备驱动API将HID识别码转换为windows可识别的按键消息(I/O请求),最终实现按键效果
0x2:Keyboard.press记录按键信息、Keyboard.release记录按键释放信息
从HID键盘设备的角度来看,我们按下一个键和释放一个键是两个独立的动作,HID会分别记录它们
1.该HID的按键临时存储槽最多只有6个空间,包括打印字符、控制字符、shift这些在内,即一次最多只能传输"同时按下6个键的组合"2.HID通过内置了一个HID识别码映射数组,将键盘上的按键翻译为HID码0x3:sendReport发送HID识别码
intHID_::SendReport(uint8_tid,constvoid*data,intlen){autoret=USB_Send(pluggedEndpoint,&id,1);if(ret<0)returnret;autoret2=USB_Send(pluggedEndpoint|TRANSFER_RELEASE,data,len);if(ret2<0)returnret2;returnret+ret2;}继续往下调用了USB接口芯片的API,C:\ProgramFiles(x86)\Arduino\hardware\arduino\avr\cores\arduino\USBCore.cpp
//SpaceinsendEPu8USB_SendSpace(u8ep){LockEPlock(ep);if(!ReadWriteAllowed())return0;returnUSB_EP_SIZE-FifoByteCount();}//BlockingSendofdatatoanendpointintUSB_Send(u8ep,constvoid*d,intlen){if(!_usbConfiguration)return-1;intr=len;constu8*data=(constu8*)d;u8timeout=250;//250mstimeoutonsendTODOwhile(len){u8n=USB_SendSpace(ep);if(n==0){if(!(--timeout))return-1;delay(1);continue;}if(n>len)n=len;{LockEPlock(ep);//FramemayhavebeenreleasedbytheSOFinterrupthandlerif(!ReadWriteAllowed())continue;len-=n;if(ep&TRANSFER_ZERO){while(n--)Send8(0);}elseif(ep&TRANSFER_PGM){while(n--)Send8(pgm_read_byte(data++));}else{while(n--)Send8(*data++);}if(!ReadWriteAllowed()||((len==0)&&(ep&TRANSFER_RELEASE)))//ReleasefullbufferReleaseTX();}}TXLED1;//lighttheTXLEDTxLEDPulse=TX_RX_LED_PULSE_MS;returnr;}按键信息通过USB模拟COM串口传输到PC中,传入WDFUSB驱动中,之后包装为I/O请求,发送给windows内核
15.Bootloader烧写
首先需要明白的是,这里所谓的对arduino进行bootloader烧写,实际上是在对arduino的主控芯片AtmegaXXX(类似于CPU)进行bootloader烧写,和PC上CPU/内存/硬盘的体系不同,单片机没有那么复杂的存储外设,片上能存储数据和代码的地方只有和主控芯片AtmegaXXX在一起的Flash以及SRAM这些,烧写bootloader的目的类似于早期的DOS操作系统,我们要给一块硬件板子安装最基本的底层代码,用于驱动硬件以及和硬件进行交互,这里的bootloader就相当于这块板子的DOS操作系统一个最最精简的电脑(computer)可以只由主控芯片+晶振器组成
0x1:使用USBASP/USBISP基于ICSP给meta32u4烧写bootloader
usbasp下载线(器),是指利用ATMega8芯片,模拟USB接口、并控制下载过程的一种电路单元,主要适合于AVR系列芯片的程序下载(读写)
驱动安装
安装USBASP驱动
USBASP支持硬件
USBASP编程接口及电路图
用这种方式需要保证USBASP和arduino板子上的接口一一对应,需要注意的,某宝上卖的大多是10pin的usbasp连接线,而arduino上是6pin针头,多出来的3个NC和GND,可以使用ISP10pin转6pin转接器,如果没有转接器,则可以使用杜邦线将arduino板子上的pin口和asp线上的对应接口连接(板子上的iscp的6个针头就是从d0~d13pin口中的其中6个引出来的),这种情况适用于arduinouno的情况,但是在arduinoLeonardoR3上就不适用了,在arduinoLeonardoR3上pin口和iscp并不是复用的,所以如果我们需要使用arduinoLeonardoR3进行接线,需要使用公对母杜邦线进行连接,下图是arduinoLeonardoR3的电路图
正确连线后,选择对应的微处理器型号(我这里选择ATmega32U4),点击RD后会读取arduino中的序列号
选择需要烧写的.hex文件(C:\ProgramFiles(x86)\Arduino\hardware\arduino\avr\bootloaders\caterina\Leonardo-prod-firmware-2012-12-10.hex)后,点击自动
bootloader固件烧写进flash之后,将板子连接到pc上,会提示安装驱动(C:\ProgramFiles(x86)\Arduino\drivers),安装完成后,该板子即可进行片上编程
如果使用arduinouno进行实验,这里需要注意的是,对于不同的板子,不同的CPU,不同的封装方式,其逻辑接线都会发生较大的变化,我们在基于不同板子实验的时候,一定要先详细阅读该板子的使用手册,根据实际的引脚进行接线
mosi<->uno11miso<->uno12sck<->uno13res<->uno105v<->5vgnd<->gndRelevantLink:
这种方式是将arduinouno本身作为一个downloader使用,通过给arduinouno上传一个程序(arduinoasISP),这个arduinouno就具备了烧录器的功能,剩下的就是引脚之间怎么互联的问题了
1.ArduinoISP(arduinouno应用态片上程序,用于将arduino转换为烧录器)
2.atmegaxxu2bootloader
17.USBKeylogger
用开发板实现一个类似hub的东西,一边接收,接码存储后,一边再send出去,想象上去场景应该是你得接触到对方的键盘,然后再他不知情的情况串接进去这个开发板最少应该包含微处理器(CPU),EEPROM(保存代码的flash)、晶振器、USB接口(host和sender)