数据专栏

智能大数据搬运工,你想要的我们都有

科技资讯

科技学院

科技百科

科技书籍

网站大全

软件大全

Leaf是美团基础研发平台推出的一个分布式ID生成服务,名字取自德国哲学家、数学家莱布尼茨的一句话:“There are no two identical leaves in the world.”Leaf具备高可靠、低延迟、全局唯一等特点。目前已经广泛应用于美团金融、美团外卖、美团酒旅等多个部门。具体的技术细节,可参考此前美团技术博客的一篇文章: 《Leaf美团分布式ID生成服务》 。近日,Leaf项目已经在Github上开源: https://github.com/Meituan-Dianping/Leaf ,希望能和更多的技术同行一起交流、共建。
Leaf特性
Leaf在设计之初就秉承着几点要求: 全局唯一,绝对不会出现重复的ID,且ID整体趋势递增。 高可用,服务完全基于分布式架构,即使MySQL宕机,也能容忍一段时间的数据库不可用。 高并发低延时,在CentOS 4C8G的虚拟机上,远程调用QPS可达5W+,TP99在1ms内。 接入简单,直接通过公司RPC服务或者HTTP调用即可接入。
Leaf诞生
Leaf第一个版本采用了预分发的方式生成ID,即可以在DB之上挂N个Server,每个Server启动时,都会去DB拿固定长度的ID List。这样就做到了完全基于分布式的架构,同时因为ID是由内存分发,所以也可以做到很高效。接下来是数据持久化问题,Leaf每次去DB拿固定长度的ID List,然后把最大的ID持久化下来,也就是并非每个ID都做持久化,仅仅持久化一批ID中最大的那一个。这个方式有点像游戏里的定期存档功能,只不过存档的是未来某个时间下发给用户的ID,这样极大地减轻了DB持久化的压力。
整个服务的具体处理过程如下:
Leaf Server 1:从DB加载号段[1,1000]。 Leaf Server 2:从DB加载号段[1001,2000]。 Leaf Server 3:从DB加载号段[2001,3000]。
用户通过Round-robin的方式调用Leaf Server的各个服务,所以某一个Client获取到的ID序列可能是:1,1001,2001,2,1002,2002......也可能是:1,2,1001,2001,2002,2003,3,4......当某个Leaf Server号段用完之后,下一次请求就会从DB中加载新的号段,这样保证了每次加载的号段是递增的。
Leaf数据库中的号段表格式如下: +-------------+--------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +-------------+--------------+------+-----+-------------------+-----------------------------+ | biz_tag | varchar(128) | NO | PRI | | | | max_id | bigint(20) | NO | | 1 | | | step | int(11) | NO | | NULL | | | desc | varchar(256) | YES | | NULL | | | update_time | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | +-------------+--------------+------+-----+-------------------+-----------------------------+
Leaf Server加载号段的SQL语句如下: Begin UPDATE table SET max_id=max_id+step WHERE biz_tag=xxx SELECT tag, max_id, step FROM table WHERE biz_tag=xxx Commit
整体上,V1版本实现比较简单,主要是为了尽快解决业务层DB压力的问题,而快速迭代出的一个版本。因而在生产环境中,也发现了些问题。比如: 在更新DB的时候会出现耗时尖刺,系统最大耗时取决于更新DB号段的时间。 当更新DB号段的时候,如果DB宕机或者发生主从切换,会导致一段时间的服务不可用。
Leaf双Buffer优化
为了解决这两个问题,Leaf采用了异步更新的策略,同时通过双Buffer的方式,保证无论何时DB出现问题,都能有一个Buffer的号段可以正常对外提供服务,只要DB在一个Buffer的下发的周期内恢复,就不会影响整个Leaf的可用性。
这个版本代码在线上稳定运行了半年左右,Leaf又遇到了新的问题: 号段长度始终是固定的,假如Leaf本来能在DB不可用的情况下,维持10分钟正常工作,那么如果流量增加10倍就只能维持1分钟正常工作了。 号段长度设置的过长,导致缓存中的号段迟迟消耗不完,进而导致更新DB的新号段与前一次下发的号段ID跨度过大。
Leaf动态调整Step
假设 服务QPS为Q,号段长度为L,号段更新周期为T ,那么 Q * T = L 。最开始L长度是固定的,导致随着Q的增长,T会越来越小。但是Leaf本质的需求是 希望T是固定的 。那么如果L可以和Q正相关的话,T就可以趋近一个定值了。所以Leaf每次更新号段的时候,根据上一次更新号段的周期T和号段长度step,来决定下一次的号段长度nextStep: T < 15min,nextStep = step * 2 15min < T < 30min,nextStep = step T > 30min,nextStep = step / 2
至此,满足了号段消耗稳定趋于某个时间区间的需求。当然,面对瞬时流量几十、几百倍的暴增,该种方案仍不能满足可以容忍数据库在一段时间不可用、系统仍能稳定运行的需求。因为本质上来讲,Leaf虽然在DB层做了些容错方案,但是号段方式的ID下发,最终还是需要强依赖DB。
MySQL高可用
在MySQL这一层,Leaf目前采取了半同步的方式同步数据,通过公司DB中间件Zebra加MHA做的主从切换。未来追求完全的强一致,会考虑切换到 MySQL Group Replication 。
现阶段由于公司数据库强一致的特性还在演进中,Leaf采用了一个临时方案来保证机房断网场景下的数据一致性: 多机房部署数据库,每个机房一个实例,保证都是跨机房同步数据。 半同步超时时间设置到无限大,防止半同步方式退化为异步复制。
Leaf监控
针对服务自身的监控,Leaf提供了Web层的内存数据映射界面,可以实时看到所有号段的下发状态。比如每个号段双buffer的使用情况,当前ID下发到了哪个位置等信息都可以在Web界面上查看。
Leaf Snowflake
Snowflake,Twitter开源的一种分布式ID生成算法。基于64位数实现,下图为Snowflake算法的ID构成图。
第1位置为0。 第2-42位是相对时间戳,通过当前时间戳减去一个固定的历史时间戳生成。 第43-52位是机器号workerID,每个Server的机器ID不同。 第53-64位是自增ID。
这样通过时间+机器号+自增ID的组合来实现了完全分布式的ID下发。
在这里,Leaf提供了Java版本的实现,同时对Zookeeper生成机器号做了弱依赖处理,即使Zookeeper有问题,也不会影响服务。Leaf在第一次从Zookeeper拿取workerID后,会在本机文件系统上缓存一个workerID文件。即使ZooKeeper出现问题,同时恰好机器也在重启,也能保证服务的正常运行。这样做到了对第三方组件的弱依赖,一定程度上提高了SLA。
未来规划 号段加载优化:Leaf目前重启后的第一次请求还是会同步加载MySQL,之所以这么做而非服务初始化加载号段的原因,主要是MySQL中的Leaf Key并非一定都被这个Leaf服务节点所加载,如果每个Leaf节点都在初始化加载所有的Leaf Key会导致号段的大量浪费。因此,未来会在Leaf服务Shutdown时,备份这个服务节点近一天使用过的Leaf Key列表,这样重启后会预先从MySQL加载Key List中的号段。 单调递增:简易的方式,是只要保证同一时间、同一个Leaf Key都从一个Leaf服务节点获取ID,即可保证递增。需要注意的问题是Leaf服务节点切换时,旧Leaf 服务用过的号段需要废弃。路由逻辑,可采用主备的模型或者每个Leaf Key 配置路由表的方式来实现。
关于开源
分布式ID生成的方案有很多种,Leaf开源版本提供了两种ID的生成方式: 号段模式:低位趋势增长,较少的ID号段浪费,能够容忍MySQL的短时间不可用。 Snowflake模式:完全分布式,ID有语义。
读者可以按需选择适合自身业务场景的ID下发方式。希望美团的方案能给予大家一些帮助,同时也希望各位能够一起交流、共建。
Leaf项目Github地址: https://github.com/Meituan-Dianping/Leaf 。
如有任何疑问和问题,欢迎提交至 Github issues 。
硬件开发
2019-03-08 16:01:00
ssh无法连接到远端Ubuntu的解决方法
2014-10-16 0 个评论 来源:KiteRunner的专栏
收藏 我要投稿
近日,饱受无法远程登录到新安装在VMWare上的Ubuntu虚拟机,如今发现问题所在,故记录此问题的解决方案,以备后用。
一、远程登录虚拟机的准备:
Ubuntu虚拟机的联网方式应该选择Bridged(桥接模式),可以在Ubuntu中配置静态IP,或者使用路由器(自己使用的是WiFi连接,经过无线路由器进行配置)通过DCHP服务器进行IP地址分配(一般配置后不再改变,通过MAC地址识别来分配地址,除非IP地址已经耗尽)。关于VMWare的几种联网方式,可以参考:vmware中的bridge、nat、host-only的区别
关于配置网卡,可在VMWare的Edit->Virtual Network Editor中进行相关配置。
p.s.在Ubuntu系统中,可以使用命令#ifup {interface}和#ifdown {interface}来打开和关闭相关网卡。但是,如果以ifconfig eth0来设置或者是修改了网络接口后,就无法再以ifdown eth0的方式来关闭了。因为ifdown会分析比较目前的网络参数与ifcfg-eth0是否相符,如果不符的话,就会放弃这次操作。因此,使用ifconfig修改完毕后,应该要以ifconfig eth0 down才能够关闭该接口。
二、关于远端主机(Ubuntu)上的一些配置:
必须安装openssh-server软件,这样才可以通过ssh连接到Ubuntu虚拟机。
安装命令:sudo apt-get install openssh-server.
sudo /etc/init.d/ssh restart(重新启动ssh服务)
具体可参考:Ubuntu下安装OpenSSH Server并在客户端远程连接Ubuntu
现在,安装好openssh-server后,可以运行命令:netstat -an | grep 22 或 ps -e |grep ssh
查看22端口是否处于LISTEN状态或ssh服务是否已经运行,如果是,则说明Ubuntu主机上的ssh已经配置好了。
三、XShell连接到远端主机Ubuntu:
依照提示,逐步配置,端口号选择22,进行个性化配置后,即可进行远程登录。
p.s.
1、为了在xshell中正常的显示中文,我们要把xshell编码方式改成utf8。具体操作为:
[file]–>[open]–>在打开的session中选择连接,点击[properties] -> [Terminal ] ,在右边的translation先选择utf8,然后重新连接服务器即可。
2、如何将windwos上的文件传输到虚拟机上的linux 上
法一:
输入rz –help
如果出现程序“rz”尚未安装。 您可以使用以下命令安装:
sudo apt-get install lrzsz
切换到你要存放文件的目录
File->Transfer->Send ZMODEM,出现一个对话框,选择你要传输的文件就可以了。
法二:
使用pscp(putty的一个绑定程序)来实现文件传输。
另外,个人谈谈采用远程登录方法的一些好处:
1、可以个性化配置终端;
2、虚拟机不必运行在图形界面;
3、操作简单,如同在系统终端上操作一样;
4、传输文件很简单,另外,可以使用粘贴复制,这是很方便的。

附: Fire this command: sudo iptables -L
If you see that no traffic is allowed (i.e. no specific rules), then run the following command: sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
this command tells the system to allow incoming connections to port 22...and usually should solve your dilemma, specifically for ssh / sshd .
UPDATED as of July 31,2016: iptables have nothing to do with ssh as an application, but on other hand, functions as router in allow the traffic to port 22. When using iptables, the system actually understand 'ssh' however, it's a shortcut within command line but, really, it's actually iptables INPUT -p udp -dport 22 while --dport means "destination port" (ssh uses port 22). This probably caused some misconception on seeing 'ssh' as if it's an appication, but really '22' as port.
硬件开发
2016-12-03 14:46:00
单反相机具有强大的拍照能力,但内置的控制软件主要面向交互操作,对于长时间摄影(如延时摄影/视频合成/HDR/Focus Stack/多幅拼接等等高级技术)的一些操作不太方便,可以使用树莓派做一个
gPhoto2是一个免费软件,提供了在类Unix系统上通过终端来控制数码相机的功能,开发队伍来自世界各地的自愿者,现在已支持超过1700多 款机型。可以运行在Linux, FreeBSD, NetBSD, MacOS X等系统上。同时在大部分发行版的软件仓库中都有。通过Picture Transfer Protocol (PTP) 协议来和相机通讯。
1、安装
  树莓派的系统是基于Debain系统,直接用apt安装。   apt-get install gphoto2
  将相机用USB线与树莓派连接,最好使用有源的USB HUB,以免供电不足,打开相机电源,在树莓派中输入lsusb,可以看到有“Nikon Corp.”的设备,这就是我们的相机了。别的相机,可以通过–list-cameras来查看所支持的相机型号 gphoto2 –list-cameras | grep D3100 返回: “Nikon DSC D3100 (PTP mode)”
2、部分常用指令
-a 查看相机所支持的功能。
-L 查看相机上照片列表和照片ID。
-p 1-10 获取指定ID范围的照片到当前目录,1~10张。
-P 获取所有照片到当前目录。
-d 1-10 删除指定范围的照片。
-D 删除所有照片。
–capture-image 拍照。
–capture-image-and-download 拍照后传到树莓派上。
-F COUNT 拍摄张数。
-I SECONDS 拍摄多张照片时的间隔时间(秒)。
这三个参数组合起来就可以拍摄 Timelapse 了。
例如:gphoto2 –capture-image -I 30 -F 60
更多可以参考官方文档: http://gphoto.sourceforge.net/doc/manual/ref-gphoto2-cli.html
硬件开发
2015-03-27 14:46:00
ufw是一个主机端的iptables类防火墙配置工具,比较容易上手。如果你有一台暴露在外网的树莓派,则可通过这个简单的配置提升安全性。
安装方法 sudo apt-get install ufw
当然,这是有图形界面的(比较简陋),在新立得里搜索gufw试试……
使用方法
启用 sudo ufw enable sudo ufw default deny
作用:开启了防火墙并随系统启动同时关闭所有外部对本机的访问(本机访问外部正常)。
关闭
sudo ufw disable
查看防火墙状态
sudo ufw status
开启/禁用相应端口或服务举例
sudo ufw allow 80 允许外部访问80端口sudo ufw delete allow 80 禁止外部访问80 端口sudo ufw allow from 192.168.1.1 允许此IP访问所有的本机端口sudo ufw deny smtp 禁止外部访问smtp服务sudo ufw delete allow smtp 删除上面建立的某条规则ufw deny proto tcp from 10.0.0.0/8 to 192.168.0.1 port 要拒绝所有的流量从TCP的10.0.0.0/8 到端口22的地址192.168.0.1
可以允许所有RFC1918网络(局域网/无线局域网的)访问这个主机(/8,/16,/12是一种网络分级): sudo ufw allow from 10.0.0.0/8sudo ufw allow from 172.16.0.0/12sudo ufw allow from 192.168.0.0/16
推荐设置 sudo apt-get install ufw sudo ufw enable sudo ufw default deny
这样设置已经很安全,如果有特殊需要,可以使用sudo ufw allow开启相应服务。
硬件开发
2015-03-27 09:49:00
TB-01 智能照明模块是一款基于 EP2S12F40 芯片设计的符合蓝牙 4.2 低功耗SIGE MESH 的蓝牙模块;该模块 支持天猫精灵直接控制且拥有蓝牙 mesh 组网
功能的蓝牙模块;设备之间通过对等星型网络通讯,采用蓝牙广播进行通讯,可保证多设备情况下响应及时,它主要应用于智能灯控。可满足低功耗、低延
时、近距离无线数据通信的要求;
产品特点
无需网关即可直接被天猫精灵控制
2.0mm 间距插针立式焊接封装
2 路正白暖白 PWM 输出
自带板载天线,无需设计天线
亮度(占空比)调整范围 5%-100%
出厂默认冷色暖色占空比各 50%
PWM 输出频率 1KHz
互补功率输出:1+1=1.5
带小夜灯功能
带墙壁开关切色温功能
产品应用
 智能灯控系统
 家庭/楼宇自动化
 家用电器无线网络控制
 工业控制
 低功耗无线传感器网络
模块热线:13632658391/2355239041 刘生
硬件开发
2020-01-10 17:09:00
IN612L-MA模块支持蓝牙5.0协议及2.4G私有协议,该模块体积小,功能齐全,支持1主25从,或者多主多从模块,支持AT透传命令的应用
IN612L是Inplay公司的SwIFtRADIO TM SOC产品系列之一,具有多模协同2.4G无线协议栈,支持2.4G私有协议栈以及蓝牙5.0全协议栈的SOC芯片;如2mbps高数据速率模式,125kbps/500kbps编码物理速率支持,以及扩展的广告功能。用户定义的SDR协议栈(2.4G协议栈)及其内置的Bluetooth 5协议栈可以同时运行,因此可以很好地解决和优化许多复杂的网络应用。
该模块内置32bitARM Cortex-M4F CPU 支持浮点运算;内部包含256Krom,512K Flash以及64KB SRAM,SRAM可以用作复杂算法和应用的用户数据空间

该芯片内部增加数字加速引擎,加密模块,语言处理模块, 数字加速引擎最多能处理16*16矩阵运算,支持矩阵加,减,乘,除等多种运算, 加密模块可以为客户提供更好的加密算法支持AES128,AES256,SHA-1,SHA-2和ECC加密功能,以及内部有唯一ID号,语言处理模块支持1:4语言压缩跟解压,支持PDM及I2S输出
主要特点
•多模式协作协议栈
-蓝牙5-完全兼容蓝牙5规范
-高数据速率支持高达2 Mbps
-远程支持(125Kbps/500Kbps】
-广告推广支持
-软件无线电
-灵活的RX/TX使能控制
-低功耗设计的事件触发模式
-真正的双向
-同时支持蓝牙5操作
•CPU和内存
-ARM Cortex-M4F高达64MHz,带i-cache
-256KB ROM(引导加载程序和软件堆栈)
64KB存储器
-1Kb eFuse内存(制造商ID、安全密钥
储存)
-512KB闪存(堆叠,支持XIP模式)
-空中更新(OTA)支持
-SWD调试接口
•收音机
-2.4GHz收发器,蓝牙5兼容
-接收灵敏度–104.5 dBm@125Kbps
-接收灵敏度–97.5 dBm@1Mbps
-接收灵敏度–94.5 dBm@2 Mbps
Tx输出0dBm,6.5mA,最高+3 dBm
-Rx 7毫安
-125Kbps时107.5db的链路预算
-医疗无线电频段支持(2360MHz~2400MHz)
•外设
高达10个GPIO-
1个I2C,主/从时钟高达400 kHz
-支持1个SPI主机
-2 UART高达2兆赫
-2个专用PWMs-1个I2S主设备和1个I2S从设备,双向支持
•电源模式
-深度睡眠模式500nA,32KHz RC开启
-关机模式<20nA
•PMU
-集成DCDC降压变换器
-1.8-3.6V输入
16.26mm*15.49mm
模块功能引脚
典型应用
•物联网应用
-智能家居自动化、智能照明
-工业物联网
-可穿戴设备,玩具,
-资产跟踪管理
-智能零售应用
-连接的设备、锁
•智能电视遥控器
-智能电视语音遥控器
硬件开发
2020-01-10 17:07:00

everspin 提供了8/16-bit的DDR4-1333MT/s(667MHz)接口,但与较旧的基于DDR3的MRAM组件一样,时序上的差异使得其难以成为DRAM(动态随机存取器)的直接替代品。

最新的1Gb容量STT-MRAM扩大了MRAM的吸引力,但Everspin仍需努力追赶DRAM的存储密度。

低容量的特性,使得MRAM组件更适用于嵌入式系统,其中SoC和ASIC可更容易地设计兼容的DDR控制器。

目前行业内已通过MRAM来部分替代DRAM,比如IBM就在去年推出了Flash Core模块,以及希捷在FMS2017上展示的原型。


当然我们并不指望 mram 专用存储设备可以迅速在市面上普及(SSD或NVDIMM)。毕竟市面上的混合型SSD,仍依赖于NAND闪存作为主要存储介质。

作为与格罗方德合作生产的第二款分立型MRAM器件,他们还在GloFo的22nmFD-SOI工艺路线图中嵌入了MRAM。

鉴于该工厂取消了7nm和更低制程的计划,包括嵌入式内存在内的特殊工艺对其未来显然至关重要。

需要指出的是,尽管Everspin不是唯一一家致力于MRAM技术的公司,但它们却是分立式MRAM器件的唯一供应商。Everspin在磁存储器设计,制造和交付到相关应用中的知识和经验在半导体行业中是独一无二的。Everspin拥有超过600项有效专利和申请的知识产权产品组合,在平面内和垂直磁隧道结(MTJ)STT-MRAM位单元的开发方面处于市场领先地位。
硬件开发
2020-02-19 14:57:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
简介
加速计它可以在倾斜检测应用中测量静态重力加速度,还可以测量运动或冲击导致的动态加速度
主要功能 单振、双振检测 横屏、竖屏检测 唤醒检测 活动、非活动检测 自由落体检测 计步 大动作检测
单振、双振
敲击检测功能可以检测任意方向的单振和双振动作
横屏、竖屏
用于检测手机手持状态
活动、非活动
活动和非活动检测功能通过比较任意轴上的加速度与用户设置的阈值来检测有无运动发生
自由落体
自由落体检测功能可以检测器件是否正在掉落
计步
内部引擎完成行走步数累计
基本硬件参数 温度范围 -40°C -- +85°C 高分辨模式 high-resolution (HR)/high-frequency mode (HF) ** 150uA ** 低功耗模式 low-power (LP) mode **< 80uA ** 检测范围 ±2/±4/±8/±16 g 输出数率 1 Hz -- 6400 Hz
Power-down
内嵌功能 计步 计步功能工作在25Hz,ODR配置必须 >= 25Hz 内置温度传感器
输出数率固定 12.5Hz
出厂测试 Self-test
参考
ADXL345
Linux驱动
硬件开发
2016-08-15 11:04:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
Banana pi BPI-M64搭载全志 A64 1.2 Ghz四核ARM Cortex A53 64位处理器, GPU采用双核500MHz Mali-400 MP2,具有的1.1 gpixel的吞吐量,让其图形能力远高于X-Box的性能水平
banana pi BPI-M64由最新的64位四核ARM A53 CPU供电,可提供比其他同行的32位开源开发板高出20%~30%的性能.
BPI-M64 主要配置亮点:
*64 位四核 ARM Cortex A53 1.2 Ghz CPU
*Dual core Mali 400 MP2 GPU
*板载2G DDR3内存
* MicroSD卡座,可以从TF卡启动系统
* 板载8G eMMC flash,系统可以烧录到eMMC,从eMMC启动
* 板载WIFI与蓝牙
* 支持IR遥控,2USB接口
* 支持1000M网口
* 支持Linux和Android 6.0系统
硬件接口:
规格书:
更多资料,请看gitbook 在线文档:
https://bananapi.gitbooks.io/bpi-m64/content/en/

硬件开发
2016-07-12 19:43:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
不想详细说了,直接甩代码!里面乱码的先不用管,kell编辑器惹的祸
KEY_LED.c文件: /** ****************************************************************************** * @file KEY_LED.c * @author fire * @version V1.0 * @date 2016-06-11 * @brief °´¼ü¿ØÖÆled ****************************************************************************** * @attention **/ #include "stm32f10x.h" void setDelay(__IO uint32_t nCount) //¼òµ¥µÄÑÓʱº¯Êý { for(; nCount != 0; nCount--); } void setGPIO(GPIO_TypeDef * GP,uint16_t IO,int TYPE){ switch(TYPE){ case 0:GP->BRR=IO; break; case 1:GP->BSRR=IO; break; case 2:GP->ODR ^=IO; break; default:break; } } void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure;//¶¨ÒåÒ»¸öGPIO_InitTypeDefÀàÐ͵ĽṹÌå RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE); //¿ªÆôGPIOFµÄÍâÉèʱÖÓ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//ÉèÖÃÒý½ÅģʽΪͨÓÃÍÆÍìÊä³ö GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //ÉèÖÃÒý½ÅËÙÂÊΪ50MHz GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//Ñ¡ÔñÒª¿ØÖƵÄGPIOFÒý½Å GPIO_Init(GPIOF,&GPIO_InitStructure);//µ÷Óÿ⺯Êý£¬³õʼ»¯GPIO_Pin_All setGPIO(GPIOF,GPIO_Pin_All,0);//¹Ø±ÕËùÓÐledµÆ } void KEY_Init(void) //IO³õʼ»¯ { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOC,ENABLE);//ʹÄÜPORTDʱÖÓ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;//PC13 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //ÉèÖóÉÉÏÀ­ÊäÈë GPIO_Mode_IPU/GPIO_Mode_IPD GPIO_Init(GPIOC,&GPIO_InitStructure);//³õʼ»¯GPIOE0 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PE0 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //ÉèÖóÉÉÏÀ­ÊäÈë GPIO_Mode_IPU/GPIO_Mode_IPD GPIO_Init(GPIOE,&GPIO_InitStructure);//³õʼ»¯GPIOE0 } int scanKey(){ int key1=GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0); int key2=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13); if(key1==0&&key2==0){ setDelay(0x000100);//È¥¶¶¶¯ if(key1==0&&key2==0){ return 3; } return 0; }else if(key1==0||key2==0){ setDelay(0x000100);//È¥¶¶¶¯ if(key1==0){return 1;} else{ return 2; } }else{ return 0;// ÎÞ°´¼ü°´Ï } } void key_led(int key){ __IO uint32_t delaytime=0x030000; /* ·½·¨2£¬Ê¹Óù̼þ¿â¿ØÖÆIO */ if(key==1){ setGPIO(GPIOF,GPIO_Pin_0,2); //±ä»»×´Ì¬ setGPIO(GPIOF,GPIO_Pin_7,2); setDelay(delaytime*3); setGPIO(GPIOF,GPIO_Pin_1,2); setGPIO(GPIOF,GPIO_Pin_6,2); setDelay(delaytime*3); setGPIO(GPIOF,GPIO_Pin_2,2); setGPIO(GPIOF,GPIO_Pin_5,2); setDelay(delaytime*3); setGPIO(GPIOF,GPIO_Pin_3,2); setGPIO(GPIOF,GPIO_Pin_4,2); setDelay(delaytime*3); }else if(key==2){ setGPIO(GPIOF,GPIO_Pin_4,2); //±ä»»×´Ì¬ setGPIO(GPIOF,GPIO_Pin_3,2); setDelay(delaytime*3); setGPIO(GPIOF,GPIO_Pin_5,2); setGPIO(GPIOF,GPIO_Pin_2,2); setDelay(delaytime*3); setGPIO(GPIOF,GPIO_Pin_6,2); setGPIO(GPIOF,GPIO_Pin_1,2); setDelay(delaytime*3); setGPIO(GPIOF,GPIO_Pin_7,2); setGPIO(GPIOF,GPIO_Pin_0,2); setDelay(delaytime*3); }else if(key==3){ setGPIO(GPIOF,GPIO_Pin_All,2); setDelay(delaytime); }else{ setGPIO(GPIOF,GPIO_Pin_0,2); //±ä»»×´Ì¬ setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_1,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_2,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_3,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_4,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_5,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_6,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_7,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_0,2); //±ä»»×´Ì¬ setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_1,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_2,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_3,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_4,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_5,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_6,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_7,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_7,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_6,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_5,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_4,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_3,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_2,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_1,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_0,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_7,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_6,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_5,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_4,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_3,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_2,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_1,2); setDelay(delaytime); setGPIO(GPIOF,GPIO_Pin_0,2); setDelay(delaytime); } }
KEY_LED.h文件,之前使用AVR都是可以直接include点C文件的,这个好像不行,还必须自己弄个点h文件过度 #include "stm32f10x.h" void setDelay(__IO uint32_t nCount); //¼òµ¥µÄÑÓʱº¯Êý void setGPIO(GPIO_TypeDef * GP,uint16_t IO,int TYPE); void LED_Init(void); void KEY_Init(void); //IO³õʼ»¯ int scanKey(void); void key_led(int key);
main.c文件,带有执行入口的哦! #include "stm32f10x.h" #include "KEY_LED.h" #include int main(void) { int key=0,flag=0; LED_Init(); KEY_Init(); NVIC_Configuration(); while(1){ key=scanKey(); if(key==1)flag=1; if(key==2)flag=2; if(key==3)flag=3; key_led(flag); } }
硬件开发
2016-06-30 01:55:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
本文采用UBUNTU 16.04,全程需要联网
首先,需要安装如下库或者工具。 gcc, binutils, bzip2, flex, python, perl, make, find, grep, diff, unzip, gawk, getopt, subversion, libz-dev and libc headers
执行如下脚本 sudo apt-get install gcc sudo apt-get install g++ sudo apt-get install binutils sudo apt-get install patch sudo apt-get install bzip2 sudo apt-get install flex sudo apt-get install bison sudo apt-get install make sudo apt-get install autoconf sudo apt-get install gettext sudo apt-get install texinfo sudo apt-get install unzip sudo apt-get install sharutils sudo apt-get install subversion sudo apt-get install libncurses5-dev sudo apt-get install ncurses-term sudo apt-get install zlib1g-dev sudo apt-get install gawk sudo apt-get install asciidoc sudo apt-get install libz-dev sudo apt-get install openssl sudo apt-get install libssl-dev sudo apt-get install libp11-kit-dev
执行过之后,基础环境就算ok了。然后下载源码。解压。进入源码目录 ./scripts/feeds update -a 更新软件包 ./scripts/feeds install -a 安装软件包
然后配置文件,这个是定制目标路由器的功能或者硬件信息的 make menuconfig
最后编译 make V=99


刚买了一个wrtnode开发板,有兴趣的盆友一起研究下呗
硬件开发
2016-05-16 10:49:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
RAID——Redundant Array of Independent Disks(独立硬盘冗余阵列)
目前分为几种级别:Raid0、Raid1、Raid5、Raid10、Raid01
Raid0
定义:
RAID 0又称为Stripe或Striping,它代表了所有RAID级别中最高的存储性能。RAID 0提高存储性能的原理是把连续的数据分散到多个磁盘上存取,这样,系统有数据请求就可以被多个磁盘并行的执行,每个磁盘执行属于它自己的那部分数据请求。这种数据上的并行操作可以充分利用总线的带宽,显著提高磁盘整体存取性能。
工作原理:
系统向三个磁盘组成的逻辑硬盘(RAID0 磁盘组)发出的I/O数据请求被转化为3项操作,其中的每一项操作都对应于一块物理硬盘。通过建立RAID 0,原先顺序的数据请求被分散到所有的三块硬盘中同时执行。从理论上讲,三块硬盘的并行操作使同一时间内磁盘读写速度提升了3倍。 但由于总线带宽等多种因素的影响,实际的提升速率肯定会低于理论值,但是,大量数据并行传输与串行传输比较,提速效果显著显然毋庸置疑。
优缺点:
读写性能是所有RAID级别中最高的。
RAID 0的缺点是不提供数据冗余,因此一旦用户数据损坏,损坏的数据将无法得到恢复。RAID0运行时只要其中任一块硬盘出现问题就会导致整个数据的故障。一般不建议企业用户单独使用。
总结:
磁盘空间使用率:100%,故成本最低。
读性能:N*单块磁盘的读性能
写性能:N*单块磁盘的写性能
冗余:无,任何一块磁盘损坏都将导致数据不可用。

RAID1
定义:
RAID 1通过磁盘数据镜像实现数据冗余,在成对的独立磁盘上产生互为备份的数据。当原始数据繁忙时,可直接从镜像拷贝中读取数据,因此RAID 1可以提高读取性能。RAID 1是磁盘阵列中单位成本最高的,但提供了很高的数据安全性和可用性。当一个磁盘失效时,系统可以自动切换到镜像磁盘上读写,而不需要重组失效的数据。
工作原理:
RAID1是将一个两块硬盘所构成RAID磁盘阵列,其容量仅等于一块硬盘的容量,因为另一块只是当作数据“镜像”。RAID1磁盘阵列显然是最可靠的一种阵列,因为它总是保持一份完整的数据备份。它的性能自然没有RAID0磁盘阵列那样好,但其数据读取确实较单一硬盘来的快,因为数据会从两块硬盘中较快的一块中读出。RAID1磁盘阵列的写入速度通常较慢,因为数据得分别写入两块硬盘中并做比较。RAID1磁盘阵列一般支持“热交换”,就是说阵列中硬盘的移除或替换可以在系统运行时进行,无须中断退出系统。RAID1磁盘阵列是十分安全的,不过也是较贵一种RAID磁盘阵列解决方案,因为两块硬盘仅能提供一块硬盘的容量。RAID1磁盘阵列主要用在数据安全性很高,而且要求能够快速恢复被破坏的数据的场合。
在这里,需要注意的是,读只能在一块磁盘上进行,并不会进行并行读取,性能取决于硬盘中较快的一块。写的话通常比单块磁盘要慢,虽然是并行写,即对两块磁盘的写入是同时进行的,但因为要比较两块硬盘中的数据,所以性能比单块磁盘慢。
优缺点:
RAID1通过硬盘数据镜像实现数据的冗余,保护数据安全,在两块盘上产生互为备份的数据,当原始数据繁忙时,可直接从镜像备份中读取数据,因此RAID1可以提供读取性能。
RAID1是硬盘中单位成本最高的,但提供了很高的数据安全性和可用性,当一个硬盘失效时,系统可以自动切换到镜像硬盘上读/写,并且不需要重组失效的数据。
总结:
磁盘空间使用率:50%,故成本最高。
读性能:只能在一个磁盘上读取,取决于磁盘中较快的那块盘
写性能:两块磁盘都要写入,虽然是并行写入,但因为要比对,故性能单块磁盘慢。
冗余:只要系统中任何一对镜像盘中有一块磁盘可以使用,甚至可以在一半数量的硬盘出现问题时系统都可以正常运行。

RAID 5

定义:
RAID 5是RAID 0和RAID 1的折中方案。RAID 5具有和RAID0相近似的数据读取速度,只是多了一个奇偶校验信息,写入数据的速度比对单个磁盘进行写入操作稍慢。同时由于多个数据对应一个奇偶校验信息,RAID5的磁盘空间利用率要比RAID 1高,存储成本相对较低,是目前运用较多的一种解决方案。
工作原理:
RAID5把数据和相对应的奇偶校验信息存储到组成RAID5的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上,其中任意N-1块磁盘上都存储完整的数据,也就是说有相当于一块磁盘容量的空间用于存储奇偶校验信息。因此当RAID5的一个磁盘发生损坏后,不会影响数据的完整性,从而保证了数据安全。当损坏的磁盘被替换后,RAID还会自动利用剩下奇偶校验信息去重建此磁盘上的数据,来保持RAID5的高可靠性。
做raid 5阵列所有磁盘容量必须一样大,当容量不同时,会以最小的容量为准。 最好硬盘转速一样,否则会影响性能,而且可用空间=磁盘数n-1,Raid 5 没有独立的奇偶校验盘,所有校验信息分散放在所有磁盘上, 只占用一个磁盘的容量。
https://weigang-gao.iteye.com/blog/2247367
总结:
磁盘空间利用率:(N-1)/N,即只浪费一块磁盘用于奇偶校验。
读性能:(n-1)*单块磁盘的读性能,接近RAID0的读性能。
写性能:比单块磁盘的写性能要差(这点不是很明白,不是可以并行写入么?)
冗余:只允许一块磁盘损坏。

RAID10
定义:
RAID10也被称为镜象阵列条带。象RAID0一样,数据跨磁盘抽取;象RAID1一样,每个磁盘都有一个镜象磁盘, 所以RAID 10的另一种会说法是 RAID 0+1。RAID10提供100%的数据冗余,支持更大的卷尺寸,但价格也相对较高。对大多数只要求具有冗余度而不必考虑价格的应用来说,RAID10提供最好的性能。使用RAID10,可以获得更好的可靠性,因为即使两个物理驱动器发生故障(每个阵列中一个),数据仍然可以得到保护。RAID10需要4 + 2*N 个磁盘驱动器(N >=0), 而且只能使用其中一半(或更小, 如果磁盘大小不一)的磁盘用量, 例如 4 个 250G 的硬盘使用RAID10 阵列, 实际容量是 500G。
实现原理:
Raid10其实结构非常简单,首先创建2个独立的Raid1,然后将这两个独立的Raid1组成一个Raid0,当往这个逻辑Raid中写数据时,数据被有序的写入两个Raid1中。磁盘1和磁盘2组成一个Raid1,磁盘3和磁盘4又组成另外一个Raid1;这两个Raid1组成了一个新的Raid0。如写在硬盘1上的数据1、3、5、7,写在硬盘2中则为数据1、3、5、7,硬盘中的数据为0、2、4、6,硬盘4中的数据则为0、2、4、6,因此数据在这四个硬盘上组合成Raid10,且具有raid0和raid1两者的特性。
虽然Raid10方案造成了50%的磁盘浪费,但是它提供了200%的速度和单磁盘损坏的数据安全性,并且当同时损坏的磁盘不在同一Raid1中,就能保证数据安全性。假如磁盘中的某一块盘坏了,整个逻辑磁盘仍能正常工作的。
当我们需要恢复RAID10中损坏的磁盘时,只需要更换新的硬盘,按照RAID10的工作原理来进行数据恢复,恢复数据过程中系统仍能正常工作。原先的数据会同步恢复到更换的硬盘中。
总结:
磁盘空间利用率:50%。
读性能:N/2*单块硬盘的读性能
写性能:N/2*单块硬盘的写性能
冗余:只要一对镜像盘中有一块磁盘可以使用就没问题。
硬件开发
2019-04-16 10:12:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
作者讲述的清楚: 我的理解:1 GPU ALU更多 2 Core 更多 3 业务更加专一(主要进行密集计算) 4 缓存区更少 https://www.zhihu.com/question/19903344
硬件开发
2019-04-26 16:00:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
一、品牌介绍
萝卜教育,以萝卜狗为硬件基础,以Python Editor为教具,设计了将计算机语言融入语言、数学、科学的编程教学的课程体系,更适用于当前进行积木式编程教育机构的课程升级。萝卜教育坚持“立足积木式编程教育后,延长编程教学,与孩子共创未来”的信念,提供优质的课程与服务,与各机构进行深度合作,实现双赢、多赢。
萝卜狗是一款支持Python语言、操作简单、功能强大的口袋编程计算机。Python Editor是自主研发的可视化图形拼插编辑器,是第一款从拼插编程到代码编程的编程工具。让青少年编程学习开启“从业余到专业,从语法到程序设计,从软件到软硬结合 ,从模仿到创意应用”的新模式。
二、经营理念与背景
萝卜教育坚持“立足编程教育,融入工业应用”,面向未来,让孩子循序渐进的走入编程世界 。
推行”给家长一个交代,与孩子共创未来 “的教育理念,积极打造”循序渐进,让孩子赢在编程起跑线上“的教育体系。让青少年接受到专业的编程学科教育。为培训机构升级编程课程,延长编程教学,减少学员流失。
三、加盟优势
加盟萝卜教育,有利于培训机构在短时间内升级编程课程,解决学员流失,提高宣传效率,节约宣传成本。
萝卜教育提供给加盟培训机构一套完善高效的课程体系,避免了新装xiu设计,开店,招募的大量繁复的工作,从而降低加盟培训机构风险,提高成功机率。
1、灵活多样的加盟方式,让您用最少的成本扩展您的课程体系,增强同业竞争力。
2、为加盟培训机构提供一套完善高效的课程体系,免费培训两名教师,免费提供五套编程教具,您的需要就是我们的目标
3、利用现有教学场所、培训现教师、延续现有学员,快速升级到专业的编程学科教育
4、避免了新装xiu设计,开店,招募及训练教师,快速回收成本实现盈利
四、市场前景与相关问题
近年来,积木式编程教育培训机构虽可让孩子在游戏中培养认知力,但课程结束后,学员并没有掌握编程,而且面临无升级课程,造成学员流失的难题。
调查统计表明一个培训教育机构3年就会遇到此困境。
越来越多的培训机构在寻找如何延长现有 学员的课程,让孩子真正从业余到专业,进行学科教育的方案。
更多加盟信息可访问: http://www.tpyboard.com
硬件开发
2018-07-30 14:24:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
智能小车作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。智能小车能够实时显示时间、速度、里程,具有自动寻迹、寻光、避障功能,可程控行驶速度、准确定位停车,远程传输图像等功能。下面带大家做一个智能蓝牙小车,用手机APP来控制小车前进、后退、向左、向右、停止,本次蓝牙小车的设计在于探索蓝牙智能小车的设计理念及设计方法,学习一下PWM控制电机差速来控制小车的方向,下面就动手搞起来吧!!!!!
1.效果展示
给大家上视频连接,可以蓝牙控制,可以手柄控制哦
http://https://v.qq.com/x/page/k0721or47dw.html
2.材料准备
TPYBoard v102 1块
蓝牙串口模块 1个
TPYBoard v102小车扩展板(包含4个车轮,4个电机)
18650电池 2节
数据线 1条
杜邦线 若干
蓝牙APP ( http://old.tpyboard.com/download/tool/190.html )
3.蓝牙模块
蓝牙( Bluetooth):是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换(使用2.4-2.485GHz的ISM波段的UHF无线电波)。
我们在此使用的蓝牙模块(HC-06)已经在内部实现了蓝牙协议,不用我们再去自己开发调试协议。这类模块一般都是借助于串口协议通信,因此我们只需借助串口将我们需要发送的数据发送给蓝牙模块,蓝牙模块会自动将数据通过蓝牙协议发送给配对好的蓝牙设备。
4.单片机-TPYBoard v102
TPYBoard v102 是遵循MIT协议,由TurnipSmart公司制作的一款MicroPython开发板,它基于STM32F405单片机,通过USB接口进行数据传输。该开发板内置4个LED灯、一个加速度传感器,可在3V-10V之间的电压正常工作。让你会Python就能做极客, 用Python控制硬件,支持Python语言的开发板。比树莓派更小巧,更简单,更便宜,比Arduino更强大,更加容易编程。
小车扩展板
以TPYBoard v102开发板为主控板,小车扩展板具有四路PWM调速电机、8个可控LED、1个蜂鸣器、5路舵机接口、1个蓝牙接口、1个PS2无线接口、引出TPYBoard v102开发板全部针脚,可装载循迹模块、超声波模块、机械手臂、红外接收头,兼容入门级电机和专业级电机,两节18650单独供电。
源代码
我们只需要把TPYBoard v102 插小车扩展板上,把蓝牙模块插上,把程序写入就行,下面是main.py源程序
# main.py -- put your code here! from pyb import Pin from pyb import UART N1 = Pin('Y1', Pin.OUT_PP) N2 = Pin('Y2', Pin.OUT_PP) N3 = Pin('Y3', Pin.OUT_PP) N4 = Pin('Y4', Pin.OUT_PP) N5 = Pin('Y6', Pin.OUT_PP) N6 = Pin('Y7', Pin.OUT_PP) N7 = Pin('Y8', Pin.OUT_PP) N8 = Pin('Y9', Pin.OUT_PP) led_red=Pin('Y5', Pin.OUT_PP) led_right=Pin('Y12', Pin.OUT_PP) led_left=Pin('Y11', Pin.OUT_PP) led_red.value(1) led_right.value(0) led_left.value(0) blue=UART(1,9600,timeout=100) def go(speed): M1_0=pyb.Timer(8, freq=10000).channel(1, pyb.Timer.PWM, pin=pyb.Pin.board.Y1, pulse_width=(speed*200)+10000) M1_1=pyb.Timer(8, freq=10000).channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.Y2, pulse_width=0) M2_0=pyb.Timer(4, freq=10000).channel(3, pyb.Timer.PWM, pin=pyb.Pin.board.Y3, pulse_width=(speed*100)+5000) M2_1=pyb.Timer(4, freq=10000).channel(4, pyb.Timer.PWM, pin=pyb.Pin.board.Y4, pulse_width=0) M3_0=pyb.Timer(1, freq=10000).channel(1, pyb.Timer.PWM, pin=pyb.Pin.board.Y6, pulse_width=(speed*220)+10000) M3_1=pyb.Timer(1, freq=10000).channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.Y7, pulse_width=0) M4_0=pyb.Timer(2, freq=10000).channel(3, pyb.Timer.PWM, pin=pyb.Pin.board.Y9, pulse_width=(speed*50)+5000) M4_1=pyb.Timer(12, freq=10000).channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.Y8, pulse_width=0) led_red.value(0) def back(speed): M1_0=pyb.Timer(8, freq=10000).channel(1, pyb.Timer.PWM, pin=pyb.Pin.board.Y1, pulse_width=0) M1_1=pyb.Timer(8, freq=10000).channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.Y2, pulse_width=(speed*200)+10000) M2_0=pyb.Timer(4, freq=10000).channel(3, pyb.Timer.PWM, pin=pyb.Pin.board.Y3, pulse_width=0) M2_1=pyb.Timer(4, freq=10000).channel(4, pyb.Timer.PWM, pin=pyb.Pin.board.Y4, pulse_width=(speed*100)+10000) M3_0=pyb.Timer(1, freq=10000).channel(1, pyb.Timer.PWM, pin=pyb.Pin.board.Y6, pulse_width=0) M3_1=pyb.Timer(1, freq=10000).channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.Y7, pulse_width=(speed*200)+10000) M4_0=pyb.Timer(2, freq=10000).channel(3, pyb.Timer.PWM, pin=pyb.Pin.board.Y9, pulse_width=0) M4_1=pyb.Timer(12, freq=10000).channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.Y8, pulse_width=(speed*100)+10000) led_red.value(1) def stop(): M1_0=pyb.Timer(8, freq=10000).channel(1, pyb.Timer.PWM, pin=pyb.Pin.board.Y1, pulse_width=0) M1_1=pyb.Timer(8, freq=10000).channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.Y2, pulse_width=0) M2_0=pyb.Timer(4, freq=10000).channel(3, pyb.Timer.PWM, pin=pyb.Pin.board.Y3, pulse_width=0) M2_1=pyb.Timer(4, freq=10000).channel(4, pyb.Timer.PWM, pin=pyb.Pin.board.Y4, pulse_width=0) M3_0=pyb.Timer(1, freq=10000).channel(1, pyb.Timer.PWM, pin=pyb.Pin.board.Y6, pulse_width=0) M3_1=pyb.Timer(1, freq=10000).channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.Y7, pulse_width=0) M4_0=pyb.Timer(12, freq=10000).channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.Y8, pulse_width=0) M4_1=pyb.Timer(2, freq=10000).channel(3, pyb.Timer.PWM, pin=pyb.Pin.board.Y9, pulse_width=0) led_right.value(0) led_left.value(0) led_red.value(1) def left(speed): M1_0=pyb.Timer(8, freq=10000).channel(1, pyb.Timer.PWM, pin=pyb.Pin.board.Y1, pulse_width=(speed*30)+10000) M1_1=pyb.Timer(8, freq=10000).channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.Y2, pulse_width=0) M2_0=pyb.Timer(4, freq=10000).channel(3, pyb.Timer.PWM, pin=pyb.Pin.board.Y3, pulse_width=(speed*100)+10000) M2_1=pyb.Timer(4, freq=10000).channel(4, pyb.Timer.PWM, pin=pyb.Pin.board.Y4, pulse_width=0) M3_0=pyb.Timer(1, freq=10000).channel(1, pyb.Timer.PWM, pin=pyb.Pin.board.Y6, pulse_width=(speed*30)+10000) M3_1=pyb.Timer(1, freq=10000).channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.Y7, pulse_width=0) M4_0=pyb.Timer(2, freq=10000).channel(3, pyb.Timer.PWM, pin=pyb.Pin.board.Y9, pulse_width=(speed*100)+10000) M4_1=pyb.Timer(12, freq=10000).channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.Y8, pulse_width=0) led_right.value(1) led_left.value(0) def right(speed): M1_0=pyb.Timer(8, freq=10000).channel(1, pyb.Timer.PWM, pin=pyb.Pin.board.Y1, pulse_width=(speed*200)+20000) M1_1=pyb.Timer(8, freq=10000).channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.Y2, pulse_width=0) M2_0=pyb.Timer(4, freq=10000).channel(3, pyb.Timer.PWM, pin=pyb.Pin.board.Y3, pulse_width=(speed*200)+3000) M2_1=pyb.Timer(4, freq=10000).channel(4, pyb.Timer.PWM, pin=pyb.Pin.board.Y4, pulse_width=0) M3_0=pyb.Timer(1, freq=10000).channel(1, pyb.Timer.PWM, pin=pyb.Pin.board.Y6, pulse_width=(speed*100)+20000) M3_1=pyb.Timer(1, freq=10000).channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.Y7, pulse_width=0) M4_0=pyb.Timer(2, freq=10000).channel(3, pyb.Timer.PWM, pin=pyb.Pin.board.Y9, pulse_width=(speed*100)+3000) M4_1=pyb.Timer(12, freq=10000).channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.Y8, pulse_width=0) led_right.value(0) led_left.value(1) while True: if blue.any()>0: data=blue.read().decode() print(data) if data.find('0')>-1: #stop stop() print('stop') if data.find('1')>-1: pyb.LED(2).on() pyb.LED(3).off() pyb.LED(4).off() #------------- go(5) print('go') if data.find('2')>-1: pyb.LED(2).off() pyb.LED(3).on() pyb.LED(4).off() #------------- back(5) if data.find('3')>-1: pyb.LED(2).off() pyb.LED(3).off() pyb.LED(4).on() left(5) if data.find('4')>-1: pyb.LED(2).off() pyb.LED(3).off() pyb.LED(4).on() right(5)
硬件开发
2018-07-19 15:48:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
基于C51单片机的丁字路口交通灯控制系统
项目要求:用单片机设计一套丁字路口的交通灯显示系统,如图所示,有三组相同的道路显示系统
项目概述:采用多机通讯实现对多个红绿灯的控制 主机功能:主机,用于在特殊情况下操纵从机,和对从机的时间统一。 从机功能:从机,每隔10s红灯亮、每隔10s绿灯亮,绿灯到红灯时黄灯闪烁3秒。
项目图纸: 概览图:
2. C51单片机连图:
3. 丁字路口模拟图:
4. 紧急情况处理按钮:
项目代码 代码注释较为详细,自行观看 程序中断图:
主机代码: // 程序说明 ; 主机,用于在特殊情况下操纵从机,和对从机的时间统一。 ; 采用串口通信方式二,波特率固定fosc/64 ; SCON = 1000 0000B = 80H, PCON = 00H 波特率不加倍 ; 定时器T0,方式1,50ms中断一次,20次为1s。 ; 初值:X = 2^16 - (50 * 10^-3) / (1 * 10^-6) = 15536D = 3CB0H // 变量定义 START EQU 30H STOP EQU 31H // 程序起点 ORG 0000H ; 复位入口 LJMP MAIN ; 转到主程序 ORG 000BH ; T0中断入口 LJMP COUNTTIME ; 转到T0中断服务程序 ORG 0023H ; 串行中断入口 LJMP CONNECT ; 转到串行中断服务程序 ORG 0100H ; 主程序入口 // 主函数 MAIN: ; 1.启动检查 ; 2.初始化定时器0,开中断 MOV TMOD, #01H ; 设置T0工作方式 MOV TCON, #05H ; 中断触发方式 MOV SCON, #80H ; 设置串行口工作方式 MOV PCON, #00H ; 设置波特率不加倍 MOV TH0, #3CH ; 装入T0初值 MOV TL0, #0B0H SETB TR0 ; 启动T0 SETB EA ; 开中断 SETB ES SETB ET0 ; 允许T0中断 ; 3.定义变量初值 MOV SP, #60H ; 设置堆栈指针 MOV START, #00H ; 传入从机的数据,控制开始运行中断信号 MOV STOP, #01H ; 传入从机的数据,控制终止运行中断信号 AGAIN: JNB P1.0, SET_NM1 ; 启动键按下? JNB P1.1, SET_NM2 ; 停止键按下? SJMP AGAIN SET_NM1: LCALL DELAY500 ; 延时消抖 LCALL DELAY500 MOV R0, START ; 数据起始地址 CPL P2.1 LCALL TRS ; 数据发送 MOV R5, #0 ; 重新计时 SJMP AGAIN SET_NM2: LCALL DELAY500 ; 延时消抖 MOV R0, STOP LCALL TRS ; 数据发送 SJMP AGAIN TRS: MOV C, P MOV TB8, C MOV A, @R0 MOV SBUF, A WAIT: JNB TI, WAIT ; 一帧输出完,TI=1时发送中断 CLR TI RET DELAY500: MOV R6, #2000 ;DELAY500MS子程序(2000*125*1*10^-3=500ms) H2: MOV R0, #125 H1: DJNZ R0, H1 DJNZ R6, H2 RET // -----定时器0中断用于定时----- ORG 0300H COUNTTIME: MOV TH0, #3CH ; 重装T0初值 MOV TL0, #0B0H CPL P1.4 INC R5 ; 中断次数加一 // -----串行中断用于主机发送信号----- CONNECT: CLR TI ; TI=0发送中断结束 CPL P2.2 RETI END 从机代码: ; 从机南北方向与东西方向基本一致 // 程序说明 ; 东西方向交通信号灯。 ; 每隔10s绿灯亮、每隔10s红灯亮、绿灯到红灯时黄灯闪烁3秒。 ; CPU晶振频率12MHz状态周期,1个机器周期为12个时钟振荡周期,即1μs。 ; 定时器T0,方式1,50ms中断一次,20次为1s。 ; 初值:X = 2^16 - (50 * 10^-3) / (1 * 10^-6) = 15536D = 3CB0H // 变量定义 REDTIME EQU 30H YELLOWTIME EQU 31H GREENTIME EQU 32H MASTERDATA EQU 50H // 程序起点 ORG 0000H ; 复位入口 LJMP MAIN ; 转到主程序 ORG 0003H ; INT0中断入口地址 LJMP SEVER0 ; 转到INT0中断服务程序 ORG 000BH ; T0中断入口 LJMP COUNTTIME ; 转到T0中断服务程序 ORG 0013H ; INT1中断入口地址 LJMP SEVER1 ; 转到INT1中断服务程序 ORG 0023H ; 串行中断入口 LJMP CONNECT ; 转到串行中断服务程序 ORG 0100H ; 主程序入口 // 主函数 MAIN: ; 1.启动检查 ; 2.初始化定时器0 MOV IE, #9FH ; 开中断 MOV IP, #91H ; 中断优先级,0>1,使0中断触发,保证恢复正常工作 MOV TMOD, #01H ; 设置T0工作方式 MOV TCON, #05H ; 中断触发方式 MOV SCON, #90H ; 设置串行口工作方式 MOV PCON, #00H ; 设置波特率不加倍 MOV TH0, #3CH ; 装入T0初值 MOV TL0, #0B0H SETB TR0 ; 启动T0 ; 3.定义变量初值 MOV SP, #60H ; 设置堆栈指针 MOV REDTIME, #10 ; 记录红灯总时长10s MOV YELLOWTIME, #3 ; 记录黄灯总时长3s MOV GREENTIME, #10 ; 记录绿灯总时长10s MOV P0, #00H ; 共阴极数码管每段都不亮 MOV P1, #00H ; 每个发光二级管都不亮 MOV P2, #00H ; 数码管每个都不显示 // 方式寄存器R0-R5的初始化 MOV R0, #10 ; 用于存储数码管显示数据,初始时从REDTIME开始 MOV R1, REDTIME ; 记录红灯实时的时间变化 MOV R2, YELLOWTIME ; 记录黄灯实时的时间变化 MOV R3, GREENTIME ; 记录绿灯实时的时间变化 MOV R4, #0 ; 记录数码管位选信号 MOV R5, #0 ; 记录定时器中断次数 MOV R6, #0 ; 记录外部中断类型 MOV R7, #0 ; 记录通信数据传输 // 灯光状态初始化 SETB P1.0 ; 初始红灯亮 CLR P1.1 ; 初始黄灯暗 CLR P1.2 ; 初始绿灯暗 ; 4.LED开始工作和SEG开始倒计时工作 WORK: CJNE R5, #10, WORK ; 中断次数检验,当R5=10则为0.5s进行倒计时时间的变化 CJNE R1, #1, RED ; 未到10s,红灯 CJNE R3, #0, GREEN ; 黄灯结束,跳转到绿灯,未到10s,绿灯 CJNE R2, #0, YELLOW ; 绿灯结束,跳转到黄灯,未到3s,黄灯 // -----灯光周期结束后的重新赋值----- REFRESH: CJNE R5, #20, REFRESH; 中断次数检验,当R5=20则为1s进行倒计时时间的变化 MOV R5, #0 ; 重置中断次数 MOV R1, REDTIME ; 时间寄存器重新赋值 MOV R2, YELLOWTIME MOV R3, GREENTIM MOV R0, #10 ; 初始化时间 SETB P1.0 ; 初始红灯亮 CLR P1.1 ; 初始黄灯暗 CLR P1.2 ; 初始绿灯暗 JMP WORK ; 重新开始工作 // -----红黄绿灯的灯光操作----- ; 1.红灯亮REDTIME秒数 RED: CJNE R5, #20, RED ; 中断次数检验,当R5=20则为1s进行倒计时时间的变化 MOV R5, #0 ; 重置中断次数 DEC R1 ; 秒数减一 MOV A, R1 ; R0作为显示时间 MOV R0, A SETB P1.0 ; 红灯亮 CLR P1.1 ; 黄灯暗 CLR P1.2 ; 绿灯暗 JMP WORK ; 2.黄灯闪烁YRLLOWTIME秒数 YELLOW: CJNE R2, #3, DARK ; 第一次进入黄灯延迟0.5s,以免时间偏差 CJNE R5, #20, YELLOW MOV R5, #0 ; 重置中断次数 DEC R2 ; 秒数减一 MOV A, R2 ; R0作为显示时间 INC A ; 从YELLOWTIME开始倒计时 MOV R0, A CLR P1.0 ; 红灯暗 SETB P1.1 ; 黄灯亮0.5s CLR P1.2 ; 绿灯暗 JMP WORK DARK: CJNE R5, #10, DARK ; 每秒闪烁 CLR P1.0 ; 红灯暗 CLR P1.1 ; 黄灯暗0.5s CLR P1.2 ; 绿灯暗 LIGHT: CJNE R5, #20, LIGHT ; 中断次数检验,当R5=20则为1s进行倒计时时间的变化 MOV R5, #0 ; 重置中断次数 DEC R2 ; 秒数减一 MOV A, R2 ; R0作为显示时间 INC A ; 从YELLOWTIME开始倒计时 MOV R0, A CLR P1.0 ; 红灯暗 SETB P1.1 ; 黄灯亮0.5s CLR P1.2 ; 绿灯暗 WAIT: CJNE R2, #0, WORK CJNE R5, #10, WAIT CLR P1.0 ; 红灯暗 CLR P1.1 ; 黄灯暗0.5s CLR P1.2 ; 绿灯暗 JMP WORK ; 3.绿灯亮GREENTIME秒数 GREEN: CJNE R5, #20, GREEN ; 中断次数检验,当R5=20则为1s进行倒计时时间的变化 MOV R5, #0 ; 重置中断次数 DEC R3 ; 秒数减一 MOV A, R3 ; R0作为显示时间 INC A ; 从GREENTIME开始倒计时 MOV R0, A CLR P1.0 ; 红灯暗 CLR P1.1 ; 黄灯暗 SETB P1.2 ; 绿灯亮 JMP WORK // -----外部中断0用于恢复正常工作----- ORG 0200H SEVER0: MOV R6, #1 ; 结束中断1的标志,退出停止状态,继续正常工作 RETI // -----外部中断1用于紧急情况处理----- ORG 0220H SEVER1: MOV R5, #0 ; 时间初始化 MOV R6, #0 ; 状态初始化 MOV P0, #6FH ; 数码管显示99秒 MOV P2, #00H SETB P1.0 ; 红灯亮 CLR P1.1 ; 黄灯暗 CLR P1.2 ; 绿灯暗 T1WAIT: CJNE R6, #1, T1WAIT ; 原地等待,维持停止状态 RETI // -----定时器0中断用于定时----- ORG 0300H COUNTTIME: MOV TH0, #3CH ; 重装T0初值 MOV TL0, #0B0H CPL P1.4 INC R5 ; 中断次数加一 STEPRO: INC R4 ;R4为片选信号 CJNE R4, #2,TODISP MOV R4, #0 TODISP: LCALL DISPSEG ;根据数码管的片选信号进行显示 DONTIME: RETI ; 中断返回 DISPSEG: MOV A, R4 MOV DPTR, #SEGCON MOVC A, @A+DPTR MOV P2, A CJNE R4, #0, SEG1 ;判断是哪一位数码管亮 MOV A, R0 ;如果是第一个数码管亮 MOV B, #10 DIV AB MOV DPTR, #NUM MOVC A, @A+DPTR MOV P0, A ;显示秒数的十位 SEG1: CJNE R4, #1, FINDISP MOV A, R0 MOV B, #10 DIV AB MOV A, B MOV DPTR, #NUM MOVC A, @A+DPTR MOV P0, A ;显示秒数的个位 FINDISP: RET ;结束显示,程序返回 // -----串行中断用于接收主机信号----- ; 0 恢复正常处理 ; 1 紧急情况处理 ; 2 时间减五秒操作 ; 3 时间加五秒操作 CONNECT: JBC RI, READ SJMP CONNECT READ: MOV A, SBUF ; 数据接收 MOV C, P ; 奇偶校验 JNC LP0 ; 奇偶校验位位0? JNB RB8, ERR ; RB8=0禁止接收 SJMP LP1 ; 将数据放入指定位置 LP0: JB RB8,ERR LP1: CLR RI ; 接收中断清零 JZ TT0 ; 恢复正常处理 DEC A JZ TT1 ; 紧急情况处理 DEC A JZ TT2 ; 时间减五秒操作 JMP LP1 DEC A JZ TT3 ; 时间加五秒操作 TT0: CLR RI ; 接受中断结束标志 CLR P3.2 ; 触发T0中断 SETB P3.2 ; 恢复T0中断 CPL P1.6 RETI TT1: ;CLR P3.3 ; 触发T1中断 ;SETB P3.3 ; 恢复T1中断 SETB P1.5 RETI TT2: RETI TT3: RETI ERR: SETB P1.3 RETI ;数组:NUM控制数码管显示数字,SEGCON控制数码管使能信号(数码管低电平亮) NUM: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH SEGCON: DB 02H, 01H END
运行效果: 开机运行:
紧急情况处理按钮按下:
恢复正常情况按钮按下:
网盘链接: 包含项目概述、项目图纸、项目代码、项目报告及项目PPT需要自取 链接: https://pan.baidu.com/s/1CVEjlkRMFfSpNBypDI-RQQ 提取码: vijn 本人初学C51如上功能暂不完善,欢迎指正!
硬件开发
2020-06-19 22:50:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
上海灵动微电子是国内专注于MCU产品及应用方案的供应商,致力于提供高性能、高质量的32位MCU产品元件。灵动迄今为止已完成数百余项产品设计,满足客户及市场多领域、多层次的丰富应用场景需求。 灵动微 一级代理介绍MM32 eMiniBoard相关资料。
板子名称
MM32 eMiniBoard(MCU型号: MM32L073PF )
MM32 eMiniBoard开发板照片及简介
1) MM32 eMiniBoard 图片


2) MM32 eMiniBoard 简介
• MM32L073PF (Cortex-M0 MCU:128k FLASH、8k SRAM)
• 板载SPI Flash芯片
• 板载IIC EEPROM芯片
• 板载CAN转换芯片
• 板载无源蜂鸣器
• 具备3个VR
• 具备4个LED
• 具备4个KEY
• 外设IO全部引出,方便快速搭载模块测试
• 双USB接口,USB-1支持USB仿真、下载和调试,USB-2支持USB device和供电
• 板载MM32-LINK OB,可对主控MCU进行在线仿真、调试和下载
• 支持 Keil uvision/ IAR EWARM开发环境


MM32L073F产品使用高性能的 ARM® Cortex®-M0 为内核的 32 位MCU,工作频率最高可达48MHz,并内置高速存储器,丰富的增强型 I/O 端口和外设连接到外部总线。产品系列工作电压为 2.0V ∼ 5.5V,工作温度范围包含-40◦C ∼ +85◦C 常规型和-40◦C∼ +105◦C 扩展型。多种省电工作模式保证低功耗应用的要求。适合于应用在电机驱动和应用控制、工业等。
硬件开发
2020-06-19 11:57:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
操作系统的主要功能之一就是文件的管理。文件管理是由文件系统来实现的, Linux 系统支持多种格式
的文件系统,本届我们主要讲解下文件系统的类型,以及文件操作的一些常用命令。
2.8.1 Linux 文件系统类型
我们在使用 Windows 系统的时候,有时会对硬盘,U 盘等的存储设备进行格式化,在格式化的时候会要求
我们选择文件系统的类型,比如:exFAT、FAT32、NTFS,同样 Linux 系统也支持各种不同类型的文件系统,
比如:ext2、ext3、ext4、yaffs、FAT32、NTFS 等。这里我们主要讲解下几种常用的文件系统。
FAT32 文件系统:
FAT32 指的是文件分配表是采用 32 位二进制数记录管理的磁盘文件管理方式,因 FAT 类文件系统的核心是
文件分配表,命名由此得来。FAT32 是从 FAT 和 FAT16 发展而来的,优点是稳定性和兼容性好,能充分兼容
Win 9X 及以前版本,且维护方便。缺点是安全性差,且最大只能支持 32GB 分区,单个文件也只能支持最大
4GB。
3 ext3 文件系统
EXT3 是第三代扩展文件系统(英语:Third extended filesystem,缩写为 ext3),是一个日志文件系统,
常用于 Linux 操作系统。它是很多 Linux 发行版的默认文件系统。Stephen Tweedie 在 1999 年 2 月的内核
邮件列表中,最早显示了他使用扩展的 ext2,该文件系统从 2.4.15 版本的内核开始,合并到内核主线中。
ext4 文件系统
4 EXT4 是第四代扩展文件系统(英语:Fourth extended filesystem,缩写为 ext4)是 Linux 系统下的日志
文件系统,是 ext3 文件系统的后继版本。Ext4 是由 Ext3 的维护者 Theodore Tso 领导的开发团队实现的,
并引入到 Linux2.6.19 内核中。Ext4 产生原因是开发人员在 Ext3 中加入了新的高级功能。
上面几种文件系统是我们在 Linux 下经常使用的,那么我们安装的 Ubuntu 系统下的文件系统使用的是哪种
格式的呢?我们可以在终端输入“df -T”命令来查看下,如下图所示:

从上图红色方框的文件就是我们安装 Ubuntu 的磁盘,在 Linux 下一切皆为文件,“/dev/sda1”就是我
们的磁盘分区,可以看到他的类型是 ext4。我们在 Windows 系统下有 C、D、E 盘这样的概念,但是通过上
面的命令我们可以看到 Linux 下对磁盘的管理与 Windows 是不一样的,没有 C、D、E 盘这样的概念。Linux
系统只有一个跟目录“/”,我们可以在 Ubuntu 的桌面打开“文件”应用,我们可以看到打开的文件路径
并不是在根目录下,这是因为 Ubuntu 是支持多用户的,会为每个用户分配一个根目录,比如我的 Ubuntu
登录的用户是 topeet,那么默认进入的就是 topeet 用户的根目录“home”,如下图所示:

我们在上图中点击左侧的“计算机”,如下图所示:

上图就是 UBuntu 的根目录,那么前面我们的说的 Ubuntu 会为每一个用户创建一个根目录,那么这个根目
录具体位置在哪里呢?我们在创建用户的时候,Ubuntu 同时会在“/home”目录下创建与应户名同名的文
件夹,这个文件夹就是用户的根目录,比如我这里登陆的用户名是 topeet,那么 topeet 用户对应的用户根
目录就是“/home/topeet”这个目录。用户可以对自己用户根目录下的文件进行任意的读写操作。我们可
以打开终端使用“cd /”命令,进入到系统根目录下,然后在输入“ls”命令,产看下系统根目录下都有哪
些文件,如下图所示:

从上图可以看到系统根目录下都有哪些文件夹,我们来看下这些文件夹的具体功能:
/bin 存储一些二进制可执行命令文件
/boot 存放 Ubuntu 系统内核和系统启动文件
/dev 存放设备节点
/etc 存放系统管理所需的配置文件
/home 普通用户默认目录,每个用户在改目录下都有一个以本用户名命名的文件夹
/lib /lib64 存放系统程序运行所需的库文件
/media 存放 Ubuntu 系统自动挂载的设备文件
/mnt 用于挂载的文件系统的挂载点
/opt 可选文件和程序的存放目录
/proc 通常用来保存系统信息和进程信息
/root 超级用户 root 的根目录文件
/sys 系统设备和文件层次结构,并向用户程序提供详细的内核数据信息
/tmp 存储系统和用户的临时文件
/usr 包括与系统用户直接有关的文件和目录
/var 存储一些不断变化的文件,比如日志文件
2.8.2 文件操作命令
创建文件命令 touch
我们在前面学习 vim 的时候,可以通过 vim 来创建一个文本文件,“touch”不仅可以用来创建文本文件,
还可以创建其它类型的文件,命令格式如下:
touch [参数] [文件名]
参数说明:
-a 只更改存取时间
-c 不建立任何文件
-d<日期> 使用指定的日期创建文件
-t<时间> 使用指定的时间创建文件
当我们使用“touch”命令创建文件的时候,如果创建的文件不存在,则会直接创建,如果创建的文件
已经存在,则会修改下文件的最后修改日期(修改成运行该命令时候的系统日期)。现在我们使用命令“cd
~”进入到用户的根目录下,然后使用“touch”命令创建一个名为 ceshi 的文件,运行结果如下图所示:

文件夹创建命令 mkdir
mkdir 是用来创建文件夹的命令,在使用该命令的时候,要求当前用户在当前的目录下具有写权限,并且创
建的文件夹名称不能是当前目录中又有的目录,命令格式如下:
mkdir [选项] 目录...
选项的说明如下:
-m //设定权限<模式>(类似 chmod)
-p //可以是一个路径命令,如果路径中的目录不存在,则依次创建他们
-v //每次创建新目录都显示信息
--help //显示帮助信息
--version //输出版本信息
我们可以使用 mkdir 创建一个名为“test”的文件夹,我们在终端运行命令“mkdir test”,运行结果如下图
所示:

文件删除命令 rm
rm 命令可以删除文件和文件夹,在使用该命令的时候,要求当前用户在当前的目录下具有写权限,命令格
式如下:
rm [选项]... 目录...
选项的说明如下:
-d //删除可能仍有数据的目录(只限超级用户 root)
-f //略过不存在的文件,不显示任何信息
-i //进行任何删除操作前,必须先确认
-r //同时删除该目录下的所有目录层
-v //详细显示进行的步骤
--help //显示帮助信息并退出
--version //显示版本信息并退出
我们使用“rm”命令删除前面创建的文件“ceshi”,我们在终端输入“rm ceshi”,然后回车就可以删
掉文件“ceshi”了,运行结果如下图所示:

“rm”命令也可以删除文件夹,我们删除前面创建的 test 目录,我们在终端执行“rm -rf test”,运行结果
如下图所示:

文件复制命令 cp
Linux 下文件复制的命令是“cp”,命令格式如下:
cp [参数] [源文件] [目标文件]
参数的说明如下:
-d //复制有符号连接的文件时,保留原始的连接
-f //强行复制文件,不管要复制的文件是否已经存在于目标目录
-r //递归处理,将指定目录下的文件及子目录一并处理
我们在用户跟目录下使用 mkdir 命令创建两个文件夹:ceshi1、ceshi2,如下图所示:

然后进入“ceshi1”文件夹,在 ceshi1 文件夹创建 a 文件,如下图所示:

我们将文件 a 复制到用户根目录下的 ceshi2 文件夹,运行结果如下图所示:

完成文件的复制,接下来我们来实现文件夹的复制,首先我们返回到用户根目录下,然后将 ceshi1 文件夹
复制到 ceshi2 文件夹,运行结果如下图所示:

移动文件命令 mv
Linux 下文件移动的命令是 mv,命令格式如下:
mv [参数] [源文件] [目标文件]
参数说明:
-b //如果要覆盖文件的话覆盖前先进行备份
-f //若目标文件或目录与现在的文件重复,直接覆盖目的文件或目录
-i //若目标文件存在,则会询问是否覆盖
-u //若目标文件已经存在,且源文件比较新,则会更新
我们在前面创建了两个文件夹:ceshi1、ceshi2,在 ceshi1 文件夹创建了文件 a,我们将文件 a 重命名成文
件 b,然后将文件 b 移动到 ceshi2 文件夹,运行结果如下图所示:

文件接压缩命令 tar
Linux 下常用的压缩包格式有两种:.bz2 和.gz。我们可以使用 tar 命令来解压或压缩这两种格式的压缩包,
命令格式如下:
tar [必要参数] [选择参数] [文件]
必要参数说明如下:
-A //新增压缩文件到已存在的压缩
-B //设置区块大小
-c //建立新的压缩文件
-d //记录文件的差别
-r //添加文件到已经压缩的文件
-u //添加改变了和现有的文件到已经存在的压缩文件
-x //从压缩的文件中提取文件
-t //显示压缩文件的内容
-z //支持 gzip 解压文件
-J //支持 bzip2 解压文件
-Z //支持 compress 解压文件
-v //显示操作过程
-k //保留原有文件不覆盖
-m //保留文件不被覆盖
-W //确认压缩文件的正确性
可选参数如下:
-b //设置区块数目
-C //切换到指定目录
-f //指定压缩文件
--help //显示帮助信息
--version //显示版本信息
我们使用 tar 命令压缩生成.bz2 和.gz 压缩包,运行结果如下图所示:

在上图中我们分别压缩了.bz2 和.gz 两个格式的压缩包,其中压缩.bz2 格式的压缩包我们使用的参数
是-jcvf,而.gz 格式的压缩包使用的参数是-zcvf。下面在我们在来学习下 tar 解压文件,操作如下图所示:

在上图中,我们分别解压了.tar.bz2 和.gz 两种格式的压缩包。其中.tar.bz2 压缩包使用的-jxvf 参
数来解压的,而.gz 格式的压缩包使用-zxvf 参数来解压的。关于 tar 的命令我们就介绍到这里,更多详细
的用法大家可以去网上找下相关的文档。
文件查找命令 find
文件查找在我们的平常使用中也是很常见的,比如在 Linux 内核源码中,我们要查找某个文件的路径,这
是就会用到文件查找 find 命令了,器格式如下:
find [路径][参数][关键字]
路径标识要从哪个目录下开始查找文件,如果不写默认从执行 find 的当前目录下开始查找。
参数说明如下:
-name 按照文件名称查找,查找与 filename 匹配的文件
-depth 从指定目录下的最深层的子目录开始查找
-size<文件大小> 查找符合指定文件大小的文件
-type<文件类型> 查找符合指定文件类型的文件
-user<拥有者> 查找符合指定的拥有者的文件或目录
-gid<群组识别码> 查找符合指定的群组识别码的文件或目录
-group<群组名称> 查找符合指定的群组名称的文件或目录
该命令的参数有很多,我们这里只是列举除了一些常用的。我们来使用 find 命令查找一下在目录“/etc”
下以“host”开头的文件,我们在终端输入“find /etc -name host*”命令,运行结果如下图所示:

从上图中我们可以看到在“/etc”目录下,以“host”关键字开头的文件全部查找出来了。
文本搜索命令 grep
有时候我们需要搜索出包含特定关键字的文件有哪些,这样就会用到 grep 这个命令,命令格式如下:
grep [参数] 关键字 文件列表
参数说明如下:
-b //在显示符合关键字的那一列前,标记处该列第 1 个字符的位编号
-a //不要忽略二进制的数据
-c //计算符合范本样式的列表
-i //忽略字符的大小写
-n //在显示符合样本范式的那一列前面,标出该列的列数编号
-r //在指定目录中递归查找
-v //反转查找,只显示不匹配的行
比如我们在“/etc”下递归查找包含字符“topeet”的文本,运行结果如下图所示:‘
硬件开发
2020-05-18 14:14:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
树莓派简易入门
主要用途

raspberry pi 这玩意用途挺多的。。
例如搭建自己的私人网盘,私人vpn访问google,自制游戏机,自制各种,,控制机器人,监控阿猫阿狗。太多太多了

我的用途主要是提供一个随时随地可免费访问的中间件地址
例如自己的mysql,redis,zookeeper等
然后还搭建一些私人所需的服务

实话说。就是为了好玩。


硬件以及配件选购


raspberry pi 相关部件概述
硬件名称 概述 是否必须 备注
树莓派 4b+ 4g 顶配版
Sd卡 必须要买,安装系统 1真Class10。不然系统反应慢
2购买的时候可由让人安装好树莓派系统
官方外壳 保护,方便携带 否,但建议买
散热片 基本散热
大功率风扇 高强度散热,不过好吵
小功率风扇 散热,想要长时间开着就要买
网线一根
读卡器 用于装系统和开机配网络 一般买内存卡会送
拓展坞-sd卡 用mac的人早就有了吧。
拓展坞-网口 否,但是建议买 经常换地方,网络环境复杂。
螺丝刀 安装外壳,风扇或者其他 但是买外壳,风扇啥的都会送吧
双面胶 粘线啥的 我买的风扇不匹配,正好用上
迷你键盘
显示器 3.7寸 5寸,7寸屏
包含鼠标功能


Ssh或者vnc了没啥用
用电脑的吧 显示器价格加上为何不买低配pc???

连接
本章列举出各种场景下的连接需求

1如果有网线,并能管理路由器
很简答,插入网线,得到树莓派的ip
1插入网线到路由器


2 进入路由器控制系统





2如果有网线,但不能管理路由器

那就扫描吧。。。
mac下我使用个ip scanner
http://www.pc6.com/mac/238352.html

windows下用advince ip scanner
https://advanced-ip-scanner.en.softonic.com

需要破解,你懂得。



3如果有网线,但树莓派连接不了
或者暂时没有互联网

那就用一根网线建立一个最小的局域网


arp -a 看下有哪些机器




31网段为我的wifi网段
192..168.1.1应该是本机,那么树莓派应该是192..168.1.2




4建立ssh连接

基于以上


默认用户名pi/ raspberry

5开启远程桌面vnc
命令行敲 vncserver
(每次重启需要手动开启)


如果不行那就就配置下

sudo raspi-config








在执行上一步

安装vnc客户端并访问

https://www.realvnc.com/en/connect/download/viewer/


注意别安装成服务端了。。。


各种同意

成功!!

设置自动连接无线网络


sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
priority 优先级 数字越大越优先

设置

1 修改超级用户root密码
sudo passwd root
2 修改软件源

deb http://mirrors.ustc.edu.cn/raspbian/raspbian/ buster main contrib non-free
deb-src http://mirrors.ustc.edu.cn/raspbian/raspbian/ buster main contrib non-free


然后更新缓存

如果遇到问题:
· E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用 )
· E: 无法对目录 /var/lib/apt/lists/ 加锁
解决办法
sudo rm -rf /var/lib/apt/lists

更新软件
sudo apt-get upgrade

sudo apt-get dist-upgrade

更新内核
sudo apt-get dist-upgrade

wget http://archive.raspbian.org/raspbian.public.key -O - | sudo apt-key add -

3 其他配置

中文界面






4软件安装
1官方软件市场界面



不过没啥用,我想没啥人会把他当做办公或者娱乐系统吧。

2 apt-get
同ubantu
找软件 apt-cache search mysql
安装 sudo apt-get install mysql
卸载 sudo apt-get remove mysql
更新缓存 apt-get update
升级 apt-get upgrade

3 deb 安装
安装 deb 软件包 dpkg -i xxx.deb
删除软件包 dpkg -r xxx.deb
连同配置文件一起删除 dpkg -r –purge xxx.deb
查看软件包信息 dpkg -info xxx.deb
查看文件拷贝详情 dpkg -L xxx.deb
查看系统中已安装软件包信息 dpkg -l
重新配置软件包 dpkg-reconfigure xxx

4编辑器
nano 比vim好用点。 我看别人玩树莓派都玩这个,玩一次就放弃vim了
5 手机访问树莓派









硬件开发
2020-05-16 13:15:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
不得不说的设计经验 如果设计的电路系统中包含FPGA器件,则在绘制原理图前必需使用Quartus II软件对管脚分配进行验证。(FPGA中某些特殊的管脚是不能用作普通IO的) 4层板从上到下依次为:信号平面层、地、电源、信号平面层;6层板从上到下依次为:信号平面层、地、信号内电层、信号内电层、电源、信号平面层。6层以上板(优点是:防干扰辐射),优先选择内电层走线,走不开选择平面层,禁止从地或电源层走线(原因:会分割电源层,产生寄生效应)。 多电源系统的布线:如FPGA+DSP系统做6层板,一般至少会有3.3V+1.2V+1.8V+5V。 3.3V一般是主电源,直接铺电源层,通过过孔很容易布通全局电源网络。 5V一般可能是电源输入,只需要在一小块区域内铺铜。且尽量粗(你问我该多粗——能多粗就多粗,越粗越好)

1.2V和1.8V是内核电源(如果直接采用线连的方式会在面临BGA器件时遇到很大困难),布局时尽量将1.2V与1.8V分开,并让1.2V或1.8V内相连的元件布局在紧凑的区域,使用铜皮的方式连接,如下图:

总之,因为电源网络遍布整个PCB,如果采用走线的方式会很复杂而且会绕很远,使用铺铜皮的方法是一种很好的选择!
相邻层之间走线采用交叉方式:既可减少并行导线之间的电磁干扰(高中学的哦),又方便走线(参考资料1)。如下图为某PCB中相邻两层的走线,大致是一横一竖。


模拟数字要隔离,怎么个隔离法?布局时将用于模拟信号的器件与数字信号的器件分开,然后从AD芯片中间一刀切!

模拟信号铺模拟地,模拟地/模拟电源与数字电源通过电感/磁珠单点连接。
基于PCB设计软件的PCB设计也可看做是一种软件开发过程,软件工程最注重“迭代开发”的思想,我觉得PCB设计中也可以引入该思想,减少PCB错误的概率。
(1) 原理图检查,尤其注意器件的电源和地(电源和地是系统的血脉,不能有丝毫疏忽)
(2) PCB封装绘制(确认原理图中的管脚是否有误)
(3) PCB封装尺寸逐一确认后,添加验证标签,添加到本次设计封装库
(4) 导入网表,边布局边调整原理图中信号顺序(布局后不能再使用OrCAD的元件自动编号功能)
(5) 手工布线(边布边检查电源地网络,前面说过:电源网络使用铺铜方式,所以少用走线)
总之,PCB设计中的指导思想就是边绘制封装布局布线边反馈修正原理图(从信号连接的正确性、信号走线的方便性考虑)。
晶振离芯片尽量近,且晶振下尽量不走线,铺地网络铜皮。多处使用的时钟使用树形时钟树方式布线。
连接器上信号的排布对布线的难易程度影响较大,因此要边布线边调整原理图上的信号(但千万不能重新对元器件编号)
多板接插件的设计:
(1) 使用排线连接:上下接口一致
(2) 直插座:上下接口镜像对称,如下图

模块连接信号的设计:
(1) 若2个模块放置在PCB同一面,如下:管教序号大接小小接大(镜像连接信号)

(2) 若2个模块放在PCB不同面,则管教序号小接小大接大
这样做能放置信号像上面的右图一样交叉。当然,上面的方法不是定则,我总是说,凡事随需而变(这个只能自己领悟),只不过在很多情况下按这种方式设计很管用罢了。
硬件开发
2020-05-06 17:33:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>

/*
* SevSegFour
* 驱动四位数码管显示0到9999
*/
#include "SevSeg.h"
SevSeg sevseg;
byte numDigits = 4; //数码管位数
byte digitPins[] = {2, 3, 12, 13}; //数码管公共极连接Arduino的引脚
byte segmentPins[] = {7, 6, 5, 10, 11, 8, 9, 4}; //数码管a,b,c,d,e,f,g,dp对应引脚
byte hardwareConfig = COMMON_ANODE ; // COMMON_CATHODE|共阴极数码管 COMMON_ANODE|共阳极数码管
int numToShow = 0;
int delaycount = 0;
void setup() {
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins); //初始化数码管
}
void loop() {
delaycount++;
if (delaycount == 1000) { //通过变量自加来达到延时效果,如果使用delay函数则会打断数码管显示
delaycount = 0;
numToShow++;
}
if (numToShow > 9999)
{
numToShow = 0;
}

sevseg.setNumber(numToShow, -1); //设置要显示的数据,不显示小数点
sevseg.refreshDisplay(); // 必须重复运行刷新数码管显示
}
硬件开发
2020-05-02 09:44:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
MCS-51系列单片机
MCS-51系列单片机分为两大系列,即51子系列与52子系列。
51子系列:基本型,根据片内ROM的配置,对应的芯片为8031、8051、8751、8951
52子系列:增强型,根据片内ROM的配置,对应的芯片为8032、8052、8752、8952
这两大系列单片机的主要硬件特性如下表:
从上表中可以看到,8031、8031、8032、80C32片内是没有ROM的,对应着上表看,我们可以发现,51系列的单片机的RAM大小为128B,52系列的RAM大小为256B,51系列的计数器为两个16位的,52系列的计数器为三个16位计数器。51系列的中断源为5个,52系列的中断源为6个。
8051与80C51的区别:
80C51单片机是在8051的基础上发展起来的,也就是说在单片机的发展过程中是先有8051,然后才有80C51的。
8051单片机与80C51单片机从外形看是完全一样的,其指令系统、引脚信号、总线等完全一致(完全兼容),也就是说在8051下开发的软件完全可以在80C51上应用,反过来,在89C51下开发的软件也可以在8051上应用。这两种单片机是完全可移植的。
既然这两种单片机外形及内部结构都一样,那它们之间的主要差别在哪里呢?
8051与80C51单片机的主要差别就在于芯片的制造工艺上。80C51的制造工艺是在8051基础上进行了改进。
8051系列单片机采用的是HMOS工艺:高速度、高密度;
80C51系列单片机采用的是CHMOS工艺:高速度、高密度、低功耗;
也就是说80C51单片机是一种低功耗单片机。
单片机常用名词解释
总线: 指能为多个部件服务的信息传送线,在微机系统中各个部件通过总线相互通信。
地址总线(AB): 地址总线是单向的,用于传送地址信息。地址总线的宽度为16位,因此基外部存储器直接寻址64K,16位地址总线由P0口经地址锁存器提供低8位地址(A0~A7),P2口直接提供高8位地址(A8~A15)。
数据总线(DB): 一般为双向,用于CPU与存储器,CPU与外设、或外设与外设之间传送数据信息(包括实际意义的数据和指令码)。数据总线宽度为8位,由P0口提供。
控制总线(CB): 是计算机系统中所有控制信号的总称,在控制总线中传送的是控制信息。由P3口的第二功能状态和4根独立的控制总线,RESET、EA、ALE、PSEN组成。
存储器: 用来存放计算机中的所有信息:包括程序、原始数据、运算的中间结果及最终结果等。
只读存储器(ROM):只读存储器在使用时,只能读出而不能写入,断电后ROM中的信息不会丢失。因此一般用来存放一些固定程序,如监控程序、子程序、字库及数据表等。ROM按存储信息的方法又可分为以下几种:
1、掩膜ROM:
掩膜ROM也称固定ROM,它是由厂家编好程序写入ROM(称固化)供用户使用,用户不能更改内部程序,其特点是价格便宜。
2、可编程的只读存储器(PROM):
它的内容可由用户根据自已所编程序一次性写入,一旦写入,只能读出,而不能再进行更改,这类存储器现在也称为OTP(Only Time Programmable)。
3、可改写的只读存储器EPROM:
前两种ROM只能进行一次性写入,因而用户较少使用,目前较为流行的ROM芯片为EPROM。因为它的内容可以通过紫外线照射而彻底擦除,擦除后又可重新写入新的程序。
4、可电改写只读存储器(EEPROM):
EEPROM可用电的方法写入和清除其内容,其编程电压和清除电压均与微机CPU的5V工作电压相同,不需另加电压。它既有与RAM一样读写操作简便,又有数据不会因掉电而丢失的优点,因而使用极为方便。现在这种存储器的使用最为广泛。
5、随机存储器(RAM):
这种存储器又叫读写存储器。它不仅能读取存放在存储单元中的数据,还能随时写入新的数据,写入后原来的数据就丢失了。断电后RAM中的信息全部丢失。因些,RAM常用于存放经常要改变的程序或中间计算结果等信息。
RAM按照存储信息的方式,又可分为静态和动态两种。
①静态SRAM: 其特点是只要有电源加于存储器,数据就能长期保存。
②动态DRAM: 写入的信息只能保存若干ms时间,因此,每隔一定时间必须重新写入一次,以保持原来的信息不变。
6、可现场改写的非易失性存储器:
这种存储器的特点是:从原理上看,它们属于ROM型存储器,从功能上看,它们又可以随时改写信息,作用又相当于RAM。所以,ROM、RAM的定义和划分已逐渐的失去意义。
①快擦写存储器(FLASH)
这种存储器是在EPROM和EEPROM的制造基础上产生的一种非易失性存储器。其集成度高,制造成本低于DRAM,既具有SRAM读写的灵活性和较快的访问速度,又具有ROM在断电后可不丢失信息的特点,所以发展迅速。
②铁电存储器FRAM
它是利用铁电材料极化方向来存储数据的。它的特点是集成度高,读写速度快,成本低,读写周期短。
时钟周期:计算机在时钟信号的作用下,以节拍方式工作。因此必须有一个时钟发生电路,输入微处理器的时钟信号的周期称为时钟周期。
机器周期:机器完成一个动作所需的时间称为机器周期,一般由一个或一个以上的时钟周期组成。在我们讲述的MCS-51系列单片机中,一个机器周期由12个时钟周期组成。
指令周期:执行一条指令(如“MOV A,#34H”,该指令的含义是将立即数34H传送到微处理器内的累加器A中)所需时间称为指令周期,它由一个到数个机器周期组成。指令周期的长短取决于指令的类型,即指令将要进行的操作步聚及复杂程度。
汇编: 是能完成一定任务的机器指令的集合。
二进制数: 只有0和1两个数码,基数为二。
16进制数: 采用0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F等16个数码,其中A-F相应的十进数为10-15,基数是16。
指令: 是计算机所能执行的一种基本操作的描述,是计算机软件的基本单元。
字节:8位二进制数组成一个字节,在存储器中以字节为单位存储信息。
字:2个字节组成一个字。
双字:2个字组成一个双字。
补码:机器数可用不同的码制来表示,补码表示法是最常用的一种,正数采用符号-绝对值表示,即数的最高有效位为0,数的其余部分则表示数的绝对值;负数的表示要麻烦一些,先写出与该负数相对应的正数的补码表示,然后将其按位求反,最后在末位加1,就可以得到该负数的补码表示了。
段地址:8086CPU将1MB的存储器空间分成许多逻辑段,每个段最大限制为64KB,段地址就是逻辑段在主存中的起始位置。为了能用16位寄存器表示段地址,8086规定段地址必须是模16地址,即为xxxx0H形式,省略低4位0,段地址就可以用16位数据表示,它通常被保存在16位的段寄存器中。
偏移地址:存单元距离段起始位置的偏移量简称偏移地址,由于限定每段不超过64KB,所以偏移地址也可以用16位数据表示。
物理地址:在1M字节的存储器里,每一个存储单元都有一个唯一的20位地址,称为该存储单元的物理地址,把段地址左移4位再加上偏移地址就形成物理地址。
代码段:程序员在编制程序时要把存储器划分成段,代码段用来存放程序的指令序列,代码段的段地址存放在CS中,指令指针寄存器IP指示代码段中指令的偏移地址,处理器利用CS:IP取得下一条要执行的指令。
数据段:数据段存放当前运行程序所用的数据,数据段的段地址存放在DS中。
附加段:附加段是附加的数据段,也用于数据的保存,另外,串操作指令将附加段作为其目的操作数的存放区域。附加段的段地址存放在ES中。
堆栈段:堆栈段是堆栈所在的主存区域,堆栈段的段地址存放在SS中,堆栈指针寄存器SP指示堆栈栈顶的偏移地址,处理器利用SS:SP操作堆栈中的数据。
堆栈:堆栈是一个"后进先出"的主存区域,位于堆栈段中,使用SS段寄存器记录其段地址。它只有一个出入口,即当前栈顶,栈顶是地址较小的一端(低端),它用堆栈指针寄存器SP指定。堆栈有两种以字为单位的基本操作,对应两条基本指令:进栈指令PUSH和出栈指令POP。
伪指令:汇编语言程序的语句除指令外还包括伪指令和宏指令,伪指令又称为伪操作,它不象机器指令那样是在程序运行期间由计算机来执行的,它是在汇编程序对源程序汇编期间由汇编程序处理的操作,完成诸如数据定义、分配存储区、指示程序结束等功能。
宏指令:宏是源程序中一段有独立功能的程序代码,它只需要在源程序中定义一次,就可以多次调用,调用时只需要用一个宏指令语句就可以了。宏指令是用户自定义的指令,在编程时将多次使用的功能用一条宏指令来代替。
子程序:子程序又称为过程,它相当于高级语言中的过程和函数。在一个程序的不同部分,往往要用到类似的程序段,这些程序段的功能和结构形式都相同,只是某些变量的赋值不同,此时就可以把这些程序段写成子程序形式,以便需要时可以调用它;某些常用的特定功能的程序段也可编制成子程序的形式供用户使用。
中断:中断是一种使CPU中止正在执行的程序而转去处理特殊事件的操作,这些引起中断的事件称为中断源,它们可能是来自外设的输入输出请求,也可能是计算机的一些异常事故或其它内部原因。
中断处理程序:当中断发生时,处理器中止当前正在运行的程序,而转到处理特殊事件的程序段中去执行,这种处理中断的子程序就是中断处理程序,又称为中断服务程序。中断处理程序的入口地址被安排在中断向量表中。
BIOS中断:在存储器系统中,从地址0FE000H开始的8K ROM中装有BIOS(Basic Input/Output System)例行程序。驻留在ROM中的基本输入输出程序BIOS提供了系统加电自检、引导装入、主要I/O设备的处理程序以及接口控制等功能模块来处理所有的系统中断。BIOS中断给程序员编程带来很大方便,程序员不必了解硬件I/O接口的特性,可直接用指令设置参数,然后中断调用BIOS中的程序。
暂存器: 用来暂存由数据总线或通用寄存器送来的操作数,并把它作为另一个操作数。
中断: 中断是单片机实时地处理内部或外部事件的一种内部机制。当某种内部或外部事件发生时,单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理,中断处理完毕后,又返回被中断的程序处,继续执行下去。
掉电保护: 指在正常供电电源掉电时,迅速用备用直流电源供电,以保证在一段时间内信息不会丢失,当主电源恢复供电时,又自动切换为主电源供电。
寄存器寻址: 操作数在寄存器中,由指令操作码中的rrr三位的值和PSW中RS1及RS0的状态,选中某个工作寄存器区的某个寄存器,然后进行相应的指令操作。
波特率: 即每秒钟传送二进制数的位数, 波特率越高,数据传输的速度越快。
D/A转换: 即将二进制数量转换成与其量值成正比的电流信号或电压信号。
A/D转换: 即将模拟量转换成相应的数字量,然而送计算机处理。
串行方式: 指数据的各位分时传送,只需一条数据线,外加一条公共信号地线和若干条控制信号线。
并行方式: 指数据的各位同时传送,每一条数据都需要一条传输线。
伪指令: 用于告诉汇编程序如何进行汇编的指令,它既不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编如何进行。
SLEEP MODI 睡觉模式: 保证程序内部运行,但与外部的传输等动作已停止的一种运行模式。
linking 连接: 把编译后生成的 *.obj 文件与其它 *.obj文件合并成机器能识别的机器文件。
I2C:输入与输出共用一条传输线,而时钟由另一条线控制的一种串行传输方式。
SFR 特殊功能寄存器区: 8051 把 CPU 中的专用寄存器、并行端口锁存器、串行口与定时器/计数器内的控制寄存器集中安排到一个区域,离散地分布在地址从 80H 到 FFH 范围内,这个区域称为特殊功能寄存器区 SFR。
常用逻辑电路
在逻辑电路中,输入和输出只有两种状态,即高电平和低电平。通常以逻辑“1”和“0”表示电平高低。
1、 与门
是一个能够实现逻辑乘运算的、多端输入、单端输出的逻辑电路。
逻辑解释:
即如右边图所示,当开关A与B当中只有全部闭合(即为高电平1)时,才会有输出(即灯泡才会亮)所以在与门电路中,只有输入的全部条件为高电平“1”时输会有输出。
语言表达为:“有0出0,全1出1”
2、 或门
是一个能够实现逻辑加运算的、多端输入、单端输出的逻辑电路。
逻辑解释:
即如右边图所示,当开关A与B当中只要有一个开关闭合(即为高电平1)时,就会有输出(即灯泡才会亮)所以在或门电路中,只要输入的为高电平“1”就会有输出。
语言表达为:“有1出1,全0出0”。
3、 非门
是一个能够实现逻辑非运算的、单端输入、单端输出的逻辑电路。非就是反,就是否定,也就是输入与输出的状态总是相反。
逻辑解释:
如右边图所示,当开关K断开时灯亮,开关闭合时灯灭。如以开关断开为灯亮,开关接通为灭为结果,则开关K与灯泡的因果关系为非逻辑关系。
语言表达为:“有0出1,有1出0”。
复合逻辑门电路
1、 与非门
将一个与门与一个非门联接起来就构成了一个与非门。
根据与门和非门的逻辑功能,可以列出与非门逻辑关系真值表。其逻辑功能的特点是:“当输入全为1,输出为0;只要输入有0,输出就为1”。
真值表如下:
2、 或非门
将一个或门与一个非门联接起来就构成了一个或非门。
根据或门和非门的逻辑功能,可以列出与非门逻辑关系真值表。其逻辑功能的特点是:“当输入全为0,输出为1;只要输入有1,输出就为0”。
真值表如下:
3、 异或门
异或门只有两个输入端和一个输出端。
其逻辑功能的特点是:“当两个输入端一个为0,另一个为1时,当两个输入端均为1或均为0时,输出为0”。
真值表如下:
异或门的作用是:把两路信号进行比较,判断是否相同。当两路输入信号不同,即一个为高电平,一个为低电平时,输出为高电平。反之当两个输出端信号相同时,即为高电平或低电平时,输出为低电平”。
触发器
触发器是计算机记忆装置的基本单元,它具有把以前的输入‘记忆’下来的功能,一个触发器能储存一位二进制代码。下面我们简单的来介绍计算机中常用的几中触发器。
1
R-S触发器
R-S触发器的逻辑符号如下图所示,它有两个输入端,两个输出端。其中,S为置位信号输入端,R为复位信号输入端;Q和Q非为输出端。规定Q为高、Q非为低时,该触发器为1状态;反之为0状态。其真值表如下。
2
D触发器
D触发器又称数据触发器,它的逻辑符号如下图所示,R、S分别为强制置0、置1端,触发器的状态是由时钟脉冲CLK上升沿到来时D端的状态决字。当D=1时,触发器为1状态;反之为0状态。其真值表如下
3
J-K触发器
J-K触发器的逻辑符号如下,R、S分别为强制置0、置1端。K为同步置0输入端,J为同步置1输入端。触发器的状态是由时钟脉冲CLK下降沿到来时J、K端的状态决定,其真值表如下
J-K触发器的逻辑功能比较全面,因此在各种寄存器、计算器、逻辑控制等方面应用最为广泛。但在某些情况,如二进制计数、移位、累加等,多用D触发器。由于D触发器线路简章,所以大量应用于移位寄存器等方面。
寄存器
寄存器是由触发器组成的,一个触发器是一个一位寄存器。多个触发器就可以组成一个多位的寄存器。由于寄存器在计算机中的作用不同,从而被命名不同,常用的有缓冲寄存器、移位寄存器、计数器等。下面我们就简单的来介绍下这些寄存器的电路结构及工作原理。
1
缓冲寄存器
它是用来暂存某个数据,以便在适当的时间节拍和给定的计算步骤将数据输入或输出到其它记忆单元中去,下图是一个并行输入、并行输出的4位缓冲器的电路原理图,它由4个D触发器组成。
启动时,先在清零端加清零脉冲,把各触发器置0,即Q端为0。然后,把数据加到触发器的D输入端,在CLK时钟信号作用下,输入端的信息就保存在各触发器中(D0~D3)。
2
移位寄存器
移位寄存器能将所储存的数据逐位向左或向右移动,以达到计算机运行过程中所需的功能,请看下图
启动时,先在清零端加清零脉冲,使触发器输出置0。然后,第一个数据D0加到触发器1的串行输入端,在第一个CLK脉冲的上升沿Q0=Q0,Q1=Q2。Q3=Q0。其后,第二个数据D1加到串行输入端,在第二个CLK脉冲到达时,Q0=Q1,Q1=Q0,Q2=Q3=0。以此类推,当第四个CLK来到之后,各输出端分别是Q0=Q3,Q1=Q2,Q2=Q1,Q3=Q0。输出数据可用串行的形式取出,也可用并行开式取出。
3
计数器
计数器也是由若干个触发器组成的寄存器,它的特点是能够把存款在其中的数据加1或减1。计数器的种类也很多,有行波计数器、同步计数器等,下面我们就以行波计数器向大家作个介绍。
下图就是一个由J-K触发器组成的行波计数器的工作原理图。这种计数器的特点是:第一个时钟脉冲促使其最低有效位加1,使其由0变1;第二个时钟脉冲促使最低有效位由1变0。同时推动第二位,使其由0变1;同理,第二位由1变0时又去推动第三位,使其由0变1,这样有如水波前进一样逐位进位下去。
上图中各位的J、K输入端都是悬浮的,这相当于J、K输入端都是置1的状态,即各位都处于准备翻转的状态。只要时钟脉冲边沿一到,最右边的触发器就会翻转,即Q由0转为1或由1转为0。
上图中的这个计数器是4位的,因此可以计0~15的数。如果要计更多的数,需要增加位数,如8位计数器可计0~255的数,16位则可计0~65535的数。
4
三态门(三态缓冲器)
为减少信息传输线的数目,大多数计算机中的信息传输线均采用总线形式,即凡要传输的同类信息都走同一组传输线,且信息是分时传送的。在计算机中一般有三组总线,即数据总线、地址总线和控制总线。为防止信息相互干扰,要求凡挂在总线上的寄存器或存储器等,它的传输端不仅能呈现0、1两个信息状态,而且还应能呈现第三种状态——高阻抗状态(又称高阻状态),即此时好像它们的输出被断开,对总线状态不起作用,此时总线可由其它器件占用。三态门即可实现上述的功能,它除具有输入输出端之外,还有一控制端,请看下图。
当控制端E=1时,输出=输入,此时总线由该器件驱动,总线上的数据由输入数据决定;
当控制端E=0时,输出端呈高阻抗状态,该器件对总线不起作用。当寄存器输出端接至三态门,再由三态门输出端与总线连接起来,就构成三态输出的级冲寄存器。如下图所示就是一个4位的三态输出缓冲寄存器。由于这里采用的是单向三态门,所以数据只能从寄存器输出到数据总线。如果要实现双向传送,则要用双向三态门。
硬件开发
2020-04-27 15:47:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
如前所述,FPGA是在PAL、GAL、EPLD、CPLD等可编程器件的基础上进一步发展的产物。它是作为ASIC领域中的一种半定制电路而出现的,即解决了定制电路的不足,又克服了原有可编程器件门电路有限的缺点。
由于FPGA需要被反复烧写,它实现组合逻辑的基本结构不可能像ASIC那样通过固定的与非门来完成,而只能采用一种易于反复配置的结构。查找表可以很好地满足这一要求,目前主流FPGA都采用了基于SRAM工艺的查找表结构,也有一些军品和宇航级FPGA采用Flash或者熔丝与反熔丝工艺的查找表结构。通过烧写文件改变查找表内容的方法来实现对FPGA的重复配置。
根据数字电路的基本知识可以知道,对于一个 n 输入的逻辑运算,不管是与或非运算还是异或运算等等,最多只可能存在 2n 种结果。所以如果事先将相应的结果存放于一个存贮单元,就相当于实现了与非门电路的功能。FPGA的原理也是如此,它通过烧写文件去配置查找表的内容,从而在相同的电路情况下实现了不同的逻辑功能。
查找表(Look-Up-Table)简称为LUT,LUT本质上就是一个RAM。目前FPGA中多使用4输入的LUT,所以每一个LUT可以看成一个有4位地址线的 的RAM。 当用户通过原理图或HDL语言描述了一个逻辑电路以后,PLD/FPGA开发软件会自动计算逻辑电路的所有可能结果,并把真值表(即结果)事先写入RAM,这样,每输入一个信号进行逻辑运算就等于输入一个地址进行查表,找出地址对应的内容,然后输出即可。
下面给出一个4与门电路的例子来说明LUT实现逻辑功能的原理。
例1-1 :给出一个使用LUT实现4输入与门电路的真值表。
表1-1 4输入与门的真值表


从中可以看到,LUT具有和逻辑电路相同的功能。实际上,LUT具有更快的执行速度和更大的规模。
由于基于LUT的FPGA具有很高的集成度,其器件密度从数万门到数千万门不等,可以完成极其复杂的时序与逻辑组合逻辑电路功能,所以适用于高速、高密度的高端数字逻辑电路设计领域。其组成部分主要有可编程输入/输出单元、基本可编程逻辑单元、内嵌SRAM、丰富的布线资源、底层嵌入功能单元、内嵌专用单元等,主要设计和生产厂家有Xilinx、Altera、Lattice、Actel、Atmel和QuickLogic等公司,其中最大的是Xilinx、Altera、Lattice三家。
如前所述,FPGA是由存放在片内的RAM来设置其工作状态的,因此工作时需要对片内RAM进行编程。用户可根据不同的配置模式,采用不同的编程方式。FPGA有如下几种配置模式: 并行模式:并行PROM、Flash配置FPGA; 主从模式:一片PROM配置多片FPGA; 串行模式:串行PROM配置FPGA; 外设模式:将FPGA作为微处理器的外设,由微处理器对其编程。
目前,FPGA市场占有率最高的两大公司Xilinx和Altera生产的FPGA都是基于SRAM工艺的,需要在使用时外接一个片外存储器以保存程序。上电时,FPGA将外部存储器中的数据读入片内RAM,完成配置后,进入工作状态;掉电后FPGA恢复为白片,内部逻辑消失。这样FPGA不仅能反复使用,还无需专门的FPGA编程器,只需通用的EPROM、PROM编程器即可。Actel、QuickLogic等公司还提供反熔丝技术的FPGA,只能下载一次,具有抗辐射、耐高低温、低功耗和速度快等优点,在军品和航空航天领域中应用较多,但这种FPGA不能重复擦写,开发初期比较麻烦,费用也比较昂贵。Lattice是ISP技术的发明者,在小规模PLD应用上有一定的特色。早期的Xilinx产品一般不涉及军品和宇航级市场,但目前已经有Q Pro-R等多款产品进入该类领域。
1.2.2 FPGA芯片结构
目前主流的FPGA仍是基于查找表技术的,已经远远超出了先前版本的基本性能,并且整合了常用功能(如RAM、时钟管理和DSP)的硬核(ASIC型)模块。如图1-1所示(注:图1-1只是一个示意图,实际上每一个系列的FPGA都有其相应的内部结构),FPGA芯片主要由6部分完成,分别为:可编程输入输出单元、基本可编程逻辑单元、完整的时钟管理、嵌入块式RAM、丰富的布线资源、内嵌的底层功能单元和内嵌专用硬件模块。



图1-1 FPGA芯片的内部结构
每个模块的功能如下:
1. 可编程输入输出单元(IOB)
可编程输入/输出单元简称I/O单元,是芯片与外界电路的接口部分,完成不同电气特性下对输入/输出信号的驱动与匹配要求,其示意结构如图1-2所示。FPGA内的I/O按组分类,每组都能够独立地支持不同的I/O标准。通过软件的灵活配置,可适配不同的电气标准与I/O物理特性,可以调整驱动电流的大小,可以改变上、下拉电阻。目前,I/O口的频率也越来越高,一些高端的FPGA通过DDR寄存器技术可以支持高达2Gbps的数据速率。



图1-2 典型的IOB内部结构示意图
外部输入信号可以通过IOB模块的存储单元输入到FPGA的内部,也可以直接输入FPGA 内部。当外部输入信号经过IOB模块的存储单元输入到FPGA内部时,其保持时间(Hold Time)的要求可以降低,通常默认为0。
为了便于管理和适应多种电器标准,FPGA的IOB被划分为若干个组(bank),每个bank的接口标准由其接口电压VCCO决定,一个bank只能有一种VCCO,但不同bank的VCCO可以不同。只有相同电气标准的端口才能连接在一起,VCCO电压相同是接口标准的基本条件。
2. 可配置逻辑块(CLB)
CLB是FPGA内的基本逻辑单元。CLB的实际数量和特性会依器件的不同而不同,但是每个CLB都包含一个可配置开关矩阵,此矩阵由4或6个输入、一些选型电路(多路复用器等)和触发器组成。 开关矩阵是高度灵活的,可以对其进行配置以便处理组合逻辑、移位寄存器或RAM。在Xilinx公司的FPGA器件中,CLB由多个(一般为4个或2个)相同的Slice和附加逻辑构成,如图1-3所示。每个CLB模块不仅可以用于实现组合逻辑、时序逻辑,还可以配置为分布式RAM和分布式ROM。



图1-3 典型的CLB结构示意图
Slice是Xilinx公司定义的基本逻辑单位,其内部结构如图1-4所示,一个Slice由两个4输入的函数、进位逻辑、算术逻辑、存储逻辑和函数复用器组成。算术逻辑包括一个异或门(XORG)和一个专用与门(MULTAND),一个异或门可以使一个Slice实现2bit全加操作,专用与门用于提高乘法器的效率;进位逻辑由专用进位信号和函数复用器(MUXC)组成,用于实现快速的算术加减法操作;4输入函数发生器用于实现4输入LUT、分布式RAM或16比特移位寄存器(Virtex-5系列芯片的Slice中的两个输入函数为6输入,可以实现6输入LUT或64比特移位寄存器);进位逻辑包括两条快速进位链,用于提高CLB模块的处理速度。



图1-4 典型的4输入Slice结构示意图
3. 数字时钟管理模块(DCM)
业内大多数FPGA均提供数字时钟管理(Xilinx的全部FPGA均具有这种特性)。Xilinx推出最先进的FPGA提供数字时钟管理和相位环路锁定。相位环路锁定能够提供精确的时钟综合,且能够降低抖动,并实现过滤功能。
4. 嵌入式块RAM(BRAM)
大多数FPGA都具有内嵌的块RAM,这大大拓展了FPGA的应用范围和灵活性。块RAM可被配置为单端口RAM、双端口RAM、内容地址存储器(CAM)以及FIFO等常用存储结构。RAM、FIFO是比较普及的概念,在此就不冗述。CAM存储器在其内部的每个存储单元中都有一个比较逻辑,写入CAM中的数据会和内部的每一个数据进行比较,并返回与端口数据相同的所有数据的地址,因而在路由的地址交换器中有广泛的应用。除了块RAM,还可以将FPGA中的LUT灵活地配置成RAM、ROM和FIFO等结构。在实际应用中,芯片内部块RAM的数量也是选择芯片的一个重要因素。
单片块RAM的容量为18k比特,即位宽为18比特、深度为1024,可以根据需要改变其位宽和深度,但要满足两个原则:首先,修改后的容量(位宽 深度)不能大于18k比特;其次,位宽最大不能超过36比特。当然,可以将多片块RAM级联起来形成更大的RAM,此时只受限于芯片内块RAM的数量,而不再受上面两条原则约束。
5. 丰富的布线资源
布线资源连通FPGA内部的所有单元,而连线的长度和工艺决定着信号在连线上的驱动能力和传输速度。FPGA芯片内部有着丰富的布线资源,根据工艺、长度、宽度和分布位置的不同而划分为4类不同的类别。第一类是全局布线资源,用于芯片内部全局时钟和全局复位/置位的布线;第二类是长线资源,用以完成芯片Bank间的高速信号和第二全局时钟信号的布线;第三类是短线资源,用于完成基本逻辑单元之间的逻辑互连和布线;第四类是分布式的布线资源,用于专有时钟、复位等控制信号线。
在实际中设计者不需要直接选择布线资源,布局布线器可自动地根据输入逻辑网表的拓扑结构和约束条件选择布线资源来连通各个模块单元。从本质上讲,布线资源的使用方法和设计的结果有密切、直接的关系。
6. 底层内嵌功能单元
内嵌功能模块主要指DLL(Delay Locked Loop)、PLL(Phase Locked Loop)、DSP和CPU等软处理核(Soft Core)。现在越来越丰富的内嵌功能单元,使得单片FPGA成为了系统级的设计工具,使其具备了软硬件联合设计的能力,逐步向SOC平台过渡。
DLL和PLL具有类似的功能,可以完成时钟高精度、低抖动的倍频和分频,以及占空比调整和移相等功能。Xilinx公司生产的芯片上集成了DLL,Altera公司的芯片集成了PLL,Lattice公司的新型芯片上同时集成了PLL和DLL。PLL 和DLL可以通过IP核生成的工具方便地进行管理和配置。DLL的结构如图1-5所示。



图1-5 典型的DLL模块示意图
7. 内嵌专用硬核
内嵌专用硬核是相对底层嵌入的软核而言的,指FPGA处理能力强大的硬核(Hard Core),等效于ASIC电路。为了提高FPGA性能,芯片生产商在芯片内部集成了一些专用的硬核。例如:为了提高FPGA的乘法速度,主流的FPGA中都集成了专用乘法器;为了适用通信总线与接口标准,很多高端的FPGA内部都集成了串并收发器(SERDES),可以达到数十Gbps的收发速度。
Xilinx公司的高端产品不仅集成了Power PC系列CPU,还内嵌了DSP Core模块,其相应的系统级设计工具是EDK和Platform Studio,并依此提出了片上系统(System on Chip)的概念。通过PowerPC、Miroblaze、Picoblaze等平台,能够开发标准的DSP处理器及其相关应用,达到SOC的开发目的。
1.2.3 软核、硬核以及固核的概念
IP(Intelligent Property)核是具有知识产权核的集成电路芯核总称,是经过反复验证过的、具有特定功能的宏模块,与芯片制造工艺无关,可以移植到不同的半导体工艺中。到了SOC阶段,IP核设计已成为ASIC电路设计公司和FPGA提供商的重要任务,也是其实力体现。对于FPGA开发软件,其提供的IP核越丰富,用户的设计就越方便,其市场占用率就越高。目前,IP核已经变成系统设计的基本单元,并作为独立设计成果被交换、转让和销售。
从IP核的提供方式上,通常将其分为软核、硬核和固核这3类。从完成IP核所花费的成本来讲,硬核代价最大;从使用灵活性来讲,软核的可复用使用性最高。
1. 软核
软核在EDA设计领域指的是综合之前的寄存器传输级(RTL)模型;具体在FPGA设计中指的是对电路的硬件语言描述,包括逻辑描述、网表和帮助文档等。软核只经过功能仿真,需要经过综合以及布局布线才能使用。其优点是灵活性高、可移植性强,允许用户自配置;缺点是对模块的预测性较低,在后续设计中存在发生错误的可能性,有一定的设计风险。软核是IP核应用最广泛的形式。
2. 固核
固核在EDA设计领域指的是带有平面规划信息的网表;具体在FPGA设计中可以看做带有布局规划的软核,通常以RTL代码和对应具体工艺网表的混合形式提供。将RTL描述结合具体标准单元库进行综合优化设计,形成门级网表,再通过布局布线工具即可使用。和软核相比,固核的设计灵活性稍差,但在可靠性上有较大提高。目前,固核也是IP核的主流形式之一。
3. 硬核
硬核在EDA设计领域指经过验证的设计版图;具体在FPGA设计中指布局和工艺固定、经过前端和后端验证的设计,设计人员不能对其修改。不能修改的原因有两个:首先是系统设计对各个模块的时序要求很严格,不允许打乱已有的物理版图;其次是保护知识产权的要求,不允许设计人员对其有任何改动。IP硬核的不许修改特点使其复用有一定的困难,因此只能用于某些特定应用,使用范围较窄。

学习更多 FPGA 知识就来 https://www.eda365.com/forum-50-1.html
硬件开发
2020-03-27 10:32:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
本文永久更新地址: https://my.oschina.net/bysu/blog/3197723
1.安装vundle插件;
2.安装vim-go;
3.安装最为头大的YouCompleteMe;
通过git clone 来离线安装YouCompleteMe。步骤如下:
cd ~/.vim/bundle
然后执行 git clone https://gitee.com/Random_Coder/YouCompleteMe.git
把YouCompleteMe目录的所有者改为当前用户(bysu) sudo chown -R bysu:bysu YouCompleteMe
然后执行 git submodule update --init --recursive
报上面的错一般是因为curl的postBuffer的默认值太小和git clone速度太慢,可能被限制了,现在贴出这两方面的解决方案。
postBuffer的默认值太小:
在这里,笔者把postBuffer的值配置成500M,对笔者来说已经够了。可以根据你需要下载的文件大小,将postBuffer值配置成合适的大小。 git config --global http.postBuffer 524288000
这样已经配置好了,如果你不确定,可以根据以下命令查看postBuffer。
git config --list
————————————————
版权声明:本文为CSDN博主「Jane.zhong」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dzhongjie/article/details/81152983
git clone速度太慢
1、查找域名对应的ip地址,并修改hosts文件
先执行 pacman -Sy dnsutils 安装dnsutils,要不会提示没有nslookup命令。 ifconfig,route在net-tools中,nslookup,dig在dnsutils中,ftp,telnet等在inetutils中,ip命令在iproute2中 ;netcfg
nslookup github.global.ssl.fastly.Net
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
Name: github.global.ssl.fastly.Net
Address: 151.101.229.194
nslookup github.com
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
Name: github.com
Address: 13.229.188.59
sudo vim /etc/hosts
在文末加上下面两行,下面分别对应上面查出来标了底色部分的内容。然后重启网络服务,archlinux上重启网络服务的命令找到了,但是提示不对,反正我是直接重启了的。
解决掉git clone慢的问题后,可以直接通过git clone把相关文件下到对应的目录 cd /home/bysu/.vim/bundle/YouCompleteMe/third_party git clone https://github.com/Valloric/ycmd
继续执行 git submodule update --init --recursive
不行就多试几次,搞完之后,要安装
编译之前先安装: cmake gcc sudo pacman -Sy cmake gcc
安装完后,开始执行下面进行编译 cd ~/.vim/bundle/YouCompleteMe ./install.py ##########如果需要支持golang######## ./install.py --go-completer ##########如果需要同时支持多种语言如:golang,java,C######## ./install.py --go-completer --java-completer --clangd-completer ##########如果需要插件当前支持的所有语言######## ./install.py --all
开始编译之后,我被卡在了45%那个地方,我以为是树莓派性能太差了的原因,第二天起来还是在45%,打算留个三天三夜,谁知道过一两个小时就报错了。这个时候连报错都觉得是好消息——报错没关系,就怕卡在那里又没错误。 [ 42%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/regex/src/regex_raw_buffer.cpp.o [ 45%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/regex/src/regex_traits_defaults.cpp.o c++: fatal error: Killed signal terminated program cc1plus compilation terminated. make[3]: *** [BoostParts/CMakeFiles/BoostParts.dir/build.make:232: BoostParts/CMakeFiles/BoostParts.dir/libs/regex/src/instances.cpp.o] Error 1 make[3]: *** Waiting for unfinished jobs.... make[3]: Leaving directory '/tmp/ycm_build_galdq8zl' make[2]: *** [CMakeFiles/Makefile2:115: BoostParts/CMakeFiles/BoostParts.dir/all] Error 2 make[2]: Leaving directory '/tmp/ycm_build_galdq8zl' make[1]: *** [CMakeFiles/Makefile2:149: ycm/CMakeFiles/ycm_core.dir/rule] Error 2 make[1]: Leaving directory '/tmp/ycm_build_galdq8zl' make: *** [Makefile:131: ycm_core] Error 2 ERROR: the build failed. NOTE: it is *highly* unlikely that this is a bug but rather that this is a problem with the configuration of your system or a missing dependency. Please carefully read CONTRIBUTING.md and if you're sure that it is a bug, please raise an issue on the issue tracker, including the entire output of this script and the invocation line used to run it.
搜索发现是因为树莓派内存不足引起报错。
解决方案: 通过增加swap交换分区来解决 sudo fdisk -l #########上面命令执行后,输出如下################# Disk /dev/mmcblk0: 29.74 GiB, 31914983424 bytes, 62333952 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xa1b33fd1 Device Boot Start End Sectors Size Id Type /dev/mmcblk0p1 2048 206847 204800 100M c W95 FAT32 (LBA) /dev/mmcblk0p2 206848 62333951 62127104 29.6G 83 Linux ######################### sudo mkdir -p /var/cache/swap/ sudo dd if=/dev/mmcblk0 of=/var/cache/swap/swap0 bs=1M count=512 #/dev/mmcblk0根据上面命令查看 sudo chmod 0600 /var/cache/swap/swap0 sudo mkswap /var/cache/swap/swap0 sudo swapon /var/cache/swap/swap0 但是这样并不能在系统重启的时候自动挂载交换分区, 这样我们就需要修改 fstab. 修改 /etc/fstab 文件, 新增如下内容: /var/cache/swap/swap0 none swap sw 0 0 这样每次重启的时候就会自动挂载swap文件了 ———————————————— 版权声明:本文为CSDN博主「little_stupid_child」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/little_stupid_child/article/details/79188015
如果报下面的错,则按照sudo pacman -Sy make (1/1) Arming ConditionNeedsUpdate... [bysu@alarm YouCompleteMe]$ ./install.py --go-completer --java-completer --clangd-completer Searching Python 3.8 libraries... Found Python library: /usr/lib/libpython3.8.so Found Python headers folder: /usr/include/python3.8 CMake Error: CMake was unable to find a build program corresponding to "Unix Makefiles". CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool. CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage -- Configuring incomplete, errors occurred! See also "/tmp/ycm_build_v8ewnuk5/CMakeFiles/CMakeOutput.log". ERROR: the build failed.
再重新编译,这次100%了,总算成功了。 [ 88%] Building CXX object ycm/CMakeFiles/ycm_core.dir/Result.cpp.o [ 90%] Building CXX object ycm/CMakeFiles/ycm_core.dir/Utils.cpp.o [ 92%] Building CXX object ycm/CMakeFiles/ycm_core.dir/Word.cpp.o [ 95%] Building CXX object ycm/CMakeFiles/ycm_core.dir/versioning.cpp.o [ 97%] Building CXX object ycm/CMakeFiles/ycm_core.dir/ycm_core.cpp.o [100%] Linking CXX shared library /home/bysu/.vim/bundle/YouCompleteMe/third_party/ycmd/ycm_core.so make[3]: Leaving directory '/tmp/ycm_build_u4swi38l' [100%] Built target ycm_core make[2]: Leaving directory '/tmp/ycm_build_u4swi38l' make[1]: Leaving directory '/tmp/ycm_build_u4swi38l' CMake Error: The source directory "/home/bysu/.vim/bundle/YouCompleteMe/third_party/ycmd/third_party/cregex" does not appear to contain CMakeLists.txt. Specify --help for usage, or press the help button on the CMake GUI. ERROR: the build failed.
哈哈哈,功夫不负有心人啊!慢着“ERROR: the build failed.”是什么鬼?竟然构建失败了!!!!
通过搜索
CMake Error: The source directory "/home/bysu/.vim/bundle/YouCompleteMe/third_party/ycmd/third_party/cregex" does not appear to contain CMakeLists.txt.发现这是因为 ~/.vim/plugged/YouCompleteMe/third_party/ycmd/third_party/cregex/ 的内部文件没有clone下来 解决方案:rm -rf ~/.vim/plugged/YouCompleteMe/third_party/ycmd/third_party/cregex (即删除掉) 再运行git submodule update --init --recursive 然后就可以 ./install.py --go-completer --clang-completer 成功编译了 ———————————————— 版权声明:本文为CSDN博主「铃舟BXVII」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_41912158/article/details/88371350 -- Generating done -- Build files have been written to: /tmp/regex_build_znc86h74 make[1]: Entering directory '/tmp/regex_build_znc86h74' make[2]: Entering directory '/tmp/regex_build_znc86h74' make[3]: Entering directory '/tmp/regex_build_znc86h74' Scanning dependencies of target _regex make[3]: Leaving directory '/tmp/regex_build_znc86h74' make[3]: Entering directory '/tmp/regex_build_znc86h74' [ 66%] Building C object CMakeFiles/_regex.dir/regex_3/_regex.c.o [ 66%] Building C object CMakeFiles/_regex.dir/regex_3/_regex_unicode.c.o [100%] Linking C shared library /home/bysu/.vim/bundle/YouCompleteMe/third_party/ycmd/third_party/cregex/regex_3/_regex.so make[3]: Leaving directory '/tmp/regex_build_znc86h74' [100%] Built target _regex make[2]: Leaving directory '/tmp/regex_build_znc86h74' make[1]: Leaving directory '/tmp/regex_build_znc86h74' go: downloading golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7
下面是我目前的.vimrc的配置,效果如下:
syntax on "设置编码" set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936 set termencoding=utf-8 set encoding=utf-8 "显示行号" set nu "突出显示当前行 set cursorline "搜索高亮 set hlsearch "启用鼠标 set mouse=a set selection=exclusive set selectmode=mouse,key "显示括号匹配 set showmatch "设置Tab长度为4空格" set tabstop=4 "设置自动缩进长度为4空格" set shiftwidth=4 "继承前一行的缩进方式,适用于多行注释" set autoindent "设置粘贴模式 set paste "显示空格和tab键在Vim中通过鼠标右键粘贴时会在行首多出许多缩进和空格,通过s et paste可以在插入模式下粘贴内容时不会有任何格式变形、胡乱缩进等问题 set listchars=tab:>-,trail:- "总是显示状态栏" set laststatus=2 "显示光标当前位置" set ruler "------------start-godef代码跳转------- let g:godef_split=0 "0是当前,1是横分屏,2是新开一个标签窗口,3是竖分屏,按ctrl+o返回 let g:godef_same_file_in_same_window=1 """函数在同一个文件中时不需要打开新窗口 "------end_godef------------ "==========快捷键============= let mapleader = ',' "-------按键映射---------- "快捷键退出 autocmd FileType * nmap qq :q! autocmd FileType * nmap wq :wq "nmap :TagbarToggle "显示代码结构 imap :q! "跳转后返回关闭 let g:miniBufExplMapWindowNavVim = 1 "------------start---打开默认高亮------------- let g:go_highlight_structs = 1 let g:go_highlight_functions = 1 let g:go_highlight_methods = 1 let g:go_highlight_fields = 1 let g:go_highlight_types = 1 let g:go_highlight_operators = 1 let g:go_highlight_build_constraints = 1 "autocmd FileType go nmap r (go-run) % autocmd FileType go nmap gr :!go run % autocmd FileType go nmap gb (go-build) % autocmd FileType go nmap gt (go-test) % autocmd FileType python nmap pr :!python % "-------------end--打开默认高亮-------------- "--------------start---NERDTreeToggle------------ "去除第一行的帮助提示 let NERDTreeMinimalUI=1 "let g:NERDTreeWinPos='left' let NERDTreeWinSize=20 " Initial NERDTree width " beautiful let g:NERDChristmasTree=1 "----按打开NERDTree----- ""map :NERDTreeToggle ""autocmd FileType * nmap nt :NERDTreeToggle "----打开vim后,默认开启NERDTree,且光标在右侧 autocmd VimEnter * NERDTree wincmd w autocmd VimEnter * wincmd w "自动退出 ""autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") &&b:NERDTreeType == "primary") | q | endif "--------------end-----NERDTreeToggle------------- "-------start-Tagbar------------ ""let g:tagbar_vertical = 0 "let g:tagbar_left = 1 let g:tagbar_width = 30 "去除第一行的帮助信息 let g:tagbar_compact = 1 "当编辑代码时,在Tagbar自动追踪变量 let g:tagbar_autoshowtag = 1 "个人爱好,展开关闭文件夹的图标 "let g:tagbar_iconchars = ['▸', '▾'] "作为toggle ""nmap :TagbarToggle ""autocmd FileType * nmap tb :TagbarOpen "打开vim时自动打开 autocmd VimEnter * nested :TagbarOpen ""wincmd l "如果不加这句,打开vim的时候当前光标会在Nerdtree区域 ""autocmd VimEnter * wincmd l nnoremapn :exe'NERDTreeToggle' "nnoremapn :exe'NERDTreeClose' nnoremapt :exe'TagbarToggle' "nnoremapt :exe'TagbarClose' let g:tagbar_sort = 0 "close the sort autocmd BufReadPost .go,.java,.py,.cpp,.c,.h,.hpp,.cc call tagbar#autoopen() "------快捷键同时打开或关闭nerdtree、tagbar------------- function! ToggleNERDTreeAndTagbar() let w:jumpbacktohere = 1 " Detect which plugins are open if exists('t:NERDTreeBufName') let nerdtree_open = bufwinnr(t:NERDTreeBufName) != -1 else let nerdtree_open = 0 endif let tagbar_open = bufwinnr('__Tagbar__') != -1 " Perform the appropriate action if nerdtree_open && tagbar_open NERDTreeClose TagbarClose elseif nerdtree_open TagbarOpen elseif tagbar_open NERDTree else NERDTree TagbarOpen endif " Jump back to the original window for window in range(1, winnr('$')) execute window . 'wincmd w' if exists('w:jumpbacktohere') unlet w:jumpbacktohere break endif endfor endfunction "调用上面的函数,实现开关nerdtree nnoremap \ :call ToggleNERDTreeAndTagbar() "-------------------------------- "------start--expand-region--快速区域选择------ vmap v (expand_region_expand) vmap V (expand_region_shrink) "------end--expand-region--快速区域选择------ "--start-minibufExplorer-vim中创建多了小窗口--- let g:miniBufExplMapWindowNavVim = 1 let g:miniBufExplMapWindowNavArrows = 1 let g:miniBufExplMapCTabSwitchBufs = 1 let g:miniBufExplModSelTarget = 1 let g:miniBufExplMoreThanOne = 0 map :MBEbp map :MBEbn "让vimrc配置变更立即生效" "autocmd BufWritePost $MYVIMRC source $MYVIMRC "----------gotar--------ctars------------ let g:tagbar_type_go = { \ 'ctagstype' : 'go', \ 'kinds' : [ \ 'p:package', \ 'i:imports:1', \ 'c:constants', \ 'v:variables', \ 't:types', \ 'n:interfaces', \ 'w:fields', \ 'e:embedded', \ 'm:methods', \ 'r:constructor', \ 'f:functions' \ ], \ 'sro' : '.', \ 'kind2scope' : { \ 't' : 'ctype', \ 'n' : 'ntype' \ }, \ 'scope2kind' : { \ 'ctype' : 't', \ 'ntype' : 'n' \ }, \ 'ctagsbin' : 'gotags', \ 'ctagsargs' : '-sort -silent' \ } "---------start-------ctag----gotar--------- "----start_YouCompleteMe set runtimepath+=~/.vim/bundle/YouCompleteMe let g:ycm_collect_identifiers_from_tags_files = 1 " 开启 YCM 基于标签引擎 "-------------start_YouCompleteMe set runtimepath+=~/.vim/bundle/YouCompleteMe let g:ycm_collect_identifiers_from_tags_files = 1 " 开启 YCM 基于标签引擎 let g:ycm_collect_identifiers_from_comments_and_strings = 1 " 注释与字符串中的内容也用于补全 let g:syntastic_ignore_files=[".*\.py$"] let g:ycm_seed_identifiers_with_syntax = 1 " 语法关键字补全 let g:ycm_complete_in_comments = 1 " 在注释输入中也能补全 let g:ycm_complete_in_strings = 1 " 在字符串输入中也能补全 let g:ycm_collect_identifiers_from_comments_and_strings = 1 " 注释和字符串中的文字也会被收入补全 let g:ycm_global_ycm_extra_conf='~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py' let g:ycm_show_diagnostics_ui = 0 " 禁用语法检查 inoremap pumvisible() ? "\" : "\" | " 回车即选中当前项 nnoremap :YcmCompleter GoToDefinitionElseDeclaration| " 跳转到定义处 let g:ycm_min_num_of_chars_for_completion=2 " 从第2个键入字符就开始罗列匹配项 let g:ycm_global_ycm_extra_conf='~/.vim/bundle/YouCompleteMe/.ycm_extra_conf.py' "YCM配置文件的路径 " 跳转快捷键 nnoremap :YcmCompleter GoToDeclaration| nnoremap :YcmCompleter GoToDefinition| nnoremap :YcmCompleter GoToDefinitionElseDeclaration| " 停止提示是否载入本地ycm_extra_conf文件 let g:ycm_confirm_extra_conf = 0 " 语法关键字补全 let g:ycm_seed_identifiers_with_syntax = 1 " 弹出列表时选择第1项的快捷键(默认为), 没有这个会拦截掉tab, 导致其他插件的tab不能用. let g:ycm_key_list_select_completion = ['', ''] " 弹出列表时选择前1项的快捷键(默认为) let g:ycm_key_list_previous_completion = ['', ''] " 主动补全, 默认为 let g:ycm_key_invoke_completion = [''] " 停止显示补全列表(防止列表影响视野), 可以按重新弹出 let g:ycm_key_list_stop_completion = [''] "-------------end_YouCompleteMe "--------------start_winManagerWindowLayout-------------------------------------------------- "let g:winManagerWindowLayout='NERDTree|Tagbar' "let g:winManagerWidth=30 "let g:AutoOpenWinManager = 1 "这里要配合修改winmanager.vim文件,见下方说明" "let g:NERDTree_title = "[NERDTree]" function! NERDTree_Start() exe 'q' "执行一个退出命令,关闭自动出现的窗口" exe 'NERDTree' endfunction function! NERDTree_IsValid() return 1 endfunction "noremap :NERDTreeFind "let g:Tagbar_title = "[Tagbar]" function! Tagbar_Start() exe 'q' "执行一个退出命令,关闭自动出现的窗口" exe 'TagbarOpen' endfunction function! Tagbar_IsValid() return 1 endfunction "let g:tagbar_vertical = 30 "--------------end_winManagerWindowLayout-------------------------------------------------- "============管理插件========== " 你在此设置运行时路径 set rtp+=/home/bysu/.vim/bundle/Vundle.vim call vundle#begin() " 在这里面输入安装的插件 " Vundle 本身就是一个插件 Plugin 'VundleVim/Vundle.vim' Plugin 'fatih/vim-go' "目录树 Plugin 'preservim/nerdtree' "代码提示 Bundle 'Blackrush/vim-gocode' "函数追踪/代码跳转 Bundle 'dgryski/vim-godef' "显示代码结构 Plugin 'majutsushi/tagbar' "YouCompleteMe补全 "Plugin 'ycm-core/YouCompleteMe' "多光标同时编辑 Bundle 'terryma/vim-multiple-cursors' "支持git Plugin 'Xuyuanp/nerdtree-git-plugin' "快速选中临近区域 Plugin 'terryma/vim-expand-region' "括号自动补全 Bundle 'Raimondi/delimitMate' "在vim中创建多了小窗口 Bundle 'fholgado/minibufexpl.vim' "所有插件都应该在这一行之前 call vundle#end() "filetype off filetype plugin indent on
硬件开发
2020-03-18 23:20:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
在不久的将来,我们将看到嵌入式STT-MRAM (eMRAM)出现在诸如物联网(IoT)、微控制器(MCU)、汽车、边缘运算和人工智能(AI)等应用中。美国 EVERSPIN 还提供了几种独立的MRAM产品,锁定包括航天、汽车、储存、工厂自动化、IoT、智慧能源、医疗和工业机器控制/运算等应用。

半导体工艺控制和支持技术供货商KLA对 MRAM 作为一种新兴的NVM技术的前景感到振奋,为IC制造商提供了一系列解决方案的组合,可帮助加速MRAM产品开发,确保成功实现量产并在生产中取得最佳良率。这些技术解决方案包括:

使用散射测量和成像的迭对量测系统进行图案对准(patterning alignment)量测,使用光学散射测量CD和形状计量系统进行关键尺寸和3D组件形状测量以及run time patterning control数分析,以优化MRAM cell patterning 组件迭对、CD和形状。

使用光谱椭圆偏振(SE)技术进行膜厚度和化学计量的测量,这些技术为MTJ迭层沉积提供了重要的关键参数。

MRAM堆栈沉积的电磁特性,可使用CAPRES电流平面穿隧(CIPTech)和MicroSense磁光Kerr效应,提供对预计的最终电池性能的早期反馈(MOKE)技术。CAPRESCIPTech是一种12点探针电阻技术,可在产品晶圆图案化之前,针对MTJ迭层进行沉积、退火和磁化后的TMR和RA测量。MicroSense Polar Kerr MRAM (PKMRAM)则表征了磁性能,例如自由层和固定层的矫顽场,以及多层MTJ堆栈在沉积、退火和在毯覆薄膜或有图案的晶圆上磁化。这种非接触式全晶圆技术可测量自由层和固定层的磁性。

一系列控片和在线产品晶圆缺陷检测和检视系统(取决于灵敏度和采样要求),可以在线检测关键缺陷,帮助工程师发现并解决可能影响良率和组件性能的工艺问题。

In-situ process control wafers,透过在工艺反应炉中撷取和记录参数并用于可视化、诊断和控制工艺条件。
硬件开发
2020-03-18 15:23:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
1、表贴IC
a)焊盘
表贴IC的焊盘取决于四个参数:脚趾长度W,脚趾宽度Z,脚趾指尖与芯片中心的距离D,引脚间距P,如下图:

焊盘尺寸及位置计算:
X=W+48
S=D+24
Y=P/2+1,当P<=26mil时
Y=Z+8,当P>26mil时
b)silkscreen
丝印框与引脚内边间距>=10mil,线宽6mil,矩形即可。对于sop等两侧引脚的封装,长度边界取IC的非引脚边界即可。丝印框内靠近第一脚打点标记,丝印框外,第一脚附近打点标记,打点线宽视元件大小而定,合适即可。对于QFP和BGA封装(引脚在芯片底部的封装),一般在丝印框上切角表示第一脚的位置。
c)place bound
该区域是为防止元件重叠而设置的,大小可取元件焊盘外边缘以及元件体外侧+20mil即可,线宽不用设置,矩形即可。即,沿元件体以及元件焊盘的外侧画一矩形,然后将矩形的长宽分别+20mil。
d)assembly
该区域可比silkscreen小10mil,线宽不用设置,矩形即可。对于外形不规则的器件,assembly指的是器件体的区域(一般也是矩形),切不可粗略的以一个几乎覆盖整个封装区域的矩形代替。
PS:对于比较确定的封装类型,可应用LP Wizard来计算详细的焊盘尺寸和位置,再得到焊盘尺寸和位置的同时还会得到silkscreen和place bound的相关数据,对于后两个数据,可以采纳,也可以不采纳。
2、通孔IC
a) 焊盘
对于通孔元件,需要设置常规焊盘,热焊盘,阻焊盘,最好把begin层,internal层,bottom层都设置好上述三种焊盘。因为顶层和底层也可能是阴片,也可能被作为内层使用。
通孔直径:比针脚直径大8-20mil,通常可取10mil。
常规焊盘直径:一般要求常规焊盘宽度不得小于10mil,通常可取比通孔直径大20mil(此时常规焊盘的大小正好和花焊盘的内径相同)。这个数值可变,通孔大则大些,比如+20mil,通孔小则小些,比如+12mil。
花焊盘直径:花焊盘内径一般比通孔直径大20mil。花焊盘外径一般比常规焊盘大20mil(如果常规焊盘取比通孔大20mil,则花焊盘外径比花焊盘内径大20mil)。这两个数值也是可以变化的,依据通孔大小灵活选择,通孔小时可取+10-12mil。
阻焊盘直径:一般比常规焊盘大20mil,即应该与花焊盘外径一致。这个数值也可以根据通孔大小调整为+10-12mil。注意需要与花盘外径一致。
对于插件IC,第一引脚的TOP(begin)焊盘需要设置成方形。
b) Silkscreen
与表贴IC的画法相同。
c) Place bound
与表贴IC的画法相同。
d) Assembly
与表贴IC的画法相同。
3、表贴分立元件
分立元件一般包括电阻、电容、电感、二极管、三极管等。
对于贴片分立元件,封装规则如下:
a) 焊盘
表贴分立元件,主要对于电阻电容,焊盘尺寸计算如下:

X=W+2/3*Hmax+8
Y=L,一般这个数值应该比L稍微大些,比如+6-8mil。
R=P-8,该数值用来确定焊盘的位置。
一般也可以通过LPWizard来获得符合IPC标准的焊盘数据。
b) Place bound
与表贴IC相同。即元件体以及焊盘的外边缘矩形+20mil,线宽不用设置,矩形即可。
c) silkscreen
一般选择比place bound略小的矩形框代替,比如-4mil,线宽6mil即可。对于有极性的分立元件,需要在丝印框上显示出来,比如正极的丝印框线条稍微粗一点,比如8mil,也可在正极画双线表示。对于表贴三极管丝印层如下图:

d) assembly
比丝印框稍微小一点,比如-4mil,线宽不用设置,矩形即可。但是对于不规则的封装,比如TO或者SOT,assembly区域指的是元件体的区域(一般也是矩形),切不可以一个几乎覆盖全部区域的矩形代替,否则贴片时将出现贴片位置不准的大问题。
PS:由于分立元件尺寸都比较小,因此线宽的选择可以稍微细些。
4、 直插分立元件
比如插针,按钮等。
对于这些元件,焊盘的参数与上面通孔IC的焊盘参数计算方法相同。
Place bound,assembly,silkscreen与表贴分立元件相应的参数基本相同。
总结: 元件的封装,对于焊盘的要求比较严格,如果能够使用LP Wizard计算,最好采用LP Wizard得出的焊盘参数。Assembly也是比较严格的,最起码,元件体的中心要与所画的assembly中心重合,这样才能使表贴的位置有保证。
焊盘类别解释:
常规焊盘:即用于阳片的焊盘,通过布线与其他资源连接在一起,主要用于信号层。
热风焊盘:也称为花焊盘,主要用于阴片,作用是为了防止热量散失产生虚焊等,主要用于电源层以及地层,即在地层或者电源层,通过花焊盘与地层或者电源层取得连接。
阻焊盘:主要用于阴片,即断开该过孔与相应内层(比如电源或者地层)的电气连接。
总之,常规焊盘用于阳片的电气连接,花焊盘用于阴片的电气连接,阻焊盘用于阴片的电气隔离。
硬件开发
2020-03-10 10:00:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
PCB设计纷繁复杂,各种意料之外的因素频频来影响整体方案的达成,如何能驯服性格各异的零散部件?怎样才能画出一份整齐、高效、可靠的PCB图?今天就让我们来盘点一下。
PCB设计看似复杂,既要考虑各种信号的走向又要顾虑到能量的传递,干扰与发热带来的苦恼也时时如影随形。但实际上总结归纳起来非常清晰,可以从两个方面去入手:

说得直白一些就是:“怎么摆”和“怎么连”。

听起来是不是非常easy?下面让我们先来梳理下“怎么摆”:

1、遵照“先大后小,先难后易”的布置原则,即重要的单元电路、核心元器件应当优先布局。这个和吃自助餐的道理是一样的:自助餐胃口有限先挑喜欢的吃,PCB空间有限先挑重要的摆。

2、布局中应参考原理框图,根据单板的主信号流向规律安排主要元器件。布局应尽量满足以下要求:总的连线尽可能短,关键信号线最短;去耦电容的布局要尽量靠近IC的电源管脚,并使之与电源和地之间形成的回路最短 ;减少信号跑的冤枉路,防止在路上出意外。



先大后小,先难后易

3、元器件的排列要便于调试和维修,亦即小元件周围不能放置大元件、需调试的元器件周围要有足够的空间,弄得太挤局面往往会变得很尴尬。

4、相同结构电路部分,尽可能采用“对称式”标准布局;按照均匀分布、重心平衡、版面美观的标准优化布局。



均匀分布、重心平衡

5、同类型插装元器件在X或Y方向上应朝一个方向放置。同一种类型的有极性分立元件也要力争在X或Y方向上保持一致,便于生产和检验。



统一极性布局

6、发热元件要一般应均匀分布,以利于单板和整机的散热,除温度检测元件以外的温度敏感器件应远离发热量大的元器件。



发热元器件均匀分布

7、高电压、大电流信号与小电流,低电压的弱信号完全分开;模拟信号与数字信号分开;高频信号与低频信号分开;高频元器件的间隔要充分。元件布局时,应适当考虑使用同一种电源的器件尽量放在一起,以便于将来的电源分隔。




以上即是关于“怎么摆”即布局的主要注意事项。而关于“怎么连”则相对要更复杂一些,大体来说就是:

键信号线优先:摸拟小信号、高速信号、时钟信号和同步信号等关键信号优先布线 ;

密度优先原则:从单板上连接关系最复杂的器件着手布线。从单板上连线 最密集的区域开始布线 。



PCB布局示例
硬件开发
2020-02-26 12:13:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>

开料
目的:根据工程资料MI的要求,在符合要求的大张板材上,裁切成小块生产板件.符合客户要求的小块板料.
流程:大板料→按MI要求切板→锔板→啤圆角磨边→出板
钻孔
目的:根据工程资料,在所开符合要求尺寸的板料上,相应的位置钻出所求的孔径.
流程:叠板销钉→上板→钻孔→下板→检查修理

沉铜
目的:沉铜是利用化学方法在绝缘孔壁上沉积上一层薄铜.
流程:粗磨→挂板→沉铜自动线→下板→浸%稀H2SO4→加厚铜

图形转移
目的:图形转移是生产菲林上的图像转移到板上。
流程:(蓝油流程):磨板→印第一面→烘干→印第二面→烘干→爆光→冲影→检查;(干膜流程):麻板→压膜→静置→对位→曝光→静置→冲影→检查
图形电镀
目的:图形电镀是在线路图形裸露的铜皮上或孔壁上电镀一层达到要求厚度的铜层与要求厚度的金镍或锡层。
流程:上板→除油→水洗二次→微蚀→水洗→酸洗→镀铜→水洗→浸酸→镀锡→水洗→下板
退膜
目的:用NaOH溶液退去抗电镀覆盖膜层使非线路铜层裸露出来。
流程:水膜:插架→浸碱→冲洗→擦洗→过机;干膜:放板→过机

蚀刻
目的:蚀刻是利用化学反应法将非线路部位的铜层腐蚀去。

绿油
目的:绿油是将绿油菲林的图形转移到板上,起到保护线路和阻止焊接零件时线路上锡的作用。
流程:磨板→印感光绿油→锔板→曝光→冲影;磨板→印第一面→烘板→印第二面→烘板
字符
目的:字符是提供的一种便于辩认的标记。
流程:绿油终锔后→冷却静置→调网→印字符→后锔

镀金手指
目的:在插头手指上镀上一层要求厚度的镍金层,使之更具有硬度的耐磨性。
流程:上板→除油→水洗两次→微蚀→水洗两次→酸洗→镀铜→水洗→镀镍→水洗→镀金
镀锡板 (并列的一种工艺)
目的:喷锡是在未覆盖阻焊油的裸露铜面上喷上一层铅锡,以保护铜面不蚀氧化,以保证具有良好的焊接性能.
流程:微蚀→风干→预热→松香涂覆→焊锡涂覆→热风平整→风冷→洗涤风干
成型
目的:通过模具冲压或数控锣机锣出客户所需要的形状成型的方法有机锣,啤板,手锣,手切
说明:数据锣机板与啤板的精确度较高,手锣其次,手切板最低具只能做一些简单的外形.
测试
目的:通过电子测试,检测目视不易发现到的开路,短路等影响功能性之缺陷.
流程:上模→放板→测试→合格→FQC目检→不合格→修理→返测试→OK→REJ→报废
终检
目的:通过目检板件外观缺陷,并对轻微缺陷进行修理,避免有问题及缺陷板件流出.
具体工作流程:来料→查看资料→目检→合格→FQA抽查→合格→包装→不合格→处理→检查OK
硬件开发
2020-02-24 11:39:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
在刚一开始接触到51单片机的时候我们是不是该怎么写程序,也不知道如何去写,怎么下手,今天针对这一问题专门总结了一下用keil建立一个单片机的最小工程程序,可谓初学者的福利,只要记着这一点再进行程序扩展就行了,过来人告诉你个秘密最小工程是编译单片机程序必写的。
话不多说,马上进入正题
第一步:打开keil点击在Project选下New Project
点击 New Project
第二步:点击 New Project之后会出来 一个界面,目的就是让我们选择工程保存路径还有工程名,我们这里选择工程名为头条实验,点击保存
选择工程名为头条实验
第三步:这个小框是选择单片机芯片类型,我们选择Atmel公司的芯片
选择Atmel
第四步: 选择Atmel之后点击At89c51,点击OK
选择 At89c51
第五步:选择File选项下的New这一项
选择New
第六步:点击保存(Save)
保存文件
第七步:命名文件名称,注意这里一定要以.c结尾,我们命名为头条实验.c,点击保存
命名为头条实验.c
第八步:双击Source Group 1,把我们建立的.c文件添加到工程中
双击Source Group 1
第九步:在新出现的对话框内选择,我们所要添加的文件,这里为头条实验
添加文件
第十步:然后写下你要下的代码,下图代码内容是编译51单片机所必须具有的代码部分,如需加其他功能,在此基础上进行添加
写入代码
现在代码是写好了,但是想要下载到单片机中必须生成Hex文件,而刚一开始是默认不生成Hex文件的,所以我们应该需要再设置一下。
第十一步:点击设置Target Options
点击设置Target Options
第十二步:在Output选项框下在create HEX File这一选项框打个勾
生产Hex文件
第十三步:编译一下就可以看到生成Hex文件了,我们最后把这个文件下载到单片机中就可以控制单片机了
生成目标文件
硬件开发
2020-02-19 11:09:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
学单片机陆陆续续也有1个多月了,也设计了自己的第一个电路板——51单片机最小系统板。理想与现实还是差距比较大的,由于自己的粗心,一些细节没有仔细推敲,导致电路板多处错误。写下这篇总结,以提醒自己 认真做事 ! 设计错误 欠考虑的问题 待解决的问题
1、设计错误
对元件封装没有认真考虑,造成PCB与原理图之间不对应。
1.1 三个按钮开关都出现问题。两个自锁开关设计一样,都是需要连接的引脚弄错了造成按不按都是断路,而那个小开关的四个引脚直接全部短路。
图表1
1.2 USB封装引脚弄反了,只能焊在后面。相应的MicroUSB口也就没办法用了。PS:当时为了解决这个问题,自己做了一个反着的USB线,结果无意用这个USB线连了一下买的开发板,开发板上的CH340G直接冒烟了。
1.3 CH340G芯片电路设计错误。由于自己大意在340的V3口直接连了VDD和退耦电容,实际只需要连接退耦电容,只能用刀划开多余的VDD线,自己飞线到电容。
图表2
2、欠考虑的问题
主要是一些空间考虑不周和缺少标示。
图表3
2.1 DIP40插脚与旁边排针距离太近,安装时比较费劲
2.2 1602与51之间距离太近,插拔芯片时很不方便,且容易损坏芯片插脚
2.3 单片机引出口没有标示
2.4 少了限流保险
2.4 CH340G与单片机串口连接线上可能需要高速开关二极管
3、待解决的问题
最后,在解决了设计错误之后,这个51最小下载板终于可以下载程序了。但依然有个问题,在这个板子插好51之后,电源指示灯本来应该在电源开关按下之后才亮,现在却是在USB线插上后就一直亮,当按下电源开关时,指示灯亮度增加。
图表 4 未按下开关时
图表 5 按下开关后
硬件开发
2020-02-17 13:47:01
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
作为一个在PCB生产行业做了15年的工程师,遇到过很多的小问题,往往是在设计的过程中,不注意一些小细节造成的,那么在PCB的生产过程中也会造成一定的影响。一些软件上的小问题、过孔时的注意事项,这都是基础,但是不注意的话,也会造成PCB板子性能的差异。
我做这个分享是为了能让大家有一个技术上的交流,比如说PCB生产有什么环节?各个环节中有什么需要注意的事项?这些疑问都可以提出来,或者是对PCB有一些见解,我也希望能够说出来大家一起讨论。
一个PCB板在画好之后,将其发送给PCB板厂打样或者是批量生产,会在给板厂下单时,附上一份PCB加工工艺说明文档,其中有一项就是要注明选用哪种PCB表面处理工艺,而且不同的PCB表面处理工艺,其会对最终的PCB加工报价产生比较大的影响,不同的PCB表面处理工艺会有不同的收费,那么我们就要对PCB的处理工艺有一定的了解,不仅能节约成本,还能让PCB的设计更为合理。
首先说下为什么要对PCB表面进行特殊的处理
因为铜在空气中很容易氧化,铜的氧化层对焊接有很大的影响,很容易形成假焊、虚焊,严重时会造成焊盘与元器件无法焊接,正因如此,PCB在生产制造时,会有一道工序,在焊盘表面涂(镀)覆上一层物质,保护焊盘不被氧化。
目前国内板厂的PCB便面处理工艺有:喷锡(HASL,hot air solder leveling 热风整平)、沉锡、沉银、OSP(防氧化)、化学沉金(ENIG)、电镀金等等,当然,特殊应用场合还会有一些特殊的PCB表面处理工艺。
对比不同的PCB表面处理工艺,它们的成本不同,当然所用的场合也不同,只选对的不选贵的,目前还没有最完美的PCB表面处理工艺能够适合所有应用场景(这里讲的是性价比,即以最低的价格就能满足所有的PCB应用场景),所以才会有这么多的工艺来让我们选择,当然每一种工艺都各有千秋,存在的既是合理的,关键是我们要认识它们用好它们。
下边来举例说明一下PCB表面处理工艺的优缺点和适用场景。
裸铜板
优点 : 成本低、表面平整,焊接性良好(在没有被氧化的情況下)。
缺点:容易受到酸及湿度影响,不能久放,拆封后需在2小时内用完,因为铜暴露在空气中容易氧化;无法使用于双面板,因为经过第一次回流焊后第二面就已经氧化了。如果有测试点,必须加印锡膏以防止氧化,否则后续将无法与探针接触良好。
喷锡板(HASL,Hot Air Solder Levelling,热风整平)
优点:价格较低,焊接性能佳。
缺点:不适合用来焊接细间隙的引脚以及过小的元器件,因为喷锡板的表面平整度较差。在PCB加工中容易产生锡珠(solder bead),对细间隙引脚(fine pitch)元器件较易造成短路。
使用于双面SMT工艺时,因为第二面已经过了一次高温回流焊,极容易发生喷锡重新熔融而产生锡珠或类似水珠受重力影响成滴落的球状锡点,造成表面更不平整进而影响焊接问题。
喷锡工艺曾经在PCB表面处理工艺中处于主导地位。二十世纪八十年代,超过四分之三的PCB使用喷锡工艺,但过去十年以来业界一直都在减少喷锡工艺的使用。喷锡工艺制程比较脏、难闻、危险,因而从未是令人喜爱的工艺,但喷锡工艺对于尺寸较大的元件和间距较大的导线而言,却是极好的工艺。
在密度较高的PCB中,喷锡工艺的平坦性将影响后续的组装;故HDI板一般不采用喷锡工艺。随着技术的进步,业界现在已经出现了适于组装间距更小的QFP和BGA的喷锡工艺,但实际应用较少。
目前一些工厂采用OSP工艺和浸金工艺来代替喷锡工艺; 技术上的发展也使得一些工厂采用沉锡、沉银工艺。加上近年来无铅化的趋势,喷锡工艺使用受到进一步的限制。虽然目前已经出现所谓的无铅喷锡,但这可将涉及到设备的兼容性问题。
除此之外,还有OSP、沉金、沉银以及沉锡等表面处理工艺,它们都是各有优缺点,使用的场景也不一样。
硬件开发
2020-02-12 12:26:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>

业界一直在寻求取代SRAM。其中之一包括自旋转移力矩MRAM(STT-MRAM)。新的存储器带来了一些大胆的主张。例如STT-MRAM具有SRAM的速度和闪存的无波动性,具有无限的耐用性。


图1.STT-MRAM的MJT细胞

Everspin已经为SSD提供SST-MRAM设备。此外一些芯片制造商正专注于嵌入式 STT-MRAM ,它分为两个市场,嵌入式闪存替代和缓存。

STT-MRAM是具有磁隧道结(MTJ)存储器单元的单晶体管架构。它利用电子自旋的磁性在芯片中提供非挥发性特性。写入和读取功能在MTJ单元中共享相同的并行路径。

为此STT-MRAM正准备取代嵌入式NOR闪存芯片。此外,STT-MRAM旨在取代SRAM,至少用于L3缓存。STT-MRAM正在不断发展,以更密集地嵌入到SoC中,其更小的单元尺寸,更低的待机功率要求和非易失性提供了一个引人注目的价值主张,针对用作通用板载存储器和最后级别的大得多且易变的SRAM缓存。

但STT-MRAM的速度还不足以取代SRAM用于L1和/或L2缓存,还包括稳定性。我们相信STT-MRAM,访问时间将在5ns到10ns之间饱和。当你进入L1和L2缓存时,我们相信你需要去SOT-MRAM。

类似于STT-MRAM,SOT-MRAM仍处于研发阶段。不同之处在于SOT-MRAM在器件下集成了SOT层。根据Imec,它通过在相邻的SOT层中注入面内电流来引起层的切换。

当你切换STT-MRAM,需要通过MTJ推动当前,在内存主任IMEC。在SOT-MRAM中,你有两条路径,一条用于写入,另一条用于读取。读取就像STT。你通读了MTJ。写不是通过MTJ。这是一个很大的好处,因为您可以循环设备并对其进行优化以延长使用寿命。第二大优势是速度。我司 Everspin代理 不同容量的MRAM存储芯片
硬件开发
2020-02-04 14:19:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
基于迅为iTOP-4418 开发板 QtE4.7
在超级终端输入 命令 “vi etc/init.d/rcS”切换成 qtopia 启动,如下图。
重新启动之后,在超级终端中使用命令“mknod /dev/sda1 b 8 1”创建 U 盘的设备节
点。
如下图,使用命令“mount /dev/sda1 /mnt/udisk/”挂载 U 盘。
如下图,修改 测试 程序的权限。在超级终端中,输入修改权限命令“chmod 777 LED s”
在超级终端中,输入运行命令“leds -qws”,如下图。
运行结果如下图,通过 LED1 可控制开发板 led 灯的亮灭。
硬件开发
2019-12-30 11:16:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
对于一个电子工程师来说,在单片机的电路设计中电磁干扰不仅关系了单片机在控制在中的能力和准确度,还关系到企业在行业中的竞争。对电磁干扰的设计本文主要从硬件和软件方面进行设计处理,下面就是从单片机的PCB设计到软件处理方面来介绍对电磁兼容性的处理。
一、影响EMC的因数

1.电压
电源电压越高,意味着电压振幅越大,发射就更多,而低电源电压影响敏感度。
2.频率
高频产生更多的发射,周期性信号产生更多的发射。在高频单片机系统中,当器件开关时产生电流尖峰信号;在模拟系统中,当负载电流变化时产生电流尖峰信号。
3.接地
在所有EMC题目中,主要题目是不适当的接地引起的。有三种信号接地方法:单点、多点和混合。在频率低于1MHz时,可采用单点接地方法,但不适宜高频;在高频应用中,最好采用多点接地。混合接地是低频用单点接地,而高频用多点接地的方法。地线布局是关键,高频数字电路和低电平模拟电路的接地电路尽不能混合。
4.PCB设计
适当的印刷电路板(PCB)布线对防止EMI是至关重要的。
5.电源往耦
当器件开关时,在电源线上会产生瞬态电流,必须衰减和滤掉这些瞬态电流。来自高di/dt源的瞬态电流导致地和线迹“发射”电压,高di/dt产生大范围的高频电流,激励部件和线缆辐射。流经导线的电流变化和电感会导致压降,减小电感或电流随时间的变化可使该压降最小。
二、对干扰措施的硬件处理方法
1.印刷线路板(PCB)的电磁兼容性设计

PCB是单片机系统中电路元件和器件的支撑件,它提供电路元件和器件之间的电气连接。随着电子技术的飞速发展,PCB的密度越来越高。PCB设计的好坏对单片机系统的电磁兼容性影响很大,实践证实,即使电路原理图设计正确,印刷电路板设计不当,也会对单片机系统的可靠性产生不利影响。例如,假如印刷电路板的两条细平行线靠的很近,会形成信号波形的延迟,在传输线的终端形成反射噪声。因此,在设计印刷电路板的时候,应留意采用正确的方法,遵守PCB设计的一般原则,并应符合抗干扰的设计要求。要使电子电路获得最佳性能,元器件的布局及导线的布设是很重要的。
2.输入/输出的电磁兼容性设计
在单片机系统中输进/输出也是干扰源的传导线,和接收射频干扰信号的拾检源,我们设计时一般要采取有效的措施:
①采用必要的共模/差模抑制电路,同时也要采取一定的滤波和防电磁屏蔽措施以减小干扰的进进。
②在条件许可的情况下尽可能采取各种隔离措施(如光电隔离或者磁电隔离),从而阻断干扰的传播。
3.单片机复位电路的设计
在的单片机系统中,看门狗系统对整个单片机的运行起着特别重要的作用,由于所有的干扰源不可能全部被隔离或往除,一旦进进CPU干扰程序的正常运行,那么复位系统结合软件处理措施就成了一道有效的纠错防御的屏障了。常用的复位系统有以下两种:
①外部复位系统。外部“看门狗”电路可以自己设计也可以用专门的“看门狗”芯片来搭建。然而,他们各有优缺点,大部分专用“看门狗”芯片对低频“喂狗”信号不能响应,而高频“喂狗”信号都能响应,使其在低频“喂狗”信号下产生复位动作而在高频的“喂狗”信号下不产生复位动作,这样,假如程序系统陷进一个死循环,而该循环中恰巧有着“喂狗”信号的话,那么该复位电路就无法实现它的应有的功能了。然而,我们自己可以设计一个具有带通的“喂狗”电路和其他复位电路构成的系统就是一个很有效外部监控系统了。
②现在越来越多的单片机都带有自己的片上复位系统,这样用户就可以很方便的使用其内部的复位定时器了,但是,有一些型号的单片机它的复位指令太过于简单,这样也会存在象上述死循环那样的“喂狗”指令,使其失往监控作用。有一些单片机的片上复位指令就做的比较好,一般他们把“喂狗”信号做成固定格式的多条指令依顺序来执行,假如有一定错误则该“喂狗”操纵无效,这样就大大进步了复位电路的可靠性。
4.振荡器

大部分的单片机都有一个耦合于外部晶体或陶瓷谐振器的振荡器电路。在PCB上,要求外接是电容、晶体或陶瓷谐振器的引线越短越好。RC振荡器对干扰信号有潜伏的敏感性,它能产生很短的时钟周期,因而最好选晶体或陶瓷谐振器。另外,石英晶体的外壳要接地。
5.防雷击措施
室外使用的单片机系统或从室外排挤引进室内的电源线、信号线,要考虑系统的防雷击题目。常用的防雷击器件有:气体放电管、TVS(Transient Voltage Suppression)等。气体放电管是当电源的电压大于某一数值时,通常为数十V或数百V,气体击穿放电,将电源线上强冲击脉冲导进大地。TVS可以看成两个并联且方向相反的齐纳二极管,当两端电压高于某一值时导通。其特点是可以瞬态通过数百乃上千A的电流。
三、对干扰措施的软件处理方法
电磁干扰源所产生的干扰信号在一些特定的情况下(比如在一些电磁环境比较恶劣的情况下)是无法完全消除的,终极将会进进CPU处理的的核心单元,这样在一些大规模集成电路经常会受到干扰,导致不能正常工作或在错误状态下工作。特别是像RAM这种利用双稳态进行存储的器件,往往会在强干扰下发生翻转,使原来存储的“0”变为“1”,或者“1”变为“0”;一些串行传输的时序及数据会因干扰而发生改变;更严重的会破坏一些重要的数据参数等;造成的后果往往是很严重的。在这种情况下软件设计的好坏直接影响到整个系统的抗干扰能力的高低。
1.程序会由于电磁干扰大致会一下几种情况:
①程序跑飞。
这种情况是最常见的干扰结果,一般来说有一个好的复位系统或软件帧测系统即可,对整个运行系统的不会产生太大的影响。
②死循环或不正常程序代码运行。
当然这种死循环和不正常程序代码并非设计职员有意写进的,我们知道程序的指令是由字节组成的,有的是单字节指令而有的是多字节指令,当干扰产生后使得PC指针发生变化,从而使原来的程序代码发生了重组产生了不可猜测的可执行的程序代码,那么,这种错误是致命的,它会有可能会往修改重要的数据参数,有可能产生不可猜测的控制输出等一系列错误状态。
2.对重要参数储存的措施
一般情况下,我们可以采用错误检测与纠正来有效地减少或避免这种情况的出现。根据检错、纠错的原理,主要思想是在数据写进时,根据写进的数据天生一定位数的校验码,与相应的数据一起保存起来;当读出时,同时也将校验码读出,进行判决。假如出现一位错误则自动纠正,将正确的数据送出,并同时将改正以后的数据回写覆盖原来错误的数据;假如出现两位错误则产生中断报告,通知CPU进行异常处理。所有这一切动作都是靠软件设计自动完成的,具有实时性和自动完成的特点。通过这样的设计,能大大进步系统的抗干扰能力,从而进步系统的可靠性。
检错与纠错原理:首先来看看检错和纠错的基本原理。进行差错控制的基本思想是在信息码组中以一定规则加进不同方式的冗余码,以便在信息读出的时候依靠多余的监视码或校码码来发现或自动纠正错误。
针对误码发生的特点,即错误发生的随机性和小概任性,它几乎总是随机地影响某个字节中的某一位(bit),因此,假如能够设计自动纠正一位错误,而检查两位错误的编码方式。就可以大大进步系统的可靠性。
3.对RAM和FLASH(ROM)的检测
在编制程序时我们最好是写进一些检测程序来测试RAM和FLASH(ROM)的数据代码,看有无发生错误,一旦发生要立即纠正,纠正不了的要及时给出错误指示,以便用户往处理。
另外,在编制程序时加进程序冗余是不可缺少的。在一定的地方加进三条或三条以上NOP指令对程序的重组有着很有效防止作用。同时,在程序的运行状态中要引进标志数据和检测状态,从而及时发现和纠正错误产生。
硬件开发
2019-12-18 10:44:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
itop4412开发版的安卓系统默认不是最高权限,可以看见后面最后一个是$符号,如下图 1,所以
想我们需要进入 root 权限,可以看见后面最后一个是#符号,如下图所示。在这个变换中只需
要在超级终端中输入 su 这个命令即可。

接下来的事情我们就是要删除我们要删除的软件了,我们默认的 app 都是 system/app
这个文件中,下面我介绍删除的步骤。
1.进入 system/app 这个文件夹中,找到我们要删除的软件名字,我就删除 Music.apk
为例,进入目录找到该 apk,如下图所示。

2.在超级终端输入删除命令 rm -r Music.apk,会出现下边错误,原因是 system 文件夹
没有权限造成的。

解决方式很简单,在超级终端中输入 mount -o rw,remount /system,设置 system 文
件夹为可读可写,然后在执行删除命令即可删除我们要删除的 apk。操作结果如下图

在查看一下发现没有 Music.apk 这个文件了(和上图做对比),如下图。

删除完我们要删除的 apk,需要将对应的数据也删除掉,数据在 data/data 目录下,进入
这个目录找到这个 apk 所对应的数据,如下图。

在超级终端中输入删除数据的命令 rm -r com.android.music,会发现数据已经被删除
了,如下图所示。
可以在图形界面中发现该 apk 已经被删除了。
部分视频观看地址:
iTOP4412开发板介绍 https://www.bilibili.com/video/av74453392
iTOP4412开发板系统编程前言 https://www.bilibili.com/video/av75754003
iTOP4412-fastboot烧写Android https://www.bilibili.com/video/av76115803
iTOP4412-安装虚拟机软件 https://www.bilibili.com/video/av75881580
iTOP4412-创建和配置虚拟机 https://www.bilibili.com/video/av75881653
iTOP4412-获取并安装ubuntu操作系统 https://www.bilibili.com/video/av75881774
iTOP-4412驱动教程一 https://www.bilibili.com/video/av74131033
iTOP-4412驱动教程二 https://www.bilibili.com/video/av74131033?p=2
iTOP-4412驱动教程三 https://www.bilibili.com/video/av74131033?p=3
iTOP-4412开发板之如何扩展不同规格LCD屏幕 https://www.bilibili.com/video/av75870604
itop4412-编译4412对应的uboot https://www.bilibili.com/video/av76737204
项目实战-GPS定位简介 https://www.bilibili.com/video/av78601887
项目实战-迅为实战教程介绍 https://www.bilibili.com/video/av78601813
项目实战-机车导航-机车导航项目演示 https://www.bilibili.com/video/av78601986
项目实战-机车导航-定制内核显示logo https://www.bilibili.com/video/av78729131
项目实战-机车导航-修改安卓开机启动动画 https://www.bilibili.com/video/av78972262
硬件开发
2019-12-17 14:33:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
内容概要: • EMC相关名词释义
• EMC三要素
• EMC标准、认证
• EMC之耦合途径
• EMC测试项目
电磁兼容性EMC (Electro Magnetic Compatibility),是指设备或系统在其电磁环境中符合要求运行并不对其环境中的任何设备产生无法忍受的电磁干扰的能力。
EMC 包括两个方面:一方面是指设备在正常运行过程中对所在环境产生的电磁干扰,不能超过一定的限值—— EMI ;另一方面是指器具对所在环境中存在的电磁干扰具有一定程度的抗扰度,即电磁敏感性—— EMS 。
一、EMC电磁兼容相关名词释义: EMC = EMI + EMS
EMC (Electro Magnetic Compatibility )电磁兼容
EMI(Electro Magnetic Interference) 电磁干扰(对外辐射)
EMS(Electro Magnetic Susceptibility) 电磁敏感度(抗干扰)
二、EMC三要素 干扰源→耦合途径→敏感接收器
三、EMC标准、认证 1)国际电工委员会(IEC)最早成立了国际无线电干扰特别委员会(CISPR),对电磁辐射干扰进行管理规定。
2)IEC/TC77、TC65分委员会
3)美国FCC认证
4)欧盟EMC指令
5)军用标准级的,如国军标GJB、美军标MIL
6)国际标准 CISPR系列、IEC61000-4系列
7)国内标准CB/T 17626系列、GB17625等
四、EMC三要素之耦合途径
耦合途径: 即传输电磁骚扰的通路或媒介。
1)传导耦合
传导是骚扰源与敏感设备之间的主要骚扰耦合途径之一。传导骚扰可以通过电源线、信号线、互连线、接地导体等进行耦合。解决传导耦合的办法是在骚扰进入敏感电路之前用滤波方法从导线上除去噪声。
2)感应耦合
感应耦合是导体之间以及某些部件(例如变压器、继电器、电感器等) 。 它可分为电感应耦合和磁感应耦合两种。
a. 电感应(容性)耦合
源电路上的电压可产生电力线,它与敏感电路相互作用后,就出现电感应(容性)耦合。感应电压是源电压、频率、导体几何形状和电路阻抗的函数。
b. 磁感应(感性) 耦合
当变化的电流产生磁通时,使源电路与另一电路(敏感电路)链环,结果出现磁感应(感性)耦合。感应电流是原电流、频率、导体几何形状和电路阻抗的函数。
3)辐射耦合
通过空间将一个电网络上的骚扰耦合到另一个电网络上。属频率较高的部分(高于30MHz).。
五、EMC测试项目
EMS电磁抗扰度测试项目
EMI电磁干扰测试项目
车载电子EMC测试项目
硬件开发
2019-12-04 10:53:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
在详细介绍了电磁干扰理论知识的基础上,对无刷直流电动机控制系统的电磁兼容性软硬件设计进行了分析,电磁兼容性设计有利于提高无刷直流电动机控制系统的抗干扰能力,增强系统的可靠性和稳定性。
1 电磁干扰
熟悉和了解常见的电磁干扰源是发现和解决电磁干扰问题的关键之一。电磁干扰可分为自然和人为两类。所谓自然的是指自然界所固有的与人类的活动无关的电磁干扰现象。所谓人为的是指由于人类的工业和社会活动所产生的电磁干扰。
1.1 电磁干扰源
诸如雷电的放电现象,电动机的TTL逻辑元件、动态RAM、电源、震荡器件及变压器等在工作时都会产生高频电磁波或者噪音,严重影响电动机的正常工作。
1.2 电磁干扰能量的耦合途径
耦合是指电路、设备、系统与其它电路、设备、系统间能量的联系。各种电磁骚扰源通过耦合传输电磁能量到敏感设备。耦合途径有两种方式:传导耦合与辐射耦合。
1.2.1 传导耦合
传导耦合是通过电源线、信号线、互联线、接地导体等连接通道进行耦合。按耦合方式又可划分为公共阻抗耦合、电容性耦合、电感性耦合三种基本方式。实际中,这三种方式是同时存在共同作用的。
1)公共阻抗耦合
当电路电流经过一个公共阻抗时,一个电路的电流在该公共阻抗上形成的电压就会影响到另一个电路。公共电源阻抗耦合模型及其等效电路如下:

图2中将图1中的电源阻抗及公共线路阻抗合并表示为R,U为理想电压源,Z1、Z2分别为电路1和电路2的阻抗。根据等效电路有:

由上式可以看出由于R的存在,电路1电源电流的任何变化都会影响电路2的电源电压。若R=0,则U1=U2=U,即电路1和电路2无公共阻抗耦合。降低电路1与电路2间的公共阻抗耦合即减小电源阻抗和公共线路阻抗。一方面可将电路的电源引线靠近电源输出端,从减小电源线长度的方式来减小公共线路阻抗;另一方面可采用稳压电源将电源内阻降低。
2)电容性耦合
电容性耦合是由两条电路间的电场相互作用所引起的,其耦合模型及等效电路如下:

C12是导体1与导体2之间的分布电容,C1g是导体1与地之间的电容,C2g是导体2与地之间的电容,R是导体2与地之间的电阻,U1是作为骚扰源的导体1的电压,电路2为受干扰电路,Un是线路2与地之间产生的骚扰电压。

式(1) 表明电容性耦合的骚扰作用相当于在导体2与地间接了一个幅值In=jwC12U的电流源。在骚扰源电压和频率恒定的情况下要减小耦合干扰,一方面可使敏感电路在较低的电阻值上工作,即通过减小R的方式来减小Un;另一方面导体通过合适地取向、屏蔽或隔离的方式减小C12来达到减小Un。
式(2) 表明在高阻抗的情况下电容性耦合骚扰作用只与C12、C2g有关,且此时产生的骚扰作用要大的多。
3)电感性耦合
电感性耦合是由两电路间的磁场相互作用引起的,其耦合模型及等效电路如下:

电路1中干扰电源I1在电路2的负载电阻R和R2上产生的骚扰电压分别为:

其中S为回路面积,B是角频率为的正弦变化磁通密度的有效值。由上式可知,可通过减小B、S、cosθ的方式减小电感性耦合骚扰的目的。
1.2.2 辐射耦合
辐射耦合是以电磁场的形式将电磁能从骚扰源经空间传输到敏感设备。空间中除了骚扰源有意辐射之外,还存在许多无意辐射的电磁波,而处在这一电磁场中的导体都能感应出电压。因此,辐射干扰可通过天线、导线、闭合回路等方式对电动机控制系统进行干扰。
2 系统硬件的电磁兼容的设计
DSP电路的工作频率很高,芯片管脚很密,在与模拟器件一起进行数模混合设计时,对PCB版的设计要求很高。以下为设计时必须遵守的准则和要求。
随着电子器件的小型化及封装密集化,有必要采用多层印刷电路板,其中包括单独的数字地层、电源层及其其它信号层。在布线时,单独设置的电源层有利于电路板元器件的布放;采用地层则不仅省去了大量器件管脚接地的工作量,而且可以有效地改善数字地线的质量。但应注意,在布孔、布线时应考虑通孔焊盘和过孔会将地层打断,过多的通孔会影响地层的抗干扰效果。本系统采用了四层板结构,分别为地层、电源层和两面元件层。在绘制PCB也特别考虑了通孔焊盘和过孔的使用, 将尽可能多的网络在元件层布通。
由于基于DSP的电动机控制系统使用的微处理器内核采用独立电源供电模式,因此对于具有144个管脚的TSM320LF2407A,需要较多的电源解耦电容,为了节省空间,减小通孔数目,系统采用贴片电容,达到了较好的解耦效果。
接地应遵循的基本原则是:数字地、模拟地、屏蔽地应该合理接地,不能混用。尽可能的使接地电路各自形成回路,减少电路与地线之间的电流耦合。合理布置地线使电流局限在尽可能小的范围内,并根据地电流的大小和频率设计相应宽度的印刷电路和接地方式。DSP的A/D采样模拟电源引脚VCCA和VSSA必须区别于任何数字电压电源引脚,避免数字干扰信号通过地线耦合。同时,A/D转化器的模拟地线采用单点接触,数字地与模拟地在电源处连接并在此处接大地。 VCCA和VSSA模拟引线在印刷电路板布线时应尽可能的短,以使二者正确匹配。
3 软件电磁兼容设计
TSM320LF2407A有丰富的指令集、极高的运行速度及软件看门狗(watchdog)和实时中断(RTI)模块,这些特点都为软件抗干扰提供了良好的条件。本系统主要采用以下几种软件抗干扰设计。
3.1软件陷阱法
由于干扰,往往会导致运行程序进入程序存储器的空白区(即无指令区),这种现象叫做程序“跑飞”。因此在各个子程序之间、各功能模块之间和所有空白处,都写上连续3个空操作(nop),后接一无条件转移指令,一旦程序跑飞到这些区域,就会自动返回执行正常程序。即:
Nop
Nop
Nop
LJMPADDRESS:ADDRESS指定地址;
3.2 程序的冗余设计
在程序存储器的空白区域,写入一些重要的数据表和程序作为备份,以便系统被破坏时仍有备份参数和程序维持系统正常工作。由于LF2407A的数据存储以数据页为基准,如果对不同数据页的数据进行操作而不指定相应的数据页,会导致程序跑飞。因此需要对程序未使用满的数据页进行填充,防止数据页混乱导致程序的系统误操作。
3.3 软件看门狗设计
看门狗定时器(WDT)又称监视定时器,可使微机系统从故障中恢复过来。在微机系统启动时,也启动WDT。它将对机器的状态周期进行计数,每一个状态周期计数器加1,当计数器溢出时,能自动的将复位引脚的电平拉低至少两个状态周期的时间,这个复位信号使得DSP复位。在正常工作时,定期的用软件去复位 WDT,而不会使WDT溢出造成系统复位。可是,如果程序一旦“跑飞”进入死循环或误区,这时软件就不会复位WDT,从而使WDT的计数达到溢出而使系统复位。系统复位后又从000H单元开始执行程序,这样就可把“跑飞”的程序拉回到正常的程序中。
4 结论
电磁兼容设计关系到基于DSP的电动机控制系统能否安全工作。电动机控制系统设计应根据系统的工作环境,控制系统的技术指标,工艺复杂性,成本等因素进行电磁兼容的综合设计。电动机控制系统的设计采用上述电磁兼容性设计,可使运行稳定可靠,故障率低,达到预期效果!
硬件开发
2019-11-22 18:54:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
VSWR代表电压驻波比(Voltage Standing Wave Ratio)。要完全理解这个术语,你需要知道什么是“驻波”。
你可能已经在高中物理课上学到了驻波。只要刷新你的想法,让我解释一下驻波是什么。
假设具有相同波长的两个波沿相反方向传播,如下图所示。一条波表示为蓝线,它正朝着右边的方向振动。另一波表示为绿线,它向左边方向振动。正如你在高中物理中学到的那样,这两个波将被合成,总合成波表示为红线。
入射波和反射波以及它们的合成波形
该总合成波仅在幅度方面随时间变化,但在相位上不变。简单地说,幅度为零的节点的位置永远不会改变。由于节点的位置不会改变,因此红色波浪看起来好像停留在同一位置,意思是“它站在那里”。这就是红波被称为“驻波”的原因。
如上所示只有一个快照,你很难直观地理解驻波。为了直观地了解驻波并确认上面的描述,您需要多个快照,显示两个行波随时间的一系列转换。您可以手动绘制这些序列波形,但这将非常简单…只需使用如下所示的简单matlab代码,您就可以创建一系列快照,显示如何创建驻波的波形。
t = 0:pi/20:20*pi;
ph = pi/20;
r = 0.5;
for i=1:20
subplot(4,5,i);
plot(t,sin(t+(i-1) ph),‘g-’,t,r sin(t-(i-1)*ph),‘b-’,t,sin(t+(i-1) ph)+r sin(t-(i-1)*ph),‘r-’);
axis([0 6*pi -2 2]);
set(gca,‘xticklabel’,[]);set(gca,‘yticklabel’,[]);
title([’(’ int2str(i) ‘)’]);
end
两个行波的快照的一个示例序列(蓝色一个向右行进,绿色向左行进。红色一个是由蓝色和绿色的总合成而形成的波)。首先看一下所有快照中的红色波浪。
每个快照中红色波形的幅度是否会发生变化? - >会的
每个快照中红色波形的频率和波长是否会发生变化? = - >不会
节点的位置(值变为零的位置)是否会在每个快照中发生变化? - >不会
让我再提一些其他问题来了解驻波的特性(如下图case 1所示)。
显示幅度最大的驻波的快照数是多少? - >是下图中的(1):这是两个行波(蓝色和绿色)完全相互重叠的快照。
显示幅度最小的驻波的快照数是多少? - >是下图中的(11):这是两个行波(蓝色和绿色)以这样的方式对齐的快照,即两个波具有180度的相位差。

Case 1:振幅相同的两个波的各种合成所得的波形情况
在上面的例子中,两个行波的幅度完全相同。如果两个行波的幅度不同(两个波的波长和频率仍然相同),该怎么办?
让我给出与我上面提到的相同的问题和相应的答案。
每个快照中红波的幅度是否会发生变化? - >会的
每个快照中红波的频率和波长是否会发生变化? = - >不会
节点的位置(值变为零的位置)是否会在每个快照中发生变化? - >不会
同样,让我再提一些其他问题来了解驻波的特性。
显示幅度最大的驻波的快照数是多少? - >是下图Case 2中的(1)。这是两个行波(蓝色和绿色)具有相同相位的快照。
显示幅度最小的驻波的快照数是多少? - >是下图Case 2中的(11)。这是两个行波(蓝色和绿色)以这样的方式对齐的快照,即两个波具有180度的相位差。但与不同,在这种情况下驻波的振幅不会变为零,因为两个行波的振幅不同。
现在让我们采用具有最小幅度和最大幅度的两个快照的驻波振幅的比率。在上面我们看到的两个例子的情况下,它是快照(1)和(11)的驻波振幅的比率。驻波是用最大振幅和最小振幅的比率称为“驻波比”来定义。我们在上面看到的第一和第二示例的驻波比可以如下所示。 (上面一个表示的最小/最大驻波振幅差,下面一个表示的最小/最大驻波振幅差).

Case 2:振幅不同的两个波的各种合成所得的波形情况
如果两个行波代表信号的电压,则驻波比称为“电压驻波比(VSWR)”。
几种入射波和反射波的定义
正如您在两个示例中看到的那样,您可能会注意到行波的振幅越接近SWR越大。 换句话说,如果你有更大的SWR,两个行波的幅度是相似的。 如果你有较小的SWR,这意味着行波的幅度差异很大(一个很大而另一个非常小)。
我们最常见的是哪里产生的驻波? 最常见的情况是行波撞击另一种介质的边界。 在这种情况下,波的一些部分将转移到另一种介质中,但是波的某些部分将被反射回来,如下图所示。
入射波和反射波的定义
该反射波将以与原始波相反的方向传播,但其波长(频率)与原始波保持相同。 结果,原始波和反射波形成驻波。
根据原始波的多少部分从边界反射(这由反射系数描述),您可以使用以下的等式来计算VSWR:
VSWR的计算方程
反射系数和VSWR之间的直观关系是什么? 您可以从以下示例中猜出。 简而言之,如果你有更大的反射系数,你会得到更大的VSWR,如果你有更小的反射系数,你会得到更小的VSWR:
反射系数和VSWR之间的关系
由于反射系数与S11紧密相关,因此您也可以使用S11表示VSWR,如下面的方程所示:
VSWR和S11之间的关系
硬件开发
2019-11-20 11:13:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
本博客所有内容来源于网络、书籍和各类手册,以及自己的胡思乱想,^。
内容均非以盈利为目的,旨在总结备份、便于查阅、开源分享。
转载内容有注明出处,如有侵权烦请告知,定尽快处理。
PS:学习、研究、探索本是枯燥事,没有什么公平可言,甚至还会不时让人感伤。
心态放平,观望远方,关心过程。
硬件开发
2019-11-18 08:38:00
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
在电子行业中,电子工程师极为熟悉的就是EMC电磁兼容性测试的各项规范。其实大多工程师所了解的电磁兼容性一般来说就是:设备或系统在其电磁环境中能正常工作,且不对该环境中任何事物构成不能承受的电磁骚扰的能力。最近有幸收到电磁兼容工程师王少启的诗词,旨在表明电磁兼容不应空论,越实践越知深浅。
《水调歌头◎电磁若兼容》
电磁若兼容? 和谐共处之。产品屡测不过,厂家迫求解。我欲群里寻问,又恐讨扰群员,每问必所获。 网罗各资料,渐积点皮毛。
可接地,可滤波,可屏蔽。不应空论,越实践越知深浅?小到芯级板级,大到系统架构,此事藏学问。但愿存知己,天涯共研讨。
王工的诗言简意赅,值得我们细细体味。只有对电磁兼容有着浓厚兴趣并有较深研究的朋友方能体会其中的含义。而对于那些初学者来说,理解起来并没有那么容易,因此小编这里在网上也搜集整理了一些跟电磁兼容相关的资料,以此来帮助大家理解。
电磁兼容是电子产品的一项非常重要的质量指标,电磁兼容的标准应用将是硬件工程师必须掌握的基本技术之一,在较短时间内掌握电磁兼容的基本技术和问题的解决方法,对于缩短产品开发周期、增强产品竞争力、节省研发经费等方面具有重要意义。EMC设计主要考虑板级设计、整机设计、系统级设计。
电磁兼容设计考虑
为节省能源和提高工作效率,目前大多数电子产品都选用开关电源供电。同时,越来越多的产品也都含有数字电路,以便提供更多的应用功能。开关电源电路和数字电路中的时钟电路是目前电子产品中最主要的电磁干扰源,它们是电磁兼容设计的主要内容。
便携式电子设备的尺寸日趋小巧纤薄,越来越多的新功能或新特性不断被集成到设备中,使得便携设备的数据率及时钟频率越来越高。与此同时,便携设备必将面临着诸多潜在的电磁干扰(EMI)/射频干扰(RFI)源的风险,如开关负载、电源电压波动、短路、雷电、开关电源、RF放大器和功率放大器及时钟信号的高频噪声等。因此,电路设计和电磁兼容性(EMC)设计的技术水平对产品的质量和技术性能指标将起到非常关键的作用。
电磁干扰通常有两种情形,即传导干扰和辐射干扰。传导干扰是指通过导电介质把一个电网络上的信号耦合(干扰)到另一个电网络。辐射干扰是指干扰源通过空间把其信号耦合(干扰)到另一个电网络。因此对EMC问题的研究实际上就是对干扰源、耦合途径、敏感设备三者之间关系的研究。电磁兼容设计就是针对电子产品中产生的电磁干扰进行优化设计,使之成为符合电磁兼容性标准的产品。
在电子线路中只要有电场或磁场存在,就会产生电磁干扰。在高速PCB及系统设计中,高频信号线、集成电路的引脚、各类接插件等都可能成为具有天线特性的辐射干扰源,能发射电磁波并影响其它系统或本系统内其他子系统的正常工作。
电路的ESD保护
静电放电(ESD)是从事硬件设计和生产的工程师都必须掌握的知识。很多开发人员往往会遇到这样的情形:实验室中开发的产品,测试完全通过,但客户使用一段时间后,即会出现异常现象,故障率也不是很高。一般情况下,这些问题大多由于浪涌冲击、ESD冲击等原因造成。在电子产品的装配和制造过程中,超过25%的半导体芯片的损坏归咎于ESD。随着微电子技术的广泛应用及电磁环境越来越复杂,人们对静电放电的电磁场效应如电磁干扰(EMI)及电磁兼容性(EMC)问题越来越重视。
电路设计工程师一般通过一定数量的瞬间电压抑制器(TVS)器件增加保护。如固状器件(二极管)、金属氧化物变阻器(MOV)、可控硅整流器、其他可变电压的材料(新聚合物器件)、气体电子管和简单的火花隙。随着新一代高速电路的出现,器件的工作频率已经从几kHz上升到GHz,对用于ESD保护的高容量无源器件的要求也越来越高。例如,TVS必须迅速响应到来的浪涌电压,当浪涌电压在0.7ns达到8KV(或更高)峰值时,TVS器件的触发或调整电压(与输入线平行)必须足够低以便作为一个有效的电压分配器。
现在,电路设计工程师在高频电路设计中越来越多地采用ESD抑制方案。尽管低成本的硅二极管(或变阻器)的触发/箝位电压非常低,但其高频容量和漏电流无法满足不断增长的应用需求。聚合物ESD抑制器在频率高达6GHz时的衰减小于0.2dB,对电路的影响几乎可以忽略不计。
电磁兼容和电路保护对所有电子产品的设计而言都是无法回避的问题。电路设计工程师除了熟悉电磁兼容相关标准,设计中还需综合考虑器件本身的性能、寄生参数、产品性能、成本以及系统设计中的每个功能模块,通过布局布线优化、增加去耦电容、磁珠、磁环、屏蔽、PCB谐振抑制等措施来确保EMI在控制范围之内。在制定电路保护设计方案时,最重要的是首先掌握因应的技术方案和设计手段,并据此选择正确的ESD保护器件。
硬件开发
2019-11-12 16:24:00