步骤1:什么是保险丝?
当我们开始了解保险丝设置时,我们脑海中浮现出的根本问题是:保险丝到底是什么?为什么我们需要花时间去学习它们?
我希望这本指南对找到问题的答案有所帮助。
首先,AVR MCU通常具有三个存储区域:1)FLASH,专用于程序代码。
2)SRAM,用于运行时变量。
3)EEPROM,可由用户代码用来存储在MCU关闭时必须保留的数据。
4)现在,保险丝形成了可用于编程的第四个存储区。它包含一些包含这些位的字节。
简单地说,保险丝是微控制器存储器的一部分,为某些功能保留,这些功能决定了微控制器的工作方式。准确地说,保险丝是保留的。微控制器中EEPROM存储器的一部分。 EEPROM代表电可擦可编程只读存储器。 EEPROM是非易失性存储器。非易失性是指一旦存储,即使关闭电源也可以保留存储器。保险丝是控制低电平功能和引脚分配的EEPROM位。保险丝不能通过程序访问,只能由芯片程序员进行更改。我将在后面解释我的低级功能。如我所说,程序一旦完成就无法使用熔丝设置,这意味着微控制器芯片中运行的程序无法更改熔丝设置。即使您使用的是“自编程”微控制器,即允许其上运行的引导加载程序软件将程序上传到其闪存的微控制器,您也无法更改熔丝位。
尽管我简要浏览了整个主题,但我主要打算展示如何为avr微控制器设置保险丝,以便使用外部时钟运行它。
步骤2:为什么需要编程保险丝?
保险丝控制着微控制器的工作方式,因此更改保险丝设置可以使我们根据自己的要求来更改和修改微控制器。在芯片可以用于外部环境之前,该芯片中很少有用于配置它的参数。这些参数通过保险丝位设置。换句话说,保险丝位决定芯片的性能,是否具有引导加载程序,运行的速度和电压,看门狗定时器条件,存储器保护模式,启动选项,时钟源和分频器,编程选项,断电检测等。
保险丝位的主要优点非常明显,可以根据情况配置微控制器。无法通过程序代码更改时钟行为。不同的AVR型号之间的保险丝位差异很大。
步骤3:如何编程保险丝?
在开始之前,我们需要查看Atmega8的保险丝位和的初始值。他们。由于即时通讯使我可以通过移动设备进行操作,因此我制作了包含所需详细信息的表格。我使用Google Sheet Android应用程序创建了它。我找不到将它们转换为图片的方法。因此,我在这里发布了链接。
Atmega 8的保险丝位(本教程中使用的那个im)
https://docs.google.com/spreadsheets/d/1haE2Sprdsa-NgKYsOQlwI99WHfGqCItJutG4h-MnOus/edit?usp = docslist_api
现在,我们将继续介绍如何根据所使用的特定编程器对AVR中的熔丝位进行编程的详细信息。首先,我们应该查阅程序员的手册以了解详细信息。例如,如果您将STK600与AVR Studio一起使用,则STK600窗口具有标签为Fuses的选项卡,您可以在其中设置不同的位,并可以在其中编程,验证或读取保险丝位。
(例如,我使用的是Atmega8。我主要使用Atmega 8,因为它便宜并且可以容纳大多数项目的内存)。
大多数人对此主题感到困惑。简而言之,只有两种类型的保险丝:高保险丝(hfuse)和低保险丝(lfuse),某些微控制器还有一个额外的保险丝字节,称为扩展保险丝(efuse)。
最令人困惑的部分是这里。熔丝位的未编程状态为逻辑高或1,对任何熔丝位进行编程都会将其电平更改为逻辑低或0。
“要记住的一个例外是-与引导加载程序相关的熔丝位不能从软件,但是可以使用并行/串行编程工具以编程模式进行访问。“
如上图所示,显示了保险丝及其位值和位数。上面提到的保险丝的一些功能是:-(我在发布的图中使用了Atmega 8数据表)。
高保险丝字节(hfuse)
1)第一位是BOOTRST,即默认情况下未编程(1)。如果将该位编程为(0),则在加电或器件复位后,它将从引导加载程序存储器部分开始执行程序。简而言之,如果使用引导程序来闪存MCU,则必须使能该位。如果仅使用ISP编程器上载固件,则不要更改此位。如果使用引导加载程序,则BOOTSZ0和BOOTSZ1也很重要。这些位允许选择引导加载程序节的大小。
2)下一位是EESAVE。如果对此熔丝进行了编程(通过写入0),则在芯片擦除过程中EEPROM存储器保持不变。有时,这种保险丝可能会有所帮助。例如,如果您将一些重要数据(例如校准值)保留在EEPROM存储器中,并且需要在不丢失数据的情况下更新程序,则可以对该位置进行编程。但是,如果要在擦除后始终保持干净的芯片,则不要更改该位(设置为1)。
3)WDTON位用于初始设置看门狗定时器。如果对此进行编程,则在不特别注意的情况下,将强制您的看门狗定时器始终处于打开状态,并保持周期性地重置芯片。如果不需要看门狗,则不要对其编程。
4)SPIEN位用于禁用串行编程模式ISP。实际上,不可能从串行模式禁用该位。必须通过高压编程来完成。
5)RSTDSBL位的情况与此相同。它用于禁用将RESET引脚转换为I/O的复位功能。通常不建议这样做。并且当在ISP模式下对器件进行编程时,不能将其禁用。
6)CKOPT位用于选择振荡器选项。
低熔丝(熔丝)
让我们看一下熔丝的低字节。
1 )一组四个相似的位(CKSEL0至CKSEL3)用于选择时钟选项。默认情况下,CKSEL0至CKSEL3保险丝被设置为选择内部8MHz RC振荡器。但是我们知道AVR可以用更多不同的方式计时:
*校准的内部RC振荡器(默认8MHz)
*外部RC振荡器
*外部晶体或晶体谐振器
*外部低频晶体
*外部时钟信号源
我将在下一步中说明有关SUT(启动时间)的内容。
稍后,我将在本指南中介绍如何自行计算这些值。
2)BODEN或掉电检测使能位使能掉电检测。通常禁用掉电检测(1)。将该位编程为低(0)使能进行掉电检测。此功能的原因是-当电源电压低于微控制器所需的电压时,它开始出现异常行为。它可能会开始擦除自己的内存,也可能会从其闪存中运行随机部分。为避免这种情况,提供了掉电检测功能。一旦电源电压低于设定的BOD电平,芯片将安全切换。当电源电压再次恢复正常时,芯片将重新启动。
BODLEVEL-通过此位,我们可以设置掉电检测电平。例如-如果微控制器以3.3伏特运行,我们可以将掉电检测电平设置为2.7伏特,这样,如果电源电压低于此电压,则微控制器将安全关闭。
此处要注意的有趣功能是的,像Atmega 32这样的其他AVR微控制器也有一些不同的熔断器,例如在高熔断器字节中有OCDEN和JTAGEN,在Atmega 328p中有DWEN等。
我为低质量的图片表示歉意,因为我根据我的要求对此进行了说明机器人。
第4步:对时钟和振荡器的了解。
是的,确实有很多保险丝计算器应用可用互联网。但是我个人在彻底学习该主题之前不喜欢使用它。现在是时候了解我们自己对熔丝位进行编程的方式了。我将撰写如何根据我们的需求选择和更改不同的时钟功能。在开始编程之前,我们需要学习与该主题相关的一些术语。
什么是时钟?
时钟只是一种可以跟踪时间的设备,它可以带给您节拍的感觉搬去。例如,墙上的时钟以秒为单位递增。节拍器的节拍器可能每半秒或整秒给您一个节拍。时钟滴答(每秒周期)的次数称为其频率,以赫兹(Hz或周期/秒)为单位。同样,Atmega内部也有一个时钟,其速度直接与其每秒(在时钟的每个滴答/周期内)可以执行多少条指令有关。大多数AVR附带的默认时钟速度为1 MHz(每秒1百万个周期)。
内部振荡器的唯一缺点是其频率随施加的电压和温度而变化,而其他时钟则没有这种情况。源。
如何设置时钟速度?
我们有两个选择:
使用内部时钟或外部时钟。如果我们编写的代码可以执行基本操作,并且不需要精确计时,则内部时钟就足够了。在任何其他情况下,尤其是对于通信(例如,使用UART),时序至关重要。在这种情况下,我们需要一种替代方法,因此我们使用诸如晶体,谐振器,振荡器和时钟之类的东西。它们都适合以我们想要的频率产生我们想要的节拍,但是在业余爱好者中最常见的是晶体和谐振器。在本教程中,我们将使用一个晶体。
要使用该晶体,我们还需要两个18-22 pF陶瓷电容器。另一方面,谐振器将电容器和晶体内置于一个封装中,因此使其更加紧凑。这几乎只是差异,但是如果使用谐振器,则在设置熔丝位方面可能会有细微的差异。振荡器需要一个外部电源来工作,并且通常具有四个引脚。
启动时间(SUT)
时钟源通常需要一点时间进行预热,并在微控制器启动时向我们提供可靠的信号已开启。这称为启动时间。
步骤5:自行编程时钟保险丝!
您已经对保险丝字节及其工作原理以及在微控制器(此处为Atmega 8)中的功能有一个大概的基本了解。现在,我们正在进入编程阶段。我主要是出于这个目的使用Winavr,所以我无法告诉您如何使用极限刻录机和其他工具来实现。
我们现在知道我们必须从高熔丝字节更改CKOPT(第4位)并进行更改低熔丝字节中的CKSEL0,CKSEL1,CKSEL2,CKSEL3和SUT0,SUT1的值,因为它们是控制时钟设置的位。由于我们仅配置时钟设置,因此其他保险丝设置将保持不变。如果甚至错误地更改了其他保险丝的位值,微控制器也会变砖。
此电子表格包含低保险丝位CKSEL3,CKSEL2,CKSEL1和CKSEL0的选项。这将帮助我们选择需要用于微控制器的时钟源。我已经从Atmega8的数据表中制作了这个Google工作表,请与教程保持打开状态
链接在这里-
https://docs.google.com/spreadsheets/d/11IjfDRkWHNW0dj0FEKCDzZMcXTvDuv1Q4jMPNpIYck0/edit ?usp = docslist_api
因此,由于我使用外部晶体运行微控制器,因此我将使用与该选项相对应的值CKSEL3-CKSEL0。但是我们看到,这些值在1111-1010范围内。要选择准确的值,我们需要查看另一个表,该表包含了我们希望微控制器获得的频率值。这是一张根据频率包含CKOPT值和CKSEL3-1值的表。选择编程的CKOPT值(0)。编程的CKOPT值用于高频操作。我还将CKSEL3-1的值选择为111。现在,我们需要从中选择CKSEL0,SUT1和SUT0值的选项。这是链接-https://docs.google.com/spreadsheets/d/1028hW05QgAiBQzUzOMjDfJ1VCY8tcOMtgQAsnH5xOWw/edit?usp=docslist_api
如果您查找表格,则会找到启动时间及其对应选项的列表位值。我选择具有65毫秒启动延迟时间的晶体振荡器,因为我在这里使用了晶体振荡器。因此,根据表,CKSEL0值为1,SUT1值为1,SUT0值为1。由于我们使用的是晶体振荡器,并且启动时间与晶体振荡器相对应,因此我们的CKSEL3-CKSEL0值将变为1111.
这完成了我们的选择选项。
第6步:总结。
上一步可能看起来很混乱,命令,但此步骤将清楚地显示整个过程。
那么,我们实际上要做什么?
我们有一个微控制器(这里是Atmega 8)。它以出厂时的默认频率运行。我们想在16Mhz外部晶体上运行它。
那到底该怎么做?仅查看和更改熔丝位值。我们也不要忘记,1表示未编程,0表示已编程。现在,芯片处于默认的熔丝字节配置。首先,我们需要决定如何运行微控制器?为简单起见,让我们假设只有三个选项-外部晶体,外部谐振器或内部振荡器。
我们发现晶体振荡器是一种可靠的计时源,我们不介意为两个22pf电容器花一点钱。现在,我们的选择很明确,我们希望使用外部晶体来运行AVR芯片。
但是从哪里可以得到选择外部晶体振荡器的选项?
在熔丝低位字节中的CKSEL3至CKSEL0中提供了这些选项。
我们查看了微控制器数据表中提供的表格,发现有一个称为陶瓷谐振器或晶振的选件。我们当然希望如此,因此我们记下与之关联的CKSEL3-CKSEL0的位值。
Hmm,但该范围的值范围为1111-1010。具体要选哪一个?以及如何指定晶体振荡器的频率?显然,晶体有很多可用频率,我们只想在16Mhz上运行。为此,我们查看另一个表,其中包含频率和与之配合使用的推荐电容器范围。
在此表中,我们发现16Mhz大于1 Mhz,因此我们选择该选项。与我们选择的CKOPT相关的位的值为0,与此同时,我们为CKSEL3-CKSEL1的值选择了111。
现在我们可以确定我们正在运行带有16Mhz外部晶振的avr芯片。
我们刚刚阅读了有关熔丝位的说明,并谈到了一些晶振需要预热并启动的启动时间资料发出可靠的信号。
我们如何找到它?
我们再次在同一指令提供的表格中找到它。现在此表包含CKSEL0值以及SUT1和SUT0值。我们选择65毫秒的启动时间选项,因此我们的相应位值为CKSEL0 -1,SUT1-1,SUT0-1-1。
因此,我们成功完成了低熔丝字节组的选择。高熔丝字节设置为-
7)RSTDISBL- 1
6)WDTON-1
5)SPIEN -0
4)CKOPT -1 《3》 EESAVE -1
2 )BOOTSZ1 -0
1)BOOTSZ0 -0
0)BOOTRST -1
现在我们必须将它们更改为-
7)RSTDISBL -1
6)WDTON -1
5)SPIEN -0
4)CKOPT -0
3)EESAVE -1
2)BOOTSZ1 -0
1)BOOTSZ0 -0
0)BOOTRST -1
11001001(二进制)或C9(十六进制)。我们只是将CKOPT从1更改为0,其他所有都保持不变。
现在是低熔丝字节,最初是-
7)BODLEVEL -1
6)BODEN -1
5 )SUT1 -1
4)SUT0 -0
3)CKSEL3 -0
2)CKSEL2 -0
1)CKSEL1 -0
0)CKSEL0 -1
我们正在改变-7)BODLEVEL -1
6)BODEN -1
5)SUT1 -1
4)SUT0 -1 《3》 CKSEL3 -1 《2》 CKSEL2- 1
1)CKSEL1 -1 《0》 0)CKSEL0 -1
二进制为11111111,十六进制为FF。
现在,既然完成了evrything,我们只需要在微控制器中刻录这些新设置即可。
使用avrdude语法,它应该是-
avrdude -c usbasp -p m8 -U lfuse:w: 0b11111111:m -U hfuse:w:0b11001001:m
但是最好以十六进制形式编写,例如-
avrdude -c usbasp -p m8 -U lfuse:w:0xff:m -U hfuse: w:0xC9:m
Atmega8内部1Mhz振荡器的默认值为-
avrdude -p atmega8 -c usbasp -U lfuse:w:0xE1:m -U hfuse:w:0xD9:m
最后,整个过程到此结束。尽管这并不能完全解释保险丝及其编程方法,但对于初学者来说,这绝对是一个大概的主意。
责任编辑:wv
-
保险丝
+关注
关注
4文章
583浏览量
44057 -
编程
+关注
关注
88文章
3592浏览量
93596
发布评论请先 登录
相关推荐
评论