单片机

我们学习单片机的目的,就是为了进行嵌入式产品的开发。要想学好单片机,首先就得对流程有一个整体了解。

本文,先简要介绍一下单片机应用系统的开发流程。

单片机系统开发流程

“梳理单片机学习方法、产品开发流程"

上图是单片机系统开发流程框图。

1、明确任务

分析和了解项目的总体要求,并综合考虑系统使用环境、可靠性要求、可维护性及产品的成本等因素,制定出可行的性能指标。

2、划分软、硬件功能

单片机系统由软件和硬件两部分组成。在应用系统中,有些功能既可由硬件来实现,也可以用软件来完成。硬件的使用可以提高系统的实时性和可靠性;使用软件实现,可以降低系统成本,简化硬件结构。因此在总体考虑时,必须综合分析以上因素,合理地制定硬件和软件任务的比例。

3、确定希望使用的单片机及其他关键部件

根据硬件设计任务,选择能够满足系统需求并且性价比高的单片机及其他关键器件,如A/D、D/A转换器、传感器、放大器等,这些器件需要满足系统精度、速度以及可靠性等方面的要求。

4、硬件设计

根据总体设计要求,以及选定的单片机及关键器件,利用Protel等软件设计出应用系统的电路原理图。

5、软件设计

在系统整体设计和硬件设计的基础上,确定软件系统的程序结构并划分功能模块,然后进行各模块程序设计。

单片机程序设计语言可分为三类:

  • 机器语言 :又称为二进制目标代码,是CPU硬件唯一能够直接识别的语言(在设计CPU时就已经确定其代码的含义)。人们要计算机所执行的所有操作,最终都必须转换成为相应的机器语言由CPU识别、控制执行。CPU系列不同,其机器语言代码的含义也不尽相同。

  • 汇编语言 :由于机器语言必须转换为二进制代码描述,不便于记忆、使用和直接编写程序,为此产生了与机器语言相对应的汇编语言。用汇编语言编写的程序执行速度快,占用存储单元少,效率高。

  • 高级语言 :高级语言具有很好的可读性,使程序的编写和操作都十分方便,目前广泛使用的高级语言是C51。

机器语言 :又称为二进制目标代码,是CPU硬件唯一能够直接识别的语言(在设计CPU时就已经确定其代码的含义)。人们要计算机所执行的所有操作,最终都必须转换成为相应的机器语言由CPU识别、控制执行。CPU系列不同,其机器语言代码的含义也不尽相同。

汇编语言 :由于机器语言必须转换为二进制代码描述,不便于记忆、使用和直接编写程序,为此产生了与机器语言相对应的汇编语言。用汇编语言编写的程序执行速度快,占用存储单元少,效率高。

高级语言 :高级语言具有很好的可读性,使程序的编写和操作都十分方便,目前广泛使用的高级语言是C51。

汇编语言和高级语言都必须被翻译成机器语言之后才能被CPU识别。

6、仿真调试

软件和硬件设计结束后,需要进行进行进入两者的整合调试阶段。为避免浪费资源,在生成实际电路板之前,可以利用Keil C51和Proteus软件进行系统仿真,出现问题可以及时修改。

7、系统调试

完成系统仿真后,利用Protel等绘图软件,根据电路原理图绘制PCB(Printed Circuit Board)印刷电路板图,然后将PCB图交给相关厂商生产电路板。拿到电路板后,为便于更换器件和修改电路,可首先在电路板上焊接所需芯片插座,并利用编程器将程序写入单片机。

接下来,将单片机及其他芯片插到相应的芯片插座中,接通电源及其他输入、输出设备,进行系统联调,直至调试成功。

8、测试修改、用户试用

经测试检验符合要求后,将系统交给用户试用,对于出现的实际问题进行修改完善,系统开发完成。

单片机学习方法探讨

单片机学习的过程应该是一个循序渐进、不断学习、不断积累的过程,大致分为三个阶段。

第一阶段:掌握开发单片机的必备基础知识

首先是熟练掌握单片机的基本原理,虽然现在单片机厂商众多,但各家单片机的基本结构和原理都比较相近,例如内核结构、内存分配、中断处理、定时计数、串行通信、端口复用等一些最基本的概念和原理。

除此之外,我们还需要学习模拟电子、数字电子、C语言程序开发以及原理图和PCB(Printed Circuit Board,印刷电路板)设计等知识。只有扎实的掌握了这些知识,在进行系统开发的时候,才能顺利地进行原理设计、PCB布板、程序编写、系统联调等工作。相关文章:如何成为高级嵌入式硬件工程师?

第二阶段:研究其他单片机功能、特点

在掌握好一款单片机原理和应用的基础上,开始学习其他各家单片机,了解其独有的功能和特点。

例如实际工作中若客户要求低成本,那我们可以选用和泰、义隆、华邦等这类台湾芯片;如果客户要求工业级的性能,那么最好从PIC、NEC、飞思卡尔、NXP等这些欧美和日式单片机中选择;若要进行功耗的开发,选用MSP430系列应该有一定优势;在进行测量仪器设计的时候,C8051和AduC842这类数模混合芯片又显得比较实用。

另外,平时要注意技术积累。在项目开发过程中将一些常用的接口程序和控制算法整理成模块或者函数,日后若在其他的项目开发中有同样或者接近的需求时,原程序可以直接或者进行少量改动后使用,这样一来会节约大量开发成本。

第三阶段:工作项目中积累经验

在实际的项目开发过程中,不断深入研究单片机应用技术,不断积累应用行业的专业知识。

有了扎实的单片机应用相关的基础知识,并且熟悉掌握了几款不同类型单片机的开发方法后,对于各种实际的应用项目,往往还需要理解和掌握外围电路相关的原理和分析方法,并结合实际的应用背景,综合考虑各种因素,才能设计出性能最优、结构最合理的单片机应用系统。

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

围观 61

为给汽车运行和最终用户提供可靠保障,安全一直是汽车应用中的头等大事。Microchip Technology Inc. (美国微芯科技公司)现可提供全新认证的功能安全包,让工程师能够按照ISO 26262功能安全标准开发产品。Microchip正式发布适用于dsPIC33C数字信号控制器(DSC)、PIC18和AVR®单片机(MCU)的ISO 26262功能安全包,加快开发针对ASIL B级和ASIL C级安全等级和认证工作的安全关键型设计。

“Microchip发布适用于dsPIC<sup®、PIC18和AVR®单片机的全新ISO 26262功能安全包">

dsPIC33C数字信号控制器的完整功能安全生态系统包括:

  • 通过AEC Q100 0级认证的功能安全就绪的dsPIC33C数字信号控制器,配备专门的硬件安全功能

  • SGS TÜV Saar认证的ASIL B Ready失效模式、影响及其诊断分析(FMEDA)报告和功能安全手册(FSM)

  • 德国莱茵TÜV认证的功能安全诊断库,适用于最高至ASIL C的设计

  • 一项功能安全参考应用,显示开发合规设计所需的步骤,以及为(ASIL B或ASIL C)合规必须产生的附属功能

  • 各种功能安全分析报告和认证报告,帮助简化合规和认证

PIC18和AVR单片机的完整功能安全生态系统包括:

  • 通过AEC Q100 1级认证的功能安全就绪的具有灵活数据速率的控制器局域网(CAN FD)的PIC18-Q84单片机和具有本地互连网络(LIN)接口的AVR DA单片机,二者均为电容式触摸传感器提供硬件支持

  • SGS TÜV Saar认证的ASIL B Ready失效模式、影响及其诊断分析(FMEDA)报告和功能安全手册(FSM)

  • 功能安全诊断库

  • ASIL B Ready证书和认证报告,帮助简化合规和认证

无论工程师是ISO 26262功能安全方面的新手还是经验丰富的专家,Microchip都拥有成熟的经验和解决方案,可帮助他们满足功能安全要求并对设计进行认证,同时最大限度地降低成本、风险和开发时间。借助以下列出的功能安全包,以及安全文件随附的开发工具,工程师便可以开发出合规的系统。

Microchip提供三款ISO 26262功能安全包供购买,为不同专业水平以及处于评估和设计周期不同阶段的客户提供帮助。

  • 功能安全基础包提供基本资源,如ASIL B Ready认证的失效模式、影响及其诊断分析和安全手册,供客户开始评估目标功能安全水平和设计安全关键型的汽车应用。

  • 功能安全初级包提供ASIL B Ready认证的失效模式、影响及其诊断分析和安全手册,一款参考应用和符合ASIL C的诊断库,帮助设计者了解符合ISO 26262的开发过程以及为了合规必须生成的报告。

  • 功能安全豪华包为新手和经验丰富的专家提供了完整的解决方案,从而简化了安全关键型汽车应用的设计和认证。除了初级包所含的产品外,豪华包还包括带源代码的认证诊断库以及针对ASIL C的设计的相关安全分析报告。

除了功能安全包外,Microchip还为其MPLAB®开发工具生态系统提供了经TÜV SÜD认证的设计工具包,用于简化工具资质认证。其中包括经TÜV SÜD认证的MPLAB XC功能安全编译器和TÜV SÜD证书、编译器的功能安全手册以及编译器、MPLAB X集成开发环境(IDE)、MPLAB代码覆盖和所有MPLAB开发生态系统程序的安全计划和完整的工具分类和资质认证报告。Microchip还提供功能安全就绪的CAN FD和LIN收发器及包括电压监控器在内的其他配套器件,这些器件可与功能安全就绪的数字信号控制器和单片机一起用于各类汽车应用。

Microchip MCU16业务部副总裁Joe Thomsen表示:“随着汽车的复杂程度和电子产品日益增加,汽车设计中的功能安全要求也变得愈发严苛。为了帮助我们的客户以最小的风险和预算快速开发安全应用,Microchip极大地拓展了认证安全文档和诊断自检库、开发工具和技术支持的业务范围。作为汽车市场的主要供应商,我们将继续扩大我们的功能安全支持,助力我们的客户取得竞争优势。”

德国莱茵TÜV集团功能安全和网络安全认证机构负责人Thomas Steffens表示:“作为功能安全认证机构,德国莱茵TÜV集团提供与ISO 26262和IEC 61508相关的独立审核、验证、评估和认证服务,为质量和安全提供支持。根据我们基于ISO 26262认证计划进行的评估结果,我们确认Microchip dsPIC33C数字信号控制器系列的安全诊断库符合ASIL C的要求,因此该诊断库可用于针对ASIL C的与汽车安全相关的应用。”

开发工具

已经通过TÜV SÜD认证的MPLAB XC16和MPLAB XC8功能安全编译器(SW006022-FS和SW006021-FS)、MPLAB代码覆盖工具(SW006026-COV)、MPLAB X IDE、MPLAB开发生态系统调试器/编程器和安全文档包全面支持ISO 26262功能安全就绪的dsPIC33C数字信号控制器,以及PIC18和AVR单片机,从而让工具资质认证工作变得更加轻松。

供货

如需了解更多有关dsPIC33C数字信号控制器(DSC)功能安全包的详细信息,请访问:www.microchip.com/dsPIC33-ISO26262

如需了解有关ASIL B Ready的PIC和AVR单片机的详细信息,请访问:www.microchip.com/PIC-AVR-ISO26262

Microchip Technology Inc. 简介

Microchip Technology Inc.(纳斯达克股市代号:MCHP)是致力于智能、互联和安全的嵌入式控制解决方案的领先供应商。其易于使用的开发工具和丰富的产品组合让客户能够创建最佳设计,从而在降低风险的同时减少系统总成本,缩短上市时间。Microchip的解决方案为工业、汽车、消费、航天和国防、通信以及计算市场中12万多家客户提供服务。Microchip总部位于美国亚利桑那州Chandler市,提供出色的技术支持、可靠的产品交付和卓越的质量。详情请访问公司网站www.microchip.com

注:Microchip的名称和徽标组合、Microchip徽标、AVR、dsPIC及MPLAB均为Microchip Technology Incorporated在美国和其他国家或地区的注册商标。在此提及的所有其他商标均为各持有公司所有。

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

围观 15

1、某天某日某产房,你诞生了(power up , 上电运行),结果你不哭,医生把你提起来,屁股上狠狠一巴掌,你哇哇大哭(reset, 复位成功),护士给你检查,看有没有传染病(EMI测试),然后打预防针(绝缘处理),没有问题后作记录(QC pass),你的父母来接你回去(客户验收)。

回家后你有了自己的新床(PCB),家里条件好,给你铺六张毛巾被(六层板),可惜上面小窟窿太多(过孔太多),父母把奶瓶给你,你终于获得了外部能量 (Power Supply),否则你的自身能量会耗尽(Battery too Low)。

每天清晨,你尚在休眠模式(IDLE)下运行时,一阵铃声吵醒你(wake up,激活),你感觉很饿,于是大哭(Alarm Ring),父母马上来喂你,你不哭了(discard Alarm,解除报警),但很不争气地撒尿了(current output,电流输出)。

父母给你收拾完,开始教你说话,但你的大脑还很简单(initial procedure,初始化程序),后来你开始学走路,结果步调不稳(步进电机驱动错误),一跑就坐到地上了(RUN Fail,运行失败)。好在你的父母很耐心地教你(调试阶段),你终于可以走了(调试通过)。

你逐渐长大,吃的也多了,给你的食物老是不够(功耗太大,power waste too heavy),你偷偷打开冰箱狂吃一顿,结果吃的太多不消化了(过载,overload),差点绷断肠子(route burn,烧断走线),还好你终于没事了,不敢吃那么多了(reduce power waste,降低功耗)。

后来你上学了,接受好多新的知识(new procedure),但是没有实际经验(未调试的),结果工作时发现那些知识不能照用,还要更多地学习别人的经验(Copy procedure,拷贝程序),不过你还是不断发现臭虫(BUG),只好请教灭虫专家来解决(调试高手)。

2、你的工作稳定了,你开始进入日复一日的工作状态(Endless Loop),你很烦,于是老是出错误(out of order,程序跑飞),结果老板开始盯紧你(软件陷阱),你被当场抓住修理一通,马上老老实实干活了(程序恢复)。

终于有个姑娘闯入你的生活(interrrupt,中断),使你忘记别的一切(优先级最高),你完全浸入爱河(进入中断服务子程序),大手大脚地花钱 (Large 模式),很快就结婚了(双CPU运行),你马上发现你的储蓄不够用了(RAM resource too low),需要精简节约(compact模式),婚假也结束了,你又回去上班了(RETI,退出中断服务程序)。

后来日子越过越 枯燥,老婆批评你脑袋不够用(MIPS太低),不会算计(没有浮点运算能力),你对她的话一耳进一耳出(FIFO),你对老婆也爱理不理了(优先级降低),这时一个小姑娘勾引你,你马上动心(抗干扰能差),幸好你老婆及时发现,严防紧守,你放弃了企图(丢弃乱码)。

3、日子恢复平静,一晃几十年过去,你发现 你身边的年轻人都用全新的知识装备着,他们都是在ARM大学毕业的,开着Linux的车子,大把花着票子(海量存储)。

你低头看自己,发现自己只是在51大学毕业,开着汇编的破车,手里钱少的可怜(256 字节内存)。你被迫到人才市场找工作,发现自己已经是多年前的旧货,降价处理了,你这样的都是一麻袋一麻袋的。

你长吁短叹,终于选择退休,靠养老金活着, 开始疾病缠身,你的牙齿有了问题(IO口驱动力下降),你说话不清楚(TXD发射失败),耳朵也不灵(RXD接收不灵),你的胃也不好,存不住食物 (ALE锁存失败),你终于因心肌梗死送到医院,医生手持电击手柄给你通电(高压测试),但你无法苏醒(复位失败),医生只好拔掉你的输液管(关闭电源),你看了这个乱七八糟的世界最后一眼,终于POWER DOWN了。

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

围观 54

随着微电子技术和计算机技术的发展,原来以强电和电器为主、功能简单的电气设备发展成为强、弱电结合,具有数字化特点、功能完善的新型微电子设备。

在很多场合,已经出现了越来越多的单片机产品代替传统的电气控制产品。单片机其控制功能通过软件指令来实现,其硬件配置也可变、易变。因此,一旦生产过程有所变动,就不必重新设计线路连线安装,有利于产品的更新换代和订单式生产。

传统电气设备采用的各种控制信号,必须转换到与单片机输入/输出口相匹配的数字信号。用户设备须输入到单片机的各种控制信号,如限位开关、 操作按钮、选择开关、行程开关以及其他一些传感器输出的开关量等,通过输入电路转换成单片机能够接收和处理的信号。输出电路则应将单片机送出的弱电控制信 号转换、放大到现场需要的强输出信号,以驱动功率管、电磁阀和继电器、接触器、电动机等被控制设备的执行元件,能方便实际控制系统使用。

针对电气控制产品的特点,本文讨论了几种单片机I/O的常用驱动和隔离电路的设计方法,对合理地设计电气控制系统,提高电路的接口能力,增强系统稳定性和抗干扰能力有实际指导意义。

输入电路设计

一般输入信号最终会以开关形式输入到单片机中,以工程经验来看,开关输入的控制指令有效状态采用低电平比采用高电平效果要好得多,如图1所示。当按下开关S1时,发出的指令信号为低电平,而平时不按下开关S1时,输出到单片机上的电平则为高电平。该方式具有较强的耐噪声能力。
图片

“图1
图1 开关信号输入

若考虑到由于TTL电平电压较低,在长线传输中容易受到外界干扰,可以将输入信号提高到+24 V,在单片机入口处将高电压信号转换成TTL信号。这种高电压传送方式不仅提高了耐噪声能力,而且使开关的触点接触良好,运行可靠,如图2所示。其 中,D1为保护二极管,反向电压≥50 V。

图2
图2 提高输入信号电平

“图3
图3 输入端保护电路

为了防止外界尖峰干扰和静电影响损坏输入引脚,可以在输入端增加防脉冲的二极管,形成电阻双向保护电路,如图3所示。二极管D1、D2、 D3的正向导通压降UF≈0.7 V,反向击穿电压UBR≈30 V,无论输入端出现何种极性的破坏电压,保护电路都能把该电压的幅度限制在输入端所能承受的范围之内。
即:VI~VCC出现正脉冲时,D1正向导 通;VI~VCC出现负脉冲时,D2反向击穿;VI与地之间出现正脉冲时,D3反向击穿;VI与地之间出现负脉冲时,D3正向导通,二极管起钳位保护作用。缓冲电阻RS约为1.5~2.5 kΩ,与输入电容C构成积分电路,对外界感应电压延迟一段时间。若干扰电压的存在时间小于τ,则输入端承受的有效电压将远低于其幅度;若时间较长,则D1 导通,电流在RS上形成一定的压降,从而减小输入电压值。

此外,一种常用的输入方式是采用光耦隔离电路。如图4所示,R为输入限流电阻,使光耦中的发光二极管电流限制在10~20 mA。输入端靠光信号耦合,在电气上做到了完全隔离。

同时,发光二极管的正向阻抗值较低,而外界干扰源的内阻一般较高,根据分压原理,干扰源能馈送到输入 端的干扰噪声很小,不会产生地线干扰或其他串扰,增强了电路的抗干扰能力。

“图4
图4 输入端光耦隔离

在满足功能的前提下,提高单片机输入端可靠性最简单的方案是:在输入端与地之间并联一只电容来吸收干扰脉冲,或串联一只金属薄膜电阻来限制流入端口的峰值电流。

输出电路设计

单片机输出端口受驱动能力的限制,一般情况下均需专用的接口芯片。其输出虽因控制对象的不同而千差万别,但一般情况下均满足对输出电压、电流、开关频率、波形上升下降速率和隔离抗干扰的要求。在此讨论几种典型的单片机输出端到功率端的电路实现方法。

1、直接耦合

在采用直接耦合的输出电路中,要避免出现图5所示的电路。

“图5
图5 错误的输出电路

T1截止、T2导通期间,为了对T2提供足够的基极电流,R2的阻值必须很小。因为T2处于射极跟随器方式工作,因此为了减少T2损耗,必须将集射间电压降控制在较小范围内。

这样集基间电压也很小,电阻R2阻值很小才能提供足够的基极电流。R2阻值过大,会大幅度增加T2压降,引起T2发热严重。而在T2截止期间,T1必须导通,高压+15 V全部降在电阻R2上,产生很大的电流,显然是不合理的。

另外,T1的导通将使单片机高电平输出被拉低至接近地电位,引起输出端不稳定。T2基极被T1拉 到地电位,若其后接的是感性负载,由于绕组反电势的作用,T2的发射极可能存在高电平,容易引起T2管基射结反向击穿。

图6为一直接耦合输出电路,由T1和T2组成耦合电路来推动T3。T1导通时,在R3、R4的串联电路中产生电流,在R3上的分压大于T2 晶体管的基射结压降,促使T2导通,T2提供了功率管T3的基极电流,使T3变为导通状态。当T1输入为低电平时,T1截止,R3上压降为零,T2截止, 最终T3截止。R5的作用在于:一方面作为T2集电极的一个负载,另一方面T2截止时,T3基极所储存的电荷可以通过电阻R3迅速释放,加快T3的截止速度,有利于减小损耗。

“图6
图6 直接耦合输出电路

2、TTL或CMOS器件耦合

若单片机通过TTL或CMOS芯片输出,一般均采用集电极开路的器件,如图7(a)所示。集电极开路器件通过集电极负载电阻R1接至+15 V电源,提升了驱动电压。但要注意的是,这种电路的开关速度低,若用其直接驱动功率管,则当后续电路具有电感性负载时,由于功率管的相位关系,会影响波形 上升时间,造成功率管动态损耗增大。

为了改善开关速度,可采用2种改进形式输出电路,如图7(b)和图7(c)所示。图7(b)是能快速开通的改进电路,当TTL输出高电平 时,输出点通过晶体管T1获得电压和电流,充电能力提高,从而加快开通速度,同时也降低了集电极开路TTL器件上的功耗。图7(c)为推挽式的改进电路, 采用这种电路不但可提高开通时的速度,而且也可提高关断时的速度。输出晶体管T1是作为射极跟随器工作的,不会出现饱和,因而不影响输出开关频率。

“图7
图7 TTL或CMOS器件输出电路

3、脉冲变压器耦合

脉冲变压器是典型的电磁隔离元件,单片机输出的开关信号转换成一种频率很高的载波信号,经脉冲变压器耦合到输出级。由于脉冲变压器原、副边线圈间没有电路连接,所以输出是电平浮动的信号,可以直接与功率管等强电元件耦合,如图8所示。

“图8
图8 脉冲变压器输出电路

这种电路必须有一个脉冲源,脉冲源的频率是载波频率,应至少比单片机输出频率高10倍以上。脉冲源的输出脉冲送入控制门G,单片机输出信号 由另一端输入G门。当单片机输出高电平时,G门打开,输出脉冲进入变压器,变压器的副线圈输出与原边相同频率的脉冲,通过二极管D1、D2检波后经滤波还 原成开关信号,送入功率管。当单片机输出低电平时,G门关闭,脉冲源不能通过G门进入变压器,变压器无输出。

这里,变压器既传递信号,又传送能量,提高了脉冲源的频率,有利于减轻变压器的体重。由于变压器可通过调整电感量、原副边匝数等来适应不同 推动功率的要求,所以应用起来比较灵活。更重要的是,变压器原副边线圈之间没有电的联系,副线圈输出信号可以跟随功率元件的电压而浮动,不受其电源大小的影响。

当单片机输出较高频率的脉冲信号时,可以不采用脉冲源和G门,对变压器原副边电路作适当调整即可。

4、光电耦合

光电耦合可以传输线性信号,也可以传输开关信号,在输出级应用时主要用来传递开关信号。

如图9所示,单片机输出控制信号经缓冲器7407放大后送入光耦。R2为光耦输出晶体管的负载电阻,它的选取应保证:在光耦导通时,其输出晶体管可靠饱和;而在光耦截止时,T1可靠饱和。但由于光耦响应速度慢使开关延迟时间加长,限制了其使用频率。

“图9
图9 光耦输出电路

结语

单片机接口技术在很多资料中均有详细的介绍,但在对大量电气控制产品的改造和设计中,经常会碰到用接口芯片所无法解决的问题(如驱动电流大、开关速度慢、抗干扰差等),因此必须寻求另一种电路解决方案。

上述几种输入/输出电路通过广泛的应用表明,其对合理、可靠地实现单片机电气控制系统具有较高的工程实用价值。

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

围观 292

前言

UART是重要的片上资源,主流单片机基本上都有该功能,通过UART可以扩展出很多的通信接口,如RS232、RS485、LIN,甚至WIFI、蓝牙模组等,可以说只要搞通讯就会涉及到UART。下面和大家分享STM32的UART配置。

1、UART是什么

USART全称universal synchronous asynchronous receiver transmitter通用同步异步接收发送器;速率最高可达4.5Mbits/s,波特率460800;

数据按位顺序发送的串行通信接口简称串口,USART模块是采用串行通信接口最常见的模块,为了方便,就把USART简称为串口;

USART接口通过RX,TX,GND同其他设备相连;当TX引脚被禁止时,该引脚恢复GPIO的配置;当TX引脚使能且未发送数据时,该引脚处于高电平(空闲态);

USART接口的数据字长度可编程,停止位长度可编程;可配置为DMA多缓冲通信;

2、USART的帧格式

串口数据应该遵循USART帧的格式,才能被串口识别;

首先总线需要持续至少一个空闲帧,然后连续发送数据帧,数据帧与数据帧之间有时会有断开帧,断开帧后需要接1-2bit停止位,连接下个数据帧;

断开帧只能为10bit或11bit低电平的帧(CR1_SBK[0]);然后接1或2bit的高电平作为停止位,然后接下一个数据帧;

数据帧的数据字有两种格式,(1)8 bit 数据位;(2)8bit 数据位 + 1 bit 奇偶校验位;

“STM32单片机,UART的寄存器配置以及工作原理"

3、USART的寄存器使用

每个USART都有7个自己的寄存器;用来配置该USART的所有功能;

有许多功能诸如硬件流控制,LIN模式,智能卡模式等,由于没用过或是用不上,实在晦涩难懂费时费力,故在此全部跳过;

以下给出了USART作为常用串口收发数据的工作框图,以及相关的寄存器配置;

3.1 工作框图

“STM32单片机,UART的寄存器配置以及工作原理"

“STM32单片机,UART的寄存器配置以及工作原理"

3.2 相关寄存器配置

1)首先需要配置USART的6个参数:

波特率USART_BRR,字长M,停止位STOP,校验位PCE,PS,PEIE,USART的收发模式TE和RE和硬件流控制CTSIE,CTSE,RTSE;

2)USART提供了8个中断:TXEIE, TCIE, RXNEIE, PEIE, IDLEIE, CTSIE, LBDIE, EIE;8个中断使能均可以进入USART的中断函数,根据需要配置合适的中断使能位为1;通常为RXNEIE位;

3)然后使能接收器RE和发送器TE;

4)然后使能UE中断;

“STM32单片机,UART的寄存器配置以及工作原理"

4、USART的代码示例

4.1 标准库提供的常用USART接口

标准库为所有的外设都提供了封装寄存器的API接口函数,文件名为stm32f10x_peripheral.c;

以下为usart外设的常用函数;

//串口USARTx的参数配置初始化函数;
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
//使能串口,(主要是分频器和输出的设置)
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);
//使能串口中断,(就是那8个中断,均可以进入中断函数)
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);
//都是处理一个字节;
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
//读取SR寄存器的状态,SR的状态都是硬件设置的;
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
//读取SR寄存器和CRx控制寄存器的状态,和上面一个功能相同的;
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);

//修改SR寄存器的状态,单功能通讯用不上;
void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG);

4.2 USART1使用代码

#include "usartDemo.h"  
u8 USART1_RX_BUF[256];    //接收缓存
u8 USART1_RX_CNT = 0;    //接收字节计数
u8 USART1_REV_0D = 0;    //收到\r
u8 USART1_REV_0A = 0;    //收到\r和\n

//usart1初始化之后,便可以通过串口读写了;
void Usart1_Init(u32 bound)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    //设置NVIC中断分组2:2位抢占优先级,2位响应优先级   0-3;

    //USART1外设中断配置
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;    //抢占优先级3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;            //子优先级3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);  

    //GPIO初始化 USART1_TX    PA9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //输出需要配置速率,输入不需要配置速率;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出,<中文..手册>8.1.11外设的GPIO配置
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //GPIO初始化    USART1_RX    PA10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;        //浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);

   //USART1初始化
    USART_InitStructure.USART_BaudRate = bound;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;   //CR1中的TE,RE  
    USART_Init(USART1, &USART_InitStructure); 

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//CR1中的RXNEIE中断
    USART_Cmd(USART1, ENABLE);                    //CR1中的UE
}

void USART1_Send_Data(u8 *buf,u16 len)
{
    u16 t;
    for(t=0;t<len;t++)        
    {
        USART_SendData(USART1,buf[t]);
        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); 
        //发送字节完成后,TC硬件置1;
    }    //先读SR,后写DR清除TC位;
    USART1_RX_CNT = 0;
    USART1_REV_0D = 0;
    USART1_REV_0A = 0;  
}

void USART1_IRQHandler(void)                    
{
    u8 Res;
    if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
     {
         Res =USART_ReceiveData(USART1);        //读DR,硬件清0 RXNE位;
        USART1_RX_BUF[USART1_RX_CNT]=Res;    //接收数据  
        USART1_RX_CNT++; 
        if(Res==0x0d)
            USART1_REV_0D = 1;
        if(USART1_REV_0D&&(Res==0x0a))
            USART1_REV_0A = 1;                      
     }
    //RXNE为1,读数据的同时又来了数据,那么新的数据丢失;产生溢出错误,读完数据后RXNE为0,但ORE标志还在;
    //RXNE为1,又来了数据,产生接收溢出错误,置位ORE;
    if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET)
    {
        USART_ReceiveData(USART1);
    //    USART_ClearFlag(USART1,USART_FLAG_ORE);//先读SR,后读DR,可以复位ORE位;应该不用软件清除了;
    }
    // USART_ClearFlag(USART1,USART_IT_RXNE); //读DR可以清除RXNE,应该不用软件清除了;
}

int main(void)
{
    Usart1_Init(460800);
    while(1)
    {
        if(USART1_REV_0A)
        {
            USART1_Send_Data(USART1_RX_BUF,USART1_RX_CNT);
        }
    }    
}

4.2.1 在前面代码的基础上不使用串口中断,直接通过SR状态位来判断数据的收发;

将上面代码的usart1初始化代码中CR1的RXNEIE配置行注释掉,然后修改main函数如下即可;

int main(void)
{
    Usart1_Init(460800); 
    while(1)
    {
        if ((USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET))
        {
            USART1_RX_BUF[USART1_RX_CNT] = USART_ReceiveData(USART1);
            if(USART1_RX_BUF[USART1_RX_CNT]==0x0a)
                USART1_REV_0A = 1;
            USART1_RX_CNT++;
        }
        if(USART1_REV_0A)
        {
            USART1_REV_0A = 0;
            for(int i=0;i<USART1_RX_CNT;i++)
            {
                USART_SendData(USART1, USART1_RX_BUF[i]);
                while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
            }
            USART1_RX_CNT=0;
        }
    }
}

5、总结

USART的功能没想到还挺多的,寄存器看起来就有些费时了,很多概念都是新的,不好理解,直接拉低了效率;于是觉得这样不行,应该用什么看什么,用到再看,学海无涯,精力有限;

另外人家费心费力写好标准库不就是为了帮开发人员省时间吗?了解一下即可,以后没必要深入;

本文代码github:https://github.com/caesura-k/stm32f1_usart

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

围观 811

今天分析一个经典的单片机供电电路,电路的原理图如下图所示:

“▲
▲ 开关电路简化后的电路

在电路上电之前。开关"TEST"断开,单片机也没有通过VCC加电。此时,T1的基极通过R9(100k)接地,处于截止状态。T3的基级电阻R7所连接的Test,T1都处于截止状态,所以T3也处于截止状态。

电源+9V被T3隔离,没有加载稳压芯片IC2上,IC2的输出VCC保持低电平。

“▲
▲ 电路关闭状态

按动按钮“TEST”启动电路,T3的基极通过R7,Test,T2的b-e接地,从而使得T3导通。此时+9V通过T3加到IC2稳压芯片。IC2输出VCC是加到单片机上。

单片机工作后,通过IO2输出高电压,通过R8使得T1导通。此时即使Test松开,T3的基极也可以通过R7,LED1,T1接地,实现电源自锁打开。

“▲
▲ 按动TEST,启动电路

“▲
▲ 电路启动后,由MCU提供T1基极电压,从而维持T3导通

之后,单片机软件可以来使得IO2端口重新变成低电平,使得T1截止,进而使得T3截止。

可以根据IO1端口,读取T2的开关状态,进而判断用户是否按动功能键。判断用户按动Test之后,等到用户释放Test之后,便可以将IO2置低电平。

也可以根据软件功能,实现自动延迟掉电,进而减少对供电电源的消耗。

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

围观 74

页面

订阅 RSS - 单片机