单片机

单片机(Microcontroller, MCU)是一种集成了计算机功能的微型计算机,通常由一个微处理器(CPU)、存储器(ROM、RAM)、输入/输出接口、定时器/计数器等功能模块集成在同一芯片上。单片机是一种常用于嵌入式系统中的控制器,它被广泛应用于家电、汽车、工业自动化、医疗设备、消费电子、物联网(IoT)设备等多个领域。

什么是框架?

程序框架其实就类似一个文件大纲或者模板。因为写程序就和类似于写文章,如果没有大纲或者模板那么你写起来就会比较费劲。

为什么要有框架?

节约时间,减少错误。因为对于一种类型的程序它们代码结构体逻辑是一样的,同时有大量相似或者共同的地方。我们可以将这些共同的地方抽出来形成一个固定的程序框架,那么我们再开发新的同一种类型的程序时就可以套用这套框架。

这样会大大提高我们的开发效率,同时由于这个框架是一套公众的大家都在使用的与维护的,使用它会使代码逻辑更不容易出错。

嵌入式系统组成

嵌入式控制系统基本都是由“普通任务”和“中断任务”组成。

• 普通任务:指对时间响应要求不高或者说是那种周期性执行的任务;

• 中断任务:指对时间响应要求高,必须立刻处理的任务;

常见的框架

1、轮询无中断

说明:所有的任务都是按照顺序执行,为了减少整个系统的响应时间有两种方法:

1. 任务中不要使用等待式的延时函数;

2. 任务无法一次执行完的情况下应该将任务分解成若干个小任务每次执行一个小任务循环直到任务完成;上述两种方法都会消耗内存,本来局部变量可以解决的事,现在只能用静态或者全局变量来处理。

1.png

优点:程序执行流程简单清晰;

缺点:对于系统修改功能非常不方便,同时如果任务数量增加的话会影响整个系统的响应时间,就会显得系统卡顿;

伪代码实现:

int main(void)
{
    while(1)
    {
        doSomething_1(); //任务1
        doSomething_2(); //任务2
        doSomething_3(); //任务3
        /*其他各种任务*/
    }
    return 0;
}

2、只有中断

说明:在“只有中断“的系统中,主函数main的循环中是不做任何操作的。

优点:可以实时响应异常的任务(事件)

缺点:中断资源有限,当任务过多时会响应不及时。

伪代码实现:

int main(void)
{
    while(1)
    {
        ;
    }
}
 
/*中断服务函数1*/
void ISR1_IRQHandler(void)
{
    doSomething_1();
}
 
/*中断服务函数2*/
void ISR2_IRQHandler(void)
{
    doSomething_2();
}

3、只有中断框架的变种

说明:采用状态机的机制来执行任务。中断函数中设置状态机的状态,而main函数主循环中根据不同的状态值执行不同的任务。这个其实不属于真正只有中断的形式。

int main(void)
{
    while(1)
    {
        if(flag_1)
        {
            doSomething_1();
        }
        if(flag_2)
        {
            doSomething_2();
        }
        if(flag_3)
        {
            doSomething_3();
        }
        /*其他各种任务*/
    }
    return 0;
}
 
/*********中断服务函数1************/
void ISR1_IRQHandler(void)
{
    flag_1 = ~flag_1;
}
 
/*********中断服务函数2************/
void ISR2_IRQHandler(void)
{
    flag_2 = ~flag_2;
}
 
/*********中断服务函数3************/
void ISR3_IRQHandler(void)
{
    flag_3 = ~flag_3;
}

4、轮询有中断

说明:将一些周期性的任务放置在main函数中的主循环中执行。

2.png

优点:合理的利用资源,将常规任务与紧急任务分开来了。

缺点:程序结构与逻辑比较复杂,在任务分配以及协作之间需要花费很大精力。

伪代码实现:

int main(void)
{
    while(1)
    {
        if(flag_1)
        {
            doSomething_1();
        }
        if(flag_2)
        {
            doSomething_2();
        }
        if(flag_3)
        {
            doSomething_3();
        }
        /*其他各种任务*/
    }
    return 0;
}
 
/*********定时器中断服务函数************/
void ISR1_IRQHandler(void)
{
    
}

5、轮询有中断——虚拟定时器

3.png

说明:利用不同的”虚拟定时器“的定时时间来调用不同任务,当定时器的定时时间到时则执行回调函数或者调用任务函数。

这对于一些周期性运行的任务是非常适合的,同时中断可以应对外界的突发事件。这样实时性也可以得到保障,但要注意不要使用等待式延时。一般虚拟定时器的时基为1ms

优点:任务的时间间隔可以相对精确的控制,同时由于中断使用整个系统的实时性也很不错。

缺点:任务的执行时间无法掌控,当定时任务执行时间过长时会影响到虚拟定时器的定时精度。

虚拟定时器实现代码:

https://codeload.github.com/0x1abin/MultiTimer/zip/master 

6、非抢占式实时操作系统

1741336791792159.png

说明:任务之间没有优先级之分,每个任务都是依次执行。但是任务的执行时间是由操作系统严格控制的。即使任务没有执行完,当时间片时间达到时任务便会被挂起。

优点:不用再处心积虑的减少任务中的延时,我们只需要将精力放置在业务逻辑上。

缺点:任务之间是平级的,这就会导致有些任务无法得到紧急处理。

伪代码实现:

https://blog.csdn.net/twx11213030422/article/details/104637273 

7、抢占式实时操作系统

说明:每个任务之间是一个“死循环”同时任务都有一个优先级。高优先级的任务可以打断低优先级的任务,这个就类似于中断一样。所以整个系统的实时性就非常好,同时每个任务都还受时间片的控制也就是说它们的执行时间是可以预测的。它也支持中断可以响应紧急的事件。

5.png

优点:实时响应,工程师只需要将精力放置在业务逻辑的实现上

缺点:需要移植且对单片机硬件资源有一定要求。

常用的抢占式实时操作系统:Keil RTX、FreeRTOS、uCosII/III等等。

来源:EDN电子技术设计

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

围观 16

首先,“嵌入式”这是个概念,准确的定义没有,各个书上都有各自的定义。但是主要思想是一样的,就是相比较PC机这种通用系统来说,嵌入式系统是个专用系统,结构精简,在硬件和软件上都只保留需要的部分,而将不需要的部分裁去。所以嵌入式系统一般都具有便携、低功耗、性能单一等特性。

然后,MCU、DSP、FPGA这些都属于嵌入式系统的范畴,是为了实现某一目的而使用的工具。

MCU俗称”单片机“经过这么多年的发展,早已不单单只有普林斯顿结构的51了,性能也已得到了很大的提升。因为MCU必须顺序执行程序,所以适于做控制,较多地应用于工业。而ARM本是一家专门设计MCU的公司,由于技术先进加上策略得当,这两年单片机市场份额占有率巨大。ARM的单片机有很多种类,从低端M0(小家电)到高端A8、A9(手机、平板电脑)都很吃香,所以也不是ARM的单片机一定要上系统,关键看应用场合。

DSP叫做数字信号处理器,它的结构与MCU不同,加快了运算速度,突出了运算能力。可以把它看成一个超级快的MCU。低端的DSP,如C2000系列,主要是用在电机控制上,不过TI公司好像称其为DSC(数字信号控制器)一个介于MCU和DSP之间的东西。高端的DSP,如C5000/C6000系列,一般都是做视频图像处理和通信设备这些需要大量运算的地方。

FPGA叫做现场可编程逻辑阵列,本身没有什么功能,就像一张白纸,想要它有什么功能完全靠编程人员设计(它的所有过程都是硬件,包括VHDL和Verilog HDL程序设计也是硬件范畴,一般称之为编写“逻辑”。)。如果你够NB,你可以把它变成MCU,也可以变成DSP。由于MCU和DSP的内部结构都是设计好的,所以只能通过软件编程来进行顺序处理,而FPGA则可以并行处理和顺序处理,所以比较而言速度最快。

那么为什么MCU、DSP和FPGA会同时存在呢?那是因为MCU、DSP的内部结构都是由IC设计人员精心设计的,在完成相同功能时功耗和价钱都比FPGA要低的多。而且FPGA的开发本身就比较复杂,完成相同功能耗费的人力财力也要多。所以三者之间各有各的长处,各有各的用武之地。但是目前三者之间已经有融合的态势,ARM的M4系列里多加了一个精简的DSP核,TI的达芬奇系列本身就是ARM+DSP结构,ALTERA和XINLIX新推出的FPGA都包含了ARM的核在里面。所以三者之间的关系是越来越像三基色的三个圆了。

一言以蔽之“你中有我,我中有你”。

硬件工程师学习从何开始?

单片机:通常无操作系统,用于简单的控制,如电梯,空调等。

dsp:用于复杂的计算,像离散余弦变换、快速傅里叶变换,常用于图像处理,在数码相机等设备中使用。

arm:一个英国的芯片设计公司,但是不生产芯片。只卖知识产权。

fpga:现场可编程门阵列,以硬件描述语言(Verilog 或 VHDL)所完成的电路设计,可以经过简单的综合与布局,快速的烧录至 FPGA 上进行测试,是现代 IC 设计验证的技术主流。

嵌入式 是相对于台式电脑而言,系统可裁剪,形态各异,可能体积、功耗、成本受限、实时性要求高,如示波器,手机,平板电脑,全自动洗衣机,路由器、数码相机,这些设备中,虽然看不到台式机的存在,但是都有一个或多个嵌入式系统在工作。

根据对象体系的功能复杂性和计算处理复杂性,提供的不同选择。对于简单的家电控制嵌入式系统,采用简单的8位单片机就足够了,价廉物美,对于手机和游戏机等,就必须采用32位的ARM和DSP等芯片了。FPGA是一种更偏向硬件的实现方式。

所以要通过学习成为硬件工程师,要从单片机开始,然后学习ARM和DSP之类。

市面上七大主流单片机的详细介绍

单片机现在可谓是铺天盖地,种类繁多,让开发者们应接不暇,发展也是相当的迅速,从上世纪80年代,由当时的4位8位发展到现在的各种高速单片机。

各个厂商们也在速度、内存、功能上此起彼伏,参差不齐~~同时涌现出一大批拥有代表性单片机的厂商:Atmel、TI、ST、MicroChip、ARM…国内的宏晶STC单片机也是可圈可点…

下面为大家带来51、MSP430、TMS、STM32、PIC、AVR、STC单片机之间的优缺点比较及功能体现……

51单片机

应用最广泛的8位单片机当然也是初学者们最容易上手学习的单片机,最早由Intel推出,由于其典型的结构和完善的总线专用寄存器的集中管理,众多的逻辑位操作功能及面向控制的丰富的指令系统,堪称为一代“经典”,为以后的其它单片机的发展奠定了基础。

51单片机之所以成为经典,成为易上手的单片机主要有以下特点:

特性:

1.从内部的硬件到软件有一套完整的按位操作系统,称作位处理器,处理对象不是字或字节而是位。不但能对片内某些特殊功能寄存器的某位进行处理,如传送、置位、清零、测试等,还能进行位的逻辑运算,其功能十分完备,使用起来得心应手。

2. 同时在片内RAM区间还特别开辟了一个双重功能的地址区间,使用极为灵活,这一功能无疑给使用者提供了极大的方便,

3. 乘法和除法指令,这给编程也带来了便利。很多的八位单片机都不具备乘法功能,作乘法时还得编上一段子程序调用,十分不便。

缺点:(虽然是经典但是缺点还是很明显的)

1.AD、EEPROM等功能需要靠扩展,增加了硬件和软件负担

2. 虽然I/O脚使用简单,但高电平时无输出能力,这也是51系列单片机的最大软肋

3. 运行速度过慢,特别是双数据指针,如能改进能给编程带来很大的便利

4. 51保护能力很差,很容易烧坏芯片

应用范围:

目前在教学场合和对性能要求不高的场合大量被采用

使用最多的器件:8051、80C51

MSP430单片机

MSP430系列单片机是德州仪器1996年开始推向市场的一种16位超低功耗的混合信号处理器,给人们留下的最大的亮点是低功耗而且速度快,汇编语言用起来很灵活,寻址方式很多,指令很少,容易上手。主要是由于其针对实际应用需求,把许多模拟电路、数字电路和微处理器集成在一个芯片上,以提供“单片”解决方案。其迅速发展和应用范围的不断扩大,主要取决于以下的特点…

特性:

1.强大的处理能力,采用了精简指令集(RISC)结构,具有丰富的寻址方式( 7 种源操作数寻址、 4 种目的操作数寻址)、简洁的 27 条内核指令以及大量的模拟指令;大量的寄存器以及片内数据存储器都可参加多种运算;还有高效的查表处理指令;有较高的处理速度,在 8MHz 晶体驱动下指令周期为 125 ns 。这些特点保证了可编制出高效率的源程序

2.在运算速度方面,能在 8MHz 晶体的驱动下,实现 125ns 的指令周期。16 位的数据宽度、 125ns 的指令周期以及多功能的硬件乘法器(能实现乘加)相配合,能实现数字信号处理的某些算法(如 FFT 等)

3.超低功耗方面,MSP430 单片机之所以有超低的功耗,是因为其在降低芯片的电源电压及灵活而可控的运行时钟方面都有其独到之处。电源电压采用的是 1.8~3.6V 电压。因而可使其在 1MHz 的时钟条件下运行时, 芯片的电流会在 200~400uA 左右,时钟关断模式的最低功耗只有 0.1uA

缺点:

1.个人感觉不容易上手,不适合初学者入门,资料也比较少,只能跑官网去找

2.占的指令空间较大,因为是16位单片机,程序以字为单位,有的指令竟然占6个字节。虽然程序表面上简洁, 但与pic单片机比较空间占用很大

应用范围:

在低功耗及超低功耗的工业场合应用的比较多

使用最多的器件:MSP430F系列、MSP430G2系列、MSP430L09系列

TMS单片机

这里也提一下TMS系列单片机,虽不算主流。由TI推出的8位CMOS单片机,具有多种存储模式、多种外围接口模式,适用于复杂的实时控制场合。虽然没STM32那么优秀,也没MSP430那么张扬,但是TMS370C系列单片机提供了通过整合先进的外围功能模块及各种芯片的内存配置,具有高性价比的实时系统控制。同时采用高性能硅栅CMOS EPROM和EEPROM技术实现。低工作功耗CMOS技术,宽工作温度范围,噪声抑制,再加上高性能和丰富的片上外设功能,使TMS370C系列单片机在汽车电子,工业电机控制,电脑,通信和消费类具有一定的应用。

STM32单片机

由ST厂商推出的STM32系列单片机,行业的朋友都知道,这是一款性价比超高的系列单片机,应该没有之一,功能及其强大。其基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M内核,同时具有一流的外设:1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI等等,在功耗和集成度方面也有不俗的表现,当然和MSP430的功耗比起来是稍微逊色的一些,但这并不影响工程师们对它的热捧程度,由于其简单的结构和易用的工具再配合其强大的功能在行业中赫赫有名…其强大的功能主要表现在:

特性:

1.内核:ARM32位Cortex-M3CPU,最高工作频率72MHz,1.25DMIPS/MHz,单周期乘法和硬件除法

2.存储器:片上集成32-512KB的Flash存储器。6-64KB的SRAM存储器

3.时钟、复位和电源管理:2.0-3.6V的电源供电和I/O接口的驱动电压。POR、PDR和可编程的电压探测器(PVD)。4-16MHz的晶振。内嵌出厂前调校的8MHz RC振荡电路。内部40 kHz的RC振荡电路。用于CPU时钟的PLL。带校准用于RTC的32kHz的晶振

4、调试模式:串行调试(SWD)和JTAG接口。最多高达112个的快速I/O端口、最多多达11个定时器、最多多达13个通信接口

使用最多的器件:STM32F103系列、STM32 L1系列、STM32W系列

PIC单片机

PIC单片机系列是美国微芯公司(Microship)的产品,共分三个级别,即基本级、中级、高级,是当前市场份额增长最快的单片机之一,CPU采用RISC结构,分别有33、35、58条指令,属精简指令集,同时采用Harvard双总线结构,运行速度快,它能使程序存储器的访问和数据存储器的访问并行处理,这种指令流水线结构,在一个周期内完成两部分工作,一是执行指令,二是从程序存储器取出下一条指令,这样总的看来每条指令只需一个周期,这也是高效率运行的原因之一,此外PIC单片机之所以成为一时非常热的单片机不外乎以下特点:

特点:

1.具有低工作电压、低功耗、驱动能力强等特点。PIC系列单片机的I/O口是双向的,其输出电路为CMOS互补推挽输出电路。I/O脚增加了用于设置输入或输出状态的方向寄存器,从而解决了51系列I/O脚为高电平时同为输入和输出的状态。

2.当置位1时为输入状态,且不管该脚呈高电平或低电平,对外均呈高阻状态;置位0时为输出状态,不管该脚为何种电平,均呈低阻状态,有相当的驱动能力,低电平吸入电流达25mA,高电平输出电流可达20mA。相对于51系列而言,这是一个很大的优点

3.它可以直接驱动数码管显示且外电路简单。它的A/D为10位,能满足精度要求。具有在线调试及编程(ISP)功能。

不足之处:

其专用寄存器(SFR)并不像51系列那样都集中在一个固定的地址区间内(80~FFH),而是分散在四个地址区间内。只有5个专用寄存器PCL、STATUS、FSR、PCLATH、INTCON在4个存储体内同时出现,但是在编程过程中,少不了要与专用寄存器打交道,得反复地选择对应的存储体,也即对状态寄存器STATUS的第6位(RP1)和第5位(RP0)置位或清零。数据的传送和逻辑运算基本上都得通过工作寄存器W(相当于51系列的累加器A)来进行,而51系列的还可以通过寄存器相互之间直接传送,因而PIC单片机的瓶颈现象比51系列还要严重,这在编程中的朋友应该深有体会

使用最多的器件:PIC16F873、PIC16F877

AVR单片机

AVR单片机是Atmel公司推出的较为新颖的单片机,其显著的特点为高性能、高速度、低功耗。它取消机器周期,以时钟周期为指令周期,实行流水作业。AVR单片机指令以字为单位,且大部分指令都为单周期指令。而单周期既可执行本指令功能,同时完成下一条指令的读取。通常时钟频率用4~8MHz,故最短指令执行时间为250~125ns。AVR单片机能成为最近仍是比较火热的单片机,主要的特点:

特点:

1.AVR系列没有类似累加器A的结构,它主要是通过R16~R31寄存器来实现A的功能。在AVR中,没有像51系列的数据指针DPTR,而是由X(由R26、R27组成)、Y(由R28、R29组成)、Z(由R30、R31组成)三个16位的寄存器来完成数据指针的功能(相当于有三组DPTR),而且还能作后增量或先减量等的运行,而在51系列中,所有的逻辑运算都必须在A中进行;而AVR却可以在任两个寄存器之间进行,省去了在A中的来回折腾,这些都比51系列出色些

2.AVR的专用寄存器集中在00~3F地址区间,无需像PIC那样得先进行选存储体的过程,使用起来比PIC方便。AVR的片内RAM的地址区间为0~00DF(AT90S2313) 和0060~025F(AT90S8515、AT90S8535),它们占用的是数据空间的地址,这些片内RAM仅仅是用来存储数据的,通常不具备通用寄存器的功能。当程序复杂时,通用寄存器R0~R31就显得不够用;而51系列的通用寄存器多达128个(为AVR的4倍),编程时就不会有这种感觉。

3.AVR的I/O脚类似PIC,它也有用来控制输入或输出的方向寄存器,在输出状态下,高电平输出的电流在10mA左右,低电平吸入电流20mA。这点虽不如PIC,但比51系列还是要优秀的…

缺点:

1.是没有位操作,都是以字节形式来控制和判断相关寄存器位的

2.C语言与51的C语言在写法上存在很大的差异,这让从开始学习51单片机的朋友很不习惯

3.通用寄存器一共32个(R0~R31),前16个寄存器(R0~R15)都不能直接与立即数打交道,因而通用性有所下降。而在51系列中,它所有的通用寄存器(地址00~7FH)均可以直接与立即数打交道,显然要优于前者。

使用最多的器件:ATUC64L3U、ATxmega64A1U、AT90S8515

STC单片机

说到STC单片机有人会说到,STC也能算主流,估计要被喷了~~我们基于它是国内还算是比较不错的单片机来说。STC单片机是宏晶生产的单时钟/机器周期的单片机,说白了STC单片机是51与AVR的结合体,有人说AVR是51的替代单片机,但是AVR单片机在位控制和C语言写法上存在很大的差异。而STC单片机洽洽结合了51和AVR的优点,虽然功能不及AVR那么强大,但是在AVR能找到的功能,在STC上基本都有,同时STC单片机是51内核,这给以51单片机为基础的工程师们提供了极大的方便,省去了学习AVR的时间,同时也不失AVR的各种功能…

STC单片机是高速、低功耗、超强抗干扰的新一代8051单片机51单片机,指令代码完全兼容传统8051,但速度快8~12倍,内部集成MAX810专用复位电路。4路PWM 8路高速10位A、D转换,针对电机电机 的供应商控制,强干扰场合,成为继51单片机后一个全新系列单片机…

特性:

1.下载烧录程序用串口方便好用,容易上手,拥有大量的学习资料及视频,最著名的要属于杜老师的那个视频了,好多对单片机有兴趣的朋友都是通过这个视频入门的,同时具有宽电压:5.5~3.8V,2.4~3.8V, 低功耗设计:空闲模式,掉电模式(可由外部中断唤醒)

2.STC单片机具有在应用编程,调试起来比较方便;带有10位AD、内部EEPROM、可在1T/机器周期下工作,速度是传统51单片机的8~12倍,价格也较便宜

3.4 通道捕获/比较单元,STC12C2052AD系列为2通道,也可用来再实现4个定时器或4个外部中断,2个硬件16位定时器,兼容普通8051的定时器。4路PCA还可再实现4个定时器,具有硬件看门狗、高速SPI通信端口、全双工异步串行口,兼容普通8051的串口,同时还具有先进的指令集结构,兼容普通8051指令集

PS:STC单片机功能虽不及AVR、STM32强大,价格也不及51和ST32便宜,但是这些并并不重要,重要的是这属于国产单片机比较出色的单片机,但愿国产单片机能一路长虹…

使用最多的器件:STC12C2052AD

Freescale单片机

主要针对S08,S12这类单片机,当然Freescale单片机远非于此。Freescale系列单片机采用哈佛结构和流水线指令结构,在许多领域内都表现出低成本,高性能的的特点,它的体系结构为产品的开发节省了大量时间。此外Freescale提供了多种集成模块和总线接口,可以在不同的系统中更灵活的发挥作用。Freescale单片机的特有的特点如下:

1.全系列:从低端到高端,从8位到32位全系列应有尽有,其推出的8位/32位管脚兼容的QE128,可以从8位直接移植到32位,弥补单片机业界8/32 位兼容架构中缺失的一环

2.多种系统时钟模块:三种模块,七种工作模式。多种时钟源输入选项,不同的mcu具有不同的时钟产生机制,可以是RC振荡器,外部时钟或晶振,也可以是内部时钟,多数CPU同时具有上述三种模块!可以运行在FEI,FEE,FBI,FBILP,FBE,FBELP,STOP这七种工作模式

3.多种通讯模块接口:Freescale单片机几乎在内部集成各种通信接口模块:包括串行通信接口模块SCI,多主I2C总线模块,串行外围接口模块 SPI,MSCAN08控制器模块,通用串行总线模块(USB/PS2)

4.具有更多的可选模块:具有LCD驱动模块,带有温度传感器,具有超高频发送模块,含有同步处理器模块,含有同步处理器的MCU还具有屏幕显示模块OSD,还有少数的MCU具有响铃检测模块RING和双音多频/音调发生器DMG模块

5.可靠性高,抗干扰性强,多种引脚数和封装选择

6.低功耗、也许Freescale系列的单片机的功耗没有MSP430的低,但是他具有全静态的“等待”和“停止”两种模式,从总体上降低您的功耗!新近推出的几款超低功耗已经与MSP430的不相上下!

使用最多的器件:MC9S12G系列

如果真要在这些单片机中分个一二三等,那么如果你想跟随大众,无可厚非51单片机还是首选;如果你追求超高性价比,STM32将是你理想选择;如果你渴望超低功耗,MSP430肯定不会让你失望;如果你想支持国产,STC会让你兴奋…

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

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

围观 17

SAM-IoT Wx v2开发板基于SAM D21单片机,可用作AWS IoT Core的基于Wi-Fi®的紧凑型IoT节点开发平台。该应用程序展示了从板载光和温度传感器到AWS IoT Core的MQTT数据传输过程。该演示应用程序基于MPLAB® Harmony v3软件框架,可以轻松定制。 

来源:Microchip微芯

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

围观 5

单片机是嵌入式系统的核心元件,使用单片机的电路要复杂得多,但在更改和添加新功能时,带有单片机的电路更加容易实现,这也正是电器设备使用单片机的原因。那么在单片机电路的设计中需要注意的难点有哪些?你都解决了吗?下面分享10个单片机电路设计中的难点,一起来学习吧~

01、单片机上拉电阻的选择

1739244845208208.jpg

1739244884319095.jpg

大家可以看到复位电路中电阻R1=10k时RST是高电平 ,而当R1=50时RST为低电平,很明显R1=10k时是错误的,单片机一直处在复位状态时根本无法工作。出现这样的原因是由于RST引脚内含三极管,即便在截止状态时也会有少量截止电流,当R取的非常大时,微弱的截止电流通过就产生了高电平。

02、LED串联电阻的计算问题

通常红色贴片LED:电压1.6V-2.4V,电流2-20mA,在2-5mA亮度有所变化,5mA以上亮度基本无变化。

1739244876161167.jpg

03、端口出现不够用的情况

这时可以借助扩展芯片来实现,比如三八译码器74HC138来拓展。

4.jpg

1739244936783707.jpg

04、滤波电容

滤波电容分为高频滤波电容和低频滤波电容。

  • 高频滤波电容一般用104容(0.1uF),目的是短路高频分量,保护器件免受高频干扰。普通的IC(集成)器件的电源与地之间都要加,去除高频干扰(空气静电)。

  • 低频滤波电容一般用电解电容(100uF),目的是去除低频纹波,存储一部分能量,稳定电源。大多接在电源接口处,大功率元器件旁边,如:USB借口,步进电机、1602背光显示。耐压值至少高于系统最高电压的2倍。

05、三极管的作用

开关作用:

6.jpg

LEDS6为高电平时截止,为低电平时导通。

限流电阻的计算:集电极电流为I,则基极电流为I/100(这里涉及到放大作用,集电极电流是基极的100倍),PN结电压0.7V,R=(5-0.7)/(I/100)。

放大作用:集电极电流是基极电流的100倍

电平转换:

7.jpg

当基极为高电平时,三极管导通,右侧的导线接地为低电平,当基极为低电平时,三极管截止,输出高电平。

06、数码管的相关问题

1739244997163967.jpg

数码管点亮形成的数字由a,b,c,d,e,f,e,dp(小数点)构成,字模及真值表如上图。

07、电流电压驱动问题

由于单片机输出有限,当负载很多的时候需要另外加驱动芯片 ,比如74HC245。

08、上拉电阻

上拉电阻选取原则:

  • 从节约功耗及芯片灌电流能力考虑应当足够大;电阻大,电流小;

  • 从确保足够的驱动电流考虑应当足够小;电阻小,电流大;

  • 对于高速电路,过大的上拉电阻可能会导致边沿变平缓;

综合考虑:上拉电阻常用值在1K到10K之间选取,下拉同理。

上下拉电阻,上拉就是将不确定的信号通过一个电阻嵌位在高电平,下拉同理。

  • 电平转换,提高输出电平参数值;

  • OC门必须加上拉电阻才能使用;

  • 加大普通IO引脚驱动能力;

  • 悬空引脚上下拉抗干扰。

09、晶振和复位电路

晶振电路

  • 晶振选择:根据实际系统需求选择,6M,12M,11.0592M,20M等待。

  • 负载电容:对地接2个10到30pF的电容即可,常用20pF。

  • 万用表测晶振:直接用红表笔对晶振引脚,黑表笔接GND,测量电压即可;复位电路把单片机内部电路设置成为一个确定的状态,所有的寄存器初始化。

51单片机的复位时间大约在2个机械周期左右,具体需要看芯片数据手册。一般通过复位芯片或者复位电路,具体的阻容参数的计算,通过google查找。

10、按键抖动及消除

按键也是机械装置,在按下或放开的一瞬间会产生抖动,如下图:

9.jpg

消除方法有两种:软件除抖和硬件除抖,其中硬件除抖是应用了电容对高频信号短路的原理。

软件除抖是检测出键闭合后执行一个延时程序,产生5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。

来源:EEPW

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

围观 28

(片内RAM)传送指令MOV(Move)把一个字节、字或双字的操作数从源位置传送到目的位置,源操作数的内容不变。可以实现立即数到通用寄存器或主存的传送,通用寄存器与通用寄存器、主存或段寄存器之间的传送,主存与段寄存器之间的传送。该操作属于复制性质,不属于搬家性质。

根据数据的存放区域可以将数据传送指令分为以下几类:

1)片内RAM区和特殊功能寄存器的数据传送,包括MOV指令、堆栈操作指令(PUSH、POP)和交换指令(SWAP、XCH和XCHD)。

2)片外RAM或I/O端口与累加器A之间的数据传送,即MOVX指令。

3)ROM中数据向累加器A的数据传送,即MOVC指令。

MOV指令的目的操作数可以是累加器A、工作寄存器Rn(n=0~7)、直接寻址操作数direct、寄存器间接寻址操作数@Ri(i=0或1)和数据指针寄存器(DPTR)等。表3-2为MCS-51单片机指令集中的MOV指令。

1.png

总结

表3-2所列出的指令语法格式,可以得到图3-1所示的MOV指令数据传送方向,其中箭头所指方向即为数据传送方向。

2.jpg

图3-1 MOV指令数据传送方向

需要特别说明的是,大多数书籍中将“MOV C,bit”和“MOV bit,C”归入位操作指令,而本书将其与字节传输指令列入同一个表格,是为了便于进行字节传送指令和位传送指令的对照,有利于读者理解、记忆和区分这些指令。

【例3-18】以累加器A为目的操作数的MOV指令。指令如下:

3.png

在本例中,需要注意以下几点:

1)累加器A的寻址方式是寄存器寻址。

2)指令②和⑤中的源操作数的寻址方式不同,②中的72H前没有“#”是直接地址,⑤中的72H前有“#”是立即数。

3)PSW是特殊功能寄存器,其字节地址是0D0H;特殊功能寄存器的名称是其字节地址的符号化,在指令中特殊功能寄存器的地址与其符号名称是等价的。

【例3-19】以Rn为目的操作数的MOV指令。指令如下:

5.png

【例3-20】以direct为目的操作数的MOV指令。指令如下:

6.png

在本例中,需要特别注意的是指令①和②的作用完全相同,而且源操作数均是累加器。但是以A表示的累加器是寄存器寻址,累加器的地址不会出现在指令的机器代码中;以ACC表示的累加器是直接寻址,累加器的地址0E0H将出现在指令的机器代码中。

【例3-21】以@Ri为目的操作数的MOV指令。指令如下:

7.png

【例3-22】以DPTR为目的操作数的MOV指令。指令如下:

MOV DPTR,#1234H;(DPTR)←1234H,即(DPH)←12H且(DPL)←34H

“MOV DPTR,#data”是MCS-51指令中唯一的16位数据传输指令,DPTR由两个特殊功能寄存器DPH和DPL构成,分别对应DPTR的高字节和低字节。

【例3-23】位传送指令。指令如下:

8.png

在本例中,20H和24H.0是同一个位地址;0D5H、F0、PSW.5和0D0H.5是同一个位,即PSW寄存器的第5位。

判断MOV指令对错的基本方法是:检查指令的格式是否符合表3-2的要求,不符合的即是错误的。在例3-24中,指令⑭和⑮的错误原因如下:

1)根据表3-2,位传送指令中必然出现进位标志位CY,而指令⑭试图完成进位标志位CY和字节型寄存器A之间的数据传输,但是由于CY和A数据类型不一致,所以无法完成数据传送。

2)指令⑮的源操作数和目的操作数虽然都是位寻址操作数。但是由表3-2可知,位传送指令中必须有一个操作数为CY,所以单片机不能识别该指令。

注意事项

1.目的操作数要与源操作数类型要一致,不能一个是字,一个是字节

2.目的操作数要和源操作数类型之一必须要有明确的类型

3.立即数不能作为目的操作数

4.不能用立即寻址方式给段寄存器传数

5.源操作数和目的操作数不能同时为存储器操作数,即存储单元之间不能用MOV指令直接传送

6.CS和IP不能作为目的操作数,但CS可以作为源操作数。

7.段寄存器之间不能用MOV指令直接传送

8.在传送字单元时,遵循“高字节存放在高地址,低字节存放在低地址”的原则。

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

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

围观 34
单片机的基本结构包括中央处理器(CPU) 、存储器、定时/计数器、输入输出接口、中断控制系统和时钟电路六部分。

一、基本组成

1.png
中央处理器(CPU)

包括运算器和控制器两部分,是单片机的核心。运算器可用于各种运算,控制器用于控制单片机各部分协调工作。

2.png

存储器

用于存放程序和原始数据。

3.png

时钟电路

时钟电路产生单片机运行的控制信号,控制单片机严格按时序执行指令。

4.png

定时/计数器:实现定时或计数功能。

输入输出接口(I/O)实现单片与其他设备之间的数据传送。

中断控制系统: 用于响应中断源的中断请求。

5.png

二、单片机引脚

双列直插式封装(DIP,Dual Inline Package)

方形封装(PLCC,PlasTIc Leaded Chip Carrier)

6.png

电源引脚: VCC (40脚)和VSS(20脚)分别接供电电源正极和负极。

时钟电路引脚:单片机需要有时钟脉冲信号才能工作,经(18脚)和 (19脚)接振荡电路。

7.png

控制信号引脚包括以下4个:

EA( 31脚):当EA接高电平时先内后外执行ROM程序。接低电平时只执行外部ROM程序。

RST (9脚):当输入两个机器周期以上的高电平时实现复位,使单片机初始化并重新执行程序。

ALE (30脚):访问外部存储器和其他外设时,ALE控制低8位地址和数据的分时传送。

PSEN (29脚):外部程序存储器读选通信号。

8.png

并行输入/输出引脚共32个:

PO口(39-32脚):可作地址/数据总线端口用,也可作普通I/O口用。

P1口(1-8脚):一般只用作I/O端口。

P2口(21-28脚):当访问外部存储器时可输出高8位地址,也可作普通I/O端口使用。

P3口(10-17脚):主要用其第二功能,也可作普通I/O口用。

9.png
10.png

三、并行输入/输出

P0口位电路结构

1个数据输出锁存器。

2个三态的数据输入缓冲器BUF1和BUF2。

2个场效应管(FET)。

多路开关、反相器、与门各1个。

11.png

P0口工作原理——用作复用的地址/数据总线

输出:“控制”信号为1,硬件自动使转接开关MUX打向上面,接通反相器的输出,同时使“与门”开启。

12.png

①当输出的地址/数据信息=1,“与门”输出为1,上方场效应管导通,下方场效应管截止,P0.x引脚输出为1。

②当输出的地址/数据信息=0,上方场效应管截止,下方场效应管导通,P0.x引脚输出为0。

P0口工作原理——用作复用的地址/数据总线

输入:当P0口作为数据输入时,仅从外部引脚读入信息,“控制”信号为0,MUX接通锁存器Q端。

13.png

P0口作为地址/数据复用方式访问外部存储器时,CPU自动向P0口写入FFH,使下方场效应管截止,上方场效应管由于控制信号为0也截止,从而保证数据信息的高阻抗输入,从外部输入的数据直接由P0.x引脚通过输入缓冲器BUF2进入内部总线。

14.png

①当D锁存器为1时, 端为0,下方场效应管截止,输出为漏极开路,此时,必须外接上拉电阻才能有高电平输出;

②当D锁存器为0时,下方场效应管导通,P0口输出为低电平。

P0口工作原理——用作通用I/O口

输入:两种读入方式:“读锁存器”和“读引脚”。

①当CPU发出“读锁存器”指令时,锁存器的状态由Q端经上方的三态缓冲器BUF1进入内部总线。

②当CPU发出“读引脚”指令时,锁存器的输出状态Q=1(Q端为0),而使下方场效应管截止,引脚的状态经下方的三态缓冲器BUF2进入内部总线。

15.png

P1口位电路结构

1个数据输出锁存器。

2个三态的数据输入缓冲器BUF1和BUF2。

1个场效应管(FET)和1个片内上拉电阻组成。

16.png

P1口工作原理——只用作通用I/O口

①若CPU输出1,Q=1,Q-=0,场效应管截止,P1.x脚输出为1;

②若CPU输出0,Q=0,Q- =1,场效应管导通,P1.x脚输出为0。

17.png

P1口工作原理——只用作通用I/O口

输入:分为“读锁存器”和“读引脚”

18.png

①读“锁存器”,输出Q状态经输入缓冲器BUF1进入内部总线;

②“读引脚”,先向锁存器写1,使场效应管截止,P1.x引脚上的电平经输入缓冲器BUF2进入内部总线。

P2口位电路结构

1个数据输出锁存器。

2个三态的数据输入缓冲器BUF1和BUF2。

1个场效应管(FET)和1个片内上拉电阻组成。

1个多路转接开关MUX

19.png

P2口工作原理——用作地址总线

在控制信号作用下,MUX与“地址”接通。

20.png

①当“地址”为0时,场效应管导通,P2口引脚输出0;

②当“地址”线为1时,场效应管截止,P2口引脚输出1。

P2口工作原理——用作通用I/O口

输出:在内部控制信号作用下,MUX与锁存器Q端接通。

21.png

①CPU输出1时,Q=1,场效应管截止,P2.x引脚输出1;

②CPU输出0时,Q=0,场效应管导通,P2.x引脚输出0。

P2口工作原理——用作通用I/O口

输入:分“读锁存器”和“读引脚”两种方式。

22.png

①“读锁存器”时,Q端信号经输入缓冲器BUF1进入内部总线;

②“读引脚”时,先向锁存器写1,使场效应管截止,P2.x引脚上的电平经输入缓冲器BUF2进入内部总线。

P3口位电路结构

1个数据输出锁存器。

3个三态的数据输入缓冲器BUF1和BUF2。

1个场效应管(FET)和1个片内上拉电阻组成。

1个多路转接开关MUX和1个与非门

23.png

P3口工作原理——用作第二功能

输出:该位的锁存器需要置“1”,使“与非门”为开启状态。

24.png

当第二输出为1时,场效应管截止,P3.x引脚输出为1;

当第二输出为0时,场效应管导通,P3.x引脚输出为0。

P3口工作原理——用作第二功能

输入:该位的锁存器和第二输出功能端均应置1,保证场效应管截止,P3.x引脚的信息由输入缓冲器BUF3的输出获得。

25.png

P3口工作原理——用作通用I/O口

输出:第二输出功能端应保持“1”,“与非门”开启。

26.png

CPU输出1时,Q=1,场效应管截止,P3.x引脚输出为1;

CPU输出0时,Q=0,场效应管导通,P3.x引脚输出为0。

P3口工作原理——用作通用I/O口

输入:P3.x位的输出锁存器和第二输出功能均应置1,场效应管截止。

27.png

P3.x引脚信息通过输入BUF3和BUF2进入内部总线,完成“读引脚”操作;

也可执行“读锁存器”操作,此时Q端信息经过缓冲器BUF1进入内部总线。

28.png

四个并口(P0-P3)在读引脚之前,都需要将锁存器置“1”,使场效应管截止,避免锁存器内数据的干扰。

由于在输入操作前还必须附加一个置“1”的准备动作,因此称为“准双向口”。

四个并口(P0-P3)都是准双向口

四、8051单片机的最小系统板

8051单片机内部有4KB闪烁存储器,本身就是一个数字量输入/输出的最小应用系统。

在构建8051单片机最小应用系统时,8051单片机需要外接时钟电路和复位电路即可,如下图所示。

29.png

注意:本最小应用系统只能作为小型的数字量的测控单元

来源:电子工程师笔记

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

围观 78

单片机在复杂的应用中,片内的资源往往不能满足实际需求,需要扩充较大的存储容量和较多的 I/O 接口。所谓系统扩展,一般有两项主要任务:

其一,是把系统所需的外设和单片机连接起来,使单片机系统能与外界进行信息交换。如通过键盘、A/D 转换器等外部设备向单片机送入数据、命令等有关信息,去控制单片机运行;通过显示器、发光二极管、打印机等设备把单片机处理的结果送出来,向人们提供各种信息或对外界设备提供控制信号,这项任务实际上就是单片机接口设计。

其二,是扩大单片机的存储容量。由于单片机芯片的结构、集成工艺等关系,单片机内 ROM 、RAM 等容量不可能很大,在使用中有时不够,需要在芯片外进行扩展。

因此,系统扩展和接口技术一般有以下几方面内容:

(1) 外部总线的扩展;

(2) 外部存储器的扩展;

(3) 输入/输出接口的扩展;

(4) 管理功能部件的扩展(如定时器/计数器、键盘/显示器等);

(5) A/D 和 D/A 接口技术。

一、外部总线的扩展

MCS 51 芯片没有对外专用的地址总线和数据总线,那么在进行对外扩展存储器或 I/O 接口时,首先需要扩展对外总线。通过 MCS 51 引脚 ALE 可实现对外总线扩展。在 ALE 为有效高电平期间,P0 口上输出 A7 ~A0 ,因而只需在 CPU 片外扩展一片地址锁存器,用 ALE 的有效高电平边沿作锁存信号,即可将 P0 口上的地址信息锁存,直到 ALE 再次有效。在 ALE 无效期间 P0 口传送数据,即作数据总线口。这样就可将 P0 口 的地址线和数据线分开。图 7.1 为 MCS 51 扩展的外部三总线示意图。

1.jpg

图 7.1 MCS 51 外部三总线示意图

通常用作单片机地址锁存器的芯片有 74LS273 、74LS377 、74LS373 、8282 等,图 7.2 的(a)、(b) 和(c) 给出了 74LS373 、8282 和 74LS273 的引脚,以及它们用做地址锁存器的接法。

2.jpg

图 7.2 地址锁存器的引脚和接口

74LS373 和 8282 是带三态输出的 8 位锁存器,两者的结构和用法类似。以 74LS373 为例,当三态端 OE有效,使能端 G 为高电平时,输出跟随输入变化;当 G 端由高变低时,输出端 8 位信息被锁存,直到 G 端再次有效。

74LS273 为 8D 触发器 ,当时钟上升沿到来时,将 D 端输入的数据锁存。作为地址锁存器使用时,可将 ALE 反相接 74LS273 的 CLK 端,CLK 端接+5V 。

二、总线驱动

在单片机应用系统中,扩展的三总线上挂接很多负载,如存储器、并行接口、A/D 接口、显示接口等,但总线接口的负载能力有限,因此常常 需要通过连接总线驱动器进行总线驱动。

总线驱动器对于单片机的 I/O 口只相当于增加了一个 TTL 负载,因此驱动器除了对后级电路驱动外,还能对负载的波动变化起隔离作用。在对 TTL 负载驱动时,只需考虑驱动电流的大小;在对 MOS 负载驱动时,MOS 负载的输入电流很小,更多地要考虑对分布电容的电流驱动。

1. 常用的总线驱动器

系统总线中地址总线和控制总线是单向的,因此驱动器可以选用单向的,如 74LS244 。74LS244 还带有三态控制,能实现总线缓冲和隔离。

系统中的数据总线是双向的,其驱动器也要选用双向的,如 74LS245 。74LS245 也是三态的,有一个方向控制端 DIR,DIR=1 时输 出 (An 一Bn ), DIR=0 时输入(An ←Bn )。74LS244 、74LS245 的引脚见图 7.3 。

3.jpg

图 7.3 总线驱动器芯片管脚

(a) 单 向驱动器; (b) 双 向驱动器

2.总线驱动器的接口

图 7.4 给出了总线驱动器 74LS244 和 74LS245 与 8051 管脚间的接口方法。

4.jpg

图 7.4 8051 与总线驱动器的接口

(a) P2 口 的驱动; (b) P0 口 的驱动

由于 P2 口始终输出地址高 8 位,接口时 74LS244 的三态控制端 1G 和 2G 接地,P2 口 与驱动器输入线对应相连。

P0 口与 74LS245 输入线相连,端接地,保证数据线畅通。8051 的 RD和 PSEN相与 后接 DIR,使得 RD或 PSEN有效时,74LS245 输入,其它时间处于输出状态。

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

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

围观 42

UART串口是嵌入式开发常见的一种通信方式,但还是有不少人不知道怎么使用串口。

今天就来围绕串口,简单分享几点内容:

  • 串口接收方式

  • 处理接收数据

  • 通信协议解析

串口接收方式

串口接收(通信另一端)的数据,常见的方式:

  • 轮询(查询)接收寄存器

  • 中断接收数据

轮询,就是间隔一定时间(一般ms,甚至us)去查询一下接收寄存器是否有数据,如果有数据,就处理接收到的数据。

中断,平时没有数据接收时,CPU干自己的事。当有接收数据时,UART串口控制器会响应中断,通知CPU有事干了。

轮询方式,大家想过有哪些弊端吗?

效率低:CPU大部分时间都是去做查询的工作;

响应不实时:如果短时间内有多个接收数据,CPU正在处理一件相对耗时的事情(比如:发送一个数据包),没来得及查询接收到的数据,此时,数据就可能丢失。(特别是早些年串口没有FIFO功能的时候)

所以,不管是UART串口,还是I2C、 SPI、 CAN等串行通信,用的最多,最常见的还是中断接收,很少有用轮询的方式。

我之前维护一个老代码(坑),CLI串口用轮询方式,出现丢数据、溢出错误等众多问题,让我还加了好几个班。。。

处理接收数据

中断有数据来了,大家怎么处理接收到的数据?

我见过有些小项目,直接在中断函数里面做一些应用的情况。比如:串口中断接收一个传感器发过来的数据,显示数据并做一些响应的动作。

中断函数,代码能少尽少,耗时能少尽少,不能处理太多耗时的复杂的逻辑、应用等。

中断有数据来了,一般是通过FIFO方式处理。

1.简单的数组接收、应用解析并处理

比如:

static uint8_t gRxCnt = 0;
static uint8_t gRxBuf[10];

void USART1_IRQHandler(void)
{  
    //...  
    gDgus_RxBuf[gRxCnt] = (uint8_t)USART_ReceiveData(USART1);  
    gRxCnt++;  //...  
}

void App(void)
{  
    //...  
    if(0 < gRxCnt)  
    {    
        //拷贝接收到的数据    
        gRxCnt = 0;    
        //解析接收数据并处理  
    }
}

2.中断函数接收一帧完整数据再处理

比如:

void USART1_IRQHandler(void)
{  
    static uint8_t RxCnt = 0;                      //计数值  
    static uint8_t RxNum = 0;                      //数量
   
   if((USART1->SR & USART_FLAG_RXNE) == USART_FLAG_RXNE)  
   {    
       gDgus_RxBuf[RxCnt] = (uint8_t)USART_ReceiveData(USART1);    
       RxCnt++;
       
      /* 判断帧头 */    
      if(gDgus_RxBuf[0] != DGUS_FRAME_HEAD1)       //接收到帧头1    
      {      
          RxCnt = 0;      
          return;    
      }    
      if((2 == RxCnt) && (gDgus_RxBuf[1] != DGUS_FRAME_HEAD2))    
      {      
          RxCnt = 0;      
          return;    
      }
    
     /* 确定一帧数据长度 */    
     if(RxCnt == 3)    
     {      
         RxNum = gDgus_RxBuf[2] + 3;    
     }
     
     /* 接收完一帧数据 */    
     if((6 <= RxCnt) && (RxNum <= RxCnt))    
     {      
         RxCnt = 0;      
         OSMboxPost(EventMBox_Touch, gDgus_RxBuf);  //发送消息邮箱(执行触控操作)    
     }  
     }
 }

中断函数解析完一帧数据,可以通过标志位通知应用(裸机时),也可以通过消息队列、邮箱等方式发送到应用(RTOS时)。

3.RTOS队列、邮箱接收

比如:

void DEBUG_COM_IRQHandler(void)
{  
    static uint8_t Data;
  
   if(USART_GetITStatus(DEBUG_COM, USART_IT_RXNE) != RESET)  
   {    
       Data = USART_ReceiveData(DEBUG_COM);    
       CLI_RcvDateFromISR(Data); //下面把这个函数分离出来了  
   }
}

void CLI_RcvDateFromISR(uint8_t RcvData)
{  
    static portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
   if(xCLIRcvQueue != NULL)  
   {    
       xQueueSendFromISR(xCLIRcvQueue, &RcvData, &xHigherPriorityTaskWoken);  
   }
}

中断来一字节数据,就通过消息队列发送一个字节数据,如果没有及时出来这个数据,也是存储在队列中。

通信协议解析

像上面第2种,简单通信协议,项目相对较小的情况下,可以直接在中断函数里面处理。

但是,如果项目相对较大、复杂一点,协议也先对复杂一点,上面第2种在函数内部出来方式就不可取。

1.裸机环境

裸机的情况下,建议用第一种:中断数组缓存数据(FIFO),应用解析通信协议。

2.RTOS环境

RTOS情况下,建议用第三种方式:消息队列、邮箱等方式接收数据,然后发送(通知)应用解析协议。

当然,以上说的都只是常见的方式,具体还需要结合你项目实际情况。

同时,其它类似I2C、CAN等通信,如有协议解析,也是类似。

比如之前给大家分享的MavLink,我就用CAN实现过:

void CAN_RX_IRQHandler(void)
{  
    static CanRxMsg RxMessage;  
    static MAVRCV_QUEUE_TypeDef MAVRcvQueue_Union;
  
   CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);                                                 
               //拷贝长度、 数据  
   
   MAVRcvQueue_Union.MAVRcvStruct.MAVLink_Len = RxMessage.DLC;  
   memcpy(&MAVRcvQueue_Union.MAVRcvStruct.MAVLink_Buf[0], &RxMessage.Data[0], RxMessage.DLC);
   MAVLink_RcvDateFromISR(&MAVRcvQueue_Union.MAVLinkRcv_Queue[0]);
}

最后,以上内容,仅提供思路,代码不一定适合项目。

来源:strongerHuang

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

围观 45

页面

订阅 RSS - 单片机