B001-Atmega16-带电复位后不清0的.noinit变量

最新更新时间:2022-02-12来源: eefocus关键字:Atmega16 手机看文章 扫描二维码
随时随地手机看文章

《AVR单片机原理与GCC编程实践》P117讲到AVR代码段时,提到了.bss段中包含了一个很有意思的.noinit段。


.noinit段描述:

.bss段的变量在芯片启动的 .init4阶段会被清0,但是定义在 .bss的 .noinit段中的变量在 .init4阶段不会被清0。

单片机不掉电复位后, .noinit段的这些变量的值依然存在,可以继续使用。


.noinit段的定义方法:int bar __attribute__ ((section (".noinit")));


不能指定初值,因为这些变量是在 .bss段。


.noinit段变量的复位测试:

也就是说、如果我在.noinit段定义一个变量,按下开发板的复位键(单片机不掉电复位),这个变量的值不会被清0。


下面是测试代码,我在.noinit段定义了变量bar,初值未知。


8bit的bar正好可以用连接在PORTB的8个LED灯来显示它的数值。


每次进入程序后、bar++,所以每按一次复位键,bar对应的8个LED灯的二进制数值就加1(二进制计数器)。


测试代码:

#include

uint8_t bar __attribute__ ((section(".noinit")));

 

int main(void)

{

    bar++;

    DDRB  = 0xFF;

    PORTB = 0xFF;

    PORTB = bar;

    while(1)  {  }

    return 0;

}


测试结果:

我的8个LED是低推的,所以点亮的LED对应的引脚逻辑值是0,熄灭的LED对应的引脚逻辑值是1。


于是得到下面的结果:

程序下载到开发板后,这一次bar的初值是00000001(这次比较巧),每按一次复位键,bar的值都加1了。


重新下载程序后,bar的初值也会自己加1,也相当于单片机不掉电复位。


------------------------------------------------------------------------------------------------------------------------

使用.noinit特性测试BOD掉电:

2016.05.30


今天发现.noinit的特性还可以测试BOD掉电。


依然是使用上面的代码中的.noinit,加上PA0输出脉冲,同时查看PORTB的二进制计数器来得知复位次数。


代码如下:

int main(void)

{

    // PA0为输出口

    DDRA  = (IO_OUTPUT << DDA0);

 

    // 记录复位次数

    _noinit_using();

 

    while(1)

    {

        // PA0拉高

        PORTA = (1 << PA0);

        // 维持0.5秒

        delay_ms(500);

        // PA0拉低

        PORTA &= ~(1 << PA0);

        // 维持0.5秒

        delay_ms(500);

    }

    return 0;

}

其中的_noinit_using()如下:


volatile uint8_t v_noinit __attribute__ ((section(".noinit")));

 

// ==========================================================================================================

// 通过观察PORTB上的8位LED的状态得知复位次数

// ==========================================================================================================

void _noinit_using(void)

{

    v_noinit++;

    // 8位LED,低推

    DDRB  = 0xFF;

    PORTB = 0xFF;

    PORTB = v_noinit;

}

测试结果:

1、当前芯片BOD监测的电压是4.0V

2、使用.noinit可以测试复位次数(二进制计数器)

3、每次将电压源电压低到<3.7V,就会引发复位,而PORTB的二进制计数器就会加1

4、而且低到1V以下,复位后依然可以记住上一次的.noinit变量的值,大概是没有完全掉电的缘故

5、正常工作时可以看到PA0的脉冲,复位时中断。


------------------------------------------------------------------------------------------------------------------------

使用.noinit特性测试看门狗WDT:

在另一篇测试WDT效果的文章中,还是用这个.noinit+二进制计数器的方法测试了WDT的复位:


http://blog.csdn.net/manon_des_source/article/details/51540217

关键字:Atmega16 编辑:什么鱼 引用地址:B001-Atmega16-带电复位后不清0的.noinit变量

上一篇:B001-Atmega16-中断(GCC-AVR)-(ques=3)
下一篇:B001-Atmega16-PORTA的定义-(ques=1)

推荐阅读

使用AVR微控制器Atmega16连接伺服电机的方法
伺服电机广泛用于需要精确控制的场合,例如机器人、自动机械、机械臂等。然而,伺服电机的范围不仅限于此,并且可以用于许多应用中。要了解伺服电机的基础知识,理论和工作原理,请阅读论坛的其他内容。在本篇文章中,我们将使用Atmel Studio 7.0将Micro Servo Motor伺服电机与Atmega16 AVR微控制器连接起来。伺服电机的额定工作电压为4.8-6V。我们可以通过应用脉冲或PWM信号来控制其旋转角度和方向。请注意,伺服电机无法完全旋转360度,因此可以在不需要连续旋转的情况下使用。旋转角度为0-180度或(-90) - (+ 90)度。所需的组件● SG90 Tower Pro微型伺服电机● Atmega16微控制
发表于 2022-07-26
使用AVR微控制器<font color='red'>Atmega16</font>连接伺服电机的方法
Atmega16微控制器连接ESP8266 NodeMCU实现发送电子邮件
Atmega16是一款低成本的8位微控制器,与之前版本的微控制器相比,其GPIO数量更多。它具有所有常用的通信协议,如UART、USART、SPI和I2C。由于其广泛的社区支持和简单性,它在机器人、汽车和自动化行业中具有广泛的应用。Atmega16不支持任何无线通信协议,如Wi-Fi和蓝牙,这限制了其在某些领域内的应用领域,如物联网。为了克服这种限制,可以连接支持无线协议的其他控制器。有许多控制器支持无线协议,如被广泛使用的ESP8266等。在本篇文章中,我们将Atmega16微控制器与ESP8266 NodeMCU进行连接,使其通过互联网进行无线通信。 ESP8266 NodeMCU是广泛使用的WiFi模块,具有完善的社区支持和易
发表于 2022-07-26
<font color='red'>Atmega16</font>微控制器连接ESP8266 NodeMCU实现发送电子邮件
使用AVR微控制器ATmega16的循迹机器人
在本篇文章中,我们将使用AVR Atmega16微控制器制作另一个小工具。如果您是AVR微控制器的新手,那么您可以参考之前的AVR项目和教程。制作一个机器人对所有电子爱好者来说都是一项挑战。如果机器人可以在没有任何外部指令的情况下自动执行某些操作,那么可以最大化这种挑战。电子初学者最常制作的机器人之一是循迹机器人。顾名思义,机器人将遵循表面上绘制的线条。线不必是直线。此外,线条可以是任何颜色。大多数红外传感器用于检测线条。红外传感器可以很好地检测白色或黑色表面。虽然您可以使用其他能够检测所有颜色的复杂传感器,并且可以制作可以跟随所有颜色线的机器人。即使通过改变角度改变路径并保持跟随线路,机器人也应该能够检测线。此外,它应该停在停止区
发表于 2022-07-26
使用AVR微控制器<font color='red'>ATmega16</font>的循迹机器人
了解Atmega16 / 32 AVR微控制器中的脉冲宽度调制(PWM)
冲宽度调制(PWM)是一种功能强大的技术,通过保持频率恒定来改变脉冲宽度。该技术目前在许多控制系统中使用。 PWM的应用不受限制,它被广泛应用于电机速度控制、测量、功率控制和通信等。在PWM技术中,可以使用数字信号轻松生成模拟输出信号。本篇文章将帮助您了解PWM,其术语以及如何使用微控制器实现它。在本文中,我们将通过改变LED的强度来演示使用AVR Atmega16微控制器的PWM。AVR微控制器Atmega16中的PWM引脚Atmega16有四个专用PWM引脚。这些引脚是PB3(OC0)、PD4(OC1B)、PD5(OC1A)、PD7(OC2)。Atmega16还有两个8位定时器和一个16位定时器。 Timer0和Timer2是8
发表于 2022-07-26
了解<font color='red'>Atmega16</font> / 32 AVR微控制器中的脉冲宽度调制(PWM)
如何使用AVR微控制器ATmega16连接霍尔传感器
霍尔传感器的工作原理是基于1869年Edwin Hall提出的霍尔效应。提出的声明说:“霍尔效应是在电导体上产生电压差(霍尔电压),横向于导体中的电流和垂直于电流的外加磁场。“那么,什么可以是最简单的声明形式,以更好的方式理解它?在本本中,将通过实际示例逐步说明。霍尔传感器将与Atmega16微控制器连接,一个LED将用于显示磁铁将被带到霍尔传感器附近时的效果。什么是霍尔效应?霍尔效应与磁场中的移动电荷有关。要以实用的方式理解,请将电池连接到导体,如下图(a)所示。电流(i)将开始从导体流过电池的正极到负极。电子流(e-)将与电流的方向相反,即从电池的负极端子通过导体到电池的正极端子。在我们测量导体之间的电压的时刻,如下面的图像(b
发表于 2022-07-26
如何使用AVR微控制器<font color='red'>ATmega16</font>连接霍尔传感器

推荐帖子

基于Windows CE的嵌入式导航软件设计与实现.pdf
基于WindowsCE的嵌入式导航软件设计与实现.pdf基于WindowsCE的嵌入式导航软件设计与实现.pdf
yuandayuan6999 单片机
一名博士的文章(转)
我出生的时候是一个下雪的深夜,我的父亲在床边生了一堆柴火,我的母亲躺在四周漏风 的那间破屋角落的床上,咬紧牙关,生下了我。27年后,也是在一个下雪的深夜,我完成 了我的博士论文。当我打完最后一个字的时候,我站起来,拉开窗帘,打开窗户,白天还 吵吵闹闹、喧嚣的世界变成一片洁白,让人顿感清净。我从进入大学到博士毕业整整十年。在这十年中,我过得浑浑愕额。十年前,我身高170c m,十年后,我身高还是170cm;十年前,我体重60kg,十年后,我体重还是60kg;十年前 ,我一无所有,十年
呱呱 嵌入式系统
USB转R232线的使用问题
装上驱动了,但是用超级终端和2440板连通信不了 不知道是驱动的问题还是其它问题,请教一下大家? 新买的帝特DT5002线USB转R232线的使用问题
zkissinger 嵌入式系统
用CCS汇编语言编一个基于DSPTMSC5509的自相关程序。
用c编一下main() { inta[L]={1,2,3}; intb[L]={1,2,3}; unsignedinti,j; for(i=0;i<=L;i++) { for(j=0;j<=i;j++) { out[i]+=a[j]*b[i-j]; } } 用CCS汇编语言编一个基于DSPTMSC5509的自相关程序。
zealjolly DSP 与 ARM 处理器
51 UART的问题急求大神帮忙
我的单片机用usb转串口供电,另买了一个gsm模块,当单片机的UART收发端和gsm的相连后程序无法下载到单片机里,为什么?51UART的问题急求大神帮忙
wszrx1234 51单片机
氮化镓电子产品会改变世界吗?
[localvideo]ffb7bb0c65a82fe852d5764c1887834b[/localvideo] 氮化镓电子产品会改变世界吗?
btty038 RF/无线
小广播
设计资源 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2023 EEWORLD.com.cn, Inc. All rights reserved