单片机

单片机组成的系统在维修中趋于常见,变频器、PLC、智能仪器仪表等工控常见设备,其控制核心大部分就是单片机。了解熟悉了单片机系统的工作原理,在维修中就可采用一些有针对性的方法和策略,做到事半功倍。下面从一款常用的51系列单片机入手来了解单片机的工作过程。

图1是由AT89S52组成的单片机最小系统。

1.png

图1  单片机最小系统

1.单片机工作需要保证稳定正常的工作电压,通常有使用5V电源或3.3V电源的单片机。此单片机使用5V电源,40脚接5V,20脚接0V;

2.单片机工作需要时钟信号,程序按照一定的步调执行,时钟信号的频率按照单片机的具体特点和应用的具体要求给定。此单片机外接晶体振荡器和电容,得到22.1184MHZ的时钟信号;

3.单片机必须有一个复位信号来复位,使得内部各功能器件从“起点”开始工作,这样就不会出现乱套。复位信号视乎单片机的特点,保持多少个时钟脉冲的高电平或低电平。此单片机是高电平复位,复位脚RST接一个电容到VCC,接一个电阻到地。复位的原理是:接通电源的瞬间,因为电容上的电压不能突变,RST相当于对VCC短路,处于高电平状态,随着C1、R1回路给电容的充电,C1两端电压逐渐升高,使得RST变为低电平,C1和R1的选值在某个范围就可以满足复位条件。

电源、时钟、复位、是满足单片机正常工作的3个必要条件。复位以后单片机怎么做、做什么,那就交给软件来完成。软件放在哪里?放在程序存储器内。程序存储器在单片机的什么部位?内部不带ROM的,或内部ROM不够用的,要到片外去找;片内有ROM够用的,那就片内找。程序是怎么进去的?通过程序烧写器,或连接单片机和电脑的某种通讯接口来录入程序。

此外,我们还看到单片机包含的I/O端口,某些端口既可以做输出,又可以做输入,有些端口还是复用的,如计时器端口、串行通讯端口、中断入口等,端口的具体功能可由单片机程序来控制。有些输出端口是集电极或漏极开路的,输出需接上拉电阻。根据单片机数据位数不同,常见的有8位单片机,16位单片机和32位单片机。早期的单片机以8051系列8位单片机最为常见,图2是8位单片机STC系列的内部结构。

2.png

图2 STC 8位单片机内部结构

图3是16位msp430单片机.

3.png

图3 16位msp430单片机内部结构

图4是STM32系列32位单片机的内部结构.

4.png

图4 32位STM32系列单片机内部结构

可以看到,单片机的内部结构越来越复杂,功能越来越强大,但是它的基本架构还是一样的。无非把某些功能加强,增添更多的单片机外设部分。

总之,单片机虽种类繁多,千变万化,其基本结构也不外乎以上内容,其它无非就是在基本内容上的优化,及配合实际应用来配置端口和外设接法。例如复位,除了简单的阻容复位,还有用到专用复位芯片的,通过复位芯片监测电源电压情况,并正确的给定复位信号。时钟信号,也有使用有源晶振,或芯片内部自带振荡电路。通讯也有自带各种通讯接口的。程序的存储有在片外的,也有在片内的,片内的又有一次性编程的和可重新编程的。根据数据位数又有4位、8位、16位、32位单片机等。各种型号单片机都可以找到厂家提供的数据手册datasheet,可以通过查阅这些数据手册来详细了解该型单片机的结构、应用方法,从而明确维修工作的方向。

单片机电路系统的检修:

单片机系统工作异常应该从以下几个方面检查:

(1)电源是否正常?

检查电源是否正常,不能简单的使用万用表直流电压档测一下电压是否到位就行。比如万用表测试5V电压,能显示5V就认为电源正常了,这种测试方法是不可取的,因为万用表测试的只是电压的平均值,电源的纹波并没有测试出来。

正确的操作应该是取4位半精度以上的数字表,一边测试直流电压,一边观察万用表电压显示值,如果电压显示的小数点最后面一位数字都不波动或者波动一两个值,说明测试的电压非常稳定。例如测试5V电压的时候显示5.022V~5.024之间跳动或者一点都不跳动,则电压稳定,假设电压在5.000~5.123之间跳动,则电源纹波过大,可能影响单片机工作。

还可以使用万用表的交流电压测试档来测试直流电源的交流成份。如果交流电压超过直流电压值的2%,说明电源纹波太大。例如,使用交流档测试5V直流,如果显示数值稳定后显示交流电压大于5V的2%即0.1V以上,说明纹波过大。

最直观的方法当然是用示波器测试电源的纹波,观察纹波波幅,幅度也以不超过直流电压的2%为宜,或者多测试一下正常时候的波形,建立起电源正常与否的直观感受。

5.png

图5 电源纹波的测试

(2)晶振是否正常?

电路板通电后可以使用万用表或示波器对晶振相应管脚进行测试。对无源晶振,可以使用示波器来测试。注意示波器探头信号衰减开关选择10x档,尽可能减小示波器探头介入对晶振的影响,避免晶振停振引起误判。无源晶振没有输出,有可能是晶振本身的问题,也有可能是晶振管脚外接电容有问题,要留意区分,必要时可通过代换晶振或电容验证。

6.png

图6 示波器探头输入电阻切换开关

有源晶振,也可以使用万用表测试,直接测试晶振信号输出脚的对地电压即可,正常应该是电源电压的一半,如果是电源电压或0V电压,说明晶振已经损坏。

(3)复位是否正常

有些单片机需要高电平复位,有些需要低电平。低电平复位,会在单片机管脚名称上加横线或在前面加“*”号,例如RESET,或者*RESET,高电平复位则没有上横线或“*”号。

高电平复位的单片机,电路板通电后复位脚保持短暂时间的高电平,然后变成低电平。如果通电后用万用表测试复位脚就一定是低电平,如果还是高电平或者有脉冲,说明复位有问题;低电平复位的单片机,电路板通电后复位脚保持短暂时间的低电平,然后变成高电平。如果通电后用万用表测试复位脚就一定是高电平,如果不是高电平或者有脉冲,说明复位有问题。

单片机复位的方式有几种,包括简单的阻容复位,专用复位芯片复位以及受控复位。

7.png

图7 简单阻容复位

如图7所示为简单阻容复位。电路使用一个电阻和电容串联,电路开始通电后,电容和电阻组成的充电回路在电容两端产生的电压有一个上升过程,电压在超过某个阈值后,复位脚实现高电平-低电平切换,或者实现低电平-高电平切换,单片机完成复位过程。另外在电容两端还可以并联手动复位按钮,可以实现手动复位重启。

图8和图9是工控电路板常见的专用复位芯片。

8.png

图8  常用复位芯片MB3771
 9.png

图9 常用复位芯片MAX690A MAX802L

MB3771兼有上电复位和电源电压监测复位功能。系统上电后,复位脚8脚因为内部连接的三极管导通,所以是输出低电平,同时芯片内部恒流源向1脚外接电容充电,充到电容电压超过1.24V后,连接的比较器翻转,输出低电平,三极管截止,复位脚变为高电平,上电复位完成。VCC电压由内部100kΩ和40kΩ电阻分压,分得电压正常情况下高于参考电压1.24V,一旦VCC电压过低,电阻分压也过低,当电压低于1.24V,比较器翻转,控制8脚输出低电平,输出复位信号,当VCC电压过低的情况排除后,复位脚又恢复高电平,完成复位工作,单片机重启。这可以防止因为偶尔电压过低造成的单片机数据混乱,避免单片机程序跑飞,造成死机。另外芯片6脚也可以外接取样电阻,监控其它电压,如果不接取样电阻,可以将6脚接VCC。

图9所示芯片兼具上电复位、电压监控、RAM电压管理功能、看门狗功能。该芯片除了对VCC电压监控以外,还可以对另一个电压进行监控,另一个电压由外电路R1、R2分压输入PFI,如果电压跌落,PFO输出低电平给单片机处理。VOUT电压供给RAM芯片,芯片VCC上电后,VOUT输出电压取自VCC,断电后,电压取自VBATT脚连接的电池。来自单片机的看门狗信号连接芯片的WDI脚,这是每隔一段时间输入一个脉冲信号,用来复位芯片的看门狗计时器,如果单片机死机,看门狗脉冲信号就会丢失,芯片的看门狗计时器超时,就输出复位信号给单片机,单片机重启。

有些单片机的复位信号不是来自专用复位芯片,可能来自另一个单片机或者复杂IC的输出。

检测到单片机复位信号不正常后,就应该追踪复位信号的来源,检测连接的相应芯片及周边,确定最终的原因。

来源:深度工控

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 7

1. C语言和汇编语言在开发单片机时各有哪些优缺点?

答:汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是不同的CPU,其汇编语言可能有所差异,所以不易移植。

C语言是一种结构化的高级语言。其优点是可读性好,移植容易,是普遍使用的一种计算机语言。缺点是占用资源较多,执行效率没有汇编高。

对于目前普遍使用的RISC架构的8bit MCU来说,其内部ROM、RAM、STACK等资源都有限,如果使用C语言编写,一条C语言指令编译后,会变成很多条机器码,很容易出现ROM空间不够、堆栈溢出等问题。而且一些单片机厂家也不一定能提供C编译器。而汇编语言,一条指令就对应一个机器码,每一步执行什幺动作都很清楚,并且程序大小和堆栈调用情况都容易控制,调试起来也比较方便。所以在单片机开发中,我们还是建议采用汇编语言比较好。

如果对单片机C语言有兴趣,HOLTEK的单片机就有提供C编译器,可以到HOLTEK的网站免费下载使用。

2. C或汇编语言可以用于单片机,C++能吗?

答:在单片机开发中,主要是汇编和C,没有用C++的。

3. 搞单片机开发,一定要会C吗?

答:汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是不同的CPU,其汇编语言可能有所差异,所以不易移植。

对于目前普遍使用的RISC架构的8bit MCU来说,其内部ROM、RAM、STACK等资源都有限,如果使用C语言编写,一条C语言指令编译后,会变成很多条机器码,很容易出现ROM空间不够、堆栈溢出等问题。而且一些单片机厂家也不一定能提供C编译器。而汇编语言,一条指令就对应一个机器码,每一步执行什么动作都很清楚,并且程序大小和堆栈调用情况都容易控制,调试起来也比较方便。所以在资源较少单片机开发中,我们还是建议采用汇编语言比较好。

而C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。C语言有功能丰富的库函数、运算速度快、编译效率高、有良好的可移植性,而且可以直接实现对系统硬件的控制。C语言是一种结构化程序设计语言,它支持当前程序设计中广泛采用的由顶向下结构化程序设计技术。此外,C语言程序具有完善的模块程序结构,从而为软件开发中采用模块化程序设计方法提供了有力的保障。因此,使用C语言进行程序设计已成为软件开发的一个主流。用C语言来编写目标系统软件,会大大缩短开发周期,且明显地增加软件的可读性,便于改进和扩充,从而研制出规模更大、性能更完备的系统。

综上所述,用C语言进行单片机程序设计是单片机开发与应用的必然趋势。所以作为一个技术全面并涉足较大规模的软件系统开发的单片机开发人员最好能够掌握基本的C语言编程。

4. 当开发一个较复杂而又开发时间短的项目时,用C还是用汇编开发好?

答:对于复杂而开发时间紧的项目时,可以采用C语言,但前提是要求对该MCU系统的C语言和C编译器非常熟悉,特别要注意该C编译系统所能支持的数据类型和算法。虽然C语言是最普遍的一种高级语言,但不同的MCU厂家其C语言编译系统是有所差别的,特别是在一些特殊功能模块的操作上。如果对这些特性不了解,那调试起来就有的烦了,到头来可能还不如用汇编来的快。

5. 在教学中要用到8088和196芯片单片机教材,请问那里可以找到关于这方面的书或资料?

答:有关这方面的教材,大学里常用的一本是《IBM-PC汇编语言程序设计》清华大学出版社出版的,在网上以及书店都是可以找到的,另外网上还可以搜索到很多其他的教材如:《微机原理及汇编语言教程》(杨延双 张晓冬 等编著 )和《16/32 位微机原理、汇编语言及接口技术》(作者: 钟晓捷 陈涛 ,机械工业出版社 出版)等,可以在较大型的科技书店里查找或者直接从网上订购。

6. 初学者到底是应该先学C还是汇编?

答:对于单片机的初学者来说,应该从汇编学起。因为汇编语言是最接近机器码的一种语言,可以加深初学者对单片机各个功能模块的了解,从而打好扎实的基础。

7. 我是一名武汉大学电子科技大3的学生,学了电子线路、数字逻辑、汇编和接口、C语言,但是总是感觉很迷茫,觉好象什么都不会。怎么办?

答:大学过程是一个理论过程,实践的机会比较少,往往会造成理论与实践相脱节,这是国内大学教育系统的通病,不过对于学生来说切不可好高骛远。一般从大三会开始接触到一些专业课程,电子相关专业会开设相关的单片机应用课程并且会有简单的实验项目,那么要充分把握实验课的机会,多多地实际上机操作练习。平时可以多看看相关的电子技术杂志网站,看看别人的开发经验,硬件设计方案以及他人的软件设计经验。有可能的话,还可以参加一些电子设计大赛,借此机会2--3个人合作做一个完整系统,会更有帮助。到了大四毕业设计阶段,也可以选择相关的课题作些实际案例增长经验。做什么事情都有个经验的积累过程,循序渐进。

8. 请问作为学生,如何学好单片机?

答:学习好单片机,最主要的是实践,在实践中增长经验。在校学生的话,实践机会的确会比较少,但是有机会的话,可以毕业实习选择相关的课题,这样就可以接触到实际的项目。而且如果单片机微机原理是一门主课的话,相信学校会安排比较多的实践上机机会。有能力的话,可以找一些相关兼职工作做做,会更有帮助。而且单片机开发应用需要软硬件结合,所以不能只满足于编程技巧如何完美,平时也要注意硬件知识的积累,多上上电子论坛网站,买一些相关杂志。可能的话,可以到电子市场去买一些小零件,自己搭一个小系统让它工作起来。

HOTLEK的单片机是RISC结构的8位单片机,它可以广泛应用在家用电器、安全系统、掌上游戏等方面。大概来说可以分成I/O型单片机、LCD型单片机、A/D型单片机、A/D with LCD型单片机等等。

9. 如何才能才为单片机的高手啊?

答:要成为单片机高手,应该多实践,时常关注单片机的发展趋势;经常上一些相关网站,从那里可以找到许多有用的资料。

10. 女性是否适合单片机软件编程这个行业?

答:要根据自己的兴趣,配合自己对软件编程的耐性,男女皆适合这个行业。

12. 8位机还能延续多久!

答:以现在MCU产品主力还是在8位领域,主要应用于汽车应用、消费性电子、电脑及PC周边、电信与通讯、办公室自动化、工业控制等六大市场,其中车用市场多在欧、美地区,而亚太地区则以消费性电子为主, 并以量大低单价为产品主流,目前16位MCU与8位产品,还有相当幅度的价差,新的应用领域也仍在开发,业界预计,至少在2005年前8位的MCU仍是MCU产品的主流。

13. 学习ARM及嵌入式系统是否比学习其它一般单片机更有使用前景?对于一个初学者应当具备哪些相关知识?

答:一般在8位单片机与ARM方面的嵌入式系统是有层次上的差别,ARM适用于系统复杂度较大的高级产品,如PDA、手机等应用。而8位单片机因架构简单,硬件资源相对较少,适用于一般的工业控制、消费性家电等等。对于一个单片机方面的软件编程初学者,应以HOLTEK系列或8051等8位单片机来做入门练习。而初学者应当具备软件编程相关知识,单片机一般软件编程是以汇编语言为主,各家有各家的语法,但大都以RISC的MCU架构为主,其中 RISC (Reduced Instruction Set Computer) 代表MCU的所有指令。都是利用一些简单的指令组成的,简单的指令代表 MCU 的线路可以尽量做到最佳化,而提高执行速率。另外初学者要具备单片机I/O接口的应用知识,这在于周边应用电路及各种元器件的使用,须配合自己所学的电子学及电路学等。

14. 符合44PIN的80系列8位单片机的MCU有哪些?

答:符合44PIN的80系列8位单片机有Z8674312FSC、Z86E2112FSC、Z86E2116FSC。

15. 请介绍一下MCU的测试方法。

答: MCU从生产出来到封装出货的每个不同的阶段会有不同的测试方法,其中主要会有两种:中测和成测。

所谓中测即是WAFER的测试,它会包含产品的功能验证及AC、DC的测试。项目相当繁多,以HOLTEK产品为例最主要的几项如下:

接续性测试:检测每一根I/OPIN内接的保护用二极管是否功能无误。

功能测试:以产品设计者所提供测试资料(TEST PATTERN)灌入IC,检查其结果是否与当时SIMULATION时状态一样。

STANDBY电流测试:测量IC处于HALT模式时即每一个接点(PAD)在1态0态或Z态保持不变时的漏电流是否符合最低之规格。

耗电测试:整颗IC的静态耗电与动态耗电。

输入电压测试:测量每个输入接脚的输入电压反应特性。

输出电压测试:测量每个输出接脚的输出电压位准。

相关频率特性(AC)测试,也是通过外灌一定频率,从I/O口来看输出是否与之匹配。

为了保证IC生产的长期且稳定品质,还会做产品的可靠性测试,这些测试包括ESD测试,LATCH UP测试,温度循环测试,高温贮存测试,湿度贮存测试等。

成测则是产品封装好后的测试,即PACKAGE测试。即是所有通过中测的产品封装后的测试,方法主要是机台自动测试,但测试项目仍与WAFER TEST相同。PACKAGE TEST的目的是在确定IC在封装过程中是否有任何损坏。

16. 能否利用单片来检测手机电池的充放电时间及充放电时的电压电流变化,并利用一个I/O端口使检测结果在电脑上显示出来?

答:目前市场上的各类智能充电器,大部分都采用MCU进行充电电流和电压的控制。至于要在电脑上显示,好象并不实用,可能只有在一些专门的电池检测仪器中才会用到;对于一般的手机用户来说,谁会在充电时还需要用一台电脑来做显示呢?要实现单片机与电脑的连接,最简单的方式就是采用串口通讯,但需要加一颗RS-232芯片。

17. 在ARM编程中又应当如何?

答:就以嵌入式系统观念为例,一般嵌入式处理器可以分为三类:嵌入式微处理器、嵌入式微控制器、嵌入式DSP(Digital Signal Processor)。

嵌入式微处理器就是和通用计算机的微处理器对应的CPU。在应用中,一般是将微处理器装配在专门设计的电路板上,在母板上只保留和嵌入式相关的功能即可,这样可以满足嵌入式系统体积小和功耗低的要求。目前的嵌入式处理器主要包括:PowerPC、Motorola 68000、ARM系列等等。

嵌入式微控制器又称为单片机,它将CPU、存储器(少量的RAM、ROM或两者都有)和其它接口I/O封装在同一片集成电路里。常见的有HOLTEK MCU系列、Microchip MCU系列及8051等。

嵌入式DSP专门用来处理对离散时间信号进行极快的处理计算,提高编译效率和执行速度。在数字滤波、FFT(Fast Fourier Transform)、频谱分析、图像处理的分析等领域,DSP正在大量进入嵌入式市场。

18. MCU在射频控制时,MCU的时钟(晶振)、数据线会辐射基频或基频的倍频,被低噪放LNA放大后进入混频,出现带内的Spur,无法滤除。除了用layout、选择低辐射MCU的方法可以减少一些以外,还有什么别的方法?

答:在设计高频电路用电路板有许多注意事项,尤其是GHz等级的高频电路,更需要注意各电子组件pad与印刷pattern的长度对电路特性所造成的影响。最近几年高频电路与数位电路共享相同电路板,构成所谓的混载电路系统似乎有增加的趋势,类似如此的设计经常会造成数位电路动作时,高频电路却发生动作不稳定等现象,其中原因之一是数位电路产生的噪讯,影响高频电路正常动作所致。为了避免上述问题除了设法分割两电路block之外,设计电路板之前充分检讨设计构想,才是根本应有的手法,基本上设计高频电路用电路板必需掌握

下列三大原则:

高质感。

不可取巧。

不可仓促抢时间。

以下是设计高频电路板的一些建议:

(1)印刷pattern的长度会影响电路特性。尤其是传输速度为GHz高速数位电路的传输线路,通常会使用strip line,同时藉由调整配线长度补正传输延迟时间,其实这也意味着电子组件的设置位置对电路特性具有绝对性的影响。

(2)Ground作大better。铜箔面整体设置ground层,而连接via的better ground则是高频电路板与高速数位电路板共同的特征,此外高频电路板最忌讳使用幅宽细窄的印刷pattern描绘ground。

(2)电子组件的ground端子,以最短的长度与电路板的ground连接。具体方法是在电子组件的ground端子pad附近设置via,使电子组件能以最短的长度与电路板的ground连接。

来源:单片机与嵌入式学堂

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 12

你可能觉得单片机没啥技术含量,但事实是单片机涵盖的技术非常之多,从底层到应用,应该没有一个人能熟练掌握其中所有的技术。

这里就站在面试的角度来说说:单片机工程师面试常见问题。

1、单片机上电之后不运行,可能的原因有哪些?

可能的原因包括供电问题(如VCC电压偏离正常范围)、晶振问题(如晶振损坏或未起振)、RESET引脚电平逻辑错误(如一直处于复位状态)、程序下载或擦除问题(如flash无法下载或损坏)以及控制程序问题(如程序存在bug)。

2、看门狗定时器的作用?

看门狗定时器(Watchdog Timer)在嵌入式系统中用于监控和重置系统,以防止因软件故障导致的系统崩溃。它通过定时检查系统是否正常运行,并在超时后触发系统重置,从而提高系统的可靠性和稳定性。

3、单片机中断处理流程是怎样的?

单片机中断处理流程通常包括三个步骤:中断响应、中断处理和中断返回。

当中断发生时,中断系统通过硬件自动生成长调用指令(LACLL),将断点地址压入堆栈保护,并将对应的中断入口地址装入程序计数器PC,使程序转向该中断入口地址执行中断服务程序。中断服务程序完成后,计算机通过中断返回指令RE将断点地址从堆栈中弹出,返回到程序计数器PC,并通知中断系统已完成中断处理。

4、解释一下进程、线程、协程的概念

进程:进程是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。

线程:线程是进程的一个执行单元,是进程内科调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。

协程:是一种比线程更加轻量级的存在。一个线程也可以拥有多个协程。其执行过程更类似于子例程,或者说不带返回值的函数调用。

1730777435142322.jpg

5、什么是嵌入式系统?

嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪的专用计算机系统。它适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的场合。嵌入式系统通常由处理器、存储器、输入输出设备、软件等组成,具有体积小、功耗低、可靠性高、功能专用等特点。

6、C语言中堆和栈的区别是什么?

堆和栈是C语言中用于存储数据的两种不同区域。栈由系统自动分配和管理,通常用于存储局部变量和函数调用时的临时数据;而堆需要程序员自己申请和释放,通常用于存储动态分配的数据。两者在存储内容、管理方式、空间大小、能否产生碎片、生长方向、分配方式和分配效率等方面都存在差异。

7、请简单说下嵌入式系统中的RTOS调度策略

RTOS(实时操作系统)的调度策略包括基于优先级的调度、轮询调度、时间片轮转调度等。这些策略直接影响系统的实时性和效率,确保任务能够按照预定要求得到执行。

8、你如何保证单片机代码的质量和可靠性?

在单片机项目中,我通常会采取以下措施来保证代码的质量和可靠性:首先,我会对代码进行严格的测试和验证,包括单元测试、集成测试和系统测试等;其次,我会遵循良好的编程规范和代码风格,以提高代码的可读性和可维护性;最后,我会定期回顾和更新代码,以消除潜在的错误和漏洞。

9、程序的局部变量、全局变量和动态申请数据分别存在于哪里?

局部变量存在于栈区。全局变量存在于静态区(数据段)。动态申请的数据存在于堆区。

10、在C语言中,如何实现链表?请举例说明。

链表是一种动态数据结构,由节点组成,每个节点包含数据部分和指向下一个节点的指针。

在C语言中,可以通过结构体和指针来实现链表。例如,单链表的节点可以定义为:

struct Node 
{    
    int data;    
    struct Node* next;
};

然后通过动态分配内存和设置指针来构建链表。例如,创建一个新的节点并插入到链表的开头:

struct Node* head = NULL;
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = 10;
newNode->next = head;head = newNode;

由于篇幅有限,今天就分享这些,其实还有很多很多,大家面试之前,尽量先刷一波面试题。

来源:strongerHuang

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 33

开发人员可利用PIC16F13145系列单片机中的可配置逻辑模块(CLB)外设实现硬件中复杂的分立逻辑功能,从而精简物料清单(BOM)并开发定制专用逻辑。

Microchip Technology Inc.
 8
位单片机业务部应用工程师
Robert Perkel

在许多嵌入式系统应用中,通常都会使用分立式逻辑器件,例如74'HC系列。这些逻辑器件的优势在于可以独立于单片机(MCU)工作,并且响应速度比软件快得多。但是,这些器件会增加物料清单(BOM)并且需要占用额外的PCB面积。

为了解决这一问题,Microchip的许多单片机都集成了一种名为可配置逻辑单元(CLC的外设(在PIC® MCU上)或名为可配置定制逻辑(CCL的类似外设(在AVR® MCU上)。这两种外设都实现了软件定义的定制逻辑,可以独立于CPU执行。换句话说,一旦设置了定制逻辑功能,其行为就独立于单片机。

但是,这两种外设存在限制,即每个实例的逻辑数量非常小。每个CLC大约相当于一个查找表(LUT),而CCL相当于一个内部具有几个独立LUT的实例。这两种外设的功能非常强大,可用于开发简单逻辑电路、将各种信号混合在一起以及与其他硬件外设相集成。例如,硬件按钮去抖WS2812输出生成正交解码这些示例都需要使用这两种外设,但单片机中这两种外设的数量并不多,因此限制了应用的复杂度。

为了支持更复杂的应用,PIC16F13145系列单片机引入了一种名为可配置逻辑模块(CLB的新型逻辑外设(如图1所示)。请注意,CLB并不会取代CLCCCL外设,器件可以同时配备CLC/CCLCLB

1—— CLB框图

1.jpg

PIC16F13145系列单片机上的CLB包含四个逻辑组,每组包含八个BLE。不同逻辑组的BLE之间彼此连接——每个逻辑组代表两个GPIO输出和一个可选的CPU中断。当工作电压为5.5V时,BLE的传播时间典型值小于6 ns。整个结构中的所有BLE共用一个公共时钟,其时钟源与可选的时钟分频器一起在软件中进行配置。CLB可以使用单片机的内部时钟源之一或外部提供的时钟源。

该外设从单片机的存储器中进行初始化,之后可通过外设引脚选择(PPS)直接从自身结构中控制引脚。用户可通过PPS重新分配用于硬件外设的I/O引脚,从而获得更大的设计灵活性。举例来说,如果SPI时钟先前使用RA1,但使用RA6会更有利,那么便可以通过PPS重新映射引脚。

CLB中的其他元件包括专用的3位硬件定时器(带解码输出)、用于输入信号的边沿检测器以及32位输出寄存器(用于调试)。单片机上的其他独立于内核的外设(CIP)输出可用作CLB的输入,以便实现更复杂的设计。

由于CLBCLCCCL复杂得多,因此Microchip开发了一款名为CLB合成器的新工具。CLB合成器提供了一个用于配置逻辑的图形界面,如下面的图2所示。除了逻辑原语之外,该工具还支持更高级的逻辑模块库(可由用户预先提供或定制)。

与该图形工具交互时,后台会自动生成一个Verilog模块用于合成。如果开发人员更喜欢编写自己的Verilog或者已准备好该文件,则可以将其作为模块直接导入工具。

2——已打开相移键控(PSK)示例的CLB合成器

2.png

CLB合成器的输出是一个汇编文件,其中包含用于设置CLB的比特流和一些用于将CLB配置为外设的源代码。该工具可通过MPLAB®代码配置器(MCC)或独立在线工具运行。MCC是一款代码生成实用程序,允许用户使用可视化界面来设置和配置单片机中的外设。当硬件外设完成配置后,MCC将生成初始化代码和器件API

在运行时,使用板上硬件直接从程序存储器加载CLB比特流。这种实现的好处在于如果在程序运行时需要更改CLB配置,则可以使用存储在器件存储器中的不同比特流重复执行加载过程。

为了演示CLB的应用,我们创建了一系列用例示例。这里我们将讨论两个示例:7段显示转换器SPIWS2812转换器。用例示例可作为构件复制以用作完整解决方案的一部分。这里旨在展示该外设的实用性以及它能够为设计带来哪些价值。

第一个用例是7段显示转换器7段显示器可通过一组普通的I/O引脚驱动,但标准实现通常需要使用软件定义的查找表将输入数字转换为适合显示器的正确输出模式。在该实现中,CLB充当硬件查找表。所需的输出字符(0F)从软件加载到CLB输入寄存器中。显示器的每个输出段均由LUT控制,以将输入映射到输出。

该用例示例在内部用于构建计时系统的新控制板。最初的用户界面是在20世纪80年代使用74'HC系列逻辑开发。使用CLB后,一个20引脚的单片机即可实现电路板上的显示和键盘逻辑,极大地精简了物料清单(BOM)。图3并排给出了两种方案以供比较。

3——原PCB与新PCB的并排比较。该示例由Josh Booth开发。

4.jpg

下一个示例是SPIWS2812转换器WS2812是一种单线串行协议,用于通过脉宽调制控制LED阵列。在本例中,SPI硬件用作要发送到LED的数据的移位寄存器,而CLB用于将SCLKSDO转换为预期的输出。

在本例中,这是通过单触发3位计数器、带使能功能的D锁存器和4输入LUT来实现,如下面的图4所示。该实现的技巧体现在SPICLB的时钟源。SPI时钟设置为空闲高电平、在上升沿改变状态并以WS2812输出的频率(800 kHz)运行,而CLB的时钟源以前者10倍的频率(8 MHz)运行。当SCLK为低电平时,将触发3位计数器并开始计数。当计数到70b111)时,3位计数器将停止并保持为0,直到时钟脉冲的下一个低电平周期为止。

计数器的输出与输出数据的锁存版本一起馈入4输入LUT。这将设置数据的输出模式,如图4的右侧所示。计数器复位后,计数器输出将保持为0以完成循环。之后,可根据需要发送SPI硬件中的下一个字节,重复该循环。

4——SPIWS2812转换器框图(由Petre Teodor-Emilian开发)

5.png

这两个示例都证明了单片机内部分立逻辑的优势。硬件外设可将CPU从各种任务中解放出来,从而缩短响应时间并降低功耗,同时减少元器件数量。有了CLB,之前无法在单片机内部实现的复杂应用现在都可以顺利开发。目前,可前往Microchip直销网站或其他代理商处购买PIC16F13145系列单片机来获取CLB

Robert Perkel是Microchip的一名应用工程师。他主要负责编辑应用笔记,投稿文章和视频等技术内容,以及分析外设的用例和开发代码示例与演示。Perkel毕业于弗吉尼亚理工大学,获得了计算机工程理学学士学位。

围观 21

晶振在单片机中是必不可少的元器件,只要用到CPU的地方就必定有晶振的存在,那么晶振是如何工作的呢?

什么是晶振    

晶振一般指晶体振荡器,晶体振荡器是指从一块石英晶体上按一定方位角切下的薄片,简称为晶片。    

石英晶体谐振器,简称为石英晶振(Crystal oscillator),如下图椭圆物体。    

1730443392530964.png

而在封装内部添加IC组成振荡电路的晶体元件称为晶体振荡器。其产品一般用金属外壳封装,也有用玻璃壳、陶瓷或塑料封装的。

晶振工作原理    

石英晶体振荡器是利用石英晶体的压电效应制成的一种谐振器件,它的基本构成大致是:从一块石英晶体上按一定方位角切下薄片,在它的两个对应面上涂敷银层作为电极,在每个电极上各焊一根引线接到管脚上,再加上封装外壳就构成了石英晶体谐振器,简称为石英晶体或晶体、晶振。其产品一般用金属外壳封装,也有用玻璃壳、陶瓷或塑料封装的。    

若在石英晶体的两个电极上加一电场,晶片就会产生机械变形。反之,若在晶片的两侧施加机械压力,则在晶片相应的方向上将产生电场,这种物理现象称为压电效应。    

2.jpg

如果在晶片的两极上加交变电压,晶片就会产生机械振动,同时晶片的机械振动又会产生交变电场。    

在一般情况下,晶片机械振动的振幅和交变电场的振幅非常微小,但当外加交变电压的频率为某一特定值时,振幅明显加大,比其他频率下的振幅大得多,这种现象称为压电谐振,它与LC回路的谐振现象十分相似。它的谐振频率与晶片的切割方式、几何形状、尺寸等有关。相关推荐:在MCU晶体两边各接一对地电容的原因。    

当晶体不振动时,可把它看成一个平板电容器称为静电电容C,它的大小与晶片的几何尺寸、电极面积有关,一般约几个皮法到几十皮法。当晶体振荡时,机械振动的惯性可用电感L来等效。    一般L的值为几十豪亨到几百豪亨。晶片的弹性可用电容C来等效,C的值很小,一般只有0.0002~0.1皮法。晶片振动时因摩擦而造成的损耗用R来等效,它的数值约为100欧。    

由于晶片的等效电感很大,而C很小,R也小,因此回路的品质因数Q很大,可达1000~10000。加上晶片本身的谐振频率基本上只与晶片的切割方式、几何形状、尺寸有关,而且可以做得精确,因此利用石英谐振器组成的振荡电路可获得很高的频率稳定度。    

计算机都有个计时电路,尽管一般使用“时钟”这个词来表示这些设备,但它们实际上并不是通常意义的时钟,把它们称为计时器可能更恰当一点。    

计算机的计时器通常是一个精密加工过的石英晶体,石英晶体在其张力限度内以一定的频率振荡,这种频率取决于晶体本身如何切割及其受到张力的大小。有两个寄存器与每个石英晶体相关联,一个计数器和一个保持寄存器。    

石英晶体的每次振荡使计数器减1。当计数器减为0时,产生一个中断,计数器从保持寄存器中重新装入初始值。这种方法使得对一个计时器进行编程,令其每秒产生60次中断(或者以任何其它希望的频率产生中断)成为可能。每次中断称为一个时钟嘀嗒。

晶振在电气上可以等效成一个电容和一个电阻并联再串联一个电容的二端网络,电工学上这个网络有两个谐振点,以频率的高低分其中较低的频率为串联谐振,较高的频率为并联谐振。    

由于晶体自身的特性致使这两个频率的距离相当的接近,在这个极窄的频率范围内,晶振等效为一个电感,所以只要晶振的两端并联上合适的电容它就会组成并联谐振电路。    

这个并联谐振电路加到一个负反馈电路中就可以构成正弦波振荡电路,由于晶振等效为电感的频率范围很窄,所以即使其他元件的参数变化很大,这个振荡器的频率也不会有很大的变化。    

晶振有一个重要的参数,那就是负载电容值,选择与负载电容值相等的并联电容,就可以得到晶振标称的谐振频率。    

一般的晶振振荡电路都是在一个反相放大器的两端接入晶振,再有两个电容分别接到晶振的两端,每个电容的另一端再接到地,这两个电容串联的容量值就应该等于负载电容,请注意一般IC的引脚都有等效输入电容,这个不能忽略。    

一般的晶振的负载电容为15皮或12.5皮,如果再考虑元件引脚的等效输入电容,则两个22皮的电容构成晶振的振荡电路就是比较好的选择。

来源:STM32嵌入式开发

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 29

学单片机,串口、I²C、SPI等这些常用外设接口是必学的一项,相信很多读者都使用过类似AT24C0x这种使用I²C读写的EEPROM,在项目中,使用不当就容易导致数据丢失,或者异常的情况。

今天就来讲讲单片机I²C驱动EEPROM常见注意事项。

1、I²C读写EEPROM基础原理

市面上大部分使用I²C通信的EEPROM,控制时序和读写流程都基本相同。

I²C通信原理,说简单不简单,但说难也不难,主要理解基础原理和时序即可。

2、EEPROM底层驱动

真正实际做过项目的人都知道,好的底层驱动,会给上层应用开发带来很大便利,节省开发时间,以及减少bug发生率。

而大部分初学者,或者应届毕业生从事相关开发,一般很少考虑代码的移植性,复用性,或者说容错处理等问题。

下面,我简单列两点我在项目中,对EEPROM常用的几项操作。

1)写,再读,验证写入成功

这种方法很好理解:写入之后,再次读去这部分数据,进行一一匹配,验证是否与写入数据一致。

一般我是会重复操作3次,也就是说:写入,再读取,如果超过3次都还失败,那么我则放弃写入,认为写入失败,或芯片异常。

这个方法可以简单解决因异常导致写入失败的问题。

2)添加校验信息

在上面一层读验证基础上,对保存一些参数,我一般还会:在参数末尾添加类似“和校验”,或“CRC校验”。

假如你连续存储一个有10字节的参数(数据结构),如果因异常修改了中间某一个字节参数,你读出来进行校验,发现不对,则认为这个参数无效。

添加这个校验的目的相信从上面我举例已经明白,就是解决多字节参数中某个字节被恶意修改,导致这个参数无效的问题。

3)EEPROM在多任务中添加互斥锁

使用过操作系统的朋友都知道,多线程访问一个资源,一般都存在互斥的关系。简单的说:一个资源,在同一时刻,只能被一个线程操作。

那EEPROM举例:线程A在往EEPROM写10字节数据,刚6个字节时,线程B想要抢占,往EEPROM写入数据。你觉得线程A应不应该放弃I2C总线,让线程B写入呢?

答案肯定是不允许的,所以,就有了互斥锁这么一说。也就是等先占用I2C总线的线程操作完,才释放总线,让其他线程进行操作。

这三点应该是我比较常用了,网上还有其他一些相关的容错处理机制,感兴趣的不妨搜索一下。

我这里就不贴代码了,因芯片型号不同,应用不同,代码就存在差异。但我们目的:在保证满足应用的同时,需考虑代码的移植、复用、以及容错。

3、I²C选择硬件、软件?

我们代码应该使用硬件I2C?还是软件模拟I2C?

这个问题有许多朋友都在问,说句实话,遇到这类有争议的问题,一般来说,需要结合项目实际情况,比如速度、实时性、移植性等。

我遇到这类问题,一般会根据实际情况而定。比如:你的I2C产品要提供给一些不同平台用户,进行二次开发,我觉得软件IO模拟比较好,方便用户嘛。

假如你们公司开发的产品都使用STM32这家公司芯片开发I2C产品,我觉得,你代码可以使用硬件I2C。

来源:strongerHuang

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 32

方案一、

先上一个低功耗的一键开关机电路,该电路的特点是关闭时所有三极管全部几乎不耗电。

1.png

原理很简单:

利用Q10的输出与输入状态相反(非门)特性和电容的电流累积特性。刚上电时Q6和Q10的发射结均被10K电阻短路所以Q6和Q10均相同,此时实测电流消耗电流仅为0.1uA,L_out输出高,H_out输出低。此时C3通过R22缓慢充电等于最终VCC电压,当按下S3后C3通过R26给Q10基极电流,Q10迅速用水,Q6也因此水,H_out等于高电平,当C3放电到Q10be结压降0.7V左右时C3不再放电,此时若按键弹开C3将进一步放电到Q10的串联压降0.3V左右,当再次按下S3,Q10即立即。

该电路可以完美解决按键开关和长按按键跳档发生的问题,开关状态跳转只在按键接触的瞬间,之后就扁平了按键存在接近或长按按键的情况开关状态不会受到影响。这是因为R22的电阻很大(相对R23,R26,R25)当C3电容的电压稳定后,R22远会改变Q10的开关状态, R22要能改变Q10的状态必须要等S3弹开后C3将流过R22的小电流累积储存,之后再通过S3的瞬间接触快速大电流释放从而改变Q10的状态。

非低功耗的三极管一键开关机电路:

2.png

该电路的原型来自互联网,参数有调整,原理和第一个低功耗电路类似在此不再赘述。电路都深入了解之后再看本帖的主题一键三档电路:

3.png

这个电路实际上就是本帖前两个电路的融合,可以实现低功耗功耗和1档、2档、关机等3个档位。上电之初由于Q1、Q4、Q5的结都并联了电阻,所有三极管都需电路因此低功耗,C3开始充电到VCC电压。按下当S1后,Q5水,同时Q1也因此水渠,L_out1堰塞低水位Q4堰—>Q3堰塞、Q2堰塞,C3排水为0.3V(Q5的堰塞压降)左右。再次按下S1,Q5堰塞湖L_out1高水位—>Q2堰塞堰,Q4堰塞L_out2输出低电平,由于R4和C1的延迟作用Q3会延迟灌溉,可以保证Q2完全充足后Q3基极才会为低电平,因此Q2,Q3都不会灌溉。当再次按下S1,Q5时由信号达到缓冲器L_out1再次低电平—>Q2阻塞(同时Q4中断),Q3阻塞延迟—>Q1输出,电路输出进入状态。

方案二、

其中所用的一键开关机电路分析如下:

4.jpg

电路过程如下:

A、按键瞬间,Q2、Q1导通,7805输入电压在8.9V左右,7805工作,输出5V电压给单片机供电。

B、单片机工作后,将最先进行IO口初始化,IO1设为输入状态,启用内部上拉;IO2设为输出状态,输出高电平。接下来Q2、Q3通导,LED1发光,7805能够正常工作,单片机进入工作状态。

C、当按键再次按下时,检测IO1电平为低电平,单片机可以通过使IO2输出低电平,Q2、Q3不导通,此时7805输入电压几乎为0,单片机不工作,系统关闭。

方案三、

电路图

5.jpg

原理很简单,Q1、Q2组成双电路。由于C1的作用,上电的时候Q1先导通,Q2先导通,如果没有按下按钮,电路将维持这个状态。Q3为P沟道增强型MOS管,因为Q2本身,Q3也同样,系统得不到电源。  

此时Q1的集电极为低电平0.3V左右,C1上的电压也为0.3V左右,当按下按键S1后,Q1基极被C1拉到0.3V,迅速。Q2开始导通,电路的状态发生跳跃,Q2导通以后将Q3的门极拉到低电位,Q3导通,电源通过Q3给系统供电。  

Q2导通后,C1通过R1、R4充电,电压上升到1V左右,此时再次按下按键,C1的电压加到Q1基极,Q1导通,Q1集电极为低电平,通过R3强迫Q2起始,Q3也起始,系统关闭。整个开关机的过程就是这样。 

如果要求该电路的静态功耗低,可以全部采用MOS管,成本要高点,电路如下图,原理都是一样的,双倍电路,就不分析了。

方案四、

電路

6.jpg

单键实现单片机开关机 

1、控制流程,按下按键,Q1导通。单片机通电复位,进入工作。 

2、检测K-IN是否为低电平,否不处理。是单片机输出K-OUT为高电平,Q2导通,旁通长按。LED背光亮。

3、放开按键,K-IN经过上拉电阻,为高电平。单片机可以正常工作。

4、在工作期间,按键按下,K-IN为低电平,单片机检测到长按1,K-OUT输出低电平,Q2右边。LED滑块。放开按钮,Q1右边,单片机断电。 

5、通过软件处理,可以实现短按开机、长按关机。

单片机用PIC16F84A,通过简单的程序演示,验证此电路的吸声。

此电路如果这样用,是说明不出它的优点,用途开关电源控制,控制光耦。可以实现关断电原,实现零功耗。有些打印机上就是用这种电路。

方案四:下面是用CD4013构建的电路

7.png

CD4013电路关断时已经把后面电路关断了,而4013本身的电源不需要关断,COMS电路静态工作电流极少,1uA以下,可以忽略不计。

用4013的电路对电源范围适用广,3~18V都没问题,电路唯一需要调整的就是根据电源电压和负载电流适当更改R1的值。

开关管也可以用MOSFET,效果更佳。

一、继电器方式:

8.png

1、ON按下之前,电容C1充电电压到达5V,三极管Q1工作,Q2不工作,继电器也不工作,无输出;

2、ON按键,Q2开始工作,继电器工作,RL1线路切换,Power OUT输出电压,系统电源启动,启动后A输出高电平,D3灯常亮,A点电压高来维持Q1、Q2工作保证继电器一直工作状态;

3、OFF按下时,Q1不工作,Q2不工作,C1开关,继电器断开,树派莓强制断电;

4、另一种情况,当软OFF按下时,由于A一直输出高,所以B口检测到电平变化是由低变高,告诉系统要执行关机操作,系统关机后A输出低,Q1,Q2所需要的工作电平有C1来提供,等C1放电结束后,Q1,Q2不工作,继电器断开,系统断电。

二、PMOS方式:

9.png

1、K1按下之前,Q1断开,电源无输出;

2、按下K1,B点电压拉低,Q1导通,Power_out有电压输出,后面的系统来控制POWER_ON/PFF输出高电平,Q2导通,则B点为低,Q1一直导通工作;

3、POWER_CHECK检测到电平一直是高电平,说明Q1一直是导通的,电源开关正常工作;

4、当再次按下K1时,POWER_CHCK为低电平,系统检测到电平的变化后,只需将POWER_ON/OFF输出为低电平,则Q2关断;

5、初始化K1后,B点电压为高,Q1关断,系统断电。

三、与非门加继电器方式:

10.png

1、由于4管脚处接的是上拉电阻,所以4出为高水平;

2、建设5处为低,则6处输出高,Q1不工作,A、B断开,1、2管脚为高,则3为低一直保持5脚为低;

3、K1按下,则5脚变成高,6脚位低,Q1工作,AB导通,1、2管脚为低,则3为高一直保持5脚位高,继电器保证一直工作;

4、再次按下K1时,5脚变为低电平,6脚为高,Q1不起作用,1、2脚为高,3脚为低;

5、其中的R5、C2构成了按键的RC延迟电路,时间为1/RC。

四、双稳态电路:

11.png

1、Q2,Q3组成双电路。由于C1的作用,上电时给C1充电,所以Q2的基级(D点)会首先变成高,Q2先导通,Q3单独,Q1不导通, VCC_OUT输出0V;

2、Q2导通此时集电级(C点)的电压为低电平大约0.3V左右,C1上的电压也为0.3V左右;

3、当按下K1后,Q2的基级(D点)电压被C1拉到0.3V,Q2迅速初始化,Q3开始导通,电路的状态反生翻转,Q3导通后Q1的门级(B)点)拉至低电位,Q1导通,VCC_OUT输出5V;

4、Q3导通后,C1通过R1,R3充电,电压上升到1V(0.3v+0.7v)左右即F点电压;

5、此时再次按下K1,C1的电压加到Q2的基级(D点),Q2导通,Q2的集电级(C点)为低电平0.3V左右,通过R4强迫Q3初始化, Q1也同样,系统关闭。

来源:硬件攻城狮

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 121

随着物联网的快速发展,嵌入式设备终端联网已经是常态了,众多MCU厂商已经考虑到这个问题,因此很多MCU都集成了以太网 (ETH)控制器。

终端设备需要联网,仅MCU集成以太网控制器还不能联网,在应用时需搭配外部的以太网PHY芯片。
本文以瑞萨高性能32位RX72M系列单片机为例,给大家讲述一下单片机和PHY芯片连接时的注意事项。

一、所需引脚定义

首先,RX72M和PHY芯片整体的连接关系如下图所示:

1.png

图1  RX72M和PHY-LSI连接示例

由于RX72M具备两个ESC端口,因此需要连接两颗PHY芯片。

对于每个PHY芯片,和RX72M连接时用到的引脚如下:

2.png

图2  每个PHY芯片和RX72M引脚的连接

注:*的值为0或1。

两个PHY芯片共同连接到RX72M的引脚如下:

3.png

图3  两个PHY芯片和RX72M连接时共用的引脚

注:MDIO引脚需增加4.7K上拉电阻。

二、PHY接口模式选择

每个PHY芯片的Power on strapping要求不尽相同,由于RX72M ESC仅支持MII模式,因此引脚配置请参考MII对应的要求(下表中黄色高亮的部分):

4.png

图4  PHY芯片 Power on strapping - Mode Config

三、PHY地址配置

对于MCU和PHY芯片通信来说,PHY芯片地址是非常重要的参数。由于RX72M具备两个ESC端口,因此需要通过地址对两颗PHY芯片进行区分。此情况下,00b地址不可用。请从下表中的3种可选项中选取任意两个。

5.png

图5  PHY芯片 Power on strapping – Phy Address

由于需要利用两颗LED分别指示PHY芯片的Link和Activity状态,因此将Pin 10 RXD1设定为LED Mode,如下图所示:

6.png

图6  PHY芯片 Power on strapping – Wake On LAN Selection

四、系统设计流程

有了前面的基础信息,我们可以按照以下的步骤进行系统设计。

01、选取板上两颗PHY芯片的Phy Address,由此决定LED/PHYADD0和LED1/PHYADD1的初始电平。

02、依据Phy Address决定LED的有效驱动电平,设计RJ45接口电路。下图是RJ45的参考设计,保留了充分的冗余设计,可适配不同Phy Address选项。

7.png

图7  RJ45部分参考设计

03、以LED0(Green)表示Link Status,LED1(Yellow)表示Activity Status为例,不同的Phy Address选项下,对应了不同的电阻配置,参考下表中的说明调整RJ45中电阻的焊接/不焊接配置。

8.png

图8  Phy Address和电阻设定对照表

04、对照硬件设计,需要在RX72M Project的Smart Configurator中进行Phy Address和Link Signal Polarity设定,下图以Phy Address分别为2和3时的设定值。注意,Phy Address的低位(bit 0)决定了Link Signal Active Level。具体地说,如果bit 0为0,则表示上电时该引脚电平已为低,则PHY芯片Link起来时,该引脚电平会变高,因此Link Signal Active Level应设定为Active-High。bit 0为1时则刚好相反。

9.png

图9  PHY Address和Link Signal Polarity设定方式

五、软件引脚初始化

最后,需要在RX72M代码(r_ecat_setting_rx72m.c中函数esc_init())中增加对PHY芯片初始化的配置,使得PHY芯片按照设定的模式工作。

//配置phy0
write_phyreg((ECAT_CFG_CH0_PHY_ADDRESS - ECAT_CFG_PHY_OFFSET_ADDRESS), 0x1e, 0x40C0); // EXT 40C0
write_phyreg((ECAT_CFG_CH0_PHY_ADDRESS - ECAT_CFG_PHY_OFFSET_ADDRESS), 0x1f, 0x0030);
write_phyreg((ECAT_CFG_CH0_PHY_ADDRESS - ECAT_CFG_PHY_OFFSET_ADDRESS), 0x1e, 0x40C0);
write_phyreg((ECAT_CFG_CH0_PHY_ADDRESS - ECAT_CFG_PHY_OFFSET_ADDRESS), 0x1e, 0x40C3); // EXT 40C3
write_phyreg((ECAT_CFG_CH0_PHY_ADDRESS - ECAT_CFG_PHY_OFFSET_ADDRESS), 0x1f, 0x0320);
write_phyreg((ECAT_CFG_CH0_PHY_ADDRESS - ECAT_CFG_PHY_OFFSET_ADDRESS), 0x1e, 0x40C3);
//configuration for phy1
write_phyreg((ECAT_CFG_CH1_PHY_ADDRESS - ECAT_CFG_PHY_OFFSET_ADDRESS), 0x1e, 0x40C0); // EXT 40C0
write_phyreg((ECAT_CFG_CH1_PHY_ADDRESS - ECAT_CFG_PHY_OFFSET_ADDRESS), 0x1f, 0x0030);
write_phyreg((ECAT_CFG_CH1_PHY_ADDRESS - ECAT_CFG_PHY_OFFSET_ADDRESS), 0x1e, 0x40C0);
write_phyreg((ECAT_CFG_CH1_PHY_ADDRESS - ECAT_CFG_PHY_OFFSET_ADDRESS), 0x1e, 0x40C3); // EXT 40C3
write_phyreg((ECAT_CFG_CH1_PHY_ADDRESS - ECAT_CFG_PHY_OFFSET_ADDRESS), 0x1f, 0x0320);
write_phyreg((ECAT_CFG_CH1_PHY_ADDRESS - ECAT_CFG_PHY_OFFSET_ADDRESS), 0x1e, 0x40C3);

以上就是单片机RX72M单片机和PHY芯片连接时的注意事项,希望对你平时开发有所帮助。

来源:瑞萨嵌入式小百科

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 36

在电子和嵌入式系统的世界里,单片机(MCU)和Arduino都是极为重要的组成部分。虽然它们的功能在某些方面有所重叠,但存在本质的差异使它们适用于不同的应用场景。本文将从定义、核心组件、应用、优点以及适用场景等方面探讨单片机和Arduino之间的主要区别。

1、什么是单片机?

单片机,或称微控制器单元(MCU),是一种小型计算机,它将一个微处理器(CPU)、内存(RAM和ROM)、输入/输出端口和支持外围设备的其他功能集成在一个单一的集成电路(IC)芯片上。与个人电脑或服务器等更为复杂的计算机系统相比,单片机设计得更为简单和专一,主要用于控制其他设备或执行特定的计算任务。

☆ 单片机的核心组件:

  • 处理器(CPU):

    CPU是单片机的大脑,负责处理所有的计算和逻辑操作。单片机的CPU通常具有较低的时钟速率,这意味着它们在每秒内执行的操作次数较少,从而减少能耗。

  • 内存:

    随机访问存储器(RAM):用于临时存储数据和程序运行时的变量。

    只读存储器(ROM):通常包括非易失性的程序存储器,存储单片机的固件或程序代码。

  • 输入/输出端口:

    这些端口允许单片机与外部设备如传感器、马达和其他电子组件进行通信。端口可以是数字的或模拟的,使单片机能够处理各种类型的信号。

  • 外围设备:

    包括定时器、计数器、模数转换器(ADC)、数模转换器(DAC)等,这些都是集成在单片机内部,用于执行特定功能,从而减少外部硬件需求。

☆ 单片机功能和应用:

单片机主要用于自动控制系统,如家用电器、办公机械、个人设备、汽车电子系统等领域。它们通常是响应外部事件或数据来执行特定任务,例如读取传感器数据、控制电机的速度、打开或关闭开关等。

☆ 优点:

  • 成本效益:集成度高,减少了外部组件的需求,降低了系统成本。

  • 功耗低:适用于便携式设备或远程监控系统,其中电源可能受限。

  • 尺寸小:集成度高使得单片机非常紧凑,适合空间受限的应用。

总之,单片机提供了一种经济、高效的解决方案,用于自动化和控制相关的应用,尤其适合对成本、空间和功耗有严格要求的场合。

2、什么是Arduino?

Arduino是基于单片机的开源电子原型平台,包括硬件(各种型号的Arduino板)和软件(Arduino IDE)。它为初学者和爱好者提供了一个易于使用的环境,通过预先制作的库和简单的编程语言(基于C/C++),使用户能够快速进行项目开发和迭代。
☆ 核心特点

  • 易用性:提供友好的开发环境和大量的学习资源。

  • 社区支持:庞大的社区为新手提供帮助、共享代码和教程。

  • 扩展性:通过Shields(扩展板)和各种传感器轻松扩展功能。

☆ 应用

Arduino适合教育、原型设计和DIY项目,尤其是在快速开发和测试新概念方面表现出色。

3、区别总结

目标用户:单片机通常面向专业的电子工程师和产品开发者,而Arduino更适合教育者、学生和电子爱好者。

技术门槛:单片机的使用和开发需要更深的电子和编程知识,Arduino则大大降低了这一门槛。

性能和灵活性:单片机在性能上通常优于Arduino,提供更多的定制化和优化选项,而Arduino则在易用性和快速开发上有优势。

通过了解单片机和Arduino的不同,用户可以根据项目需求、预算和个人经验选择最适合自己的平台。两者虽各有千秋,但选择正确的工具可以大大提高项目成功的可能性。

*本文来源网络整理与ChatGPT

围观 69

不少初学者都有这么一个疑问:

  • 8位单片机定义一个 int 型变量,占几个字节?

  • 32位单片机定义一个 char 型变量,占几个字节?

有很多人工作几年的工程师都不知道具体占多少字节,其实通过手动验证一下就知道了。

今天结合Keil C51(AT89C51),以及Keil MDK(STM32)为大家验证一下 char、short、int、float、double 到底占几字节空间。

Keil C51、8位单片机

这一节基于Keil C51工具,8位单片机(AT89C51)进行测试。

1.png

//char a;

void main(void)
{  
    while(1)  {  }
}

这是一个很简单的Demo,只针对变量占用空间大小进行测试,主要是对比 data 的大小,初始值为9。(其中系统【启动文件】占用了9字节RAM空间)

1.char占1字节

定义变量:

char a;

编译结果:

Program Size: data=10.0 xdata=0 code=17

2.png

2.short占2字节

定义变量:

short a;

编译结果:

Program Size: data=11.0 xdata=0 code=17

3.int占2字节

定义变量:

int a;

编译结果:

Program Size: data=11.0 xdata=0 code=17

3.png

4.float占4字节

定义变量:

float a

编译结果:

Program Size: data=13.0 xdata=0 code=17

4.png

5.double占4字节

定义变量:

double

编译结果:

Program Size: data=13.0 xdata=0 code=17

Keil MDK、32位单片机

这一节基于Keil MDK工具,32位单片机(STM32)进行测试。

5.png

//char a;


int main(void)
{  
   while(1)  
   {
       //    a++;  
   }
}

这也是一个很简单的Demo,主要是对比 RW-data 的大小,初始值为0。(其中 ZI-data=1024 为系统分配的栈空间大小)
1.char占1字节

定义变量:

char a;

编译结果:

Program Size: Code=512 RO-data=436 RW-data=4 ZI-data=1028

6.png

啥?占了4个字节?

答案:只占了一个字节,因为32位机是4字节为一个“单元”,一个 char 只占用了其中1字节(类似结构体占用空间大小,这里还牵涉到大小端对齐模式)。

再举一个例子:定义4个 char 型变量,还是占用4字节空间(short原理一样)。

7.png

再次提示:

注意4字节为一个“单元”,超过这个单元就分配到“下一个单元”,比如:

char a;
int b;
char c;

这里就会占用12(3 * 4)字节空间(a、b、c各自占4字节)。

2.short占2字节

定义变量:

short a;

编译结果:

Program Size: Code=512 RO-data=436 RW-data=4 ZI-data=1028

这里和 char 类似,如果定义两个 short 也是占用4个字节。

3.int占4字节

定义变量:

int a;

编译结果:

Program Size: Code=512 RO-data=436 RW-data=4 ZI-data=1028

32位机,int占用4字节没什么说的。

4.float占4字节

定义变量:

float a;

编译结果:

Program Size: Code=520 RO-data=436 RW-data=4 ZI-data=1028

8.png

5.double占8字节

定义变量:

double a;

编译结果:

Program Size: Code=1156 RO-data=436 RW-data=8 ZI-data=1024

总结

上面验证情况在Keil C51、 8位单片机(AT89C51)中:

  • char:占1字节

  • short、int:占2字节

  • float、double:占4字节

在Keil MDK、 32位单片机(STM32)中:

  • char:占1字节

  • short:占2字节

  • int、float:占4字节

  • double:占8字节

通过对比上面几个变量,以及编译结果,得出一些结论。

1.变量占多少字节,与处理器(以及编译器)有关;

2.浮点数运算更占代码空间,且double比float更占空间。

上面基于32位机中进行了 a++; 运算,明显float、double打码量(code)更大。

3.变量数据对齐规则和结构体一样。

经典的面试题:计算下面结构体占用多少字节?

struct Str
{  
    char a;  
    short b;  
    int c;  
    char d;
};

这里面还有很多细节内容,可能很多人都没有深入研究过,感兴趣的朋友可以自己实验研究一下。

来源:strongerHuang

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 27

页面

订阅 RSS - 单片机