• [技术干货] 数码管
    LED 小灯是一种简单的 LED,只能通过亮和灭来表达简单的信息。还有另一种能表达更复杂信息的器件——LED 数码管      这是比较常见的数码管的原理图。从上图可以看出来,数码管共有 a、b、c、d、e、f、g、dp 这么 8 个段,而实际上,这 8 个段每一段都是一个 LED 小灯,所以一个数码管就是由 8个 LED 小灯组成的,数码管上边有 2 个 com,这就是数码管的公共端。为什么有 2 个呢,一方面是 2 个可以起到对称的效果,刚好是 10 个引脚,另外一个方面,公共端通过的电流较大,我们初中就学过,并联电路电流之和等于总电流,用2 个 com 可以把公共电流平均到 2 个引脚上去,降低单条线路承受的电流。      数码管分为共阳和共阴两种,共阴数码管就是 8 只 LED 小灯的阴极是连接在一起的,阴极是公共端,由阳极来控制单个小灯的亮灭。同理,共阳数码管就是阳极接在一起。数码管的真值表      数码管的 8 个段,我们直接当成 8 个 LED 小灯来控制,那就是 a、b、c、d、e、f、g、dp 一共 8 个 LED 小灯。我们通过图 5-3 可以看出,如果点亮 b 和 c 这两个 LED 小灯,也就是数码管的 b 段和 c 段,其他的所有的段都熄灭的话,就可以让数码管显示出一个数字 1,那么这个时候实际上 P0 的值就是 0b11111001,十六进制就是 0xF9#include <reg52.h> sbit ADDRO = P1^0; sbit ADDR1 = P1^1; sbit ADDR2= P1^2; sbit ADDR3 = P1^3; sbitENLED = P1^4; void main () { ENLED = 0; //使能U3,选择数码管DS1 ADDR3 = 1; ADDR2 =0; ADDR1 = 0; ADDR0 = 0; PO = 0xF9; //点亮数码管段b和c while (1); }      下载到51单片机中,就可以看到程序运行的结果是在最右侧的数码管上显示了一个数字 1。      用同样的方法,我们可以把其他的数字字符都在数码管上显示出来,而数码管显示的数字字符对应给 P0 的赋值,我们叫做数码管的真值表。这个电路图的数码管真值表,注意,这个真值表里显示的数字都不带小数点的
  • [行业资讯] USB PD3.1公布,可提供48V 240W功率,一统笔电充电时代将至!
    **转载文章 作者:晓宇,排榜:晓宇 微信公众号:芯片之家(ID:chiphome-dy)** 目前,业界标准基于USB Type-C 方面的USB PD充电协议仅开放到100W ,虽然对于多数手机与入门级游戏笔电等已经够用,不过对于动辄使用到150W 以上甚至240W 的电竞笔电还是不够的,不过USB Type-C 要一统笔电充电的日子应该不远了,根据开发USB标准规范的非营利组织USB实施者论坛(USB-IF )在近日公开的USB Type-C 修订版V2.1 版更新说明中,提及USB PD 3.1将开放到240W ,这就意味着除了少数超频型电竞笔电外,未来的USB PD 将可提供充足的功率,因此可以使用在高性能PC,大屏幕显示器,带有USB的打印机等,甚至,USB PD将成为大一统的标准供电接口。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/27/174114kl3teohjyeuukgch.png) 在USB Type-C 修订版V2.1版的USB PD 的3.1 修订版的规范当中,此规范自2.0以来的最大变化是增加了EPR或“扩展功率范围”支持。USB PD3.1规范将原来的USB PD3.0内容归到标准功率范围(Standard Power Range,简称SPR)里面,最大功率保持100W不变;同时增加了扩展功率范围(Extended Power Range,简称EPR),最大功率由100W扩展到240W。 USB PD规范的最高电流承受值仍维持5A ,不过由于将电压进一步从现在的最高20V 提升到48V ,使得总功率可达240W ,这就表示笔记型电脑等支持USB PD 3.1 充电的设备需要兼容48V 电压,由于电压值的改变了并且总功率提升一倍以上, USB-IF 要求未来联盟成员需在缆线标记能够支持最大240W 的图示,避免消费者误用。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/27/174127y9t0msugqljnomwp.png) ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/27/174134n7ho13lotl4zv4wk.png) >图片来源:充电头网 感兴趣的小伙可点击 阅读原文 在usb.org官方网站上查看最新公布USBType-C®电缆和连接器规范V2.1版本的详细内容! ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/27/174149xvprwio0v88s3r9x.png)
  • [技术干货] 去耦电容的应用
    左边这张图,过了保险丝以后,接了一个 470uF 的电容 C16,右边这张图,经过开关后,接了一个 100uF 的电容 C19,并且并联了一个 0.1uF 的电容 C10。其中 C16 和 C19 起到的作用是一样的,C10 的作用和他们两个不一样,我们先来介绍这 2 个大一点的电容。容值比较大的电容,理论上可以理解成水缸或者水池子,同时,大家可以直接把电流理 解成水流,其实大自然万物的原理都是类似的。 作用一,缓冲作用。当上电的瞬间,电流从电源处流下来的时候,不稳定,容易冲击电 子器件,加个电容可以起到缓冲作用。作用二,稳定作用。一整套电路,后级电子器件的功率大小都不一样,而器件正 常工作的时候,所需电流的大小也不是一成不变的。比如后级有个器件还没有工作的时候,电流消耗是 100mA,突然它参与工作了,电流猛的增大到了 150mA,这个时候如果没有一 个水缸的话,电路中的电压(水位)就会直接突然下降,比如我们的 5V 电压突然降低到 3V 了。而我们系统中有些电子元器件,必须高于一定的电压才能正常工作,电压太低就直接不工作了,这个时候水缸就必不可少了。电容会在这个时候把存储在里边的电量释放一下,稳定电压,当然,随后前级的电流会及时把水缸充满的。有了这个电容,可以说我们的电压和电流就会很稳定了,不会产生大的波动。这种电容常用的有如图:这三种电容是最常用的三种,其中第一种个头大,占空间大,单位容量价格最便宜,第二种和第三种个头小,占空间小,性能一般也略好于第一种,但是价格也贵不少。当然,除了价格,还有一些特殊参数,在通信要求高的场合也要考虑很多。电容的选取,第一个参数是耐压值的考虑。我们用的是 5V 系统,电容的耐压值要高于 5V,一般推荐 1.5 倍到 2 倍即可,有些场合稍微再高点也可以。我们板子上用的是 10V 耐压 的。第二个参数是电容容值,这个就需要根据经验来选取了,选取的时候,要看这个电容起 作用的整套系统的功率消耗情况,如果系统耗电较大,波动可能比较大,那么容值就要选大 一些,反之可以小一些。      另一种电容 C10,它容值较小,是 0.1uF,也就是 100nF,是用来 滤除高频信号干扰的。比如 ESD,EFT 等。我们初中学过电容的特性——可以通交流隔直流, 但是电容的参数对不同频率段的干扰的作用是不一样的。这个 100nF 的电容,是我们的前辈根据干扰的频率段,根据板子的参数,根据电容本身的参数所总结出来的一个值。也就是说, 以后大家在设计数字电路的时候,在电源处的去耦高频电容,直接用这个 0.1uF 就可以了, 不需要再去计算和考量太多。
  • [技术干货] Linux系统编程——初步操作
    一、  目的1、掌握Linux中VI的使用方法;2、通过实验学习 gcc 编译器编译 c 程序的方法,熟悉 gcc 编译程序的各个阶段;3、掌握使用gdb跟踪、调试程序。4、熟练掌握C语言中的位操作二、实验步骤(一)Linux 编辑器 vi 的使用1、vi 的模式vi 有 3 种模式,分别为命令行模式、插入模式及底行模式。各模式的功能,下面具体进行介绍。(1) 命令行模式用户在用 vi 编辑文件时,最初进入的为一般模式。在该模式中可以通过上下移动光标进行“删除字符” 或“整行删除”等操作,也可以进行“复制”、“粘贴”等操作,但无法编辑文字。(2) 插入模式只有在该模式下,用户才能进行文字编辑输入,用户按[ESC]键回到命令行模式。(3) 底行模式在该模式下,光标位于屏幕的底行。用户可以进行文件保存或退出操作,也可以设置编辑环境,如寻找字符串、列出行号等。2、vi 的基本流程(1)进入 vi:即在命令行下键入 vi hello(文件名)。此时进入的是命令行模式,光标位于屏幕的上方,如下图所示。(2)在命令行模式下键入 i 进入到插入模式,如图所示。可以看出,在屏幕底部显示有“插入” 表示插入模式,在该模式下可以输入文字信息。 (3)最后,在插入模式中,输入“Esc”,则当前模式转入命令行模式,并在底行中输入“:wq”(存盘退出)进入底行模式,如图所示。3、vi 的各模式功能键(1)命令行模式常见功能键如表 3.1 所示。表 3.1  vi 命令行模式功能键命   令功    能I切换到插入模式,此时光标当于开始输入文件处A切换到插入模式,并从目前光标所在位置的下一个位置开始输入文字O切换到插入模式,且从行首开始插入新的一行[ctrl]+[b]屏幕往“后”翻动一页[ctrl]+[f]屏幕往“前”翻动一页[ctrl]+[u]屏幕往“后”翻动半页[ctrl]+[d]屏幕往“前”翻动半页0(数字 0)光标移到本行的开头G光标移动到文章的最后nG光标移动到第 n 行$移动到光标所在行的“行尾”n<Enter>光标向下移动 n 行/name在光标之后查找一个名为 name 的字符串?name在光标之前查找一个名为 name 的字符串x删除光标所在位置的一个字符续表 命   令功        能X删除光标所在位置的“前面”一个字符dd删除光标所在行ndd从光标所在行开始向下删除 n 行yy复制光标所在行nyy复制光标所在行开始的向下 n 行p将缓冲区内的字符粘贴到光标所在位置(与 yy 搭配)u恢复前一个动作 (2)插入模式的功能键只有一个,也就是 Esc 退出到命令行模式。(3)底行模式常见功能键如表 3.2 所示。 表 3.2  vi 底行模式功能键目    录目 录 内 容:w将编辑的文件保存到磁盘中:q退出 Vi(系统对做过修改的文件会给出提示):q!强制退出 Vi(对修改过的文件不作保存):wq存盘后退出:w [filename]另存一个命为 filename 的文件:set nu显示行号,设定之后,会在每一行的前面显示对应行号:set nonu取消行号显示这样,就完成了一个简单的 vi 操作流程:命令行模式→插入模式→底行模式。由于 vi 在不同的模式下有不同的操作功能,因此,读者一定要时刻注意屏幕最下方的提示,分清所在的模式。4、用vi编辑hello,world程序。 (二)编译器gcc的使用GNU CC(简称为 Gcc)是 GNU 项目中符合 ANSI C 标准的编译系统,能够编译用 C、C++和 Object C 等语言编写的程序。gcc 不仅功能强大,而且可以编译如 C、C++、Object C、Java、Fortran、Pascal、Modula-3 和 Ada 等多种语言,而且 gcc 又是一个交叉平台编译器,它能够在当前 CPU 平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。下表 3.3 是 gcc 支持编译源文件的后缀及其解释。表 3.3   Gcc 所支持后缀名解释后 缀 名所对应的语言后 缀 名所对应的语言.cC 原始程序.s/.S汇编语言原始程序.C/.cc/.cxxC++原始程序.h预处理文件(头文件).mObjective-C 原始程序.o目标文件.i已经过预处理的 C 原始程序.a/.so编译后的库文件.ii已经过预处理的 C++原始程序  gcc 有超过 100 个的可用选项,主要包括总体选项、警告和出错选项、优化选项和体系结构相关选项。以下对每一类中最常用的选项进行讲解。1、总体选项gcc 的总结选项如表 3.4 所示,很多在前面的示例中已经有所涉及。表 3.4  gcc 总体选项列表后  缀  名所对应的语言-c只是编译不链接,生成目标文件“.o”-S只是编译不汇编,生成汇编代码-E只进行预编译,不做其他处理-g在可执行程序中包含标准调试信息-o file把输出文件输出到 file 里-v打印出编译器内部编译各过程的命令行信息和编译器的版本-I dir在头文件的搜索路径列表中添加 dir 目录-L dir在库文件的搜索路径列表中添加 dir 目录-static链接静态库-llibrary连接名为 library 的库文件 以下操作步骤对上面在vi中编写好的程序进行编译、生成可执行程序。2、使用 gcc 编译程序$ gcc  helloworld.c –o hello3、执行应用程序$ ./hello4、分步编译程序,生成预编译展开文件。$ gcc  -E  helloworld.c  -o  hello.i5、分步编译程序,生成汇编文件。$ gcc  -S  helloworld.c  -o  hello.s6、分步编译程序,生成目标代码。$gcc  -c  helloworld.c  -o  hello.o (三)Linux系统GDB调试工具使用1、使用 vi 编辑器,将以下代码输入到名为 greet.c 的文件中。此代码的原意为倒序输出 main 函数中定义的字符串,但目前程序结果没有输出。#include <stdio.h>#include <string.h>#include <stdlib.h> int display1(char *string);int display2(char *string); int main (int argc,char **argv){ char string[] = "Embedded Linux";  display1 (string); display2 (string);  return 0;} int display1 (char *string){ printf ("The original string is %s \n", string);} int display2 (char *string1){ char *string2; int size,i;  size = strlen (string1); string2 = (char *) malloc (size+1); for (i = 0; i < size; i++)  string2[size - i] = string1[i]; string2[size+1] = ' '; printf("The string afterward is %s\n",string2); free(string2);}2、使用 gcc 编译这段代码, gcc –g  greet.c –o greet,注意要加上‘-g’选项以方便之后的调试。3、运行生成的可执行文件./greet,观察运行结果。4、使用 gdb 调试程序,通过设置断点、单步跟踪,一步步找出错误所在。5、纠正错误,更改源程序并得到正确的结果。6、启动 gdb 调试: gdb  greet7、查看源代码,使用命令‘l’。8、在 30 行(for 循环处)设置断点,使用命令‘b 30’9、在 33 行(printf 函数处)设置断点,使用命令‘b 33’10、查看断点设置情况,使用命令‘info b’11、运行代码,使用命令‘r’12、单步运行代码,使用命令‘n’13、查看暂停点变量值,使用命令‘p string2[size - i]’14、继续单步运行代码数次,并使用命令查看,发现 string2[size-1]的值正确。15、继续程序的运行,使用命令‘c’16、程序在 printf 前停止运行,此时依次查看 string2[0]、 string2[1]…,发现 string[0]没有被正确赋值,而后面的复制都是正确的,这时,定位程序第 31 行,发现程序运行结果错误的原因在于‘size-i’。由于 i只能增到‘size-i’,这样 string2[0]就永远不能被赋值而保持 NULL,故输不出任何结果。17、退出 gdb,使用命令 q18、修改 greet.c,把其中的“string2[size - i] = string1[i]”改为“string2[size-i-1] = string1[i];”即可。19、使用 gcc 重新编译: gcc –g  greet.c –o greet20、查看运行结果: ./greet,得到结果正确
  • [技术干货] 乐鑫代理-启明云端分享|ESP-12F和ESP-12S,一个字母的区别,模块到底有啥不同呢?
    ESP-12F和ESP-12S别看只有一个字母不同,但在应用上可得注意了!他们最大的不同,是封装的区别。特别要注意的是模块底部,如下图所示:ESP-12F 底部有焊盘ESP-12S  底部是平的ESP-12S和ESP-12F他们俩的特性差不多,就封装差异,具体如下:一、ESP-12F主要特性 :采用: SMD-22 封装板载: PCB 天线工作电压:3.3V工作环境温度:-20-85°CCPU Tensilica L106RAM :50KB(可用)Flash :32Mbit系统 :802.11 b/g/n内置 Tensilica L106 超低功耗 32 位微型 MCU,带有16位精简模式,主频支持 80 MHz 和 160 MHz,支持 RTOS WIFI @2.4 GHz,支持 WEP/WPA-PSK/WPA2-PSK 安全模式超小尺寸模组: 24mm16mm3mm(±0.2mm)内置 10 bit 高精度 ADC内置 TCP/IP 协议栈内置 TR 开关、balun、LNA、功率放大器和匹配网络深度睡眠保持电流为 20uA,关断电流小于 5uA串口速率最高可达 4Mbps待机状态消耗功率小于 1.0mW (DTIM3)支持 AT 远程升级及云端 OTA 升级支持 STA/AP/STA+AP二、ESP-12S主要特性 :采用: SMD-16 封装板载: PCB 天线工作电压:3.3V工作环境温度:-20-85°CCPU Tensilica L106RAM :50KB(可用)Flash :32Mbit系统 :802.11 b/g/n内置 Tensilica L106 超低功耗 32 位微型 MCU,带有16位精简模式,主频支持 80 MHz 和 160 MHz,支持 RTOS WIFI @2.4 GHz,支持 WEP/WPA-PSK/WPA2-PSK 安全模式超小尺寸模组: 24mm16mm3mm(±0.2mm)内置 10 bit 高精度 ADC内置 TCP/IP 协议栈内置 TR 开关、balun、LNA、功率放大器和匹配网络深度睡眠保持电流为 20uA,关断电流小于 5uA串口速率最高可达 4Mbps待机状态消耗功率小于 1.0mW (DTIM3)支持 AT 远程升级及云端 OTA 升级支持 STA/AP/STA+APESP-12F又叫WT8266-S5; ESP-12S又叫WT8266-S6; 这两个模组是乐鑫代理公司启明云端基于ESP8266在较小尺寸封装中集成了业界领先的 Tensilica L106 超低功耗 32 位微型 MCU,带有 16 位精简模式,主频⽀持 80 MHz 和 160 MHz,支持 RTOS,集成 Wi-Fi MAC/ BB/RF/PA/LNA, 板载天线。现在你应该知道如何选择ESP-12F和ESP-12S模块了吧,如果您有任何问题,或需要 ESP8266模块,可与启明云端商务取得联系!我们会第一时间提供样品和技术指导给到你们!启明云端有幸从2013年起就与乐鑫同步成长,夯实走好每一步.我们看好原厂开放、包容的生态,看好乐鑫对产品质量追求的持之以恒的“钻劲”。启明云端作为乐鑫代理,已一跃成为乐鑫全球销货最大代理商之一,累计服务数千家客户。在我们的合作客户名单里,N多具有行业代表性和成长爆发性的企业,其中不乏家电龙头、照明行业翘楚、智能家居独角兽……涵盖智能家电、家居、工业控制、人机界面等启明云端重点布局的赛道和领域。
  • [技术干货] 电子工程师用得最多的10种软件
    电子工程又称“弱电技术”或“信息技术”,严格来说它属于电气工程下属学科,电子工程又可分为电测量技术、调整技术、电子技术。电子工程相关的职业一般分为硬件工程师和软件工程师。而电子工程师是一个对从事集成电路、电子电气设备等相关产品生产、研发工作的技术人员的统称。一般的电子工程师都不会说只专注于硬件或者软件,这两者是密不可分的,硬件需要软件来执行其程序实现具体功能。软件需要硬件做载体,它们之间是一个相辅相承的关系。本文中我们就给大家介绍一下目前被电子工程师用得最多的10款软件工具。1、Altium DesignerAltium designer是一款一体化的电子产品开发系统软件。这套软件通过把原理图设计、电路仿真、PCB绘制编辑、拓扑逻辑自动布线、信号完整性分析和设计输出等技术的完美融合,为设计者提供了全新的设计解决方案,使设计者可以轻松进行设计,熟练使用这一软件使电路设计的质量和效率大大提高。目前,这个软件的市场定位主要是一些简单的板子,相对是较简单的偏低端的产品设计。一般都是画2层 4层为主。这个软件,在内地城市使用的占有率很高。很多读电子或者机电相关专业的学生在学校里面就有教这个,或者有要求去学这个,主要用于画简单的板子。2、MatlabMatlab也是值得接触的软件。MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。3、LabVIEWLabVIEW是一种程序开发环境,由美国国家仪器(NI)公司研制开发,类似于C和BASIC开发环境,但是LabVIEW与其他计算机语言的显著区别是:其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G编写程序,产生的程序是框图的形式。4、KeilKeil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。5、Visual c++Microsoft Visual C++(简称Visual C++、MSVC、VS或VC)是微软公司的免费C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。VC++集成了便利的除错工具,特别是集成了微软Windows视窗操作系统应用程序接口(Windows API)、三维动画DirectX API,Microsoft .NET框架。它以拥有“语法高亮”,IntelliSense(自动完成功能)以及高级除错功能而著称。比如,它允许用户进行远程调试,单步执行等。还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。其编译及建置系统以预编译头文件、最小重建功能及累加连结著称。这些特征明显缩短程式编辑、编译及连结花费的时间,在大型软件计划上尤其显著。6、MultisimMultisim是美国国家仪器(NI)有限公司推出的以Windows为基础的仿真工具,适用于板级的模拟/数字电路板的设计工作。它包含了电路原理图的图形输入、电路硬件描述语言输入方式,具有丰富的仿真分析能力。工程师们可以使用Multisim交互式地搭建电路原理图,并对电路进行仿真。Multisim提炼了SPICE仿真的复杂内容,这样工程师无需懂得深入的SPICE技术就可以很快地进行捕获、仿真和分析新的设计,这也使其更适合电子学教育。通过Multisim和虚拟仪器技术,PCB设计工程师和电子学教育工作者可以完成从理论到原理图捕获与仿真再到原型设计和测试这样一个完整的综合设计流程。7、ProteusProteus软件是英国Lab Center Electronics公司出版的EDA工具软件。设计套件结合了易用和强大的功能集,可实现专业PCB的快速设计,测试和布局。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。8、Solidworks可能有人说这就是一个普通的3D软件,怎么会用在电子工程领域呢?那我来解释一下,之前我在深圳是做治具的,也称夹具。这是一个偏硬件的行业。简要介绍一下其整个制造流程,分析工程师把客户的文件资料(通常是PCB资料)用Tebo软件分析出来,然后给结构工程师设计治具结构,然后将需要加工的零部件用JD加工出来,然后进行装配。治具是用于PCB(印刷电路板)测试的工具。这是PCB制造的一个下游行业。但却在保证PCB出厂质量这方面起着不可或缺的而作用。9、PADSPADS的前身是 POWER PCB ,这个软件界面菜单很少,易上手。特别是消费类电子产品市场占有率非常高,早期都可以说在消费类产品里面差不多是垄断的地位,比如从早期的 VCD,DVD,MP3 ,MP4,U盘,液晶电视,到现在的平板电脑,行车记录仪,车载电子产品,导航仪,数字机顶盒,安卓智能电视盒、手机等都是绝对的市场占有率。在整个消费类电子产品里面,PADS几乎占了绝对的优势。目前在沿海发达城市里面,PADS还是占主流市场,特别是深圳大部分公司还是用PADS ,其次是allegro 。10、OrCADOrCAD是一款专业PCB设计,电路板布局和布线的工具。可以帮助更快地生产可制造的电路板设计。Cadence OrCAD产品以其直观的操作界面以及强大的功能而深受广大电子工程师们的喜爱。是世界上使用最广泛的EDA软件。
  • [问题求助] Atlas200DK能控制STM32单片机吗?
    【功能模块】Atlas200DK上已经部署了由mindstudio转换而来的.om模型文件,那么如何实现与STM32单片机的下行通讯?在Atlas200DK内部结构中有串口设计,可以进行串口通讯吗?)
  • [交流吐槽] 学单片机有什么书推荐?
    **本文转自:捷配电子工程师笔记** 大家可能都有过关于学习单片机的讨论 不过看到的回答都是劝退型的…… ``` Q: 学单片机有什么书推荐吗? A: 有,STM32从入门到放弃 ``` ``` Q: 学单片机有什么书推荐吗? A: 深入浅出学习51单片机之开发板吃灰秘籍 ``` ``` Q: 学单片机有什么书推荐吗?图片 A: 如下图 ``` ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/23/150022p7zu8et91ckfxlyf.png) 看完这几条回答后: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/23/150044dyux5ol7q0d1bhzm.png) 那么,学习单片机,到底难不难呢?单片机,要学什么呢? 下面是@无际单片机分享的单片机入门最佳学习路线 入门学习路线大纲:电子元器件-电路基础-C语言-单片机-AD软件使用 - 1. 电子元器件 单片机主要是用来控制硬件的,所以基本的电路必须要懂,而电路是由各种电子元器件组成的。 元器件成千上万种,没必要全部学,前期只需要学会电阻、电容、继电器、LED灯、二极管、三极管、MOS管、电感、按键、晶振这些元器件的作用就可以了。 - 2. 电路基础 关于电路的知识就多了,电路还分模拟电路和数字电路,我入门的时候在这里踩了一个大坑(死磕了一段时间模拟电路),导致我一度想放弃单片机。 其实完全没必要单独去学模拟电路和数字电路,对于单片机开发来说模拟电路用的还是比较少的,即便有也有专门硬件工程师帮你设计成能直接接单片机的信号了。 电路基础只要掌握欧姆定律、三极管开关原理、二极管导通原理、按键检测原理、蜂鸣器驱动、单片机的外围电路就可以了,简单来说学到能看的懂51单片机开发板的电路图就行了。 - 3. C语言 我在入门的时候C语言和单片机是同步学的,否则单纯去学枯燥无味的代码兴趣很容易被磨灭,学技术最大的动力就是兴趣。 C语言学完结构体和指针那章就可以了,如果指针实在学不懂那也没关系,先了解,当你有一定代码量的沉淀后,再回过头去看就很容易搞懂了。 - 4. 单片机 目前市面上主流的单片机就是51和STM32,所以这两个单片机是必学的,先学51后学STM32。 51的话全部外设都要学完,而STM32因为比较复杂一点,所以只需要学习常用的外设(GPIO、Timer、中断、USART、IIC、SPI、PWM、DMA、ADC)就可以了,其他像什么CAN、USB的一律不管,工作需要用到的时候再去学。 - 5. AD软件使用 AD是一个画原理图和PCB的软件,作为单片机软件开发来说只需要会看或者画原理图即可。 拿好这份指南,入门单片机不再难! **本文转自:捷配电子工程师笔记**
  • [交流吐槽] 电容是如何工作的?
    本文转自:捷配电子工程师笔记 # 1.电路和电容器 **首先讲一下电路和电容器。** 电路是道路,电荷是车。 如果将一个电路比作马路的话,电荷的移动就好像车流一样。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/23/144944ty7aekjknz6lbbyr.png) 阻抗是崎岖的道路。 道路凹凸不平的情况下,车的行驶速度虽然会减慢但还是会向目的地前进。在电路中,阻抗会产生热并发生能耗(焦耳电)。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/23/145006zj15b7li7f78cl8m.png) 电源(电池)是负载着电位差的装置。 电源是在两端连接负载着E[V]电位差的装置。这与汽车利用电梯,自动地向高为t[m]的位置移动是一个道理。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/23/145030ouijwjlxggra0zwp.png) # 2.电容器是什么? 接着就来说一说当电源装上电容器后的情况。 电容器是停车场。 电容器能够储蓄电荷。将电路比作成道路的话,电容器就好比停车场。电路正端和负端必定储蓄着相同的电荷数。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/23/145100lxjurk77keeduzn1.png) 电容有储存电荷的能力。 电容器能储存多少的电荷的标准叫做电容值,电容值由(1)式所示。 由(1)式可知,①电极面积S扩大 ②电极间的距离缩短 ③使用诱电率高的材料,可增大容值。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/23/145120vjl2oa00skptottv.png) 电容的单位是SI单位系的F(法拉)。将1V电压(电位差)给予某导体,储存1C(库伦)的电荷时,电容值为1F。 # 3.电容器的工作 电容器储存的电荷在开关S1为OFF,S2为ON的时候,向负载电流流动。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/23/145138vdnpv34obqhu247w.png) 根据电容的状态,电源电压不稳定的情况下,稳定的电灯发光。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/23/145156eangiekqih2m0u6n.png) 电容阻断直流电,仅可通交流电。 电容不可通直流电,如果重复充电、放电,在电容中将会反复流动充电电流和放电电流。 这种现象可通过电容的外观观察电流是否流经电容。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/23/145211bqml7ywqeelyzybq.png) 由于这些特征,使得电路中用到许多电容。 配合它的用途,选择适合的产品是有必要的。 **本文转自:捷配电子工程师笔记**
  • [技术干货] 单片机入门需知的几个概念
    **本文转自:捷配电子工程师笔记** # 01 单片机执行指令 我们来思考一个问题,当我们在编程器中把一条指令写进单片机内部,然后取下单片机,单片机就可以执行这条指令。 那么这条指令一定保存在单片机的某个地方,并且这个地方在单片机掉电后依然可以保持这条指令不会丢失,这是个什么地方呢? 这个地方就是单片机内部的只读存储器即ROM(READ ONLY MEMORY)。 为什么称它为只读存储器呢?刚才我们不是明明把两个数字写进去了吗?原来在89C51中的ROM是一种电可擦除的ROM,称为FLASH ROM,刚才我们是用的编程器,在特殊的条件下由外部设备对ROM进行写的操作,在单片机正常工作条件下,只能从那面读,不能把数据写进去,所以我们还是把它称为ROM。 # 02 单片机数的本质和物理现象 我们知道,计算机可以进行数学运算,这令我们非常难以理解,它们只是一些电子元器件,怎么可以进行数学运算呢? 我们人类做数学题如37+45是这样做的,先在纸上写37,然后在下面写45,然后大脑运算最后写出结果,运算的原材料是37和45,结果是82都是写在纸上的,计算机中又是放在什么地方呢? 为了解决这个问题,先让我们做一个实验:这里有一盏灯,我们知道灯要么亮,要么不亮,就有两种状态,我们可以用‘0’和‘1’来代替这两种状态:规定亮为‘1’、不亮为‘0’。 现在放上三盏灯,一共有几种状态呢?我们列表来看一下:000 / 001 / 010 / 011 / 100 / 101 / 110 / 111。我们来看,这个000 / 001 / 101 不就是我们学过的的二进制数吗?本来,灯的亮和灭只是一种物理现象,可当我们把它们按一定的顺序排好后,灯的亮和灭就代表了数字了。 让我们再抽象一步,灯为什么会亮呢?是因为输出电路输出高电平,给灯通了电。因此,灯亮和灭就可以用电路的输出是高电平还是低电平来替代了。这样,数字就和电平的高、低联系上了。 # 03 单片机数位的含义 通过上面的实验我们已经知道:一盏灯亮或者说一根线的电平的高低,可以代表两种状态:0和1,实际上这就是一个二进制位。 因此我们就把一根线称之为一“位”,用BIT表示。 # 04 单片机字节的含义 一根线可以表示0和1,两根线可以表达00 / 01 / 10 / 11四种状态,也就是可以表达0~3,而三根可以表达0~7,计算机中通常用8根线放在一起,同时计数,就可以表示0~255一共256种状态。 这8根线或者8位就称之为一个字节(BYTE)。 # 05 单片机存储器的构造 存储器就是用来存放数据的地方。它是利用电平的高低来存放数据的,也就是说,它存放的实际上是电平的高、低,而不是我们所习惯认为的1234这样的数字,这样,我们的一个谜团就解开了。 一个存储器就象一个个的小抽屉,一个小抽屉里有八个小格子,每个小格子就是用来存放“电荷”的,电荷通过与它相连的电线传进来或释放掉。至于电荷在小格子里是怎样存的,就不用我们操心了,你可以把电线想象成水管,小格子里的电荷就象是水,那就好理解了。存储器中的每个小抽屉就是一个放数据的地方,我们称之为一个“单元”。 有了这么一个构造,我们就可以开始存放数据了,想要放进一个数据12,也就是00001100,我们只要把第二号和第三号小格子里存满电荷,而其它小格子里的电荷给放掉就行了。 可是问题出来了,一个存储器有好多单元,线是并联的,在放入电荷的时候,会将电荷放入所有的单元中,而释放电荷的时候,会把每个单元中的电荷都放掉。这样的话,不管存储器有多少个单元,都只能放同一个数,这当然不是我们所希望的。因此,要在结构上稍作变化。 需要在每个单元上有个控制线,想要把数据放进哪个单元,就把一个信号给这个单元的控制线,这个控制线就把开关打开,这样电荷就可以自由流动了。而其它单元控制线上没有信号,所以开关不打开,不会受到影响。 这样,只要控制不同单元的控制线,就可以向各单元写入不同的数据了。同样,如果要从某个单元中取数据,也只要打开相应的控制开关就行了。 # 06 单片机存储器的译码 那么,我们怎样来控制各个单元的控制线呢?这个还不简单,把每个单元的控制线都引到集成电路的外面不就行了吗? 事情可没那么简单,一片27512存储器中有65536个单元,把每根线都引出来,这个集成电路就得有6万多个脚?不行,怎么办?要想法减少线的数量。 有一种方法称这为译码,简单介绍一下:一根线可以代表2种状态,2根线可以代表4种状态,3根线可以代表8种,256种状态又需要几根线代表?8根线,所以65536种状态我们只需要16根线就可以代表了。 # 07 单片机存储器的选片概念 至此,译码的问题解决了,让我们再来关注另外一个问题。送入每个单元的八根线是用从什么地方来的呢?它就是从计算机上接过来的,一般地,这八根线除了接一个存储器之外,还要接其它的器件。 这样问题就出来了,这八根线既然不是存储器和计算机之间专用的,如果总是将某个单元接在这八根线上,就有问题出现了:比如这个存储器单元中的数值是0FFH另一个存储器的单元是00H,那么这根线到底是处于高电平,还是低电平?怎样分辨? 办法很简单,当外面的线接到集成电路的引脚进来后,不直接接到各单元去,中间再加一组开关就行了。平时我们让开关打开着,如果确实是要向这个存储器中写入数据,或要从存储器中读出数据,再让开关接通就行了。 这组开关由三根引线选择:读控制端、写控制端和片选端。要将数据写入片中,先选中该片,然后发出写信号,开关就合上了,并将传过来的数据(电荷)写入片中。如果要读,先选中该片,然后发出读信号,开关合上,数据就被送出去了。 读和写信号同时还接入到另一个存储器,但是由于片选端不同,所以虽有读或写信号,但没有片选信号,所以另一个存储器不会“误会”而开门,造成冲突。那么会不同时选中两片芯片呢? 只要是设计好的系统就不会,因为它是由计算控制的,而不是我们人来控制的,如果真的出现同时出现选中两片的情况,那就是电路出了故障了,这不在我们的讨论之列。 # 08 单片机的总线概念 从上面的介绍中我们已经看到,用来传递数据的八根线并不是专用的,而是很多器件大家共用的。 所以我们称之为数据总线,总线英文名为BUS,总即公交车道,谁也可以走。而十六根地址线也是连在一起的,称之为地址总线。 **本文转自:捷配电子工程师笔记**
  • [交流分享] 无线AP介绍
    一、无线AP安装部署无线AP相比比较简单,但需要注意以下细节,避免出现速度慢、卡顿、无法运行等情况。根据覆盖的范围选择无线AP型号;一般室内无线AP间隔在20-30米距离,室外AP间隔在30-50米;在部署之前,需要考虑环境及外界设备对AP无线信号的影响,再综合考虑覆盖范围;无线AP最好选择双频,双频较单频速度更快、干扰更低、价格更贵,未来的趋势;无线信号由AP为中心向四周发射,如有墙壁灯障碍物可反射或改变方向;AP最好选择安装在中间位置,全向推荐高度4-6米,定向6-8米,PoE网线长度不超过80m;无线AP发射功率决定发射无线信号强度和距离,功率大,信号强,距离相对远,接入用户多。AP与终端之间有水泥墙,有效传输距离不到5米。如是木板墙或玻璃墙,有效传输距离在15米内。二、关于POE供电标准IEEE802.3af主要供电参数直流电压在44~57V之间,典型值为48V。典型工作电流为10~350mA,典型的输出功率:15.4W。超载检测电流为350~500mA。在空载条件下,最大需要电流为5mA。为PD设备提供3.84~12.95W四个Class等级的电功率请求。IEEE802.3af的分级参数Class0设备需要的最高工作功率为0~12.95WClass1设备需要的最高工作功率为0~3.84WClass2设备需要的工作功率介于3.85W~6.49WClass3设备的功率范围则介于6.5~12.95WIEEE802.3at标准的诞生由于IEEE802.3af标准使受电设备(PD)上的PoE功耗被限制为12.95W,这就限制了以太网电缆供电的应用范围。为了克服PoE对功率的限制,推出新标准:IEEE802.3at(也称为PoE+),它将功率要求高于12.95W的设备定义为Class4,可将功率水平扩展到25W或更高。IEEE802.3at与802.3af相比,802.3at可输出2倍以上的电力,每个端口的输出功率可在30W以上。受电设备PD可以最大到29.95W,PSE将为其提供30W以上的直流电源。PD以Class4分级的电流响应,告诉PSE是否能够为其提供802.3at规定的较高功率。(PSE,PowerSourcingEquipment)和受电端设备(PD,PowerDevice)两部分。POE交换机就是PSE设备,无线AP就是PD设备。IEEE802.3at(PoE+)供电参数直流电压在50-57V之间,典型值为50V。工作电流为10~600mA,输出功率为30W。受电设备PD支持Class4的分级。IEEE802.3bt(PoE++)供电参数802.3bt引入了四种新的高功率PD分级(Class),从而是单特征类别总数达到了9个。Class5~8对于PoE标准是新的,功率为40W~71W的PD功率水平。关于各类网线支持PoE协议标准三、关于信道带宽频段带宽是发送无线信号频率的标准。在常用的2.4-2.4835GHz频段上,每个信道的频段带宽为20MHz;前者工作的协议有b/g/n,后者有ac/a/n。(参考百度百科)频率越高越容易失真,其中20MHz在11n的情况下能达到144Mbps带宽,它穿透性较好,传输距离远(约100米左右);40MHz在11n的情况下能达到300Mbps带宽,穿透性稍差,传输距离近(约50米左右)。Channel Spectrum Width(信道带宽): 40MHZ42-5210MHZ 5.21GHz50-5250MHZ 5.25GHz58-5290MHZ 5.29GHz152-5760MHZ 5.76GHz160-5800MHZ 5.8GHzChannel Spectrum Width(信道带宽): 20MHZ36-5180MHZ 5.18GHz40-5200MHZ 5.2GHz44-5220MHZ 5.22GHz48-5240MHZ 5.24GHz52-5260MHZ 5.26GHz56-5280MHZ 5.28GHz60-5300MHZ 5.3GHz64-5320MHZ 5.32GHz149-5745MHZ 5.745GHz153-5765MHZ 5.765GHz157-5785MHZ 5.785GHz161-5805MHZ 5.805GHz165-5825MHZ 5.825GHz
  • [技术干货] 嵌入式基础1:I2C
    1. 简介I2C (Inter-Integrated Circuit),是一种串行通信总线,用于连接微控制器及其外围设备,实现主控制器和从器件间的主从双向通信,是一种同步半双工通信(两端时钟频率一致,双向通信,但不能同时进行数据收发)。2. 原理I2C通信属于串行通信,具有两根串行信号线:数据线(SDA),时钟线(SCL)。如下图所示,主控制器与从器件(一个或多个)都通过两根信号线连接,信号线上主机和从机都可以扮演发送器和接收器的角色。为确保传输过程的指向准确性,每个接到I2C总线上的器件都有唯一的地址(7位从器件专用地址码),可实现制定从机的定向传输与群发传输。图1,I2C总线物理拓扑图2.1 信号类型同时,为确保传输稳定,所有连接在同一I2C总线上的设备共用一个时钟。I2C 总线在传送数据过程中共有以下几种类型信号:(1) 开始信号/结束信号    SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。    SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。    在这里插入图片描述在这里插入图片描述(2) 应答信号/非应答信号    IIC 总线协议规定,每传送一个字节数据后(8bit),都要有一个应答信号以确定数据传送是否被对方收到。即一个字节传输的8个时钟过后的第9个时钟期间,接收器必须回一个ACK应答信号给发送器,这样才能进行数据传输。    应答信号由接受设备产生,在SCL为高电平期间,接受设备将SDA拉低为低电平,表示数据传输正确,产生应答(ACK),SDA拉高则表示数据传输失败,产生非应答位(NACK)。    在这里插入图片描述(3) 闲置状态/被占用状态    在主机发送起始信号后,且未发送终止信号期间,总线处于被占用状态。    发送终止信号后,总线处于闲置状态,SCL与SDA同时为高电平。    在这里插入图片描述2.2 总线读写流程I2C总线进行数据传送时,SCL时钟信号为高电平期间,SDA数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。 当一个字节按数据位从高位到低位的顺序传输完后,紧接着从机将拉低SDA线,回传给主设备一个应答位ACK, 此时才认为一个字节真正的被传输完成 ,如果一段时间内没有收到从机的应答信号,则自动认为从机已正确接收到数据。I2c总线写通信过程:    主机在检测到总线空闲的状况下,首先发送一个START信号掌管总线;    发送一个地址字节(8 bit),其中bit0-6位为从机地址,存放从机唯一地址;bit7位为读写位(R/W),0表示write主机 ->从机,1表示read 从机->主机;    主机发送地址时,总线上每个从机都会将7位地址与自己的地址进行比较,若相同,则将匹配成功,发送应答信号(ACK),确定发送器和接收器;    主机收到ACK后开始发送第一个字节(Command),对应从机中要写入的寄存器;    从机接收到Command后,从机发送ACK;    主机收到ACK后开始发送第一个数据字节:bit0-7(8bit数据,高到低),从机收到数据后,发送应答ACK;    继续发送数据,n帧;    主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线;    图2,I2C总线写通信过程    I2c总线读通信过程:    主机产生START信号,随后发送从机地址(7bit)+0(Write);    *方向仍然是写,待接收到从机发送的ACK应答后,配对成功。    主机接收到ACK后,发送8bit内存地址(Command对应从机相应寄存器地址),从机接收到后,内部寻址并提取数据,返回ACK;    主机接收到ACK后,重新产生START信号,再一次发送从机内存地址,(7bit)+1(Read),从机接收到后返回ACK;    *方向设置为读,主机设置为接收模式    主机接收到ACK后,做好接收从机信息的准备,现在即可接收1bit的数据。    *主机不向从机发送应答信号,接收完毕后直接发起终止信号。    主机接收全部数据后,产生STOP信号,终止通信,总线变为闲置状态。
  • [技术干货] PWM脉宽调制
    一:什么是PWM脉宽调制技术,全称为脉冲宽度调制,英文名称为Pulse Width Modulation,简写为PWM,是一种利用微处理器来完成对模拟电路控制的一种技术,其具有操作简单、灵活性好、反应速度快等诸多特点,现已在通信、测量、功率变换、功率控制等多个方面都得到了广泛的应用原理:脉宽调制技术是通过对逆变电路开关的通断控制来实现对模拟电路的控制的。脉宽调制技术的输出波形是一系列大小相等的脉冲,用于替代所需要的波形,以正弦波为例,也就是使这一系列脉冲的等值电压为正弦波,并且输出脉冲尽量平滑且具有较少的低次谐波。根据不同的需求,可以对各脉冲的宽度进行相应的调整,以改变输出电压或输出频率等值,进而达到对模拟电路的控制二:频率和占空比频率:物质在1秒内完成周期性变化的次数叫做频率单位:HZ单位换算:1kHz=1000Hz,1MHz=1000000Hz 1GHz=1000MHz周期:频率的倒数占空比:是指在一个脉冲循环内,通电时间相对于总时间所占的比例如图:一个周期内高电平所占的比就是占空比三:单片机怎么产生PWM调制对于51单片机而言,用定时器来产生pwm思路如下:我们知道单片机的时钟脉冲,那怎么利用PWM呢,其实就是通过定时器来改变一个周期内高低电平的占空比来实现PWM的调制.例如我们把电平置为高电平持续1ms,然后然低电平持续3毫秒,这样就能产生一个周期为4毫秒的占空比为25%的PWM波了.单片机的晶振是11.092MHZ方便计算取12MHZ.那么他的时钟周期就是1/12us,机器周期就是1us. 那么如何用定时器怎么来产生.对于定时器0来说定时器是16位的寄存器,来一个脉冲加一,加到65535时就会溢出.所以定时器0从0开始计数到65535,一个微妙就记一次数.那么要溢出则需要65535us.举个例子:我们要产生一个100HZ的PWM且占空比25%,用定时器怎么完成.首先100HZ的周期是10ms.也就是持续一个周期的时间是10ms,那么占空比25%就让高电平持续2.5个ms,低电平持续7.5个ms我们让定时器0产生10ms需要计数10000,因为定时器每计数一次是1us,那么10000次就是10ms,我们把这10000分成100分,就相当与把一个脉冲周期分成100分而占空比25%即高电平占了25份,低电平就占了75份.那么定时器就要每100us就要中断一下那么中断要装的初值就是TH0=(65535-100)/256,TL0=(65535-100)%256.然后在中断里面设置一个变量在这个变量在0到25期间是高电平否则是低电平就可以实现题目要求.4:pwm的应用通过按键改变小灯的亮度呼吸灯电机调速这里先介绍以下第一个:#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit L1=P0^0;sbit S7=P3^0;uchar aa=0;pwm=0;cont=0;void delay(uint tt){    while(tt--);}void HC_138(){    P2=(P2&0X1F)|0X80;}void scankey(){    if(S7==0)    {        delay(100);        if(S7==0)        {            switch(cont)            {                case 0: L1=0; TR0=1;pwm=10; cont=1;break;                case 1: pwm=50; cont=2;break;                case 2: pwm=90; cont=3;break;                case 3: L1=1;TR0=0;cont=0;break;            }          while(S7==0);        }    }}void INIT_t0(){    TMOD=0X01;    TH0=(65535-100)/256;    TL0=(65535-100)%256;    ET0=1;    EA=1;        }void servicet0() interrupt 1{    TH0=(65535-100)/256;    TL0=(65535-100)%256;    aa++;    if(aa==pwm)    {        L1=1;    }    else if(aa==100)    {        L1=0;        aa=0;    }}void init(){    P2=(P2&0X1F)|0Xa0;    P0=0x00;}void main(){    init();    HC_138();    P0=0XFF;    INIT_t0();    while(1)    {      scankey();    }}
  • [交流分享] 4G LTE物理广播信道PBCH与主信息块MIB
    第1章 物理广播信道PBCH概述1.1 PBCH概述PBCH: physical Boardcast Channel, 物理广播信道,顾名思义,是蜂窝小区的广播信道。PBCH信道承载的MIB消息。MIB消息,Master information block,主信息块:为小区提供广播播消息,主要承载的是MIB消息,用于终端获得接入无线接入网中所需要的必须的的、少量的小区信息。下行系统带宽、SFN子帧号、PHICH指示信息、天线配置信息等1.2 PBCH在启动流程中的位置 第2章 4G LTE物理广播信道PBCH的时频资源频域:对于不同的带宽,都占用中间的1.08MHz (6 PRB * 12子载波 = 72个子载波)进行传输,在频域上与PSS和SSS的位置是相同的,分时复用相同的子载波时域:映射在每个10ms 无线帧的0号子帧的第2个slot的前4个连续的OFDM符号周期上.调试方式:采用固定的QPSK。周期:PBCH更新调度周期为40ms,但每10ms帧都会重复发送一次,终端可以通过4次中的任一次接收解调出BCH,就可以获取小区MIB信息。内容:小区的主信息块。 第3章 4G LTE主信息块MIB3.1 MIB概述为了能正常接入小区,UE在完成扫频, 还需要继续读取小区的系统信息。系统信息是由网侧不断的重复广播的,这样无论UE什么时候开机,都能及时的获取到系统信息。LTE的系统信息被分为两大类:MasterInformationBlock(MIB)消息和多个SystemInformationBlocks(SIBs)消息。MIB消息在PBCH中传输,不使用RNTI加扰;SIB消息是在PDSCH中传输,使用SI-RNTI加扰。当网侧设备开机后,会先发送MIB消息,然后再发送一系列的SIB消息。MIB消息中承载的是最基本的信息,这些信息涉及到PDSCH信道的解码,UE只有先解码到MIB,才能利用MIB中的参数去继续解码PDSCH中的数据,包括解码SIB信息。MIB消息包含的参数如图2所示。(1)dl-Bandwidth:下行带宽参数,指示当前下行链路的带宽大小。取值范围是n6(对应1.4MHz)、n15(对应3MHz)、n25(对应5MHz)、n50(对应10MHz)、n75(对应15MHz)、n100(对应20MHz),分别表示当前带宽占用的RB个数,如n6表示带宽占用6个RB。因为下行带宽大小影响了PDSCH的解码,因此必须要将下行带宽dl-Bandwidth参数放到MIB中。本字段只需要3个bit就可以完成编码。 (2)phich-Config:PHICH信道的参数,包括phich-Duration和phich-Resource这两个参数。phich-Config用于通知PHICH信道的位置。(3)systemFrameNumber:系统帧号,用于UE和网侧的10ms的帧号同步。PSS和SSS只完成子帧的同步,,UE只有成功解码了MIB,才能完成系统帧号的同步。需要注意的是: 因为帧号的范围是0~1023,需要10个bit才能完整的编码1024个数据,但本字段并不能使用10个bit,而只能传输系统帧号的高8位(MSB)。至于为什么系统帧号的低2位不能在本字段中发送,后文在讲到MIB周期发送的时候会解释。这里说明一下MIB占用的bit位个数以及原因:上述三个字段的有效信息只需要14bits(=3+3+8)就可以完成编码,考虑ASN1编码实现的时候需要字节对齐,所以MIB最低可以使用16bits的空间。但如果MIB占16bits,那么此时预留的bit位(图2中的spare字段)个数只有2个(=16-14),以后扩展的时候会很受限,所以这里协议为MIB分配了24bits的空间,预留的bit位是10bits(=24-14)。 3.2 MIB的发送周期MIB在时域上是周期发送的,调度周期固定是40ms,且所有的MIB消息都只在0号子帧发送,如下图所示。如果系统帧号SFN满足(SFN mod 4 = 0)条件,那么该系统帧的0号子帧是第一次传输(first transmission )MIB消息,同一个MIB周期内的其他3个0号子帧时刻则是重复发送(repetitions)。也就是说eNB侧的物理层是每10ms发送一次MIB的。UE只要收到任何一个0号子帧中的MIB消息,就可以独立解码,不需要等待收齐全部4个MIB块才能解码。也就是说,MIB中的SFN值,是40ms更新一次,而不是10ms更新一次,这就是为什么MIB中的SFN只有高8bit。
  • [技术干货] 【转载技术长文】算术逻辑单元
    转载于维基百科(https://zh.wikipedia.org/wiki/%E7%AE%97%E8%A1%93%E9%82%8F%E8%BC%AF%E5%96%AE%E5%85%83) 算术逻辑单元(英语:Arithmetic logic unit,简称:ALU)是一种可对二进制整数执行算术运算或位运算的组合逻辑数字电路。[1][2][3][4]ALU 与浮点数运算单元(FPU)不同,后者仅对浮点数进行操作。ALU 是许多类型的计算电路的基本部件,这些计算电路包括计算机的中央处理单元(CPU)、浮点处理单元(FPU)和图形处理单元(GPU)。单个CPU、FPU 或 GPU 可能包含多个 ALU。 ALU 的输入包括需要运算的数据(也称为运算数)和表明了运算操作类型的指令码。ALU 的输出是其执行运算的结果。在许多的设计中,ALU 还带有状态输入或输出,可将其之前操作或当前操作的信息在 ALU 和外部状态寄存器间传递。 目录 1 信号 1.1 数据 1.2 操作码 1.3 状态 1.3.1 输出 1.3.2 输入 2 电路操作 3 功能 3.1 算术运算 3.2 按位逻辑运算 3.3 移位操作 4 应用 4.1 多倍精度运算 4.2 复杂运算 5 实现 6 历史 7 参见 8 参考资料 9 延伸阅读 信号 一个 ALU 具有各种输入和输出网络,它们用于在 ALU 和外部电路之间传送数字信号。当 ALU 工作时,外部电路在 ALU 的输入端输入信号,而 ALU 将产生运算结果,并将信号通过其输出端输出至外部电路。 数据 一个基本的 ALU 具有三个并行的数据总线,包括两个输入操作数(A、B)和结果输出(Y)。每个数据总线都是一组传递了一个二进制整数的信号。通常,A、B和Y的总线宽度(每个总线包含的信号数)是相同的,并且与外部电路(例如,封装 CPU 或其他处理器)的原生字长相同。 操作码 操作码通过并行总线输入,它向 ALU 传递选择的操作的信息,该操作选择码是对 ALU 要执行的算术或逻辑运算的枚举。操作码的长度(其总线宽度)决定了 ALU 可以执行的操作的最大数量。例如,一个4位操作码可最多为 ALU 指定不同的 16 个操作(16=24)。通常,ALU 的操作码与机器语言的操作码不同,尽管在某些情况下,它可以直接编码为机器语言操作码内的位字段。 状态 输出 ALU 的状态输出是各类单独的信号,补充表示了有关当前 ALU 操作结果的信息。通用 ALU 通常具有以下状态信号: Carry-out,表示由加法运算产生的进位、由减法运算产生的借位或由二进制移位运算产生的溢出位。 Zero,表示运算结果的所有位均为逻辑零。 Negative,表示算术运算结果为负。 Overflow,表示算术运算的结果溢出,超出了 Y 的数值范围。 Parity,表示输出数 Y 的奇偶校验结果,说明 Y 中的含有逻辑 1 的数量的奇偶性。 在 ALU 的操作结束后,状态输出信号通常会被存储在外部寄存器中,以使其可用于之后的 ALU 操作(例如实现多倍精度运算,或用于控制条件分支)。存储了状态输出的集合的位寄存器通常被视为一整个多位寄存器,称为“状态寄存器”或“条件代码寄存器”。 输入 状态输入使 ALU 在执行操作时可接收其他信息。通常,这是单个“低位进位”,传递了来自上一级 ALU 操作的进位。 电路操作 74181 集成电路内部的组合逻辑电路,它是一个简单的四位 ALU ALU 是组合逻辑电路。这意味着当输入变化时,其输出也将随之变化。在正常的情况下输入到 ALU 的信号是稳定的,并且当经过足够的时间(称为“传播延迟”)信号通过 ALU 中的电路传播后,ALU 操作的结果就会出现在ALU上输出。连接到 ALU 的外部电路负责确保 ALU 的输入信号在整个操作过程中是稳定的,并在对 ALU 的输出进行采样之前为信号传播预留足够的时间。 通常,外部电路通过将信号施加到其输入端来控制 ALU。外部电路往往采用顺序逻辑来控制 ALU 的运作,该操作由足够低频率的时钟信号调整,以确保 ALU 的输出在最坏情况下也有足够的时间达到稳定。 例如,在用 ALU 执行加法操作时,CPU 会将操作数(通常是从寄存器)路由到 ALU 的输入,而控制单元会同时将一个值传送至 ALU 的操作码输入,使其执行加法操作。同时,CPU 还将把 ALU 的计算结果输出路由到用于接收该结果的目标寄存器。在 CPU 等待下一个时钟期间,ALU 的输入信号需一直保持稳定,已使其通过 ALU 并到达目标寄存器。当下一个时钟到达时,目标寄存器将存储 ALU 结果,并且由于 ALU 操作已完成,因此此时可以为下一次 ALU 操作设置 ALU 输入。 功能 ALU 通常支持许多基本算术和按位逻辑函数。基本的通用 ALU 通常支持以下操作[1][2][3][4]: 算术运算 加法:将操作数 A、B 相加,并在 Y 处得到二者的和 带进位加法:将操作数 A、B、进位相加,并在 Y 处得到三者的和 减法:将操作数 A、B 相减,并在 Y 处得到二者的差。对于此功能,结转实际上是“借入”指示器。此操作也可以用来比较A和B的大小;在这种情况下,处理器可能会忽略Y输出,该处理器仅对操作产生的状态位(尤其是零和负)感兴趣。 带借位减法:借位(进位)从A中减去B(反之亦然),差值出现在Y处并结转(借入)。 二补数(取相反数):得到 A 或 B 的相反数(将 0 与 A 相减或将 0 与 B 相减),并在 Y 处得到计算结果 加 1:将 A(或 B)增加 1,并在 Y 处得到计算结果 减 1:将 A(或 B)减小 1,并在 Y 处得到计算结果 直通(Pass through):保持 A(或 B)的所有位不变,并在 Y 处得到原输入数;该操作常用于对操作数进行奇偶校验,判断是否为 0,判断是否为负数,或者为了将操作数直接加载到寄存器中。 按位逻辑运算 AND:将 A 和 B 按位进行“与”运算,并在 Y 处得到计算结果 OR:将 A 和 B 按位进行“或”运算,并在 Y 处得到计算结果 XOR:将 A 和 B 按位进行“异或”运算,并在 Y 处得到计算结果 补码:将 A(或 B)的每一位都反转,并在 Y 处得到计算结果 移位操作 8 位 ALU 的位移示例 类型 左移 右移 算术移位 Rotate left logically.svg Rotate right arithmetically.svg 逻辑移位 Rotate left logically.svg Rotate right logically.svg 循环移位 Rotate left.svg Rotate right.svg 循环移位 (带进位) Rotate left through carry.svg Rotate right through carry.svg 在不同的操作码下,ALU 的移位操作可将操作数 A(或 B)向左或向右移位,移位的结果将出现在 Y 处。简单的 ALU 通常只能将操作数移位一位,而更复杂的 ALU 使用桶形移位器,在一次操作中可移位任意的位数。在一位的移位操作中,从操作数移出的位会被转移到进位输出中。而被移位到操作数中的数位取决于移位的类型,比如: 算术移位:操作数被视为二补数整数,其高有效位是符号位,在移位时会被保留。 逻辑移位:移位时用逻辑 0 补充操作数,这适合于无符号整数。 循环移位:此时操作数被视为一个循环缓冲区,因此在移位时,其最低和最高位就像是相邻的。 循环移位(带进位):进位输入(C)和操作数被视为整个操作数的循环移位。 应用 多倍精度运算 在整数算术计算中,多倍精度运算(Multiple-precision arithmetic)是对字长大于 ALU 字长的整数进行运算的操作。为此,该算法将每个操作数视为多个 ALU 能够处理的操作数片段的集合(并从最高位(MSB)到最低位(LSB)排列,或相反)。例如,在使用 8 位 ALU 的情况下,将 24 位整数0x123456视为如下三个8位片段的集合:0x12(高位)、0x34、0x56(低位)。由于片段的大小与该 ALU 字长完全匹配,因此可以直接对这几个数进行操作。 该算法使用 ALU 直接对特定的操作数片段进行运算,从而生成多精度结果的相应片段。在操作数的每个片段被计算后,结果都将被保存到对应的位置。对所有操作数片段重复此过程,将这些结果进行拼合,即可得到完整的运算结果。 对于算术运算(如加法和减法),该算法首先对操作数的最低位片段进行运算,从而生成最低位对应的结果和进位。随后将该结果储存至某个指定的位置,而处理器通常会存储 ALU 状态输出中的进位。然后,该算法继续计算每个操作数片段集合的下一个片段,并对这些片段调用 ALU 操作,并将先前 ALU 操作的进位一起输入,从而产生另一个更高位的片段和进位。重复此过程,直到处理完所有操作数片段为止,从而在存储位置中得到完整的运算结果。 对于移位运算,操作数片段处理的顺序取决于移位方向。在左移操作中,首先对最低位片段进行处理,因为必须用低位片段左移的溢出位来得到该运算的最低位。类似地,在右移操作中应首先对操作数的最高位进行处理。 对于按位逻辑运算(如逻辑与、逻辑或操作)中,可以按任何任意顺序处理操作数片段,因为计算结果的每个片段仅取决于相应的操作数片段(来自先前 ALU 操作的进位将被忽略)。 复杂运算 尽管可以将ALU设计于执行复杂的功能,但在许多情况下,由此导致的更高的电路复杂性,成本,功耗和更大的尺寸使其不切实际。因此,ALU通常限于可以以非常高的速度(传播延迟更短)执行的简单功能,而为了执行复杂的运算,外部处理器电路则需要将一系列简单的ALU操作进行编排。 例如,在ALU的复杂程度不同的情况下,可以通过多种方式来计算数字的平方根: 单周期计算:如果一个ALU设计得足够复杂,那它可能可在一次操作中得到计算结果。 计算流水线:可以让一组结构不那么复杂的 ALU 逐步地完成平方根计算,计算的中间结果储存在各级 ALU 上,就像工厂的生产线一样。该电路可以在完成之前的操作数前接受新的操作数,并得到与复杂的 ALU 一样快的结果,尽管结果过程会因各级 ALU 的延迟而存在延迟。有关更多信息,请参见指令流水线。 迭代计算:可让 ALU 在控制单元的控制下经由多步计算平方根,这使其结构更加简单。 上面的实现从最快和最昂贵的到最慢和最便宜的过渡,在这几种情况下都可完成平方根的计算,但是结构更加简单的 ALU 的计算时间往往更长,因为需要执行多步操作。 实现 ALU 通常是一个独立的集成电路(如 74181 芯片),也可能是一个更加复杂的 IC 的一部分。在后一种情况下,ALU 一般由VHDL、Verilog或其他硬件描述语言编写,并通过综合该代码来实例化其电路。例如,以下 VHDL 代码描述了一个功能非常简单的8位ALU: entity alu is port ( -- 该 ALU 对外部电路的接口 A : in signed(7 downto 0); -- 操作数 A B : in signed(7 downto 0); -- 操作数 B OP : in unsigned(2 downto 0); -- 运算指令 Y : out signed(7 downto 0)); -- 运算结果 end alu; architecture behavioral of alu is begin case OP is -- 解码运算指令并执行计算操作 when "000" => Y = A + B; -- 加法 when "001" => Y = A - B; -- 减法 when "010" => Y = A - 1; -- 减1 when "011" => Y = A + 1; -- 加1 when "100" => Y = not A; -- 求补 when "101" => Y = A and B; -- 位与 when "110" => Y = A or B; -- 位或 when "111" => Y = A xor B; -- 位异或 when others => Y = (others => 'X'); end case; end behavioral; 历史 冯·诺伊曼在1945年的一份关于新型计算机EDVAC的基础的报告中提出了 ALU 的概念。[5] 在整个信息时代的初期,电子电路的成本,尺寸和功耗都相对较高。因此,尽管所有串行计算机和许多早期计算机(例如 PDP-8)都具有一个简单的 ALU,但它一次只能处理一个数据位,而程序员们使用更长的字长。最早的具有多个分立单位 ALU 电路的计算机是1948年的 Whirlwind I,它使用了16个这样的“数学单元”,以使其能够对16位数据进行操作。 1967年,仙童半导体推出了第一款用集成电路实现的 ALU,名为 Fairchild 3800,由一个带累加器的八位 ALU 构成[6]。随后,其他集成电路 ALU 也相继出现,包括4位 ALU,如 Am2901 和 74181。这些设备通常具有“位片”功能,这意味着它们可以输出“超前进位”的信号,从而有助于使用多个 ALU 芯片相互连接以构成字长更宽的 ALU。这些设备迅速流行起来,并广泛用于位片微型计算机。 1970年代初,微处理器开始出现。虽然晶体管变得越来越小,但裸晶的尺寸并不足以放下全字宽的 ALU。因此,一些早期的微处理器采用了位数更少的 ALU,每条指令因而需要多个周期来执行。比如当时流行的Zilog Z80,它使用4位 ALU 执行8位加法运算。[7]后来,正如摩尔定律预测的那样,晶体管的尺寸进一步缩小,在微处理器上构建更宽的 ALU 从而也变得可行。 现代的集成电路中晶体管的尺寸比早期微处理器的小几个数量级,从而可以配备高度复杂的 ALU。如今,许多现代ALU的字宽更宽,体系结构的提升(如使用了桶形移位器和二进制乘法器)能使它们能够在单个时钟周期内执行需要早期 ALU 进行多次运算才能完成的操作。
总条数:248 到第
上滑加载中