单片机

单片机 执行指令

我们来思考一个问题,当我们在编程器中把一条指令写进单片机内部,然后取下单片机,单片机就可以执行这条指令。

那么这条指令一定保存在单片机的某个地方,并且这个地方在单片机掉电后依然可以保持这条指令不会丢失,这是个什么地方呢?这个地方就是单片机内部的只读存储器即ROM(READ ONLY MEMORY)。

为什么称它为只读存储器呢?刚才我们不是明明把两个数字写进去了吗?原来在89C51中的ROM是一种电可擦除的ROM,称为FLASH ROM,刚才我们是用的编程器,在特殊的条件下由外部设备对ROM进行写的操作,在单片机正常工作条件下,只能从那面读,不能把数据写进去,所以我们还是把它称为ROM。

单片机 数的本质和物理现象

我们知道,计算机可以进行数学运算,这令我们非常难以理解,它们只是一些电子元器件,怎么可以进行数学运算呢?

我们人类做数学题如37+45是这样做的,先在纸上写37,然后在下面写45,然后大脑运算最后写出结果,运算的原材料是37和45,结果是82都是写在纸上的,计算机中又是放在什么地方呢?

为了解决这个问题,先让我们做一个实验:这里有一盏灯,我们知道灯要么亮,要么不亮,就有两种状态,我们可以用‘0’和‘1’来代替这两种状态:规定亮为‘1’、不亮为‘0’。

现在放上三盏灯,一共有几种状态呢?我们列表来看一下:000 / 001 / 010 / 011 / 100 / 101 / 110 / 111。我们来看,这个000 / 001 / 101 不就是我们学过的的二进制数吗?本来,灯的亮和灭只是一种物理现象,可当我们把它们按一定的顺序排好后,灯的亮和灭就代表了数字了。让我们再抽象一步,灯为什么会亮呢?是因为输出电路输出高电平,给灯通了电。因此,灯亮和灭就可以用电路的输出是高电平还是低电平来替代了。这样,数字就和电平的高、低联系上了。

单片机 数位的含义

通过上面的实验我们已经知道:一盏灯亮或者说一根线的电平的高低,可以代表两种状态:0和1,实际上这就是一个二进制位。

因此我们就把一根线称之为一“位”,用BIT表示。

一根线可以表示0和1,两根线可以表达00 / 01 / 10 / 11四种状态,也就是可以表达0~3,而三根可以表达0~7,计算机中通常用8根线放在一起,同时计数,就可以表示0~255一共256种状态。

这8根线或者8位就称之为一个字节(BYTE)。

单片机 存储器的构造

存储器就是用来存放数据的地方。它是利用电平的高低来存放数据的,也就是说,它存放的实际上是电平的高、低,而不是我们所习惯认为的1234这样的数字,这样,我们的一个谜团就解开了。

一个存储器就象一个个的小抽屉,一个小抽屉里有八个小格子,每个小格子就是用来存放“电荷”的,电荷通过与它相连的电线传进来或释放掉。至于电荷在小格子里是怎样存的,就不用我们操心了,你可以把电线想象成水管,小格子里的电荷就象是水,那就好理解了。存储器中的每个小抽屉就是一个放数据的地方,我们称之为一个“单元”。

有了这么一个构造,我们就可以开始存放数据了,想要放进一个数据12,也就是00001100,我们只要把第二号和第三号小格子里存满电荷,而其它小格子里的电荷给放掉就行了。

可问题出来了,一个存储器有好多单元,线是并联的,在放入电荷的时候,会将电荷放入所有的单元中,而释放电荷的时候,会把每个单元中的电荷都放掉。这样的话,不管存储器有多少个单元,都只能放同一个数,这当然不是我们所希望的。因此,要在结构上稍作变化。

需要在每个单元上有个控制线,想要把数据放进哪个单元,就把一个信号给这个单元的控制线,这个控制线就把开关打开,这样电荷就可以自由流动了。而其它单元控制线上没有信号,所以开关不打开,不会受到影响。

这样,只要控制不同单元的控制线,就可以向各单元写入不同的数据了。同样,如果要从某个单元中取数据,也只要打开相应的控制开关就行了。

单片机 存储器的译码

那么,我们怎样来控制各个单元的控制线呢?这个还不简单,把每个单元的控制线都引到集成电路的外面不就行了吗?

事情可没那么简单,一片27512存储器中有65536个单元,把每根线都引出来,这个集成电路就得有6万多个脚?不行,怎么办?要想法减少线的数量。

有一种方法称这为译码,简单介绍一下:一根线可以代表2种状态,2根线可以代表4种状态,3根线可以代表8种,256种状态又需要几根线代表?8根线,所以65536种状态我们只需要16根线就可以代表了。

单片机 存储器的选片概念

至此,译码的问题解决了,让我们再来关注另外一个问题。送入每个单元的八根线是用从什么地方来的呢?它就是从计算机上接过来的,一般地,这八根线除了接一个存储器之外,还要接其它的器件。

这样问题就出来了,这八根线既然不是存储器和计算机之间专用的,如果总是将某个单元接在这八根线上,就有问题出现了:比如这个存储器单元中的数值是0FFH另一个存储器的单元是00H,那么这根线到底是处于高电平,还是低电平?怎样分辩?

办法很简单,当外面的线接到集成电路的引脚进来后,不直接接到各单元去,中间再加一组开关就行了。平时我们让开关打开着,如果确实是要向这个存储器中写入数据,或要从存储器中读出数据,再让开关接通就行了。

这组开关由三根引线选择:读控制端、写控制端和片选端。要将数据写入片中,先选中该片,然后发出写信号,开关就合上了,并将传过来的数据(电荷)写入片中。如果要读,先选中该片,然后发出读信号,开关合上,数据就被送出去了。

读和写信号同时还接入到另一个存储器,但是由于片选端不同,所以虽有读或写信号,但没有片选信号,所以另一个存储器不会“误会”而开门,造成冲突。那么会不同时选中两片芯片呢?

只要是设计好的系统就不会,因为它是由计算控制的,而不是我们人来控制的,如果真的出现同时出现选中两片的情况,那就是电路出了故障了,这不在我们的讨论之列。

单片机 总线概念

从上面的介绍中我们已经看到,用来传递数据的八根线并不是专用的,而是很多器件大家共用的。

所以我们称之为数据总线,总线英文名为BUS,总即公交车道,谁也可以走。而十六根地址线也是连在一起的,称之为地址总线。

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

围观 17

单片机程序编译之后,除了生成hex文件之外还生成了bin文件,实际它们都是单片机的下载文件,下文介绍它们的区别。

Hex

Hex文件包含地址信息。

在用ISP方式烧写程序时,有这样的经验:

  • 选择单片机型号

  • 选择串口号

  • 设置波特率(或者默认)

  • 选择下载的文件

  • 点击下载按钮下载

在串口工具中,操作如下图红框所示。

“单片机中hex、bin文件的区别"

经过这几步后,程序下载工作就完成了,在以上的步骤中我们并没有选择要把程序下载到单片机的哪块内存中,即不需要设置地址。因为HEX文件内部的信息已经包括了地址,相关文章推荐:在SMT32的HEX文件里加入固件版本信息。

单片机一般是下载hex文件。

BIN

BIN文件格式只包括了数据本身,没有包含地址。烧写BIN文件的时候,用户是一定需要指定地址信息的。

所以在下载bin文件时需要选择内存的起始地址和终止地址,即要把bin文件下载到指定的内存空间,相关文章移步此处:STM32单片机中Hex、Bin文件的区别与应用。

通常需要指定程序内存地址的芯片为ARM芯片和DSP芯片。

文件大小

对于bin文件,通过右键属性查看到的文件的大小就是数据的实际大小。

而对HEX文件而言,你看到的文件大小并不是实际的数据的大小。一是因为HEX文件是用ASCII来表示数据,二是因为HEX文件本身还包括别的附加信息。

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

围观 137

如果你还不了解什么是STM32对其Flash的保护,那么今天就来给你讲解一下什么是STM32的Flash保护!

01、什么是Flash?

STM32的FLASH组织结构,可能因不同系列、型号略有不同。比如大家熟悉的STM32F1中小容量一页大小只有1K,而F1大容量一页有2K。

还比如有些系列以扇区为最小单元,有的扇区最小16K,有的128K不等。

通常Flash包含几大块,这里以F40x为例:

  • 主存储器:用来存放用户代码或数据。

  • 系统存储器:用来存放出厂程序,一般是启动程序代码。

  • OTP 区域:一小段一次性可编程区域,供用户存放特定的数据。

  • 选项字节:存放与芯片资源或属性相关的配置信息。

“讲讲STM32单片机Flash的读保护和写保护"

02、什么是STM32对内部Flash的保护?

所有的STM32芯片都会提供对Flash的保护,防止对Flash的非法访问,分为:写保护和读保护。

1、读保护就是大家通常说的“加密”,作用于整个Flash存储区域。如果一旦设置了Flash的读保护,那么单片机内置的Flash存储区就只能通过程序的正常执行才能读出,而不能通过下述方式读出:

(1) 使用调试器(JTAG或SWD);
(2)从内存RAM中启动并执行的程序;

2、写保护是以四页(1KB/页) Flash存储区为单位提供写保护,如果对Flash设置了写保护,那么就无法对Flash进行编程和擦除,而且同时产生操作错误标志。 当出现下图标志的时候,就要检查Flash是否被保护起来了。

“讲讲STM32单片机Flash的读保护和写保护"

03、读保护与写保护的相关效果

当设置读保护与写保护时,其效果如下图所示:

“讲讲STM32单片机Flash的读保护和写保护"

1)flash保护的相关函数

“讲讲STM32单片机Flash的读保护和写保护"

2)STM32如何设置读保护?

我们只需要在程序开头加入“设置读保护”的代码就可以,这样就可以在每次运行代码的时候都检查一下,如果没有开的话就打开,如果开了就跳过。下面是读保护的代码:

“讲讲STM32单片机Flash的读保护和写保护"

当我们在程序的开头执行了上面的代码之后,使用j-link就不能在读出程序了,这样就实现了读保护。

3)如何通过代码解除Flash保护

解除读保护可以下面代码来进行解除,我们为了方便解锁,可以设置一个按键。

“讲讲STM32单片机Flash的读保护和写保护"

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

围观 2967

ADC的种类很多,对应的精度和误差也有很多,本文就来讲讲关于ADC精度和误差的内容。

ADC介绍

ADC:Analog Digital Converter,指模数转换,也就是(电压)模拟量转换成数字量。

大多数MCU中都集成了ADC模块,同时ADC也是在产品开发中使用率较高的一个模块,相信大部分人都使用过ADC这个功能。

在STM32中内置最多四个高级12位ADC控制器(ADC1、2、3、4)。当然,ADC控制器数量多少取决于STM32型号,还有部分STM32具有16位采样的ADC(如STM32F373)。他们提供自校准功能,用于提高环境条件变化时的ADC精度。

我们平时在使用ADC中要求不是很高,可能就没有在于ADC转换的值是否精确。但是,有些特定场合就需要更精确的转换值,那么我们就需要对ADC做更多了解。下面章节带领大家了解相关内容。

ADC误差

在涉及模数转换的应用中, ADC精度会影响整体的系统质量和效率。为了提高此精度,有必要了解与ADC相关的误差。

ADC误差主要包含:ADC自身和环境导致的误差。

1、ADC自身导致的误差

说误差之前,先说下ADC精度,为便于参考,将精度误差表达为1 LSB的倍数:

1 LSB = VREF+ / 2^12

A、偏移误差

偏移误差是第一次实际转换和第一次理想转换之间的偏离。第一次转换发生在数字ADC输出从0变为1时。理想情况下,当模拟输入介于0.5 LSB和1.5 LSB之间时,数字输出应为1。

仍然是理想情况下,第一次转换发生在0.5 LSB处。用EO表示偏移误差。可通过应用固件轻松校准偏移误差。

正偏移误差的表示方法:

“单片机中ADC采集都存在哪些误差?"

负偏移误差的表示方法:

“单片机中ADC采集都存在哪些误差?"

B、增益误差

增益误差是最后一次实际转换和最后一次理想转换之间的偏离。增益误差用EG表示。

正增益误差的表示方法:

“单片机中ADC采集都存在哪些误差?"

负增益误差的表示方法:

“单片机中ADC采集都存在哪些误差?"

C、微分线性误差

微分线性误差( DLE)为实际步进和理想步进之间的最大偏离。这里的“理想情况”不是指理想传输曲线,而是指ADC分辨率。

理想情况下, 1 LSB的模拟输入电压变化量应导致数字代码变化。如果需要大于1 LSB的模拟输入电压才能导致数字代码变化,将观察到微分线性误差。因此, DLE对应于从一个数字代码变为下一个数字代码所需的最大额外电压。

“单片机中ADC采集都存在哪些误差?"

D、积分线性误差

积分线性误差为任何实际转换和端点相关线间的最大偏离,用EL表示ILE。

端点相关线可以定义为A/D传输曲线上连接第一次实际转换与最后一次实际转换的线。EL是指与每一次转换的这条线的偏离。因此,端点相关线对应于实际传输曲线并且与理想传输曲线不相关。

“单片机中ADC采集都存在哪些误差?"

E、总未调整误差

总未调整误差( TUE)为实际和理想传输曲线间的最大偏离。此参数指定可能发生的会导致理想数字输出与实际数字输出之间最大偏离的总误差。TUE是记录到的任何输入电压的理想预期值与从ADC获得的实际值之间的最大偏离。

“单片机中ADC采集都存在哪些误差?"

2、ADC环境导致的误差

A、参考电压噪声

由于ADC输出为模拟信号电压与参考电压之比,因此模拟参考上的任何噪声都会导致转换后数字值的变化。在某些封装中, VDDA模拟电源被用作参考电压( VREF+),因此VDDA电源的质量会影响ADC误差。

B、参考电压/电源调节

电源调节对于ADC精度十分重要,因为转换结果是模拟输入电压与VREF+值之比。
当连接到VDDA或VREF+时,如果这些输入上的负载及其输出阻抗导致电源输出下降,将在转换结果中产生误差。

C、外部参考电压参数

当使用外部参考电压源( VREF+引脚上)时,该外部参考源有一些重要参数。必须考虑三个参考电压规格:温度漂移、电压噪声和长期稳定性。

D、模拟输入信号噪声

在采样时间内,小而高频率的信号变化可导致较大转换误差。此噪声由电气设备(例如电机、发动机点火、电源线)生成。它增加了不需要的信号,因此会影响源信号(例如传感器)。这样一来,导致ADC转换结果不准确。

E、最大输入信号幅度的ADC动态范围匹配不佳

为获得最高ADC转换精度, ADC动态范围必须与待转换信号的最大幅度相匹配。

我们假设待转换信号在0 V与2.5 V之间变化,并且VREF+等于3.3 V。如下图,有部分未使用的ADC转换范围,也会使转换后信号精度下降。

“单片机中ADC采集都存在哪些误差?"

如何提高ADC采集数据准确性

这个问题之前写过相关的内容,只是没有单独提出来说,这里汇总一下。

1、减少ADC相关误差的影响

上面描述了“ADC自身导致的误差”,使用STM32 ADC自校准功能或通过微控制器固件可以轻松补偿偏移误差和增益误差。

之前在分享的代码中有提到,比如通过软件校正:

ADC_StartCalibration(ADC1);

2、使外部环境误差最小化

A、参考电压/电源噪声最小化

也就是在VREF和VDDA引脚连接外部去耦电容。

“单片机中ADC采集都存在哪些误差?"

B、模拟输入信号噪声消除

通过添加外部RC滤波器以消除高频。

C、将ADC动态范围与最大信号幅度进行匹配

也就是将参考电压范围匹配采样电压(当然,需要有参考电压引脚的芯片才行)。

“单片机中ADC采集都存在哪些误差?"

同时,也可以使用放大器针对ADC范围调整输入信号范围:

“单片机中ADC采集都存在哪些误差?"

D、温度影响补偿

第一种方法是完整描述偏移和增益漂移特性,并在存储器中提供查询表,以便根据温度变化修正测量值。此校准方法需要额外的成本和时间。

第二种方法包括使用内部温度传感器和ADC看门狗,以在温度变化达到给定值时重新校准ADC。

E、优化PCB布局

  • 将模拟和数字布局分开
  • 隔离模拟和数字电路电源
  • 对供电和接地使用单独的PCB层

3、提高精度的软件方法

A、平均采样

·平均会降低速度但可以提高精度

B、数字滤波(抑制DC值中的50/60 Hz噪声)

·设置适当的采样频率(这种情况下,从计时器触发十分有用)。
·对采样数据执行软件后处理(例如,对50 Hz噪声及其谐波抑制进行组合滤波)。

C、AC测量的快速傅里叶变换( FFT)

·此方法可以显示被测信号中的谐波部分。
·由于使用了更强的计算能力,因此速度较慢。

D、ADC校准:偏移、增益、位权重校准

·ADC校准可减少内部ADC误差。但是,必须知道内部ADC结构。

E、使CPU生成的内部噪声最小化

应用设计必须确保

·ADC转换期间来自微控制器的干扰尽可能小。
·使采样和转换期间的数字信号变化量最小化(数字静默)。

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

围观 535

AVR® DB MCU系列以AVR内核的低功耗性能为基础,提供一系列独立于内核的外设(CIP)和丰富的智能模拟产品组合。在今天推荐的视频中,我们将对该系列产品做个介绍。

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

围观 19

很多初学者觉得自己学的东西很基础,担心今后实际工作用不到。有初学者问了这样的问题:单片机真正开发产品和学习的时候有什么差别,平时学的LED、ADC这些东西,在实际项目中会用到吗?

虽然技术更新迭代很快,但有很多基本的技术,仍然在实际项目中会用到,今天就拿LED为例来说说吧。

LED有哪些作用?

别小看LED,它在实际生活中应用很广泛的。

首先就是以LED为光源的项目,比如呼吸灯、广告灯、LED显示屏等,这类控制LED亮灭(闪烁),或者亮度渐变。

再次就是LED背光灯,像液晶背光灯、按键背光灯等,这种也是需要控制LED变化的。我之前做过有按键的项目,按键背光灯需要渐变、配合音效控制LED不同频率闪烁,目的就是为了达到更好的体验效果。

再再次,LED作为指示灯,电源指示灯、状态指示灯,这种就和接近初学者的学习时的LED灯,但这种却在项目中很常见。

“单片机项目中LED的重要性"

拿状态指示灯来说,一个项目的LED状态指示灯可以直观明了的指示设备的运行状态,比如:运行、故障、待机、死机等常见状态。通过RGB,或者红黄绿不同颜色LED组合,可以实现更多状态的指示。

下面针对LED状态灯,说几点细节的内容。

LED状态灯实现

这里结合代码为大家分享一些项目中常见的LED状态灯的实现方法。

1、单色LED运行状态指示灯

通过闪烁(一亮一灭)指示设备运行的状态的指示灯,一个关键作用:设备有没有死机。

很多产品中都会用到,你买一个开发板,提供的综合例程也基本都有。

裸机情况下(一般状态机),在某一个状态实现LED闪烁:

int main(void)
{
  //系统初始化
  while(1)
  {
    //do something
    switch(State)
    {
      case 状态1:
        //do something
      break;

      case 状态2:
        //do something
      break;
      ·
      ·
      ·
      case 状态灯:
        ED_TOGGLE();  //LED闪烁
      break;
    }
  }
}

RTOS情况下,新建一个状态灯线程,在线程里面直接控制即可:

void StatusLight_Task(void *pvParameters)
{
  static TickType_t xLastWakeTime;
  //初始化
  xLastWakeTime = xTaskGetTickCount();

  for(;;)
  {
    //do something

    LED_TOGGLE();                       //LED闪烁
    vTaskDelayUntil(&xLastWakeTime, 500);
  }
}

2、单色LED渐变

LED渐变在生活中其实也有一些场景在用,呼吸灯、键盘等,其实原来也很简单,就是控制LED亮度。

控制方法有很多,电压、PWM都能达到控制LED亮度的效果。当然,现在还有控制LED渐变的专有芯片。

“”单片机项目中LED的重要性"

但是,对于单片机项目来说,单片机自身就能实现,如果单独用一个芯片,就显得有点多余。

使用DAC输出模拟量可以实现,但如果多路就不现实,因此这种方法不常见。

常见的是PWM控制IO高低电平(从而控制电压),这种对于单片机来说有两种方法:

  • 定时器硬件PWM

  • 控制GPIO口高低电平

a、定时器硬件PWM

一个定时器输出PWM波形的同时,还需要一个定时器定时更新PWM输出占空比(修改亮度)。

b、控制GPIO口高低电平

这个方法就比较简单,控制IO口高低电平时间,只是这个时间需要结合整个项目业务逻辑(特别是裸机情况下),不能出现“卡机”情况。

当然,在RTOS情况下,业务逻辑就比较简单,单独一个线程:

LED_ON();
vTaskDelay(TimesON);

LED_OFF();
vTaskDelay(TimesOFF);

这里TimesON 和 TimesOFF是需要结合项目情况修改的变量(比如渐变时间)。

3、多色LED,多种运行状态

一个设备在没有显示屏指示状态的时候,通过LED指示状态也是一种方法,比如:红、黄、绿三色,分别常灭、常亮、闪烁三种状态。

这种相对第一种单色固定状态要复杂一点,但实现起来也不难,方法也有很多。

这里分享一些思路:创建一个线程,一个结构体,轮询各种LED状态,根据应用修改其各种状态,以及闪烁时间等。

LED状态结构体:

typedef struct
{
  uint8_t  Mode;                  //模式

  uint8_t  Status;                //当前状态
  uint16_t OffTimes;              //灭时间
  uint16_t OnTimes;               //亮时间(ms)
  uint16_t Counter;               //计数(计时)

  void (*OffFun)(void);           //灭函数接口
  void (*OnFun)(void);            //亮函数接口
}SL_TypeDef;
/* 状态灯 */

LED状态主线程:

void StatusLight_Task(void *pvParameters)
{
  static TickType_t xLastWakeTime;
  xLastWakeTime = xTaskGetTickCount();

  for(;;)
  {
    SL_Scan(&sSLG_Structure);      //红灯
    SL_Scan(&sSLY_Structure);      //黄灯
    SL_Scan(&sSLR_Structure);      //绿灯

    vTaskDelayUntil(&xLastWakeTime, SL_TASK_PERIOD);
  }
}

这里结构体也是方便统一管理,其中SL_Scan浏览(扫描)函数的参数通过传递结构体指针,是为了方便读取并修改其中变量。

当然,SL_Scan浏览函数具体实现,就与你应用有关:

static void SL_Scan(SL_TypeDef *SL_Struct)
{
  /* 常灭模式 */
  if(SL_MODE_OFF == SL_Struct->Mode)
  {
    SL_Struct->Status = SL_STATUS_OFF;           //状态置为"灭"
    SL_Struct->OffFun();                         //灭灯
  }
  /* 常亮模式 */
  else if(SL_MODE_ON == SL_Struct->Mode)
  {
    SL_Struct->Status = SL_STATUS_ON;            //状态置为"亮"
    SL_Struct->OnFun();                          //亮灯
  }
  /* 闪烁模式 */
  else if(SL_MODE_FLICKER == SL_Struct->Mode)
  {
    /* 在灭状态 */
    if(SL_STATUS_OFF == SL_Struct->Status)
    {
      SL_Struct->Counter++;
      if(SL_Struct->Counter >= SL_Struct->OffTimes)
      {
        SL_Struct->Counter = 0;
        SL_Struct->OnFun();                      //亮灯
        SL_Struct->Status = SL_STATUS_ON;        //状态置为"亮"
      }
    }
    /* 在亮状态 */
    else if(SL_STATUS_ON == SL_Struct->Status)
    {
      SL_Struct->Counter++;
      if(SL_Struct->Counter >= SL_Struct->OnTimes)
      {
        SL_Struct->Counter = 0;
        SL_Struct->OffFun();                     //灭灯
        SL_Struct->Status = SL_STATUS_OFF;       //状态置为"灭"
      }
    }
    else
    {
      SL_Struct->Status = SL_STATUS_OFF;         //状态置为"灭"
    }
  }
  /* 未知模式 */
  else
  {
    SL_Struct->Status = SL_STATUS_OFF;           //状态置为"灭"
    SL_Struct->OffFun();                         //灭灯
  }
}

最后

以上的控制LED的状态,其实是一个项目中很小的一个模块,还有更复杂的LED实现和控制方法,相信做过这一块的同学就比较了解。

当然,LED在项目中是微不足道的一个模块,但是,如果针对莫个人设计一块LED的产品,那就意义非凡了。

“单片机项目中LED的重要性"

“单片机项目中LED的重要性"

上面这种,相信很多暖(zhi)男都做过,就是不知道,最终那个女孩子感动了没有?如果感动了,那这个LED项目就是一生中非常重要的项目。

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

围观 54

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

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

单片机系统开发流程

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

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

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)。

围观 41

为给汽车运行和最终用户提供可靠保障,安全一直是汽车应用中的头等大事。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)。

围观 14

页面

订阅 RSS - 单片机