在本教程中,我们将讨论保险丝。上大学时,我了解了电子学中的所有奇妙事物,这是我第一次听到AVR中的保险丝一词,对此的最初想法是,哦!如果我做错了事,AVR内会有些东西吹响。那时,Internet上没有太多资源可供使用。我进行了相当多的搜索,发现这些保险丝是指AVR微控制器内部的一些特殊位。这些位就像AVR中的微小开关,通过打开/关闭它们,我们可以打开/关闭AVR的某些特殊功能。打开和关闭它意味着进行设置和重置。
我们将借此机会讨论有关AVR中的保险丝位的所有内容。为简单起见,我们将以包含受欢迎的ATmega328P微控制器的Arduino板为例。在这里,您将学习如何设置这些保险丝,以启用和禁用其中的某些功能,这些功能在实际应用中非常方便。所以,让我们开始吧。
在之前的文章中,我们已经建立了许多AVR微控制器项目,例如与AVR微控制器接口的GSM模块和与AVR微控制器接口的HC-05。如果您想了解有关这些项目的更多信息,可以查看它们。
什么是AVR中的保险丝-详细说明
正如我们前面所讨论的,微控制器中的保险丝就像很小的开关,可以打开和关闭以启用和禁用AVR微控制器的各种功能。这是下一个问题出现的部分,那么如何设置或重置这些保险丝?这个问题的答案很简单:我们借助保险丝寄存器来实现。
在ATmega328P IC中,共有19个保险丝位,它们被分为三个保险丝字节。这些被定义为“扩展保险丝字节”, “高保险丝字节”和“低保险丝字节”。
如果查看ATmega328 / P数据表修订版:7810D–AVR–01 / 15的表27,您会发现有关保险丝位的所有小细节。但是下面的图像将使您对数据表的保险丝位部分有更好的了解。
现在,您已经对保险丝位有所了解,让我们浏览一下数据表,找出有关该IC的所有必要细节。
扩展保险丝位:
单击“保险丝位”选项卡并向下滚动一点后,您会发现表27-5:该表显示了“扩展保险丝字节” 表,通常称为“ EFUSE”。下图恰好显示了这一点。
在此表中,只有三个可用位,其余三个保留。这三个位处理掉电检测级别。如您在注释中看到的,如果我们看表28-5,我们可以找到有关它的更多详细信息。
如您在上表中所见,我们有用于掉电检测的表。掉电检测是一项功能,当电源电压降至某个电压电平以下时,该功能会复位微控制器。在ATmega328P IC中,我们可以完全禁用掉电检测,也可以将其设置为上表所示的水平。
高保险丝字节:
如下图所示,数据表中的表27-6:显示了ATmega328P IC的高保险丝位。
该高熔处理的ATmega328单片机内部的各种任务。在本节中,我们将讨论高级保险丝位及其工作原理。让我们从BOOTRST,BOOTSZ0和BOOTSZ1位开始。这三个位负责设置引导大小;引导大小是指为安装引导加载程序保留的内存量。
引导加载程序是运行在微控制器之上并管理不同任务的特殊软件。但对于Arduino,则使用引导加载程序将Arduino草图上传到微控制器中。在上一篇文章中,我们向您展示了如何使用Arduino在ATmega328P中刻录Bootloader。您可以查看是否对该主题感兴趣。回到我们的主题,高字节中的其他位的用途已明确阐明,EESAVE位用于在执行芯片擦除周期时保留EEPROM存储器。 WDTON位用于启用或禁用看门狗定时器。
看门狗定时器是ATmega328P IC中的特殊定时器,具有独立的时钟并独立运行。如果启用了看门狗定时器,则需要在一定时间内清除它,否则,看门狗定时器将使微控制器复位。如果处理器卡住了,这是许多微控制器中的一项有用功能。看门狗将重置它,以防止对最终应用程序造成任何损坏。
DWEN位在那里使能调试线;这是一个内置于其硬件中的准备协议,用于对处理器进行编程和调试。启用此功能后,您可以通过单线连接来刷新和调试处理器。但是要使用它,您将需要为Atmel准备的特殊硬件。
剩下的两位是您需要避免的那些位,除非您完全知道自己在做什么。它们是RSTDISBL位7和SPIEN位5。顾名思义,RSTDISBL(外部复位禁用)禁用外部硬件复位引脚,而SPIEN位用于禁用SPI编程接口。禁用这两个位中的任何一个都可以完全阻塞您的AVR。因此,让他们独自一人是个好主意。
低保险丝字节:
如下图所示,数据表的表27-7:显示了ATmega328P IC的低保险丝位。
此熔丝字节负责设置AVR内部时钟源和时钟的其他一些参数。在本节中,我们将学习所有这些内容。
可以将第7位或CKDIV8标志设置为将时钟源除以8,这非常方便,如果您自己尝试对AVR进行编程,您可能已经知道。下一位是CKOUT位,它是低保险丝字节中的第六位。对其进行编程将在微控制器的PORTB0上输出内部时钟信号。
SUT1和SUT0的位5和位4控制着微控制器的启动时间。这样可以防止在电源电压达到可接受的最小阈值电压电平之前可能发生或可能不会发生的任何启动动作。最后四个CKSEL0-4位用于选择微控制器的时钟源。下表所示为您更好地理解了负责设置时钟源的这四个位,您可以在数据手册的“时钟源”部分中找到此表。
现在,在进一步介绍之前,我还需要处理振荡器起振延迟表。通过启动延迟,我们指的是较低熔丝字节的第4位和第5位。需要根据电路工作的条件和所用振荡器的类型来设置延迟。当执行上电或断电序列时,默认值设置为以6个时钟周期减慢上升功率。接下来,启动后还有另一个14个时钟周期的延迟,延迟为65Ms。
!那是很多要消化的信息。但是在继续进行之前,让我们以快速笔记结尾。
注意:
如果您仔细查看了数据表,您一定已经注意到,对熔丝位进行编程意味着将其设置为低电平,即0(零),这与我们通常将端口设置为高电平或低电平的相反。在配置保险丝时,必须牢记这一点。
Arduino中的保险丝位
在上一节中,我们已经讨论了很多保险丝,但是在本节中,我们将讨论如何配置保险丝以及如何在微控制器中编写保险丝。为此,我们将需要一个名为Avrdude的工具。它是一种可用于读取,写入和修改AVR微控制器中的内存的工具。它可与SPI一起使用,并且对不同类型的程序员都提供了很长的支持。您可以从下面给出的链接下载该工具。另外,我们将使用我们最喜欢的微控制器Arduino。
- 下载Avrdude版本6.3 Windows-ming32
现在,有了Avrdude,您需要解压缩该文件并在该文件夹中打开命令窗口。另外,如果您打算以后使用它,可以将文件夹路径添加到Windows环境变量部分。但是我将其放在桌面上并在其中打开命令窗口。完成此操作后,我们将USBasp编程器连接到PC,并确保我们具有适合USBasp编程器的驱动程序。一旦做到这一点,我们就很好了,我们将首先读取默认的保险丝值。为此,您需要运行以下命令。
avrdude.exe -c usbasp -p m328p -U lfuse:r:low_fuse_val.txt:h -U hfuse:r:high_fuse_val.txt:h -U efuse:r:ext_fuse_val.txt:h
如果一切正常,此命令将读取保险丝字节并将其放入三个单独的文本文件中。下图将使您对该过程有更好的了解。
如您所见,Avrdude读取了Arduino nano上的保险丝并将其保存到三个单独的文本文件中。现在,我们打开它们并获得三个值。对于EFUSE:0xFD;对于HFUSE:0XDA;对于LFUSE:0xFF。这是我们为Arduino nano获得的默认保险丝值。现在,让我们将这些位转换为二进制并将它们与数据表中的默认值进行比较。下表准确显示了这一点。
为方便起见,熔丝位以十六进制值编写,但是如果将它们转换为二进制值并将其与数据表进行比较,我们将知道发生了什么。让我们从低位保险丝字节开始。从上面的字符串可以看到,它设置为0XFF,二进制值将为0B11111111。
用Arduino比较低位保险丝字节:
低熔丝字节 |
位号 |
AVR中的默认值 |
Arduino的默认值 |
CKDIV8 |
7 |
0(已编程) |
1(未编程) |
CKOUT |
6 |
1(未编程) |
1(未编程) |
1号 |
5 |
1(未编程) |
1(未编程) |
0号 |
4 |
0(已编程) |
1(未编程) |
CKSEL3 |
3 |
0(已编程) |
1(未编程) |
CKSEL2 |
2 |
0(已编程) |
1(未编程) |
CKSEL1 |
1个 |
1(未编程) |
1(未编程) |
CKSEL0 |
0 |
0(已编程) |
1(未编程) |
高位保险丝字节以0B11011010二进制格式设置为0XDA。
二进制中的较高熔丝字节:
高熔丝字节 |
位号 |
AVR中的默认值 |
Arduino的默认值 |
RSTDISBL |
7 |
1(未编程) |
1(未编程) |
德文 |
6 |
1(未编程) |
1(未编程) |
斯皮恩 |
5 |
0(已编程) |
0(已编程) |
威登 |
4 |
1(未编程) |
1(未编程) |
EESAVE |
3 |
1(未编程) |
1(未编程) |
靴子1 |
2 |
0(已编程) |
0(已编程) |
BOOTSZ0 |
1个 |
0(已编程) |
1(未编程) |
开机启动 |
0 |
1(未编程) |
0(已编程) |
扩展保险丝字节的设置设置为0XFD,二进制格式为0B11111101。
二进制扩展引信字节:
扩展保险丝字节 |
位号 |
AVR中的默认值 |
Arduino的默认值 |
– |
7 |
1个 |
1个 |
– |
6 |
1个 |
1个 |
– |
5 |
1个 |
1个 |
– |
4 |
1个 |
1个 |
– |
3 |
1个 |
1个 |
BODLEVEL2 |
2 |
1(未编程) |
1(未编程) |
BODLEVEL1 |
1个 |
1(未编程) |
0(已编程) |
BODLEVEL0 |
0 |
1(未编程) |
1(未编程) |
现在,这标志着本节的结束。到目前为止,我们已经了解了有关AVR微控制器及其熔丝位的很多知识。因此,让我们通过对Arduino Nano中的某些保险丝位进行更改和试验来对我们的理论进行测试来结束本文。
测试AVR中的保险丝所需的组件
在上面的部分中,我们已经讨论了很多保险丝。但是,要继续进行本文的介绍,我们需要一些硬件组件和一些软件工具。在本节中,我们将讨论这些内容。带有图像的所需组件列表如下所示。
- 面包板-1
- Arduino纳米-1
- USBasp AVR编程器-1
- USB电缆-1
- AVR 10引脚至6引脚转换器-1
- Avrdude(用于AVR编程的软件工具)
- LED-1
- 330R电阻器-1
- 跨接电缆
测试AVR中保险丝位的原理图
硬件测试设置如下所示。我们已使用USB电缆将Arduino Nano连接至PC,并且还将USBasp编程器连接至PC。本文的目的是对AVR中的熔丝位进行编程。因此,我们已经将USBasp编程器与Arduino连接了。下图将为您提供更好的设置思路。
在AVR中测试保险丝
测试设置如下所示。如您所见,我们已经将Arduino和USBasp编程器都连接到了笔记本电脑的USB。
现在,我们打开Arduino IDE并上传基本的眨眼草图。基本眨眼草图的内容是不言自明的,因此我没有提供任何细节。
您将在视频中看到13号插针上的指示灯正在闪烁。现在,我们来调整保险丝设置并将其设置为默认值。正如我们之前在数据表中看到的那样;所述EFUSE为0xFF; HFUSE是D9;LFUSE为:62。现在,让我们使用Avrdude对其进行配置,对其进行刷新,然后看看会发生什么。我们将使用的代码是-
avrdude -c usbasp -p m328P -U lfuse:w:0x62:m -U hfuse:w:0xd9:m -U efuse:w:0xff:m
一旦执行此操作,您将看到LED闪烁非常慢,因为我们已经为16Mhz时钟计算并编程了该值,现在在熔断保险丝之后,它只是一个1Mhz内部RC振荡器。这就是为什么LED闪烁如此缓慢的原因。现在,让我们尝试再次上传草图。我们将看到Arduino发出错误,并且未上传代码。因为通过更换保险丝,我们也弄乱了引导加载程序的设置。您可以在下图中看到它。
要解决此问题并将Arduino放回原处,我们需要再次为Arduino烧写引导程序。为此,请转到 工具->程序员-USBasp ,完成后,我们可以再次转到工具,然后单击 Burn bootloader选项。这将再次烧毁您的Arduino上的常规bootloader,一切将恢复到以前的水平。
自举程序闪回Arduino之后,它又回到了原始状态,最后一张图显示了自举程序再次烧毁后的LED闪烁。
这标志着本文的结尾。希望您喜欢这篇文章并学到新知识。如果您对本文有任何疑问,请随时在下面发表评论。