• MathWorks 入选 2021 年 Gartner《数据科学和机器学习平台魔力象限》并荣膺领导者称号

    中国 北京,2021 年 3 月 25 日 —— MathWorks 今天宣布,公司连续第二年在 Gartner《数据科学和机器学习平台魔力象限》报告中被评为领导者。根据 Gartner 对公司愿景完整性和执行能力的评估,MathWorks 被评为 2021 年度领导者。 MathWorks 首席战略师 Jim Tung 表示:“随着 MathWorks 连续两年被评为领导者,我们相信,我们的产品得到了进一步认可,能够为用户提供应对 AI 挑战的全方位平台。MathWorks 凭借其深厚经验和不懈钻研,为加快技术创新提供一系列软件和服务,帮助工程师和科学家构建更完善的 AI 数据集、集成社区 AI 模型,并在系统级环境内快速迭代和持续测试 AI 模型。” 借助 MATLAB 科学计算平台,企业和机构可以: · 让 AI 惠及整个团队,成员无需具备 AI 或数据科学方面的专业技能或丰富经验,也能顺利应用 AI · 将 AI 整合到系统设计工作流的各个环节,涵盖数据准备、分析与建模、仿真与测试以及生产 · 将 AI 模型部署到嵌入式设备、边缘、企业系统和云 · 使用建模和仿真来处理集成问题、验证有效性,并降低 AI 驱动系统开发过程中的风险 Gartner 免责声明: Gartner 不为其研究出版物中出现的任何供应商、产品或服务提供担保,也并非建议技术用户只选择那些获得最高评级或荣誉的供应商。Gartner 研究出版物包含 Gartner 研究机构的观点,但不应被理解为对事实的陈述。Gartner 对本研究不作任何明示或暗示的保证,包括对适销性或特定目的适用性的保证。

    MathWorks MathWorks 数据科学 机器学习

  • RTOS操作系统中HOOK函数的用途

    作者 | strongerHuang 微信公众号 | 嵌入式专栏 在很多操作系统中,都存在这样一类API(函数接口):HOOK函数,也叫钩子函数。 比如:Windows桌面系统、µC/OS、 FreeRTOS等RTOS中,都可以看见HOOK函数的存在。 下面结合µC/OS来讲讲什么是HOOK函数,它的用途是什么。 嵌入式专栏 1 什么是HOOK函数? HOOK函数,也叫钩子函数,是一种会被操作系统内部的回调的函数。 如果使能了HOOK,操作系统就会在特定的事件到来之际,调用对应Hook函数(回调函数,也是你写的hook应用程序)。 比如:在RTOS中删除了一个Task,就会调用对应的App_TaskIdleHook函数。(这个“App_TaskIdleHook”是需要你自己写的函数) 网上搜索大多已windows为例,描述钩子函数的作用、例子,比如百度百科: 钩子函数是Windows消息处理机制的一部分,通过设置“钩子”,应用程序可以在系统级对所有消息、事件进行过滤,访问在正常情况下无法访问的消息。钩子的本质是一段用以处理系统消息的程序,通过系统调用,把它挂入系统。 为什么叫“钩子”? 网上有很多说法,比如:被操作系统“钩”住了。感兴趣的读者可以上网了解。 嵌入式专栏 2 HOOK函数的用途和用法 我们熟悉的µC/OS、 FreeRTOS等RTOS实时操作系统中都有Hook函数,在config配置文件中使能对应的开关即可使用。 下面结合µC/OS来讲讲HOOK函数的用途和用法: 1.配置HOOK 在很多RTOS中都有一个(或多个)配置文件,来配置(裁剪)系统。 比如在µC/OS中,就有os_cfg.h系统配置文件。其实就是一些使能开关,需要的功能开启,不需要的关系,以达到裁剪系统的作用。 /* ---------------------- MISCELLANEOUS ----------------------- */#define OS_APP_HOOKS_EN 1 /* Application-defined hooks are called from the uC/OS-II hooks */#define OS_ARG_CHK_EN 0 /* Enable (1) or Disable (0) argument checking */#define OS_CPU_HOOKS_EN 1 /* uC/OS-II hooks are found in the processor port files */ #define OS_DEBUG_EN 1 /* Enable(1) debug variables */ 同样,HOOK函数也是通过cfg配置文件进行使能,比如: #define OS_APP_HOOKS_EN 1#define OS_CPU_HOOKS_EN 1 0:关闭; 1:开启; 同理,在FreeRTOS中一样也有类似配置: 我们开启需要使用HOOK即可。 2.使用TaskIdleHook TaskIdleHook,即任务空闲钩子函数,在任务空闲的时候,会调用该钩子函数。 这个钩子函数,在很多操作系统中都有,在任务空闲(其他所有任务都挂起)的时候,会调用该Hook函数。 比如:我们所说的CPU利用率,就是在空闲任务中进行统计的,拿µC/OS来说: void OS_TaskIdle (void *p_arg){#if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */ OS_CPU_SR cpu_sr = 0u;#endif p_arg = p_arg; /* Prevent compiler warning for not using 'p_arg' */ for (;;) { OS_ENTER_CRITICAL(); OSIdleCtr++; OS_EXIT_CRITICAL(); OSTaskIdleHook(); /* Call user definable HOOK */ }} 系统空闲钩子函数OSTaskIdleHook: #if OS_CPU_HOOKS_EN > 0uvoid OSTaskIdleHook (void){#if OS_APP_HOOKS_EN > 0u App_TaskIdleHook();#endif}#endif 应用空闲钩子函数App_TaskIdleHook: 如果使能了怎会执行该函数,需要我们自己实现,比如:空闲统计数值超过50次,我们打印一段信息: void App_TaskIdleHook (void){ UserIdleCtr++; //¿ÕÏмÆÊý if(50 < UserIdleCtr) { UserIdleCtr = 0; printf("SYS_IDLE"); }} 看到这里,大家明白了HOOK函数原来了吗?从系统内部一步一步分析,其实很简单。 因为操作系统大多数时候都处于空闲状态,IDLE空闲函数会比较频繁执行,可能很多人怎么理解。 HOOK函数就上面说的,会在特定的事件到来之际,被回调执行,IDLE空闲任务比较频繁,像 删除Task任务 这种事件就很少,该类HOOK 函数就很少产生。 好了,大家明白了吗? 若不明白,欢迎大家留言! 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    strongerHuang 操作系统 RTOS HOOK

  • UART的Rx和Tx引脚如何互换,电平如何反转

    转自 | AI电堂 今天给大家分享 关于STM32中UART的一些特性 ,主要针对较新系列STM32(如:STM32H7、G0、G4等 ) 的UART,可通过软件改变Rx和Tx引脚、电平反转、高低反序、介绍超时等。 嵌入式专栏 1 支持RXD和TXD管脚互换 有些时候,我们在外接RS232芯片时,可能会将RXD和TXD两根线接反。这类低级错误,一般是老司机才会犯。 如果大家知道USART的TXD和RXD管脚可以互换,那么在连接外设RS232芯片时,如果发生错误,就不必再修改硬件,只需直接在软件中将RXD和TXD的管脚反转过来即可修正错误。 参考上图,设置SWAP位,即可将RXD和TXD管脚互换。 嵌入式专栏 2 支持接收和发送的电平极性反转 第二个新特性: Tx和Rx 电平极性反转。 通常默认串口电平是高电平为逻辑1,低电平为逻辑0。而在STM32的USART新特性中是可以将高电平设置为逻辑0,低电平设置为逻辑1的。 这一特性,让我们在一些特殊的场景下灵活使用,如:USART外接了反相器时就可以直接使用。 在数据接收发送寄存器中,数据也是可以反转的,原来的0变为1,原来的1变为0,这和电平极性反转是类似。需要特别注意的是,在极性反转的时候,起始位和结束位也都反转了,所有的信号电平都反转;而在数据寄存器中只反转了数据位,其中也包含了校验位,没有反转信号的起始位和结束位的极性。 参考上图,在USART_CR2寄存器中TXINV、RXINV和DATAINV位来进行设置。 嵌入式专栏 3 支持数据高位与低位反序发送或接收 第三个新特性: 发送和接收数据时,可在寄存器中设置是先发低位还是先发高位 。 默认的配置都是先发送或接收低位的信号(bit 0),实际应用中,通过USART_CR2中的MSBFIRST设置后,也可以让USART先发送或接收高位信号(bit 7/8),这一点在对数据进行反序的时候会经常用到它。 我们可以考虑这种情况,如果需要把串口接收到的数据先进行反序操作之后,再进行计算,那这个硬件的功能就可以帮助我们节省很多软件的工作量。 嵌入式专栏 4 USART支持DMA传输 最后, STM32的USART都是支持DMA 的,这一点有利于做数据的连续发送和数据的缓冲接收。 在某些STM32产品系列中,如STM32F4和H7系列具有专门的串口FIFO,这就可以用来做串口唤醒,先让MCU进入到Sleep模式,当接收到一个完整的数据包,这个数据包可能是100个字节或者200个字节,之后再唤醒单片机,这样既可以做到不丢数据又可以降低MCU的唤醒频率。 另外,USART的接收还具有超时功能,可以人为设定一个时间,在USART的RTOR寄存器中进行设置,当串口接收的数据帧之间超过了这个设定值,就会引发一个超时中断,串口中会有一个叫RTOF的标志位来显示发生的超时事件,我们通过这个中断中应用的代码就可以知道串口的数据发生了中断现象,近似可认为对方的数据已经发送完成。这种方式,在串口上层协议的开发中,有很多应用场景。 USART 新特性小结 支持RXD和TXD管脚的互换 支持管脚上的电平逻辑反转和数据寄存器中的逻辑反转 支持数据高位与低位反序发送或接收,既可以先发送或接收低位,也可以先发送或接收高位 支持接收数据的超时功能,并且每个USART都可以支持DMA传输 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    strongerHuang STM32 UART

  • Achronix宣布其Speedcore eFPGA IP核出货量超千万个

    中国深圳市,2021年3月 — Achronix日前宣布:其Speedcore嵌入式FPGA(eFPGA)硅知识产权(IP)内核的出货量已经超过1000万个,这些eFPGA IP产品搭载于多家客户的不同ASIC中。Achronix是唯一同时提供高性能独立FPGA芯片和eFPGA IP的高端FPGA供应商。 Speedcore eFPGA IP已针对5G无线基础设施、网络设备、计算性存储和汽车驾驶员辅助系统等应用进行了优化。 Achronix Speedcore eFPGA IP使客户公司能够将FPGA功能集成到其ASIC或SoC器件中。 Speedcore eFPGA具有可变换的架构,它可让客户根据需求去定义eFPGA IP的FPGA逻辑阵列、存储器和DSP处理能力。与独立FPGA芯片解决方案相比,eFPGA可以将器件成本降低90%,功耗降低75%,同时将接口带宽提高10倍,并将延迟降低100倍。通过将灵活的eFPGA IP内核嵌入到ASIC设计中,可延长产品生命周期,快速开发产品的更新版本,并给ASIC带来了灵活的、可修改的功能以支持不断变化的算法。 Achronix销售与市场营销副总裁Steve Mensor表示:“Speedcore eFPGA IP已经在需要集成灵活性并支持新兴AI工作负载的高性能数据加速应用中得到广泛的采用,搭载该eFPGA IP核的芯片产品的交付量已经超过1000万颗,这表明了eFPGA IP技术的快速增长以及Achronix的Speedcore eFPGA IP解决方案的高质量。” 客户在其芯片开发过程中可采用类似于标准ASIC IP模块的设计过程来引入Speedcore eFPGA IP。Achronix已优化了支持客户的开发流程,以快速交付eFPGA设计文件,并可以帮助客户去选择ASIC设计公司,以进一步加快ASIC交付。Speedcore eFPGA IP设计人员使用与独立FPGA器件设计相同的Achronix ACE设计工具,从而缩短了上市时间,并支持使用独立Speedster7t FPGA器件进行早期原型开发。 2021年1月,Achronix与ACE Convergence Acquisition Corp.(纳斯达克股票代码:ACEV)达成了最终合并协议,使得Achronix在纳斯达克上市,预计该交易将于2021年上半年完成。 产品供货情况 目前,Speedcore eFPGA IP已可以用在台积电(TSMC)的多个制程中,包括16FFC、12FFC、N7以及N5等。Achronix还可以根据客户要求,将Speedcore eFPGA移植到其他工艺节点上。

    Achronix半导体 FPGA IP Achronix

  • MCU内核版本、厂商及型号的识别

    之前21ic家曾发过《GD32也开始假货泛滥了》一文,也曾转发过黄工撰写的辨别方法《如何识别STM32/GD32是否为翻新假货?》,不过最近类似的问题又出现在了21ic论坛。 一位网友在21ic论坛提出疑问表示:“我用的STM32F103VBT6原本是在嘉立创买的,但没办法现在太贵了,而且还没货,就想在天猫上买,找到一个39元的,但听说淘宝上假货或拆机的旧货很多,请教如何识别是不是假货? 假的是不是用GD这类假冒?但GD的如果我直接用原来ST的程序应该是不能直接用的,它们的外设初等始化程序是不一样的,是不是还有连外设初等始化程序都仿造成一样的?拆机的旧货就更难识别了,请老鸟们教教我,在天猫上能买到真货吗?” 热心网友解答表示:“说真的,这款芯片一年前是9块多,现在天猫上各种价都有,39元是贵还是便宜真不知道,至于丝印很难看出吧。现在激光打印机那么便宜,谁都可以激光打印,封装管脚不一样的话直接就不能用了,性能不稳定这个最难判别,我现在用的就遇到一些无法下载程序的,也找不到原因,但都是在嘉立创买的啊。” 网友玄德则为该网友支了一招——所谓“假货”,其实都是拆机件。厂家说“原装正品”,这话不算错,因为没人能假冒。多数商家不会在网页上明说这是别人用过的,需要你在聊天里问。能假冒出来,说明能力已经媲美ST公司了,何必再干假冒的活?他认为应该这样辨别假货: 1、看单个芯片,咱们一般人是辨别不出来的。拆机件似乎都是散着装的,新货似乎是带装。——好像是这样,我不敢打包票。 2、你用旺旺问商家,是全新还是拆机,商家一般会实话实说,因为价钱摆着呢,没必要骗人。有大把人能够接受拆机,不必要骗你一个。 3、如果想压低成本,拆机件照样可以用。寿命完全可以应对用户需要。 其中也有一位大佬也表示,可以使用ID来识别MCU的各种信息,他所举例的是AT32系列,其他系列也可以参考这种方法来鉴别: 前言 本应用笔记介绍了在AT32微控制器上如何实现当前使用内核版本、MCU厂商及型号的识别。 支持型号 AT32F403xx AT32F413xx AT32F415xx AT32F403Axx AT32F407xx 功能实现 识别内核版 本所有的MCU内部都包含一颗内核(CPU),数据处理等操作都由它来完成。各MCU厂商在设计MCU的时候会根据使用场景等不同来选择不同的内核版本满足需求。该部分就是提供一种方法自动识别MCU的内核版本。 通常本应用设计到的MCU使用的内核情况如表一所示: 表1 MCU 使用的内核情况 内核的系统控制块(SCB)中存在一个名为CPU ID基本寄存器的寄存器,它是只读的,其中包括处理器类型和版本号,即为表1所示的CPU ID(内核版本号)。该寄存器的地址为0XE000ED00(只支持特权访问),在程序中,可以利用SCB->CPUID访问该寄存器,也可通过绝对地址访问,如*(uint32_t *)0xE000ED00。本指南的配套程序就是通过这种方式获取到内核版本号并判断出MCU所使用的内核版本。 注:如需增加其他内核版本的识别,自行添加即可。 识别MCU厂商 识别AT32 MCU AT32 MCU内部包含PID和UID编码。UID总共为96bit,基地址为0x1FFFF7E8。这里只需要最高地址的一个Byte的数据,则地址为0x1FFFF7F3,该地址中的内容可以识别AT32系列MCU为403系列还是413系列。得到UID后还需要获取PID以得到MCU的其他信息(例如封装、内部FLASH大小,SRAM大小等)从而达到区分的情况,PID的基地址为0xE0042000。本指南配套的程序中将获取到的信息组装成一个64bit的数据,它可以区分出是AT32系列下的哪一种型号,但是程序中只是判断是否为AT32的MCU系列,并没有做其它的细分判断。 AT32系列MCU的PID/UID以及型号的对照表详见附录文档中的表2(点击阅读原文内下载) .................................................................................... .................................................................................... 配套程序通过对表2进行遍历查找,判断当前MCU是否为AT32系列。 注:表格2中所列为AT32系列MCU的F403、F413、F415、F403A和F407,若需支持更多型号的MCU,添加到程序内的数组表中即可。 识别SXX32 MCU 配套程序支持对SXX32系列MCU的简易识别,通过读取SXX32 MCU的PID便可识别是否为SXX32系列的MCU。配套程序支持对SXX32系列MCU的SXX32F1XXX和SXX32F4XXX系列的识别。 SXX32 MCU识别码如表三所示: 表3 SXX 32 MCU 型号表 配套程序只支持对SXX32的简易识别,并且SXX32编码方式与AT32不同,但是其PID的存放地址是与AT32是相同的。程序中对表3进行遍历查找,如果找到则返回。 注:本应用指南主要为识别AT32系列MCU,若需对更多SXX32或其他MCU厂商的MCU识别支持,自行添加即可。 功能演示 AT32 MCU被识别实验: 步骤:①下载程序到AT32 MCU中并运行;②查看打印值,如图1; 图1 识别 AT32 F403A MCU 实验 从打印结果可知目前程序运行的MCU为AT32系列的MCU且内核版本为Cortex-M4。 AT32 MCU被识别实验: 步骤:①下载程序到AT32 MCU中并运行;②查看打印值,如图2; 图 2 识别 AT 32 F407 MCU 实验 从打印结果可知目前程序运行的MCU为AT32系列的MCU且内核版本为Cortex-M4。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    嵌入式ARM MCU 内核版本

  • 嵌入式开发需要学习硬件吗?

    嵌入式开发从大类上来说,主要分为两类:1)嵌入式硬件开发;2)嵌入式软件开发。对于嵌入式硬件开发而言,硬件是必须要懂得,因为涉及到电路原理图的设计。对于嵌入式软件而言,如果细分的话,又可以分为驱动开发和软件开发。这两者都需要一定的硬件知识,所以,嵌入式开发有必要学习硬件。 1、嵌入式硬件开发 嵌入式硬件开发的工作就是根据用户需求、产品经理的要求,设计技术方案并细化技术方案,设计电路原理。这个过程包括技术方案的提出、技术方案的评审、硬件芯片/元器件的选型、技术方案原理的实施等。毫无疑问,硬件开发必须要懂硬件,而且是精通。 2、嵌入式驱动开发 这个职位在大公司里是有的,在小公司可能就取消了。这个岗位的工作职责就是编写驱动程序。什么是驱动程序,就是介于硬件和软件之间、将硬件接口形成软件指令/代码。方便程序员去调用,这样就避免了程序员直接去理解硬件原理,只需要调用相应的驱动接口即可。如下图,要让继电器动作,单片机必须输出高电平,驱动开发就是将该过程形成一个接口:JDQ_ON;JDQ_OFF,程序员在驱动继电器时,直接调用JDQ_ON或者JDQ_OFF,就可以了,从而忽略了硬件。 这个职位是为软件开发服务的,要熟悉硬件接口,知道硬件的工作过程,并形成可调用的代码。所以,必须要懂硬件。 3、嵌入式软件开发 该职位,其实已经是程序员的范畴,但是与上位机程序员、网站程序员相比,该职位还是偏硬的,因为该职位是对硬件编程,所面对的平台是工控板,是单片机、ARM、DSP等,只不过,所用的硬件接口都被驱动开发者做好了,控制硬件时只需要调用驱动接口就可。在小公司,驱动开发和软件开发是放在一起的,甚至在更小的公司硬件设计、驱动设计、软件设计都是一个人在做,软硬通吃。所以,嵌入式软件开发还是要懂一些硬件。 所以,对于硬件而言,即使你是软件开发者,也要懂一点硬件,可以不会设计电路,但是一定要能看懂电路。应为驱动开发者,如果犯一点小错误可能就导致软件开发者调试好久,如果懂硬件的话,可能就能及早地发现问题所在。所以,即使是嵌入式软件开发者,也要懂一定地硬件。

    嵌入式ARM 嵌入式 硬件

  • Keil MDK 又更新了什么:一文看懂

    作者 | strongerHuang 微信公众号 | 嵌入式专栏 打开Keil官网,可以非常容易就看到一个更新提示: 是的,Keil MDK更新到了V5.34版本,但这次更新内容不多,绝大部分功能和原来V5.33差不多。 目前我已经下载、安装并体验了一下: 嵌入式专栏 1 ARM编译器 AC5(Arm Compiler 5)编译器没变,继续使用V5.06u7; AC6编译器升级至V6.16。 Keil MDK上一版本(V5.33)使用编译器AC5版本一样,AC6版本为V6.15。 当然,可以自己下载安装不同版本的编译器,请参看文章:手把手教你升级Keil MDK的ARM编译器 嵌入式专栏 2 补充和更正内容 这个版本补充和更正了一点内容: 1.补充了关于AC6生成源浏览器信息 基于AC6生成源浏览器信息的更新全局可配置,还可以通过菜单或快捷键手动触发更新。 这里推荐阅读文章:Keil MDK使用编译器AC5与AC6生成浏览信息的差异 2.更正编辑器无法显示俄语或日语编码字符 编辑控件 Scintilla 更新到了V4.4.6 嵌入式专栏 3 软件包和中间件 这部分内容和上一版本一样: 这里推荐阅读:Cortex-M软件接口标准CMSIS有哪些重要内容 嵌入式专栏 4 其他 这次更新的不多,一些小更新: 1.新唐NU-Link调试驱动程序更新为V3.05.7174 2.系统要求 Keil目前只支持Windows,不支持Mac、Linux操作系统: 3.下载 我已经通过迅雷下载之后有镜像,建议大家使用迅雷下载。当然,也可以在我后台回复“Keil”获取网盘下载链接。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    strongerHuang 更新 Keil MDK

  • 一文带你彻底了解电子灌封(灌胶)工艺技术

    来源 | 芯片之家 一、什么是灌封? 灌封(灌胶)就是将聚氨酯灌封胶、有机硅灌封胶、环氧树脂灌封胶用设备或手工方式灌入装有电子元件、线路的器件内,在常温或加热条件下固化成为性能优异的热固性高分子绝缘材料,从而达到粘接、密封、灌封和涂敷保护的目的。 二、灌封的主要作用? 灌封的主要作用是: 1)强化电子器件的整体性,提高对外来冲击、震动的抵抗力; 2)提高内部元件与线路间的绝缘性,有利于器件小型化、轻量化; 3)避免元件、线路的直接暴露,改善器件的防水、防尘、防潮性能; 5)传热导热; 三、3种灌封胶的优缺点? 1)环氧树脂灌封胶 环氧树脂灌封胶多为硬性,固化后和石头差不多硬,很难拆掉,具有良好的保密功能,但也有少部分为软性。普通的耐温在100℃左右,加温固化的耐温在150℃左右,也有耐温在300℃以上的。有固定、绝缘、防水、防油、防尘、防盗密、耐腐蚀、耐老化、耐冷热冲击等特性。常见的有环氧灌封胶有:阻燃型、导热型、低粘度型、耐高温型等。 优点:对硬质材料粘接力好,具有优秀的耐高温性能和电气绝缘能力,操作简单,固化前后都非常稳定,对多种金属底材和多孔底材都有优秀的附着力。 缺点:抗冷热变化能力弱,受到冷热冲击后容易产生裂缝,导致水汽从裂缝中渗入到电子元器件内,防潮能力差。并且固化后为胶体硬度较高且较脆,容易拉伤电子元器件,灌封后无法打开,修复性不好。 适用范围:环氧树脂灌封胶容易渗透进产品的间隙中,适合灌封常温条件下且对环境力学性能没有特殊要求的中小型电子元器件,如汽车、摩托车点火器,LED驱动电源、传感器、环型变压器、电容器、触发器、LED防水灯、电路板的保密、绝缘、防潮(水)灌封。 2)有机硅灌封胶 有机硅电子灌封胶固化后多为软性、有弹性可以修复,简称软胶,粘接力较差。其颜色一般都可以根据需要任意调整,或透明或非透明或有颜色。双组份有机硅灌封胶是最为常见的,这类胶包括缩合型的和加成性剂的两类。一般缩合型的对元器件和灌封腔体的附着力较差,固化过程中会产生挥发性低分子物质,固化后有较明显收缩率;加成型的(又称硅凝胶)收缩率极小、固化过程中不会产生挥发性低分子物质,可以加热快速固化。 优点:抗老化能力强、耐候性好、抗冲击能力优秀;具有优秀的抗冷热变化能力和导热性能,可在宽广的工作温度范围内使用,能在-60℃~200℃温度范围内保持弹性,不开裂,可长期在250℃使用,加温固化型耐温更高,具有优异的电气性能和绝缘能力,绝缘性能较环氧树脂好,可耐压10000V以上。灌封后有效提高内部元件以及线路之间的绝缘,提高电子元器件的使用稳定性;对电子元器件无任何腐蚀性而且固化反应中不产生任何副产物;具有优秀的返修能力,可快捷方便的将密封后的元器件取出修理和更换;具有优秀的导热性能和阻燃能力,有效提高电子元器件的散热能力和安全系数;粘度低,具有良好的流动性,能够渗入到细小的空隙和元器件下面;可室温固化也可加温固化,自排泡性好,使用更方便;固化收缩率小,具有优异的防水性能和抗震能力。 缺点:价格高,附着力差。 适用范围:适合灌封各种在恶劣环境下工作的电子元器件。 有机硅电子灌封胶相比其他灌封胶有什么优势? 优势1:对敏感电路或者电子元器件进行长期的保护,对电子模块和装置,无论是简单的还是复杂的结构和形状都可以提供长期有效的保护。 优势2:具有稳定的介电绝缘性能,是防止环境污染的有效屏障,固化后形成柔软的弹性体在较大的温度和湿度范围内消除冲击和震动所产生的应力。 优势3:能够在各种工作环境下保持原有的物理和电学性能,能够抵抗臭氧和紫外线的降解,具有良好的化学稳定性。 优势4:灌封后易于清理拆除,以便对电子元器件进行修复,并且在修复的部位重新注入新的灌封胶。 3)聚氨脂灌封胶 聚氨酯灌封胶又称PU灌封胶,固化后多为软性、有弹性可以修复,简称软胶,粘接性介于环氧与有机硅之间,耐温一般,一般不超过100℃,灌封后出现汽泡比较多,灌封条件一定要在真空下,粘接性介于环氧与有机硅之间。 优点:耐低温性能好,防震性能是三种之中最好的。具有硬度低、强度适中、 弹性好、 耐水、 防霉菌、 防震和透明等特性, 有优良的电绝缘性和难燃性,对电器元件无腐蚀,,对钢、铝、铜、锡等金属, 以及橡胶、塑料、木质等材料有较好的粘接性。 缺点:耐高温性能较差,固化后胶体表面不平滑且韧性较差,抗老化能力和抗紫外线都很弱、胶体容易变色。 适用范围:适合灌封发热量不高的室内电器元件,可使安装和调试好的电子元件与电路不受震动、腐蚀、潮湿和灰尘等的影响,是电子、电器零件防湿、防腐蚀处理的理想灌封材料。 四、选用灌封材料时应考虑的问题? 1)灌封后性能的要求:使用温度、冷热交变情况、元器件承受内应力情况、户外使用还是户内使用、受力状况、是否要求阻燃和导热、颜色要求等; 2)灌封工艺:手动或自动,室温或加温,完全固化时间、混合后胶的凝固时间等; 3)成本:灌封材料的比重差别很大,我们一定要看灌封后的实际成本,而不要简单的看材料的售价。 用于灌封的胶粘剂按照功能分类有导热灌封胶、粘接灌封胶、防水灌封胶;按照材料分类有聚氨酯灌封胶、有机硅灌封胶和环氧树脂灌封胶,对于选择软胶还是硬胶,其时两种都可以灌封、防水绝缘,如果要求耐高温导热那么建议使用有机硅软胶;如果要求耐低温、那么建议使用有聚氨酯软胶;如果没有什么要求,建议使用环氧硬胶,因为环氧硬胶比有机硅固化时间更快。 环氧树脂灌封胶的应用范围广,技术要求千差万别,品种繁多。从固化条件上分有常温固化和加热固化两类;而从剂型上分双组分和单组分两类,还有就是常温固化环氧灌封胶一般为双组分的,它的优势在于灌封后不需加热即可固化,对设备要求不高,使用方便,存在的缺陷是胶液混合物作业黏度大,浸渗性差,适用期短,且固化物的耐热性和电性能不是很高,一般多用于低压电子器件的灌封或不宜加热固化的场合使用。 五、灌封工艺 灌封产品的质量,主要与产品设计、元件选择、组装及所用灌封材料密切相关,灌封工艺也是不容忽视的因素。环氧灌封有常态和真空两种灌封工艺。 环氧树脂.胺类常温固化灌封料,一般用于低压电器,多采用常态灌封。 环氧树脂.酸酐加热固化灌封料,一般用于高压电子器件灌封,多采用真空灌封工艺。 目前常见的有手工真空灌封和机械真空灌封两种方式,而机械真空灌封又可分为A、B组分先混合脱泡后灌封和先分别脱泡后混合灌封两种情况。其操作方法有三种: 第一种:单组份电子灌封胶,直接使用,可以用抢打也可以直接灌注; 第二种:双组份缩合型电子灌封胶,固化剂2%-3%或其他比例,搅拌-抽真空脱泡-灌注; 第三种:加成型电子灌封胶,固化剂1:1、10:1; 工艺流程如下: (1)手工真空灌封工艺 (2)机械真空灌封工艺 1)计量:准确称量A组分和B组分(固化剂)。 2)混合:混合各组份; 3)脱泡:自然脱泡和真空脱泡; 4) 灌 注:应在操作时间内将胶料灌注完毕否则影响流平; 5)固化:加温或室温固化,灌封好的产品置于室温下固化,初固后可进入下道工序, 完全固化需8~24小时。夏季温度高,固化会快一些;冬季温度低,固化会慢一些。 (3)注意事项: a、被灌封产品的表面在灌封前必须加以清洁! b、注意在称量前,将 A 、B 组份分别充分搅拌均匀,使沉入底部的颜料(或填料)分散到胶液中。 c、底涂不可与胶料直接混合,应先使用底涂,待底涂干后,再用本胶料灌封。 d、胶料的固化速度与温度有一定的关系,温度低固化会慢一些。 相比之下,机械真空灌封,设备投资大,维护费用高,但在产品的一致性、可靠性等方面明显优于手工真空灌封工艺。无论何种灌封方式,都应严格遵守设定的工艺条件,否则很难得到满意的产品。 六、灌封产品常出现的问题及原因分析 (1)局部放电起始电压低,线间打火或击穿电视机、显示器输出变压器,汽车、摩托车点火器等高压电子产品,常因灌封工艺不当,工作时会出现局部放电(电弧)、线间打火或击穿现象,是因为这类产品高压线圈线径很小,一般只有0.02~0.04mm,灌封料未能完全浸透匝间,使线圈匝间存留空隙。由于空隙介电常数远小于环氧灌封料,在交变高压条件下,会产生不均匀电场,引起界面局部放电,使材料老化分解,引起绝缘破坏。 从工艺角度分析,造成线间空隙有以下两方面原因: 1)灌封时真空度不够高,间空气未能完全排除,使材料无法完全浸渗。 2)灌封前胶水或产品预热温度不够,黏度不能迅速降低,影响浸渗。 对于手工灌封或先混合脱泡后真空灌封工艺,物料混合脱泡温度高、作业时间长或超过物料适用期,以及灌封后产品未及时进入加热固化程序,都会造成物料黏度增大,影响对线圈的浸渗。先前据有关专家介绍,热固化环氧灌封材料复合物,起始温度越高,黏度越小,随时间延长,黏度增长也越迅速。因此为使物料对线圈有良好的浸渗性,操作上应注意如下几点: 1)灌封料复合物应保持在给定的温度范围内,并在适用期内使用完毕。 2)灌封前,产品要加热到规定温度,灌封完毕应及时进入加热固化程序。 3)灌封真空度要符合技术规范要求。 (2)灌封件表面缩孔、局部凹陷、开裂灌封料在加热固化过程中,会产生两种收缩,即由液态到固态相变过程中的化学收缩和降温过程中的物理收缩。进一步分析,固化过程中的化学变化收缩又有两个过程,从灌封后加热化学交联反应开始到微观网状结构初步形成阶段产生的收缩,我们称之为凝胶预固化收缩。从凝胶到完全固化阶段产生的收缩我们称之为后固化收缩。这两个过程的收缩量是不一样的。前者由液态转变成网状结构过程中,物理状态发生突变,反应基团消耗量大于后者,体积收缩量也高于后者。凝胶预固化阶段(75℃/3h)环氧基消失大于后固化阶段(110℃/3h),差热分析结果也证明这点,试样经750℃/3h处理后其固化度为53%。 若我们对灌封产品的采取一次高温固化,则固化过程中的两个阶段过于接近,凝胶预固化和后固化近乎同时完成,这不仅会引起过高的放热峰,损坏元件,还会使灌封件产生巨大的内应力,造成产品内部和外观的缺损。 为获得良好的产品,我们必须在灌封料配方设计和固化工艺制定时,重点关注灌封料的固化速度(即A、B复合物凝胶时间)与固化条件的匹配问题。 通常采用的方法是: 依照灌封料的性质、用途按不同温区分段固化的工艺。 据专家介绍,彩色电视机输出变压器灌封按不同温区分段固化规程及 产品 内部放热曲线。 在凝胶预固化温区段灌封料固化反应缓慢进行,反应热逐渐释放,物料黏度增加和体积收缩平缓进行。 此阶段物料处于流态,则体积收缩表现为液面下降,直至凝胶,可完全消除该阶段体积收缩内应力。 从凝胶预固化到后固化阶段,升温也应平缓,固化完毕,灌封件应随加热设备同步缓慢降温,多方面减少、调节 产品 内应力分布状况,可避免 产品 表面产生缩孔、凹陷甚至开裂现象。 对灌封料固化条件的制订,还要参照灌封产品内封埋元件的排布、饱满程度及产品大小、形状、单只灌封量等。对单只灌封量较大而封埋元件较少的,适当地降低凝胶预固化温度并延长时间是完全必要的。 (3)固化物表面不良或局部不固化这些现象也多与固化工艺相关。主要原因是: 1)计量或混合装置失灵、生产人员操作失误。 2)A组分长时间存放出现沉淀,用前未能充分搅拌均匀,造成树脂和固化剂实际比例失调。 3)B组分长时间敞口存放、吸湿失效。 4)高潮湿季节灌封件未及时进入固化程序,物件表面吸湿。 总之,要获得一个良好的灌封产品,灌封及固化工艺的确是一个值得高度重视的问题。 电子灌胶常见问题 1)电子灌封胶中毒不固化如何解决? 硅胶中毒一般发生在加成型电子灌封胶上,中毒后硅胶会出现不固化的现象,所以使用加成型灌封胶时应避免与含磷、硫、氮的有机化合物接触,或与加成型硅胶同时使用聚氨酯、环氧树脂、不饱和聚脂、缩合型室温硫化硅橡胶等产品,防止发生中毒不固化现象。 2)不小心粘到的电子灌封胶用什么可以清洗干净? 常用的硅胶清洗剂主要有酒精、丙酮、白酒等等,记得在用时都要稀释涂。 3)冬天电子灌封胶干不了怎么办? 由于冬天气温很低,造成电子灌封胶在混合后固化很慢甚至长时间不固化,所以我们可以提高固化的温度,可以将灌好胶的产品放在25℃烘箱里固化。 环氧树脂灌封料及其工艺和常见问题 1、在电子封装技术领域曾经出现过两次重大的变革。 第一次变革出现在20世纪70年代前半期,其特征是由针脚插入式安装技术(如DIP)过渡到四边扁平封装的表面贴装技术(如QFP);第二次转变发生在20世纪90年代中期,其标志是焊球阵列,BGA型封装的出现,与此对应的表面贴装技术与半导体集成电路技术一起跨人21世纪。随着技术的发展,出现了许多新的封装技术和封装形式,如芯片直接粘接、灌封式塑料焊球阵列(CD-PBGA)、倒装片塑料焊球阵列(Fc-PBGA)、芯片尺寸封装(CSP)以及多芯片组件(MCM)等,在这些封装中,有相当一部分使用了液体环氧材料封装技术。灌封,就是将液态环氧树脂复合物用机械或手工方式灌入装有电子元件、线路的器件内,在常温或加热条件下固化成为性能优异的热同性高分子绝缘材料。 2、产品性能要求 灌封料应满足如下基本要求:性能好,适用期长,适合大批量自动生产线作业;黏度小,浸渗性强,可充满元件和线间;在灌封和固化过程中,填充剂等粉体组分沉降小,不分层;固化放热峰低,固化收缩小;固化物电气性能和力学性能优异,耐热性好,对多种材料有良好的粘接性,吸水性和线膨胀系数小;在某些场合还要求灌封料具有难燃、耐候、导热、耐高低温交变等性能。 在具体的半导体封装中,由于材料要与芯片、基板直接接触,除满足上述要求外,还要求产品必须具有与芯片装片材料相同的纯度。在倒装芯片的灌封中,由于芯片与基板间的间隙很小,要求灌封料的黏度极低。为了减少芯片与封装材料间产生的应力,封装材料的模量不能太高。而且为了防止界面处水分渗透,封装材料与芯片、基板之间应具有很好的粘接性能。 3、灌封料的主要组份及作用 灌封料的作用是强化电子器件的整体性,提高对外来冲击、震动的抵抗力;提高内部元件、线路间绝缘,有利于器件小型化、轻量化;避免元件、线路直接暴露,改善器件的防水、防潮性能。 环氧树脂灌封料是一多组分的复合体系,树脂、固化剂、增韧剂、填充剂等组成,对于该体系的黏度、反应活性、使用期、放热量等都需要在配方、工艺、铸件尺寸结构等方面作全面的设计,做到综合平衡。 3.1 环氧树脂 环氧树脂灌封料一般采用低分子液态双酚A型环氧树脂,这种树脂黏度较小,环氧值高。常用的有E-54、E-51、E-44、E-42。在倒装芯片下填充的灌封中,由于芯片与基板之间的间隙很小,因此要求液体封装料的黏度极低。故单独使用双酚A型环氧树脂不能满足产品要求。为了降低产品黏度,达到产品性能要求,我们可以采用组合树脂:如加入黏度低的双酚F型环氧树脂、缩水甘油酯型树脂以及具有较高耐热、电绝缘性和耐候性的树脂环族环氧化物。其中,树脂环族环氧化物本身还具有活性稀释剂的作用。 3.2 固化剂 固化剂是环氧灌封料配方中的重要成分,固化物性能很大程度取决于固化剂的结构。 (1)室温固化一般采用脂肪族多元胺做固化剂,但这类固化剂毒性大、刺激性强、放热激烈,固化和使用过程易氧化。因此,需要对多元胺进行改性,如利用多冗胺胺基上的活泼氢,部分与环氧基合成为羟烷基化及部分与丙烯晴合成为氰乙基化的综合改性,可使固化剂达到低黏度、低毒、低熔点、室温固化并有一定韧性的综合改性效果。 (2)酸酐类固化剂是双组分加热固化环氧灌封料最重要的固化剂。常用的固化剂有液体甲基四氢邻苯二甲酸酐、液体甲基六氢邻苯二甲酸酐、六氢邻苯二甲 酸酐、甲基纳迪克酸酐等。这类固化剂黏度小,配合用量大,能在灌封料配方中起到固化、稀释双重作用,固化放热缓和,固化物综合性能优异。 3.3固化促进剂 双组分环氧一酸酐灌封料,一般要在140℃左右长时间加热才能固化。这样的固化条件,不仅造成能源浪费,而且多数电子器件中的元件、骨架外壳是难以承受的。配方中加入促进剂组分则可有效降低固化温度、缩短固化时间。常用的促进剂有:卞基二胺、DMP-30等叔胺类。也可使用咪唑类化合物和羧酸的金属盐,如2-乙基-4-甲基咪唑、2-甲基咪唑等。 3.4偶联剂 为了增加二氧化硅和环氧树脂之间的密着性,需加入硅烷偶联剂。偶联剂可以改善材料的粘接性和防潮性。适用于环氧树脂的常用硅烷偶联剂有缩水甘油氧、丙基三氧基硅烷(KH-560)、苯胺基甲三乙氧基硅烷、α-氯代丙基三甲氧基硅烷、α-巯基丙基三甲氧基硅烷、苯胺甲基三甲氧基硅烷、二乙烯二胺基丙基三甲氧基硅烷等。 3.5 活性稀释剂 单独使用环氧树脂,加入无机填料后黏度明显增大,不利于操作和消泡,常需加入一定量的稀释剂,以增加其流动性和渗透性,并延长使用期,稀释剂有活性和非活性之分。非活性稀释剂不参与固化反应,加入量过多,易造成产品收缩率提高,降低产品力学性能及热变形。活性稀释剂参与固化反应增加了反应物的粘性,对固化物性能影响较小。灌封料中选用的就是活性稀释剂,常用的有:正丁基缩水甘油醚、烯丙基缩水甘油醚、二乙基己基缩水甘油醚、苯基缩水甘油醚。 3.6 填充剂 灌封料中填料的加入对提高环氧树脂制品的某些物理性能和降低成本有明显的作用。它的添加不仅能降低成本,还能降低固化物的热膨胀系数、收缩率以及增加热导率。在环氧灌封料中常用的填充剂有二氧化硅、氧化铝、氮化硅、氮化硼等材料。二氧化硅又分为结晶型、熔融角型和球形二氧化硅。在电子封装用灌封料中,由于产品要求,优选熔融球形二氧化硅。 3.7 消泡剂 为了解决液体封装料固化后表面留有气泡的问题,可加入消泡剂。常用的是乳化硅油类乳化剂。 3.8 增韧剂 增韧剂在灌封料中起着重要作用,环氧树脂的增韧改性主要通过加增韧剂、增塑剂等来改进其韧性,增韧剂有活性和惰性两种,活性增韧剂能和环氧树脂一起参加反应,增加反应物的粘性,从而增加固化物的韧性。一般选择端羧剂液体丁腈橡胶,在体系内形成增韧的"海岛结构",增加材料的冲击韧度和耐热冲击性能。 3.9 其他组分 为满足灌封件特定的技术、工艺要求,还可在配方中加人其他组分。如阻燃剂可提高材料的工艺性;着色剂用以满足产品外观要求等。 4、灌封工艺 环氧树脂灌封有常态和真空两种工艺。图1为手工真空灌封工艺流程。 5、常见问题及解决方法 5.1 放电、线间打火或击穿现象 由于灌封工艺不当,器件在工作时会产生放电、线间打火或击穿现象,这是因为这类产品高压线圈线径很小(一般只有0.02mm~0.04mm),灌封料未能完全浸透匝间,造成线圈匝问存留空隙。由于空隙介电常数远小于环氧灌封料,在交变高压条件下会产生不均匀电场,引起局部放电,使材料老化分解造成绝缘破坏。从工艺角度来看,造成线间空隙有两方面原因: (1)灌封时真空度不够高,线问空气未能完全排除,使材料无法完全浸渗; (2)灌封前产品预热温度不够,灌入产品物料黏度不能迅速降低,影响浸渗。对于手工灌封或先混合脱泡后真空灌封工艺,物料混合脱泡温度高、作业时间长或超过物料适用期以及灌封后产品未及时进入加热固化程序,都会造成物料黏度增大,影响对线圈的浸渗。热同性环氧灌封材料复合物,起始温度越高黏度越小,随时间延长黏度增长也越迅速。因此,为使物料对线圈有良好的浸渗性,操作上应注意做到灌封料复合物应保持在合适的温度范围内,并在适用期内使用完毕。灌封前产品要加热到规定温度,灌封完毕应及时进入加热固化程序,灌封真空度要符合技术规范要求。 5.2 器件表面缩孔、局部凹陷、开裂 灌封料在加热固化过程中会产生两种收缩:由液态到固态相变过程中的化学收缩和降温过程中的物理收缩。固化过程中的化学变化收缩又有两个过程:从灌封后加热化学交联反应开始到微观网状结构初步形成阶段产生的收缩,称之为凝胶预固化收缩;从凝胶到完全固化阶段产生的收缩我们称之为后固化收缩。这两个过程的收缩量是不一样的,前者由液态转变成网状结构过程中物理状态发生突变,反应基团消耗量大于后者,体积收缩量也高于后者。如灌封产品采取一次高温固化,则固化过程中的两个阶段过于接近,凝胶预固化和后固化近乎同时完成,这不仅会引起过高的放热峰、损坏元件,还会使灌封件产生巨大的内应力造成产品内部和外观的缺损。为获得良好的产品,必须在灌封料配方设计和固化工艺制定时,重点关注灌封料的固化速度与固化条件的匹配问题。通常采用的方法是依照灌封料的性质、用途按不同温区分段固化。在预固化温区段灌封料固化反应缓慢进行、反应热逐渐释放,物料黏度增加和体积收缩平缓进行。此阶段物料处于流态,则体积收缩表现为液面下降直至凝固,可完全消除该阶段体积收缩内应力。从凝胶预固化到后固化阶段升温应平缓,固化完毕灌封件应随加热设备同步缓慢降温,多方面减少、调节产品内应力分布状况,可避免产品表面产生缩孔、凹陷甚至开裂现象。对灌封料固化条件的制订,还要参照灌封器件内元件的排布、饱满程度及产品大小、形状、单只灌封量等。对单只灌封量较大而封埋元件较少的,适当地降低凝胶预固化温度并延长时间是完全必要的。 5.3 固化物表面不良或局部不固化 固化物表面不良或局部不固化等现象也多与固化工艺相关。中国环氧树脂行业协会专家表示,其主要原因是计量或混合装置失灵、生产人员操作失误;A组分长时间存放出现沉淀,用前未能充分搅拌均匀,造成树脂和固化剂实际比例失调,B组分长时间敞口存放,吸湿失效;高潮湿季节灌封件未及时进入固化程序,物件表面吸湿。总之,要获得一个良好的灌封及固化工艺的确是一个值得高度重视的问题。 七、灌封胶施工工艺 2.表面处理 八、双组份灌胶工艺案例 九、PCBA灌胶的三种方法 1、半自动灌胶机 在给产品灌胶时,放在流水线旁,人工将产品放入出胶头下方,按启动开关,机器便自动灌胶,灌胶完毕自动停止。然后操作人员再将灌好胶的产品放到流水线上即可,半自动灌胶机适合于各类PCBA产品,不论大小。 2、自动灌胶机 如果都以小产品居多,灌胶方式也很简单,将产品放入一个治具中,然后将治具放到灌胶机的台面上,按一下启动,机器便开始灌胶,等所有灌胶完毕之后,自动停止,然后操作人员将治具从台面上取下,然后放上另一个装好产品的治具,按下启动,以此循环,操作人员要做的就是放治具,按启动按钮。 3、全自动灌胶线 将装有产品的治具放到传输线上,机器自动灌胶,自动送料到烤箱过炉,节省人工,高效运转。 以上就是自动灌胶的3种方法,自动灌胶设备的使用可以更好的节省人工,提高生产效率。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    strongerHuang 灌胶 电子灌封

  • 你绝对没听说过的:树莓派,居然还隐藏了这些秘密

    来源 | DF创客社区 微信公众号 | 嵌入式专栏 树莓派,相信这里很多读者都听说过,但是,又有多少人真正了解它呢? 今天的这篇文章,我们系统地看看这台非常酷的小电脑是什么,也给小伙伴们简单介绍一下你可以用它做什么。 文章涵盖了目前所有Pi的迭代版本,以及他们的特点。每个版本都略有不同,其中一个版本可能比另一个版本更适合你的需求! 树莓派的基础知识 树莓派是一台和信用卡差不多大小的小电脑。 这块板子上有一个处理器、内存和标准的硬件端口,就像大多数电脑上一样。 树莓派具有电脑的所有功能,所以可以用它做大多数台式电脑做的事情。比如文档编辑、播放高清视频、玩游戏、编程等任务。 不过,树莓派的处理能力是不如台式电脑的,但因为它便宜很多,所以它是你可以随意折腾的小电脑。如果不小心弄坏了一台,也不会花费一大笔钱去更换。 日常生活中,很多工作并不需要很高的性能电脑才能做。 这个时候,树莓派的高性价比就体现出来了,比如说运行作为一个家庭NAS(网络存储),网络服务器,媒体中心,TorrentBox等等。 操作系统 树莓派的主要操作系统是Raspbian,是基于Debian的。这是一个Linux的发行版,如果你习惯于使用Windows电脑,可能会发现它有一点不同,但我相信只要你慢慢接触了它,你一定会爱上它。 尽管主要支持的操作系统是Raspbian,但也可以安装其他操作系统。可以安装的操作系统包括Ubuntu mate、Ubuntu Core、OSMC、RISC OS、Windows 10 IoT等等。 如果正在寻找Raspberry Pi项目,可以到我们社区里去看一看,那边有很多树莓派很酷的项目。 树莓派的型号很多,我们接下来一个一个讲讲它们的特点。 树莓派A+ 树莓派 A+是Pi的低规格和成本的版本。这个版本只有一个USB端口,功耗较低,没有以太网端口,只有256MB的内存。最新版本的内存为512MB。 这个版本的Pi更适合那些不需要相当大的处理能力的项目,并且有较轻的重量和较小的尺寸。 可以用这块板子做很多事情,比如机器人、遥控飞机、遥控汽车和嵌入式项目。 举几个例子,它可以成为机器人的大脑,触摸屏汽车仪表板,运动感应相机等等。 树莓派B+和B 树莓派 B+和B是老版本的Pi,现在已经被Pi 2取代。 B+版采用单核CPU、4个USB接口、microSD卡槽,功耗更低。 这款机型在之前只有两个USB接口的B型机的基础上进行了改进,功耗更高,全尺寸SD卡槽。 现在仍然可以买到B+型号,但会慢慢地被更好的Pi版本取代。 Raspberry Pi 2 树莓派 2 是Pi的第二代产品。这个Pi和B+版本是最受欢迎的版本之一。 Pi 2是B+的换代产品,采用了900MHz四核CPU和1GB的内存。 其余规格与上一代机型保持一致。 下面列出了它的特色: 40针扩展GPIO 4x USB 2.0 端口 立体声输出和复合视频端口 HDMI接口 CSI(摄像机接口接口)和DSI(显示器串行接口)端口。 微型SD卡插槽 微型USB电源 这个版本的Pi现在已经被更强大的Pi 3和4所取代。 Raspberry Pi 3 & 3 B+ 树莓派 3 是Pi的第二个新版本,在性能和功能上胜过了第2版。这个版本提供了一些额外的功能,让Pi的使用变得更加简单。 这个版本的Pi带来了新的CPU,时钟频率为1.2Ghz,并且是64位的,但是,在Pi 3上只能安装32位的操作系统。 Pi 3还具有板载Wi-Fi(802.11n)和蓝牙4.1。同时也有更多的USB端口。这些新功能可以让我们能够做一些很酷的事情。 板子的其他部分基本保持不变。 下面列出来了新特点: 博通BCM2387芯片组 1.2GHz的64位四核ARM Cortex-A53 CPU 集成802.11n无线局域网和蓝牙4.1 现在还可以买到树莓派 3B+,它有一些轻微的升级,但没有新树莓派 4 那么多。 Raspberry Pi 4 树莓派4是树莓派家族的最新版本,是迄今为止最好的板子。它在硬件上进行了不少升级,使得它远胜于上一代产品。 这个版本带来了1.5GHZ的四核ARM Cortex-A72,比前代产品好很多。 这款Raspberry Pi的内存选择也比较多。例如,可以选择经典的1GB版本、2GB和4GB,以及更新的8GB。 更多的改进使得这块板子对发烧友和普通用户来说具有超强的吸引力。4GB使其成为非常可行的台式电脑替代品。 下面列出了树莓派 4 中所有新功能。 1.5GHz四核64位ARM Cortex-A72 CPU(约3倍性能)。 1GB、2GB、4GB或8GB LPDDR4 SDRAM。 全量千兆以太网 双频802.11ac无线网络 蓝牙5.0 两个USB 3.0和两个USB 2.0接口 支持双显示器,分辨率高达4K。 VideoCore VI图形,支持OpenGL ES 3.x。 4Kp60 HEVC视频的硬件解码方法 与早期的Raspberry Pi产品完全兼容 用树莓派当作日常的主力机体验如何?可以看看这篇文章——《拔掉MacBookPro,用8GB树莓派4工作一天,体验原来是这样的》 Raspberry Pi Zero 和 Zero W 树莓派 Zero是目前所有Pi中最小、最便宜的一款。 这块板子的售价为66元,在一个超小的板子上搭载了Pi的基本功能。 虽然这款Pi无法处理大量的处理工作,但它非常适合嵌入式项目。它也非常适合不需要大量处理能力或内存的项目,就像Pi A+一样。 下面是Zero的功能总结: 1Ghz,单核CPU 512MB内存 迷你HDMI 微型USB接口 微型USB电源 微型SD卡接口 与HAT兼容的40针头 复位头 Raspberry Pi Zero W具有无线功能,这在这么小的板子上是非常方便的,能够利用WiFi和蓝牙做一些有趣的事情。 现在还可以买到树莓派 3B+,它有一些轻微的升级,但没有新树莓派 4 那么多。 Raspberry Pi 400和Raspberry Pi Pico 当然,除了上面的经典款,树莓派基金会还推出来两款新品。 ▼ Raspberry Pi Pico ▼ Raspberry Pi 400

    strongerHuang 树莓派 Pi

  • IAP、APP程序拼接,及hex/bin格式互转

    作者 | strongerHuang 微信公众号 | 嵌入式专栏 现在很多产品都有IAP(BootLoader)和APP(应用程序),一般在量产的时候,需要把两部分程序合在一起。 一般来说,通过编程(下载)工具就能实现程序拼接,以及hex/bin格式互转。 下面结合STM32,以及对应的ST-LINK Utility、STM32CubeProg工具给大家简单描述下: IAP、APP程序拼接 hex、bin格式的互转 1 理解bin、hex、axf 想要掌握程序IAP+APP程序拼接,需要理解程序文件hex、bin文件格式内容。 用一个表格来区分bin、hex和axf三者的关系: bin hex axf 程序数据 程序数据 程序数据 地址、类型、校验等标记信息 地址、类型、校验等标记信息 调试信息 Bin文件 Bin文件就是一种没有格式的程序文件,只是包含了程序数据。 Hex文件 Hex是由Intel制定的一种十六进制标准文件格式,是由编译器转换而成的一种用于下载带处理器里面的文件。 Hex文件格式是由一行一行的十六进制数据组成,每行包含:开始、长度、数据、类型、校验和等重要信息。 axf文件 axf文件是经过编译器编译之后,包含具有程序、调试等更多信息的一种文件。 对比MDK-ARM编译后三个文件大小 Objects目录下: Demo.axf(236K) Demo.hex(4K) Bin目录下: Demo.bin(2K) 2 通过工具实现IAP+APP拼接 用于产品量产,烧录的程序文件,一般是hex,或bin文件。 不管是hex文件,还是bin文件,我们都需要通过烧录软件 + 烧录(编程)工具实现。 烧录软件针对不同MCU,一般有不同的烧录软件。 针对STM32,一般建议使用官方提供的STVP、ST-LINK Utility和STM32CubeProg 这三种编程软件。 拼接说明 拼接IAP+APP两段程序,一般简单方法就是:将两个程序分别烧录进去,再统一读取出来,保存成一个量产文件。 拼接说明 IAP 和 APP程序的起始地址是不同的,因此烧录进芯片,是存储在两片区域的。 烧录程序的时候,特别是烧录bin文件(没有地址)时,要注意设置好起始地址。hex文件有地址地址,不用自己设置地址。 读取“合并”程序的时候,同样要注意起始地址,还有读取大小,保证读取全部程序。 比如通过ST-LINK Utility读取STM32程序: 通过STM32CubeProg读取STM32程序: 再次提示: 烧录bin文件时,设置好起始地址; 读取时,设置起始地址,读取大小; 保存可选择hex,还是bin文件; 3 通过工具实现bin、hex格式转换 在某些情况下需要使用特定格式的文件,比如我们远程升级,要求通过bin文件实现。 通过上面的介绍,其实你会发现,使用编程软件ST-LINK Utility,或STM32CubeProg,就能直接另存为hex,或bin文件格式。 ST-LINK Utility另存为: STM32CubeProg另存为: 之前我有介绍在MDK-ARM中,直接转换成bin文件的文章: Keil MDK利用 fromelf 实现axf 转 bin 的方法 当然,这些方法是比较简单,也比较使用的方法。bin和hex格式文件互相转换的工具,网上有很多,感兴趣的朋友可以搜索了解一下。 ------------ END ------------

    strongerHuang 格式 APP IAP

  • 单片机到底是个什么东西?

    1 从电路到集成电路 1.1 电路发展变化的趋势 (1)功率。电子设备越来越省电,待机时间越来越长,工作电压越来越低。 (2)体积。体积越来越小。 (3)功能。功能越来越强大。 1.2 微器件的出现 (1)电路的核心:开关控制、倍率控制。 (2)电子管、晶体管等。 1.3 集成电路的出现 (1)IC(integrated circuit,集成电路),就是使用微器件为积木,去搭建具备一定功能的一个电路板。 (2)以前没有微器件的时候,必须很大一块电路板才能实现一个电路功能(譬如一个加法器,完成加法运算)。然后有了微器件之后,这个电路板的体积变小了,越来越小,最后小到mm级别甚至更小,我们就把这个电路做在一起,用塑料外壳封装起来就形成了大家看到的IC芯片。 (3)芯片(IC、集成电路)其实就是:里面馅是电路,外面的壳就是绝缘体壳,里面的电路通过外壳上引出来的一些引脚(金属材料的)来与IC外部接轨。 (4)IC有多少个引脚,每一个引脚的作用是干嘛的,是IC设计制造的时候就已经决定的,我们拿到IC使用时要去读IC的数据手册来知道这个引脚怎么用。 2 计算机的核心设备CPU CPU就是一块超大规模集成电路,CPU的本质就是电路。 2.1 CPU(Central Processing Unit,中央处理器) (1)CPU = 运算器 + 控制器 (2)CPU = ALU + cache + Bus (3)CPU = 汇编指令 + 寄存器 2.2 CPU的工作原理 (1)CPU通过总线从存储器取出指令到内部,然后译码,然后执行。 (2)一条指令包括:指令码+数据。 (3)执行指令反应为一个控制操作或者一个数学运算。 (4)给单片机编程其实就是给CPU写指令序列。 3 给单片机下个定义 3.1 计算机系统三大组成部分:CPU、内部存储器、IO (1)单片机属于计算机的一种。 (2)IO就是input/output,也就是输入输出。譬如键盘、鼠标、触摸屏等就是输入设备,而LCD显示器、声卡等就是输出设备。 3.2 单片机的结构框图分析 (1)我们来看单片机这个计算机系统的结构框图。 (2)框图中的方块是组成部件、箭头表示总线Bus。 (3)CPU处于单片机系统的核心位置,别的模块都通过总线和CPU进行关联。别的模块之间一般没有总线直接相连,有时候2个互相有关系的模块也会有总线直接相连。 (4)IO其实就是芯片上的引脚,不同的单片机型号有不同的IO数量和定义。 3.3 如何定义单片机 (1)单片机就是一台微型计算机。 (2)台式电脑或者笔记本电脑(这种计算机叫PC)也是一种计算机系统,这种计算机系统由很多个零部件组成。这些零部件由不同的厂商生产,可以去组合组装成一台电脑。 (3)单片机这台计算机的所有零件全部做在了一个IC内部,并且出厂前被塑料壳封装起来了。传统计算机中的主要部件单片机都有,都集成到内部去了。 (4)MCU的概念(参考百度百科词条:MCU),所以说大家看到:单片机、单片微型计算机、MCU、微控制器、微控制单元等,都是一个意思。 微控制单元(Microcontroller Unit;MCU) ,又称单片微型计算机(Single Chip Microcomputer )或者单片机,是把中央处理器(Central Process Unit;CPU)的频率与规格做适当缩减,并将内存(memory)、计数器(Timer)、USB、A/D转换、UART、PLC、DMA等周边接口,甚至LCD驱动电路都整合在单一芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制。诸如手机、PC外围、遥控器,至汽车电子、工业上的步进马达、机器手臂的控制等,都可见到MCU的身影 4 ROM与RAM 4.1 计算机中的2种存储器 (1)计算机要存储器干嘛 (2)内存:内存和CPU接轨比较紧密,内存可以被CPU直接访问,内存可以按照字节为单位来随机访问、程序运行时离不开内存、程序中的变量都是定义在内存中的。内存受限于物理技术和成本,容量比较小而贵;内存速度比外存快很多,CPU的速度比内存的速度快好多。 (3)外存:外存和CPU之间比较远,外存不可以被CPU直接访问,外存一般以块为单位来访问,不能以字节为单位随机访问。外存容量大而便宜,外存速度比内存慢好多。 (4)综合来说,计算机系统是这样工作的:文件和数据不用的时候就放在外存中,要用的时候从外存读取到内存,然后CPU再从内存中读取数据来直接使用。 4.2 ROM (1)read only memory,只读存储器,意思是只能读不能写。实际上世界上根本不存在真正的只能读不能写的器件,我们ROM这里的只读意思是:程序运行时只能通过程序自己本身的操作去读而不能写。 (2)常见的ROM:单片机中用来存储用户烧录的程序的器件就是ROM,烧录的过程其实就是在写ROM,但是程序运行时是不能修改ROM内容的。烧录程序一般要通过烧录器来完成。 (3)storage,存储器,含义有点像仓库存储东西。ROM就有点类似于仓库,用来存储程序代码。 (4)ROM有点像外存的概念,但是并不完全相等。主要是因为计算机系统有不同的设计方法,譬如PC机和单片机的设计就不相同。PC机中有外存没有ROM,单片机中有ROM没有外存。单片机中程序平时是存储在ROM中,运行时由ROM直接供给CPU。 4.3 RAM (1)random access memory,随机访问存储器。 (2)常见的RAM:从物理上来讲,主要分为SRAM和DRAM,单片机中一般使用的都是SRAM,嵌入式SoC中和PC机中用的都是DRAM。 (3)memory,存储器,专指的是计算机的内存。 4.4 单片机中的ROM和RAM (1)单片机中的ROM一般是Flash(闪存),有些地方会看到叫flash memory;单片机中的RAM一般都是SRAM;这两个共同构成单片机中的存储体系。 (2)ROM和RAM的协同工作方式是:ROM用来存储用户写好编译好的程序,运行时CPU直接从ROM中读取一条一条的指令来运行,指令运行过程中产生的临时数据放在RAM中。所以基本可以理解为:ROM是单片机用来放程序的,RAM是用来放数据的。 5 单片机的工作原理 5.1 主要器件负责干嘛?CPU、存储器、IO 5.2 统一的时钟节拍 (1)这里有一个概念叫:同步。同步就是好多个独立的部分按照同一个节奏步调来动,以此来实现一个配合。 (2)和同步相对的一个概念叫异步,异步就是各自干各自的。 (3)单片机的各个模块之间是同步工作的,CPU和存储器和IO和单片机中其他东西这些模块之间通过一个统一的节拍来同步工作,这个统一节拍就是单片机的时钟。 (4)这个时钟节拍对单片机很重要,单片机内部在一个时钟节拍中只能做一件事情。所以单片机要发生一些变化或者做一些事情,最小的时间单位就是1个时钟节拍。单片机的时间单位都是时钟节拍的整数倍。 (5)单片机中的CPU、存储器、IO等都是以时钟节拍为动作节拍的,所以单片机是一个同步系统。 (6)时钟周期的长度(时钟节拍的快慢)影响了单片机的速度,所以这个时钟就叫做单片机的主频。主频越高性能越高,一般PC的主频都是2G多3G多,51单片机的主频MHz级别。一般手机CPU的主频也在1G-2G左右。一般高级单片机如STM32的主频在百MHz级别。 6 外设与内部外设 6.1 什么是外设 (1)外设英文叫 peripheral ,全称为外部设备。属于单片机中的模块。 (2)单片机中除了三大部件(CPU、IO、存储器)外,还有一些别的东西,譬如串口控制器、譬如I2C控制器等····这些东西就叫外设。 (3)早期单片机功能很弱小,不具备很多功能(譬如中断功能、譬如串口通信功能),那我们用单片机做产品,只能外部扩展一些专用芯片(中断控制有中断控制器芯片,串口通信我们有串口通信芯片)来和单片机结合(做到一块电路板上用导线连接)起来工作。这种产品设计中核心部分就是单片机,外部配合的这些专用芯片就是外部设备,简称外设。 (4)后来随着半导体工业发展进化,集成电路的集成能力变强大了,我们干脆就把一些常用的外设直接集成到单片机里边去了。所以单片机里边就有了一些原来被称为外设的东西,但是叫法名称还是沿用了开始的名称。 6.2 什么叫内部外设 (1)我为了区分外设,将集成到单片机里边的外设叫做内部外设。 (2)还有外部外设,就是至今仍然没有集成到单片机内部,还在外部的那些外设。 7 单片机与电路板 7.1 什么是电路板(PCB printed circuit board,印刷电路板) (1)外观:PCB板 = 基板(绝缘)+电路。 (2)作用:PCB的作用就是骨架和连接。最终目的就是把所有的元件按照正确的电路图连接起来形成一个完整的可以工作的电路。 (3)构成和材质,常用的基板材质都是FR4(玻璃纤维),PCB板是由多层构成的(单面板、双面板、四层板、8层板、12层、16层、24层)。 (4)印刷电路其实就是在不导电的基板表面按照电路构成来印刷一层导电物质形成电路。最后形成的就是一个里面的芯是不导电的FR4,外面有一层构成了电路的铜(标准术语叫覆铜),为了避免铜氧化或者与外部导电外部还有一层油墨,刷油墨时要露出来焊接点(焊接点一般有2种:一种是插针式、一种是贴片式),焊接点上本来就是铜,但是我们为了方便焊接一般会做镀锡。 (5)PCB板其实就是硬件电路(元件和电路设计)的载体。 7.2 什么是芯片 (1)芯片就是:芯是半导体技术形成的电路,外面的壳是塑料绝缘壳,里面电路通过芯片引脚接出来用于连接外部电路。 7.3 芯片方式和电路板方式的关系 (1)相同点。芯片其实就是一个微型的电路板。这两个东西本身一模一样,早期只有电路板没有芯片,后来半导体工艺发展后有了微型器件,所以人把一些电路利用半导体工艺直接作死到一个芯片中去形成了IC。 (2)不同点。电路板体积较大,功率大;芯片体积小,功率小。 (3)我们做一个电子产品究竟应该如何去总体设计?现代的设计方案都是芯片+电路板。能做到芯片里面的都做进去(趋势是越来越进去的多),实在不能做成芯片的就只好放在外面。原来的产品,譬如老式大屁股电视机主板非常大,而新式的智能电视机主板就是一个大芯片+很少的外围设备。 (4)单片机开发板其实就是PCB板主板+单片机芯片+其他芯片+其他外围电路元器件总体构成的。这就是普遍的电子产品的结构。 8 软件与硬件的区别和联系 8.1 从产品角度 (1)硬件是?产品的载体和身体。 (2)软件是?产品的思维和灵魂、精神。 8.2 软硬结合 (1)物联网不能靠纯软件打造。 (2)纯硬件产品大部分都低端。 9 硬件工程师主要工作职责 电路图的分析和设计 原件的选择和参数确定 PCB的设计和样板焊接、调试 生产跟踪和问题解决 10 软件工程师主要工作职责 初级软件工程师:辅助测试、写代码、维护 中级软件工程师:独立工作、对产品负责、解bug 高级软件工程师:需求分析、框架设计、团队管理 软件工程师成长路线:学到基础(知识+能力)->找到工作->学习和锻炼->中级->高级/转方向 11 datasheet的重要性 11.1 什么是datasheet (1)datasheet就是数据手册,其实就是芯片的文档。 (2)数据手册中描述的都是这个芯片/器件的物理参数、电学参数、时序图、编程需要的信息、别的信息。总的来说这个芯片的所有有用的信息都在数据手册中,使用这颗芯片过程中的任何疑问都可以去datasheet中查询。 (3)我们学习单片机软件开发过程中,要不断去查询各种芯片的数据手册以获取一些有效信息来指导我们。 11.2 datasheet谁写的? (1)datasheet是由芯片厂商提供的。datasheet其实就是芯片的产品说明书。 11.3 datasheet从哪里来? (1)最官方最权威的途径就是到芯片厂商的官方网站去下载。 (2)开发板附带的光盘资料中一般也会有。 (3)将芯片型号信息敲到百度去搜索其数据手册。 11.4 datasheet应该怎么使用? (1)数据手册不是书,更不是教材,数据手册更像是一本字典。所以不是从第一页看到最后一页,更不用试图是记住。 (2)数据手册一定要先浏览一遍。尤其对于刚开始学习的人。浏览的目的是大概知道什么东西在哪里(将来用到时大概知道到哪里去找),里面一些概念基本理解,但是并不是为了记住。 (3)数据手册的正确用法就是:前面先简单看一遍(其中的前面一些可以认真看,后面的了解即可),用到某个具体知识时再根据前面浏览时的了解去具体查找数据手册中相关部分,这时候再去认真看。 12 原理图和PCB图 12.1 原理图 (1)原理图叫电路原理设计图,就是用符号来绘制出的电路连接的逻辑图。我们平时讲的电路图其实就是原理图。原理图不是实物。 (2)原理图由:线条、方框、圆圈、数字、字母等组成。看懂这些符号所对应的电路实物,就能看懂原理图。 (3)原理图中每一个符号表达一种含义,常见的有: 直线:表示导线,是用来连接元件构成电路的。 方框:表示器件,如IC、插座 常见符号:如电阻、电容、三极管等··· 特殊符号:不常见器件 (4)原理图中的每一个器件都有一个编号,如IC都用Un(U1、U2等),电容都用Cn(C1、C2)····这个编号在原理图中是唯一的,这个编号用来表示/记录这个元器件。 (5)原理图中芯片类型的器件还会有一个名字,名字一般是器件的型号。 (6)原理图中大多数器件还有一个参数值,譬如电容的容量、电阻的阻值等。 (7)有些器件(IC、插座)有引脚,引脚编号用数字表示。 (8)原理图中有个网络的概念,原理图上2个编号一样的节点其实在逻辑上是连在一起的。网络的发明纯粹是为了方便画图,让图不会导线连接的跟蜘蛛网一样。分析原理图时一定要注意网络,否则看到的可能就是一半的原理图。 12.2 PCB图 (1)硬件工程师在设计产品硬件时的步骤是:先有原理图,然后用原理图画出PCB图。 (2)PCB图是原理图和实际器件结合起来后,生成的PCB板的结构图纸,PCB图的作用就是拿给做PCB板的厂商去印刷电路板。 (3)对于软件工程师来说,PCB图完全不用去关注,我们只关注原理图。 12.3 BOM表 (1)BOM就是bills of meterials,就是物料表,物料表是整个电路中用到的所有物料的一张清单。 (2)BOM表是研发部门(硬件工程师)提供,一般是给生产部门来备料、记录用的。 (3)BOM中每个物料的记录和对应就靠物料编号。

    嵌入式ARM 软件 硬件 单片机

  • 电容在电路中各种基本常识,你了解多少?

    电容在电路中各种基本常识,你了解多少?

    1 电压源正负端接了一个电容与电路并联,用于整流电路时,具有很好的滤波作用。当电压交变时,由于电容的充电作用,两端的电压不能突变,就保证了电压的平稳。 当用于电池电源时,具有交流通路的作用,这样就等于把电池的交流信号短路,避免了由于电池电压下降,电池内阻变大,电路产生寄生震荡。 2 比如说什么样的电路中串或者并个电容可以达到耦合的作用,不放电容和放电容有什么区别? 在交流多级放大电 路中,因个级增益及功率不同,各级的直流工作偏值就不同。 若级间直接藕合,则会使各级工作偏值通混无法正常工作。 利用电容的通交隔直特性,既解决了级间交流的藕合,又隔绝了级间偏值通混,一举两得。 3 基本放大电路中的两个耦合电容,电容+极和直流+极相接,起到通交隔直的作用,接反的话会怎么样,会不会也起到通交隔直的作用,为什么要那接呀! 接反的话电解电容会漏电,改变了电路的直流工作点,使放大电路异常或不能工 作。 4 阻容耦合放大电路中,电容的作用是什么? 隔离直流信号,使得相邻放大电路的静态工作点相互独立,互不影响。 5 模拟电路放大器不用耦合电容行么,照样可以放大啊? 书上放大器在变压器副线圈和三极管之间加个耦合电容。解释是通交流阻直流,将前一级输出变成下一级输入,使前后级不影响。前一级是交流电,后一级也是交流电,怎么会相互影响啊,我实在想不通加个电容不是多此一举啊。 你犯了个错误,前一级确实是交流电,但后一级是交流叠加直流,三极管是需要直流偏置的,如果没有电容隔直,则变压器的线圈会把三极管的直流偏置给旁路掉,因为电感是通直流的。 6 基本放大电路耦合电容,其中耦合电容可以用无极性的吗? 在基本放大电路中,耦合电容要视频率而定,当频率较高时,需用无极电容,特点是比较稳定,耐压可以做得比较高,体积相对小,但容量做不大。 其最大的用途是可以通过交流电,隔断直流电,广泛用于高频交流通路、旁路、谐振等电路,简单理解为高频通路。 当频率较低时,无极电容因为容量较低容抗相对增大,就要用有极性的电解电容了,由于其内部加有电解液,可以把容量做得很大,让低频交流电通过,隔断直流电。 但由于内部两极中间是有机介质的,所以耐压受限,多用于低频交流通路、滤波、退耦、旁路等电路,简单理解为低频通路。 7 耦合电容起什么作用? 在放大电路中,利用耦合电容通交隔直的作用,使高频交流信号可以顺利通过电路,被一级一级地放大,而直流量被阻断在每一级的内部。 8 请问用电池供电的电路中,电容为什么会充放电,起到延时的作用? 电容是聚集电荷的,你可把它想象成个水杯,充放电就是充放水,在充电过程中,电压是慢慢的上升的;放电反之,你只需检测电容两端电压就能实现延时。 如充电开始时,电容两端电压为零,随着充电时间延长,电压逐渐上升到你设定的电压就能控制电路的开关。 当然,也可反过来利用放电。 延时时间与电容容量、电容漏电,充电电阻及电压有关,有时还要把负载电阻考虑进去。 9 阻容耦合,是利用电容的通交隔直特性,防止前、后级之间的直流成分引起串扰,造成工作点的不稳定。 10 阻容耦合放大电路只能放大交流信号,不能放大直流信号,对还是错? 对,电容是一种隔直流阻交流的电子元件。所以阻容耦合放大电路只能放大交流信号,放大直流信号用直接耦合放大电路。 11 放大电路中耦合电容和旁路电容如何判别? 耦合电容负极不接地,而是接下一级的输入端,旁路电容负极接地。 12 运放的多级交流放大电路如何选用电容耦合? 其实很 简单 ,一般瓷片电容就可搞定! 要效果好的话可选用钽电容,按照你输入信号的频率范围高频的可选用103、104容值的电容,对于较低频率的交流信号可选用22uF左右的电解电容。 13 放大电路采用直接耦合,反馈网络为纯电阻网络,为什么电路只可能产生高频振荡? 振荡来源于闭环的相移达到180度并且此时的环路增益是大于零的,采用纯电阻网络作为反馈网络是一定不会引入相移的,所以呢全部的相移是来自于放大器的开环电路。 采用直接耦合的开环放大器在级之间是不会有电容元件引起相移的,那么能够引起相移的便是晶体管或MOS管内部的电容,这些电容都是fF,最大pF级的电容,这些电容与电路等效电阻构成的电路的谐振频率是相当高的。 所以放大器采用直接耦合,反馈网络为纯阻网络只可能产生高频振荡。 14 阻容耦合放大电路的频带宽度是指(上限截至频率与下限截至频率之差)阻容耦合放大电路的上限截止频率是指(随着频率升高使放大倍数下降到原来的0.707倍,即-3dB时的频率)阻容耦合放大电路的下限截止频率是指(随着频率降低使放大倍数下降到原来的0.707倍,即-3dB时的频率)。 阻容耦合放大电路的上限截止频率主要受(晶体管结电容,电路的分布电容)的影响,阻容耦合放大电路的下限截止频率主要受(隔直电容与旁路)电容的影响。 15 在多级放大电路里面电解电容是怎么耦合到下一级的呢在电容里面的特性不是隔直的吗,它是怎么传送过去的呢?还有为电容要通过三极管的集电极来接呢,发射极为什么不可以呢? 电解电容都是在交流放大器里面工作,而交流的电流方向呈周期性变化,三极管能正常导通吗? 还有NPN型的三极管的集电极不是从C到B的吗,那它的电流是怎么通过流到下一级的三极管的基极的呢? 用电解电容做耦合的放大器,都是交流放大器,电解电容在这里作“通 交隔直 ”用,由三极管的哪个极输出,是电路形式的问题,两者都有。 16 怎样估算第一级放大器的输出电阻和第二级放大器的输入电阻?第二级放大器的输入电阻就是第一级放大器的输出电阻。 当信号源的幅度过大,在两级放大器的输出端分别会出现什么情况?失真。 用手在放大器的输入端晃动,观察放大器的输出端,看是否出现了什么?原因是什么?杂波,人体感应。 17 电容就是充放电。那怎么利用电容的充放电,去理解滤波,去耦,旁路..... 电容隔直流通交流,隔直流好理解,通交流不好理解,只要理解了通交流就理解了滤波、去耦和旁路。 电容就是充放电,不错,但交流电的方向,正反向交替变化,振幅的大小也做周期性变化,整个变化的图像就是一条正弦曲线。 电容器接在交流电路中,由于交流电压的周期性变化,它也在周期性的充放电变化。 线路中存在充放电电流,这种充放电电流,除相位比电压超前90度外,形状完全和电压一样,这就相当于交流通过了电容器。 和交流电通过电阻是不同,交流电通过电阻,要在电阻上消耗电能(发热),而通过电容器只是与电源做能量交换,充电时电源将能量送给电容器,放电时电容器又将电能返还给电源,所以这里的电压乘电流所产生的功率叫无功功率。 需要明确的是,电容器接在交流电路中,流动的电子(电流)并没有真正的冲过绝缘层,却在电路中产生了电流。这是因为在线路中,反向放电和正向充电是同一个方向。 而正向放电和反向充电是同一个方向,就象接力赛跑,一个团队跑完交流电的正半周,另一个团队接过接力棒继续跑完交流电的负半周。 理解了电容器通交流,那么,交流成份 旁路到地,完成滤波也就可以理解了。 18 旁路电容和滤波电容,去耦电容分别怎么用?可以举一些实例说明。 这三种叫法的电容,其实都是滤波的,只是应用在不同的电路中,叫法和用法不一样。 滤波电容:这是我们通常用在电源整流以后的电容,它是把整流电路交流整流成脉动直流,通过充放电加以平滑的电容,这种电容一般都是电解电容,而且容量较大,在微法级。 旁路电容:是把输入信号中的高频成份加以滤除,主要是用于滤除高频杂波的,通常用瓷质电容、涤纶电容,容量较小,在皮法级。 去耦电容:是把输出信号的干扰作为滤除对象,去耦电容相当于电池,利用其充放电,使得放大后的信号不会因电流的突变而受干扰。它的容量根据信号的频率、抑制波纹程度而定。 19 什么是耦合电容、去耦电容,有什么特点和作用? 耦合电容是传递交流信号的,接在线路中,去耦电容是将无用交流信号去除的,一段接在线路中、一端接地。 20 关于电容有几作用,在什么情况才电容耦合,在什么情况才电容滤波? 电容器在电路里的十八般武艺归根到底就是两个: 充电荷,放电荷。 其特性就是通交流、隔直流。 电容两端加上交变电压后会随电流交变频率而不断的充放电,此时电路里就有同频率的交变电流通过,这就是电容的通交特性。 在频率合适的情况下,电容对电路可视为通路。前级交流输出经电容就可传至后级电路。而对直流来说,它却是隔绝的。因为两端电压充至与电路电压相等时就不会再有充电电流了。作用于前后级交流信号的传递时就是藕合。作用于滤除波动成份及无用交流成分时就是滤波。 21 大家都知道,整流电路的电容滤波是利用其充放电;但是有时候滤波是利用电容对不通频率信号的容抗不同,比如旁路电容,所以分析电容滤波时到底用哪个角度分析啊? 其实不论是哪种说法都是一个道理,利用充放电的理论较笼统一些,利用容抗的的理论则更深入一些,电容的作用就是利用了其充放电的特性,看你想滤除什么成份,滤低频用大电容,滤高频用小电容,在理论上低频整流电路中的滤波和高频中的旁路是相同的都是利用了容抗的不同。 22 电容如何实现充放电、整流、滤波的功能? 电容的充电,放电,整流和滤波甚至包括它的移相,电抗等功能,都是电容的存储功能在起作用。 电容之所以能够存储电荷,是利用了正负电荷之间有较强的互相吸引的特性来实现的。在给电容充电时,人们通过电源将正电荷引入正极板,负电荷引入到电容的负极板。但是正负电荷又到不了一起这是因为有一层绝缘模阻隔着它们,隔模越大越薄引力也就越大,存储的电荷也就越多。正负电荷在十个极板间是吸引住了但是如果你给它提供一个外电路它们就会能过这个外电路互相结合,也就是放电。它们毕竟是一高一低。形象 来说电容就像一个储水池。 它可以形像地说明它的整流波波的作用。 23 滤波电容充电满了之后然后对后面回路放电然后在充放循环?稳压二极管是击穿稳压还是不击穿稳压? 其实你说的很对,它在电路中就是这么一个工作的过程,但是他跟信号的频率有关系,首先看你要把电容放在电路中用着什么,当用作滤波时,它把一定频率信号滤除到地,如芯片电源前端的电容,有的则是去耦,你说的现象就像稳压关前的滤波电容和开关电源输出的滤波电容。 关于稳压管我给你举个例子吧,假如有个5V的稳压管,当电压小于5V,电压就等于它本身的电压,当电压高于5V,稳压管就把电压稳到5V,多余的电压把稳压管击穿通道上去了。 24 电容的耦合是什么具体意思啊?它和滤波有什么区别吗? 耦合指信号由第一级向第二级传递的过程,一般不加注明时往往是指交流耦合。 退耦是指对电源采取进一步的滤波措施,去除两级间信号通过电源互相干扰的影响。 耦合常数是指耦合电容值与第二级输入阻抗值乘积对应的时间常数。 退耦有三个目的: 将电源中的高频纹波去除,将多级放大器的高频信号通过电源相互串扰的通路切断; 大信号工作时,电路对电源需求加大,引起电源波动,通过退耦降低大信号时电源波动对输入级/高电压增益级的影响; 形成悬浮地或是悬浮电源,在复杂的系统中完成各部分地线或是电源的协调。 有源器件在开关时产生的高频开关噪声将沿着电源线传播,去耦电容的主要功能就是提供一个局部的直流电源给有源器件,以减少开关噪声在板上的传播和将噪声引导到地。 25 电容器主要用于交流电路及脉冲电路中,在直流电路中电容器一般起隔断直流的作用。 电容既不产生也不消耗能量,是储能元件。 电容器在电力系统中是提高功率因数的重要器件;在电子电路中是获得振荡、滤波、相移、旁路、耦合等作用的主要元件。 因为在工业上使用的负载主要是电动机感性负载,所以要并电容这容性负载才能使电网平衡。 在接地线上,为什么有的也要通过电容后再接地?在直流电路中是抗干扰,把干扰脉冲通过电容接地,在这次要作用是隔直 —— 电路中的电位关系;交流电路中也有这样通过电容接地的,一般容量较小,也是抗干扰和电位隔离作用。 电动机、变压器等有线圈的电感电路,因通过电感的电流不能突变的原因,它与电容正好相反,需要先在线圈两端建立电压,后才有电流,电感电流回路中无电阻和电容时,叫纯电感电路,纯电感电路的电流滞后电压90度。由于功率是电压乘以电流,当电压与电流不同时产生时,如:当电容器上的电压最大时,电已充满,电流为0;电感上先有电压时,电感电流也为0,这样,得到的乘积(功率)也为0!这就是无功。那么,电容的电压与电流之间的关系正好与电感的电压与电流的关系相反,就用电容来补偿电感产生的无功,这就是无功补偿的原理。 26 电容器在电路中是如何起到滤波作用的?电容是开路的,交流电通过时是在给电容充电吗?电容是并联还是串联? 电容器的容抗随着两端加的交流电的频率不同而改变,Z=1/2*3.14*FC,根据需要滤除哪个频率的电流,设置不同的容值。 这样就可以把不需要的电流引到地,就完成了滤波,而对需要的频率的电流,电容是通路的或阻抗很小,交流电通过时,是反复充电和放电的过程。 27 退藕电容,滤波电容,旁路电容,三者都有什么作用,它们之间的区别和联系是什么? 例如晶体管放大器发射极有一个自给偏压电阻,它同时又使信号产生压降反馈到输入端形成了输入输出信号耦合,这个电阻就是产生了耦合的元件,如果在这个电阻两端并联一个电容,由于适当容量的电容器对交流信号较小的阻抗这样就减小了电阻产生的耦合效应,故称此电容为去耦电容。 电子管或者晶体管是需要偏置的,就是决定工作点的直流供电条件,例如电子管的栅极相对于阴极往往要求加有负压,为了在一个直流电源下工作,就在阴极对地串接一个电阻,利用板流形成阴极的对地正电位,而栅极直流接地,这种偏置技术叫做“自偏”,但是对(交流)信号而言,这同时又是一个负反馈,为了消除这个影响,就在这个电阻上并联一个足够大的点容,这就叫旁路电容。后来也有的资料把它引申使用于类似情况。 滤波电容就更好理解了,电容有通交流阻直流的功效,滤波就是我可以通过选择不同的滤波电容,把一定频率的交流信号滤掉,留下想要的频率信号。 28 请问耦合电容就是去耦电容么? 完全不同,耦合电容是信号传递,去耦电容是减少干扰。 29 电容去耦的原理是什么? 直流电路窜入交流信号或交流放大电路的自激回授,都会产生不良后果。 为了阻止该交流成份逐级藕合放大,在级间设置电容使之回流入地,该电容就是退藕电容。 30 耦合和去耦有什么区别,耦合电容和去耦电容的作用分别是什么,在电路中如何放置,有什么原则? 藕合电容的作用是将前级的交流信号输送到下一级。 藕合电容的位置是跨接在前级的输出和后级的输入两端。 退藕电容的作用是将放大器级间窜藕的无益交流信号短路入地。 退藕电容的位置是在某输入级的对地间。 31 如何区分电子电路中的电容是滤波电容还是旁路电容啊? 滤波电容在电源电路中,旁路电容在信号电路中,其实作用是基本一样的,滤波电容: 将脉动的电流成份旁路或称 滤除掉并起充放电作用,旁路电容: 将电路中的高频或低频成份 滤除或旁路掉。 32 请问去耦电容和旁路电容的区别? 旁路电容不是理论概念,而是一个经常使用的实用方法,电子管或者晶体管是需要偏置的,就是决定工作点的直流供电条件。 例如电子管的栅极相对于阴极往往要求加有负压,为了在一个直流电源下工作,就在阴极对地串接一个电阻,利用板流形成阴极的对地正电位,而栅极直流接地,这种偏置技术叫做“自偏”,但是对(交流)信号而言,这同时又是一个负反馈,为了消除这个影响,就在这个电阻上并联一个足够大的点容,这就叫旁路电容。 去耦电容在集成电路电源和地之间的有两个作用: 一方面是本集成电路的蓄能电容,另一方面旁路掉该器件的高频噪声,数字电路中典型的去耦电容值是0.1μF。 这个电容的分布电感的典型值是5μH。 0.1μF的去耦电容有5μH的分布电感,它的并行共振频率大约在7MHz左右,也就是说,对于10MHz以下的噪声有较好的去耦效果,对40MHz以上的噪声几乎不起作用。 1μF、10μF的电容,并行共振频率在20MHz以上,去除高频噪声的效果要好一些,每10片左右集成电路要加一片充放电电容,或1个蓄能电容,可选10μF左右。 最好不用电解电容,电解电容是两层薄膜卷起来的,这种卷起来的结构在高频时表现为电感,要使用钽电容或聚碳酸酯电容,去耦电容的选用并不严格,可按C=1/F,即10MHz取0.1μF,100MHz取0.01μF。 一般来说,容量为uf级的电容,象电解电容或钽电容,他的电感较大,谐振频率较小,对低频信号通过较好,而对高频信号,表现出较强的电感性,阻抗较大,同时,大电容还可以起到局部电荷池的作用,可以减少局部的干扰通过电源耦合出去。 容量为0.001~0.1uf的电容,一般为陶瓷电容或云母电容,电感小,谐振频率高,对高频信号的阻抗较小,可以为高频干扰信号提供一条旁路,减少外界对该局部的耦合干扰。 旁路是把前级 或电源携带的高频杂波或信号滤除; 去藕是为保证输出端的稳定输出(主要是针对器件的工作)而设的“小水塘”,在其他大电流工作时保证电源的波动范围不会影响该电路的工作; 补充一点就是所谓的藕合: 是在前后级间传递信号而不互相影响各级静态工作点的元件。 有源器件在开关时产生的高频开关噪声将沿着电源线传播,去耦电容的主要功能就是提供一个局部的直流电源给有源器件,以减少开关噪声在板上的传播和将噪声引导到地。 从电路来说,总是存在驱动的源和被驱动的负载,如果负载电容比较大,驱动电路要把电容充电、放电,才能完成信号的跳变,在上升沿比较陡峭的时候,电流比较大。 这样驱动的电流就会吸收很大的电源电流,由于电路中的电感,电阻(特别是芯片管脚上的电感,会产生反弹),这种电流相对于正常情况来说实际上就是一种噪声,会影响前级的正常工作。 这就是耦合。 去耦电容就是起到一个电池的作用,满足驱动电路电流的变化,避免相互间的耦合干扰。 旁路电容实际也是去耦合的,只是旁路电容一般是指高频旁路,也就是给高频的开关噪声提高一条低阻抗泄防 途径。 高频旁路电容一般比较小,根据谐振频率一般是0.1u,0.01u等,而去耦合电容一般比较大,是10u或者更大,依据电路中分布参数,以及驱动电流的变化大小来确定。 33 二极管、三极管、电容,在电路中怎样起作用? 二极管起单向导电作用。 三极管在模拟电路中起放大作用,在数字电路中起开关作用。 电容总体来说起通交流隔直流作用,如滤波电容、耦合电容等等,根本宗旨就是“通交隔直”。 34 请问滤波电容在电路上起什么作用? 低频滤波电容主要用于市电滤波或变压器整流后的滤波,其工作频率与市电一致为50Hz; 而高频滤波电容主要工作在开关电源整流后的滤波,其工作频率为几千Hz到几万Hz。 当我们将低频滤波电容用于高频电路的时候,由于低频滤波电容高频特性不好,它在高频充放电时内阻较大,等效电感较高。 因此在使用中会因电解液的频繁极化而产生较大的热量,而较高的温度将使电容内部的电解液气化,电容内压力升高,最终导致电容的鼓包和爆裂。

    嵌入式ARM 电容 电路 基本常识

  • 深度:单片机到底是如何软硬件结合的

    我们通过IO和串口的软件开发,已经体验了嵌入式软件开发。不知道大家有没有疑惑,为什么软件能控制硬件?反正当年我学习51的时候,有这个疑惑。今天我们就暂停软件开发,分析单片机到底是如何软硬件结合的。并通过一个基本的程序,分析单片机程序的编译,运行。 软硬件结合 初学者,通常有一个困惑,就是为什么软件能控制硬件?就像当年的51,为什么只要写P1=0X55,就可以在IO口输出高低电平?要理清这个问题,先要认识一个概念:地址空间。 寻址空间 什么是地址空间呢?所谓的地址空间,就是PC指针的寻址范围,因此也叫寻址空间。 大家应该都知道,我们的电脑有32位系统和64位系统之分,为什么呢?因为32位系统,PC指针就是一个32位的二进制数,也就是0xffffffff,范围只有4G寻址空间。 现在内存越来越大,4G根本不够,所以需要扩展,为了能访问超出4G范围的内存,就有了64位系统。STM32是多少位的?是32位的,因此PC指针也是32位,寻址空间也就是4G。 我们来看看STM32的寻址空间是怎么样的。在数据手册《STM32F407_数据手册.pdf》中有一个图,这个图,就是STM32的寻址空间分配。所有的芯片,都会有这个图,名字基本上都是叫Memory map,用一个新芯片,就先看这个图。 最左边,8个block,每个block 512M,总共就是4G,也就是芯片的寻址空间。 block 0 里面有一段叫做FLASH,也就是内部FLASH,我们的程序就是下载到这个地方,起始地址是0X800 0000,大家注意,这个只有1M空间。现在STM32已经有2M flash的芯片了,超出1M的FLASH放在哪里呢?请自行查看对应的芯片手册。 3 在block 1 内,有两段SRAM,总共128K,这个空间,也就是我们前面说的内存,存放程序使用的变量。如果需要,也可以把程序放到SRAM中运行。407不是有196K吗? 其实407有196K内存,但是有64k并不是普通的SRAM,而是放在block 0 内的CCM。这两段区域不连续,而且,CCM只能内核使用,外设不能使用,例如DMA就不能用CCM内存,否则就死机。 block 2,是Peripherals,也就是外设空间。我们看右边,主要就是APB1/APB2、AHB1/AHB2,什么东西呢?回头再说。 block 3、block4、block5,是FSMC的空间,FSMC可以外扩SRAM,NAND FALSH,LCD等外设。 好的,我们分析了寻址空间,我们回过头看看,软件是如何控制硬件的。在IO口输出的例程中,我们配置IO口是调用库函数,我们看看库函数是怎么做的。 例如: GPIO_SetBits(GPIOG, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2| GPIO_Pin_3); 这个函数其实就是对一个变量赋值,对GPIOx这个结构体的成员BSRRL赋值。 void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) {  /* Check the parameters */  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));  assert_param(IS_GPIO_PIN(GPIO_Pin));  GPIOx->BSRRL = GPIO_Pin; } assert_param:这个是断言,用于判断输入参数是否符合要求GPIOx是一个输入参数,是一个GPIO_TypeDef结构体指针,所以,要用->获取其成员 GPIOx是我们传入的参数GPIOG,具体是啥?在stm32f4xx.h中有定义。 #define GPIOG               ((GPIO_TypeDef *) GPIOG_BASE) GPIOG_BASE同样在文件中有定义,如下: #define GPIOG_BASE           (AHB1PERIPH_BASE + 0x1800) AHB1PERIPH_BASE,AHB1地址,有点眉目了吧?在进一步看看 /*!< Peripheral memory map */ #define APB1PERIPH_BASE       PERIPH_BASE #define APB2PERIPH_BASE       (PERIPH_BASE + 0x00010000) #define AHB1PERIPH_BASE       (PERIPH_BASE + 0x00020000) #define AHB2PERIPH_BASE       (PERIPH_BASE + 0x10000000) 再找找PERIPH_BASE的定义 #define PERIPH_BASE           ((uint32_t)0x40000000) 到这里,我们可以看出,操作IO口G,其实就是操作0X40000000+0X1800这个地址上的一个结构体里面的成员。说白了,就是操作了这个地方的寄存器。实质跟我们操作普通变量一样,就像下面的两句代码,区别就是变量i是SRAM空间地址,0X40000000+0X1800是外设空间地址。 u32 i; i = 0x55aa55aa; 这个外设空间地址的寄存器是IO口硬件的一部分。如下图,左边的输出数据寄存器,就是我们操作的寄存器(内存、变量),它的地址就是0X40000000+0X1800+0x14. 控制其他外设也类似,就是将数据写到外设寄存器上,跟操作内存一样,就可控制外设了。 寄存器,其实应该是内存的统称,外设寄存器应该叫做特殊寄存器。慢慢的,所有人都把外设的叫做寄存器,其他的统称内存或RAM。寄存器为什么能控制硬件外设呢?因为,初略的说,一个寄存器的一个BIT,就是一个开关,开就是1,关就是0。通过这个电子开关去控制电路,从而控制外设硬件。 纯软件-包罗万象的小程序 我们已经完成了串口和IO口的控制,但是我们仅仅知道了怎么用,对其他一无所知。程序怎么跑的?代码到底放在那里?内存又是怎么保存的?下面,我们通过一个简单的程序,学习嵌入式软件的基本要素。 分析启动代码 函数从哪里开始运行? 每个芯片都有复位功能,复位后,芯片的PC指针(一个寄存器,指示程序运行位置,对于多级流水线的芯片,PC可能跟真正执行的指令位置不一致,这里暂且认为一致)会复位到固定值,一般是0x00000000,在STM32中,复位到0X08000004。因此复位后运行的第一条代码就是0X08000004。前面我们不是拷贝了一个启动代码文件到工程吗?startup_stm32f40_41xxx.s,这个汇编文件为什么叫启动代码?因为里面的汇编程序,就是复位之后执行的程序。在文件中,有一段数据表,称为中断向量,里面保存了各个中断的执行地址。复位,也是一个中断。 芯片复位时,芯片从中断表中将Reset_Handler这个值(函数指针)加载到PC指针,芯片就会执行Reset_Handler函数了。(一个函数入口就是一个指针) ; Vector Table Mapped to Address 0 at Reset                 AREA    RESET, DATA, READONLY                 EXPORT  __Vectors                 EXPORT  __Vectors_End                 EXPORT  __Vectors_Size __Vectors       DCD     __initial_sp               ; Top of Stack                 DCD     Reset_Handler              ; Reset Handler                 DCD     NMI_Handler                ; NMI Handler                 DCD     HardFault_Handler          ; Hard Fault Handler                 DCD     MemManage_Handler          ; MPU Fault Handler                 DCD     BusFault_Handler           ; Bus Fault Handler                 DCD     UsageFault_Handler         ; Usage Fault Handler Reset_Handler函数,先执行SystemInit函数,这个函数在标准库内,主要是初始芯片时钟。然后跳到__main执行,__main函数是什么函数? 是我们在main.c中定义的main函数吗?后面我们再说这个问题。 ; Reset handler Reset_Handler    PROC                  EXPORT  Reset_Handler             [WEAK]         IMPORT  SystemInit         IMPORT  __main                  LDR     R0, =SystemInit                  BLX     R0                  LDR     R0, =__main                  BX      R0                  ENDP 芯片是怎么知道开始就执行启动代码的呢?或者说,我们如何把这个启动代码放到复位的位置?这就牵涉到一个一般情况下不关注的文件wujique.sct,这个文件在wujique\prj\Objects目录下,通常把这个文件叫做分散加载文件,编译工具在链接时,根据这个文件放置各个代码段和变量。 在MDK软件Options菜单Linker下有关于这个菜单的设置。 把Use Memory Layout from Target Dialog前面的勾去掉,之前不可设置的框都可以设置了。点击Edit进行编辑。 在代码编辑框出现了分散加载文件内容,当前文件只有基本的内容。 其实这个文件功能很强大,通过修改这个文件可以配置程序的很多功能,例如:1 指定FLASH跟RAM的大小于起始位置,当我们把程序分成BOOT、CORE、APP,甚至进行驱动分离的时候,就可以用上了。2 指定函数与变量的位置,例如把函数加载到RAM中运行。 从这个基本的分散加载文件我们可以看出: 第6行 ER_IROM1 0x08000000 0x00080000定义了ER_IROM1,也就是我们说的内部FLASH,从0x08000000开始,大小0x00080000。 第7行 .o (RESET, +First)从0x08000000开始,先放置一个.o文件, 并且用(RESET, +First)指定RESET块优先放置,RESET块是什么?请查看启动代码,中断向量就是一个AREA,名字叫RESET,属于READONLY。这样编译后,RESET块将放在0x08000000位置,也就是说,中断向量就放在这个地方。DCD是分配空间,4字节,第一个就是__initial_sp,第二个就是Reset_Handler函数指针。也就是说,最后编译后的程序,将Reset_Handler这个函数的指针(地址),放在0x800000+4的地方。所以芯片在复位的时候,就能找到复位函数Reset_Handler。 第8行 *(InRoot$$Sections)什么鬼?GOOGLE啊!回头再说。 第9行 .ANY (+RO)意思就是其他的所有RO,顺序往后放。就是说,其他代码,跟着启动代码后面。 第11行 RW_IRAM1 0x20000000 0x00020000定义了RAM大小。 第12行 .ANY (+RW +ZI)所有的RW ZI,全部放到RAM里面。RW,ZI,也就是变量,这一行指定了变量保存到什么地址。 分析用户代码 到此,基本启动过程已经分析完。下一步开始分析用户代码,就从main函数开始。1 程序跳转到main函数后:RCC_GetClocksFreq获取RCC时钟频率;SysTick_Config配置SysTick,在这里打开了SysTick中断,10毫秒一次。 Delay(5);延时50毫秒。 int main(void) {   GPIO_InitTypeDef GPIO_InitStructure; /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup files before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f4xx.c file */ /* SysTick end of count event each 10ms */ RCC_GetClocksFreq(&RCC_Clocks);   SysTick_Config(RCC_Clocks.HCLK_Frequency / 100); /* Add your application code here */ /* Insert 50 ms delay */ Delay(5); 2 初始化IO就不说了,进入while(1),也就是一个死循环,嵌入式程序,都是一个死循环,否则就跑飞了。 /*初始化LED IO口*/ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2| GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOG, &GPIO_InitStructure); /* Infinite loop */ mcu_uart_open(3); while (1) {   GPIO_ResetBits(GPIOG, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);   Delay(100);   GPIO_SetBits(GPIOG, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);   Delay(100);   mcu_uart_test();   TestFun(TestTmp2); } 3 在while(1)中调用TestFun函数,这个函数使用两个全局变量,两个局部变量。 /* Private functions ---------------------------------------------------------*/ u32 TestTmp1 = 5;//全局变量,初始化为5 u32 TestTmp2;//全局变量,未初始化 const u32 TestTmp3[10] = {6,7,8,9,10,11,12,13,12,13}; u8 TestFun(u32 x)//函数,带一个参数,并返回一个u8值 {  u8 test_tmp1 = 4;//局部变量,初始化 u8 test_tmp2;//局部变量,未初始化 static u8 test_tmp3 = 0;//静态局部变量 test_tmp3++;  test_tmp2 = x; if(test_tmp2> TestTmp1)   test_tmp1 = 10; else test_tmp1 = 5;  TestTmp2 +=TestTmp3[test_tmp1]; return test_tmp1; } 然后程序就一直在main函数的while循环里面执行。中断呢?对,还有中断。中断中断,就是中断正常的程序执行流程。我们查看Delay函数,uwTimingDelay不等于0就死等?谁会将uwTimingDelay改为0? /**   * @brief  Inserts a delay time.   * @param  nTime: specifies the delay time length, in milliseconds.   * @retval None   */ void Delay(__IO uint32_t nTime) {   uwTimingDelay = nTime; while(uwTimingDelay != 0); } 搜索uwTimingDelay变量,函数TimingDelay_Decrement会将变量一直减到0。 /**   * @brief  Decrements the TimingDelay variable.   * @param  None   * @retval None   */ void TimingDelay_Decrement(void) { if (uwTimingDelay != 0x00)   {     uwTimingDelay--;   } } 这个函数在哪里执行?经查找,在SysTick_Handler函数中运行。谁用这个函数? /**   * @brief  This function handles SysTick Handler.   * @param  None   * @retval None   */ void SysTick_Handler(void) {   TimingDelay_Decrement(); } 经查找,在中断向量表中有这个函数,也即是说这个函数指针保存在中断向量表内。当发生中断时,就会执行这个函数。当然,在进出中断会有保存和恢复现场的操作。这个主要涉及到汇编,暂时不进行分析了。有兴趣自己研究研究。通常,现在我们开发程序不用关心上下文切换了。 __Vectors       DCD     __initial_sp               ; Top of Stack                 DCD     Reset_Handler              ; Reset Handler                 DCD     NMI_Handler                ; NMI Handler                 DCD     HardFault_Handler          ; Hard Fault Handler                 DCD     MemManage_Handler          ; MPU Fault Handler                 DCD     BusFault_Handler           ; Bus Fault Handler                 DCD     UsageFault_Handler         ; Usage Fault Handler                 DCD 0 ; Reserved                 DCD 0 ; Reserved                 DCD 0 ; Reserved                 DCD 0 ; Reserved                 DCD     SVC_Handler                ; SVCall Handler                 DCD     DebugMon_Handler           ; Debug Monitor Handler                 DCD 0 ; Reserved                 DCD     PendSV_Handler             ; PendSV Handler                 DCD     SysTick_Handler            ; SysTick Handler 余下问题 1 __main函数是什么函数?是我们在main.c中定义的main函数吗?2 分散加载文件中*(InRoot$$Sections)是什么?3 ZI段,也就是初始化为0的数据段,什么时候初始化?谁初始化? 为什么这几个问题前面留着不说?因为这是同一个问题。顺藤摸瓜! 通过MAP文件了解代码构成 编译结果 程序编译后,在下方的Build Output窗口会输出信息: *** Using Compiler 'V5.06 update 5 (build 528)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin' Build target 'wujique' compiling stm32f4xx_it.c... ... assembling startup_stm32f40_41xxx.s... compiling misc.c... ... compiling mcu_uart.c... linking... Program Size: Code=9038 RO-data=990 RW-data=40 ZI-data=6000 FromELF: creating hex file... ".\Objects\wujique.axf" - 0 Error(s), 0 Warning(s). Build Time Elapsed: 00:00:32 编译目标是wujique C文件compiling,汇编文件assembling,这个过程叫编译 编译结束后,就进行link,链接。 最后得到一个编译结果,9038字节code,RO 990,RW 40,ZI 6000。CODE,是代码,很好理解,那RO、RW、ZI都是什么? FromELF,创建hex文件,FromELF是一个好工具,需要自己添加到option中才能用 map文件配置 更多编译具体信息在map文件中,在MDK Options中我们可以看到,所有信息都放在\Listings\wujique.map 默认很多编译信息可能没钩,钩上所有信息会增加编译时间。 map文件 打开map文件,好乱?习惯就好。我们抓重点就行了。 map 总信息 从最后看起,看到没?最后的这一段map内容,说明了整个程序的基本概况。 有多少RO?RO到底是什么? 有多少RW?RW又是什么? ROM为什么不包括ZI Data?为什么包含RW Data? Image component sizes 往上,看看Image component sizes,这个就比刚刚的总体统计更细了。 这部分内容,说明了每个源文件的概况 首先,是我们自己的源码,这个程序我们的代码不多,只有main.o,wujique_log.o,和其他一些STM32的库文件。 第2部分是库里面的文件,看到没?里面有一个main.o。main函数是不是我们写的main函数?明显不是,我们的main函数是放在main.o文件。这么小的一个工程,用了这么多库,你以前关注过吗?估计没有,除非你曾经将一个原本在1M flash上的程序压缩到能在512K上运行。 第3部分也是库,暂时没去分析这两个是什么东西。 库文件是什么?库文件就是别人已经别写好的代码库。在代码中,我们经常会包含一些头文件,例如: #include #include #include 这些就是库的头文件。这些头文件保存在MDK开发工具的安装目录下。我们经常用的库函数有:memcpy、memcmp、strcmp等。只要代码中包含了这些函数,就会链接库文件。 文件map 再往上,就是文件MAP了,也就时每个文件中的代码段(函数)跟变量在ROM跟RAM中的位置。首先是ROM在0x08000000确实放的是startup_stm32f40_41xxx.o中的RESET 库文件是什么? 库文件就是别人已经别写好的代码库。 在代码中,我们经常会包含一些头文件,例如: #include #include #include 这些就是库的头文件。这些头文件保存在MDK开发工具的安装目录下。 我们经常用的库函数有: memcpy、memcmp、strcmp等。 只要代码中包含了这些函数,就会链接库文件。 文件map 再往上,就是文件MAP了,也就时每个文件中的代码段(函数)跟变量在ROM跟RAM中的位置。首先是ROM在0x08000000确实放的是startup_stm32f40_41xxx.o中的RESET 每个文件有有多行,例如串口,4个函数。 然后是RAM的,main.o中的变量,放在0x20000000,总共有0x0000000c,类型是Data、RW。串口有两种变量,data和bss,什么是bss?这两个名称,是section name,也就是段的意思。看前面type和Attr, RW Data,放在.data段;RW Zero放在.bss段,RW Zero,其实就是ZI。到底哪些变量是RW,哪些是ZI? Image Symbol Table 再往上就是Image Symbol Table,就更进一步到每个函数或者变量的信息了 例如,全局变量TestTmp1,是Data,4字节,分配的位置是0x20000004。 TestTmp3数组放在哪里?放在0X080024E0这个地方,这可是代码区额。因为我们用const修饰了这个全局变量数组,告诉编译器,这个数组是不可以改变的,编译器就将这个数组保存到代码中了。程序中我们经常会使用一些大数组数据,例如字符点阵,通常有几K几十K大,不可能也没必要放到RAM区,整个程序运行过程这些数据都不改变,因此通过const修饰,将其存放到代码区。 const的用处比较多,可以修饰变量,也可以修饰函数。更多用法自行学习 那局部变量存放在哪里呢?我们找到了test_tmp3, 没找到test_tmp1/test_tmp2,为什么呢?在定义时,test_tmp3增加了static定义,意思就是静态局部变量,功能上,相当于全局变量,定义在函数内,限制了这个全局变量只能在这个函数内使用。哪test_tmp1、test_tmp2放在哪里呢? 局部变量,在编译链接时,并没有分配空间,只有在运行时,才从栈分配空间。 u8 TestFun(u32 x)//函数,带一个参数,并返回一个u8值 {  u8 test_tmp1 = 4;//局部变量,初始化 u8 test_tmp2;//局部变量,未初始化 static u8 test_tmp3 = 0;//静态局部变量 上一部分,我们留了一个问题,哪些变量是RW,哪些是ZI?我们看看串口变量的情况,UartBuf3放在bss段,其他变量放在.data段。为什么数组就放在bss?bss是英文Block Started by Symbol的简称。 到这里,我们可解释下面几个概念了: Code就是代码,函数。 RO Data,就是只读变量,例如用const修饰的数组。 RW Data,就是读写变量,例如全局变量跟static修饰的局部变量。 ZI Data,就是系统自动初始化为0的读写变量,大部分是数组,放在bss段。 RO Size等于代码加只读变量。 RW Size等于读写变量(包括自动初始化为0的),这个也就是RAM的大小。 ROM Size,也就是我们编译之后的目标文件大小,也就是FLASH的大小。但是?为什么会包含RW Data呢?因为所有全局变量都需要一个初始化的值(就算没有真正初始化,系统也会分配一个初始化空间),例如我们定义一个变量u8 i = 8;这样的全局变量,8,这个值,就需要保存在FALSH区。 我们看看函数的情况,前面我们不是有一个问题吗?__main和main是一个函数吗?查找main后发现,main是main,放在0x08000579 main是main,放在0x08000189 __main到main之间发生了什么?还记得分散加载文件中的这句吗? *(InRoot$$Sections) __main就在这个段内。下图是__main的地址,在0x08000189。__Vectors就是中断向量,放在最开始。 在分散加载文件中,紧跟RESET的就是*(InRoot$$Sections)。 而且,RESET段正好大小0x00000188。 巧合?参考PPT文档《ARM嵌入式软件开发.ppt》,或自行GOOGLE。 这一段代码都完成什么功能呢?主要完成ZI代码的初始化,也就是将一部分RAM初始化为0。其他环境初始化。。。。通常,我们不用管这一部分。 其他再往上,就是其他信息了,例如优化了哪些东西,移除了哪些函数。 最后 到这里,一个程序,是怎么组成的,程序是如何运行的,基本有一个总体印象了。不过,对于中断,后面还会进行详细说明。

    嵌入式ARM 嵌入式 单片机 IO

  • 多少嵌入式工程师对

    多少嵌入式工程师对

    最近很多伙计问我现在搞嵌入式还有没有必要学习汇编? 还记得信息类专业、电子类专业微机原理课上被汇编程序支配的恐惧吗? 曾记得那时一个同学还说汇编是个"外星文"。 bug菌也承认对不起当年教授该门课程的老师,当时这门课摸鱼去了! 但是出来混总要还的,参加工作没多久就得回去狂啃各种汇编书籍、代码、视频,因为受不了公司的技术大牛在前面对一大段汇编代码毫不放在眼里的感觉。 可以说这些年打交道的嵌入式工程师一半以上都会对汇编代码心存恐惧,当然如果你是做编译工具等方面的那就另当别论了,因为汇编是他们的工作的必备能力,但是并不是说与这行业不太相关的人对汇编就可以不用去了解学习了。 01 多学点汇编的四大理由 1、嵌入式C与汇编的混搭 有学过RTOS的朋友都知道,RTOS中的任务上下文切换,中断的现场保护的等等,基本上都是由汇编来编写嵌入,可以说在一个嵌入式系统中需要频繁使用的代码片段,都最好使用汇编来编写,目的只有一个提高效率。 上面是C语言中嵌入汇编,其实大部分MCU程序都是汇编中嵌入C程序,没错!上电没有创建堆栈前都是汇编代码!你研究过吗?如果没有,或许你不关心,又或许...... 2、优秀的算法都会使用汇编来测试极限 我相信大部分人都没有过这样的噩梦,当你的团队研究出了一套新的算法,领导要你用C和汇编分别编写出来,进行效率、复杂度等各方面的测试。好吧,当年的心理阴影一直都在! 不过这确实也应该是一名嵌入式工程师的工作!特别是在一些语音、视觉、信号处理等行业是非常常见的! 3、你的bug在C代码中是找不出来的! 这种情景对于有点工作经验的朋友应该都遇到过吧,也就是大部分人常挂在嘴边的 : "这个问题一定是编译器优化导致的。","这个是不是跟编译器优化有关系?",“你确定你没有开优化等级?”...... 我只能说编译器优化真无辜呀,只是一个帮忙优化代码的功能选项,搞不定bug就得背锅,真冤! 4、对嵌入式程序运行理解更深入 比如多线程程序设计中讨论最多的互斥问题、cache等等,都可以从汇编代码角度分析问题,这样从机器或者CPU角度编写你的代码稳定性、效率等等都会大有好处。 所以如果你真的对汇编不感兴趣,至少能够具备看懂的能力!这也算是作为一名合格的嵌入式工程师的能力! 02 C为什么比汇编更受欢迎? 在部分眼中似乎汇编没有嵌入式C这么受欢迎。 1、方便是目标 个人觉得这都是软件发展的需要,人类的大部分发明可以说都是为了追求方便,舒适等等,说得不好听,或许就是喜欢偷懒吧,这也是天性!所以在目前这个阶段C语言相比汇编语言能够让更多的程序员降低底层的束缚,更专注于更上层软件的开发。 2、开发分工明确 同时还有一点,软件开发的分工也越来越明确,你所使用的编译器、开发工具等等难道是天然存在的吗 ? 显然不是,这些工具跟我们平时做的项目无异,也会有bug,也会奔溃! 但是随着编译器的逐渐强大,不再需要你们从汇编开始开发了,从C开发挺香的,当然如果你想用C++、JAVA、Python等等都是可以的,关键你还是要知道这些语言编译出来以后究竟是如何操控你的硬件的,最终还是会研究到汇编这一个层面。 所以你可以认为C语言到汇编这一层的转换已经被开发编译工具的那群人跟你做好了,你可以更舒坦的进行贴近上层的程序开发! 如果说推荐的汇编学习资料,看大学微机原理的汇编程序设计章节就行了,硬是要推荐系统一点的那就王爽老师的<汇编语言>(第三版)吧。 来最后匿名投个票,看看你的汇编水平达标没!

    嵌入式ARM 嵌入式 汇编

  • 希捷被美国商务部查!原因竟是违反华为制裁禁令?

    希捷被美国商务部查!原因竟是违反华为制裁禁令?

    众所周知,美国此前对华为下了制裁禁令,3月23日消息,据外媒报导,美国商务部已开始对硬盘大厂希捷( Seagate ) 展开调查,指控希捷可能破坏美国针对华为的制裁禁令,存在将磁盘驱动器运往华为的情况。 报导称,美国商务部已于2020年8月对华为实施了更严厉的制裁,通过修订的“外国制造直接产品规则”,阻止华为绕过美国的出口管制,获取基于美国软件或技术来开发或生产的“零件”、“组件”或“设备”,除非获得美国的许可证。 而虽然在美国商务部的禁令下,企业仍可以申请特别出口许可,向华为供货相关产品。比如,西部数据此前就已经获得了向华为出售磁盘驱动器以及固体硬盘等产品的许可。但是,在取得美国商务部的出口许可之前,企业仍禁止向华为出口受禁令管制的产品及技术。 对电脑硬件有一定了解的消费者可能都知道西数和希捷是全球最大的两家硬盘企业,机械硬盘销售份额合计占全球市场八成,西数还拥有闪存大厂SanDisk闪迪。但这两家全球最大的硬盘供应商,已经停止向华为供应硬盘。而在此之前,东芝也已经停止向华为供应硬盘,要知道硬盘是电脑必不可少的硬件,而这三家厂商也是手机闪存内存的供应商,可以预见,华为即将正面临新一轮的断货危机。 而作为美国著名的硬盘巨头,西数已经在禁令生效之后向美国申请向华为供货的申请,而希捷在去年9月份时候表示正在对希捷能否提供给华为硬盘以及相关的芯片进行评估,并且称将会严格遵守美国商务部的规则。随后有外媒针对希捷受到美国商务部的调查询问希捷,希捷发言人则表示目前希捷遵守所有能够适用的法律法规,针对希捷特定的客户并不发表任何的评论。 在此之前,希捷曾说会严格执行美国商务部的限制令,有新闻媒体专门针对遭商务部调查统计一事对希捷开展了询问,希捷回复说希捷遵守所有能够采用的相关法律法规,但对希捷特定的客户不发表其他评价。 希捷与众多中国巨头企业都有着联系,此前刚和京东达成合作,据了解,未来三年来,双方将通过与京东电脑数码专卖店、京东之家、京喜等全渠道合作,进一步打破品牌地域的限制,让全国各地尤其城镇消费者,在家门口都能接触到希捷最新产品与服务,真正实现与国际产品的零距离接触。除此之外,双方在营销层面也将进一步深化合作,依托京东大数据优势,优化品牌会员体系的运营,实现无论站内还是站外,都能确保新品信息第一时间精准触达细分人群,从而实现有效转化。 希捷(Seagate Technology Cor)成立于1979年,目前是全球最大的硬盘、磁盘和读写磁头制造商,总部位于美国加州司各特谷市。希捷在设计、制造和销售硬盘领域居全球领先地位,提供用于企业、台式电脑、移动设备和消费电子的产品。移动硬盘作为我们的私人小物品,其外观颜值在一定程度上也体现了我们个人的审美和品位。希捷铭系列移动硬盘采用金属拉丝设计,简约有质感。另外其配色丰富多彩,黑、红、银、灰配色低调沉稳,在与金属拉丝工艺的结合下,呈现出非常高端的格调。另外还有樱花粉和蓝色两种清新配色,弥漫着时尚轻奢的品质感。多彩的配色、充满格调的质感,无论您选择的是哪款,都能彰显您不俗的审美和品位。 总的来说,希捷铭系列移动硬盘拥有着时尚简约、高端格调的外观颜值,是一件能够彰显个人审美和品位的小物品。另外无论是良好的便携性、快速的传输,还是广泛的兼容性,都能够为我们带来便捷的使用体验。而希捷Toolkit软件和原厂数据救援服务,为数据安全提供了可靠的保障。

    嵌入式新闻 华为 制裁 希捷

发布文章