白姐透特今晚开什么码

打印

实现识别掉电关机和用户关机

[复制链接]
722|18
跳转到指定楼层
楼主
想要板子能够自动识别是用户自行关电,还是异常掉电关机,根据判断从而在下次上电的时候做出不同的动作。请教各位,有何办法能实现这个判断?在关电的函数里写一个寄存器,上电的时候读寄存器来判断?那么操作哪个空闲的寄存器,怎么读写寄存器呢?新人求教,多谢各位大佬!

相关资料

来自 2楼
|2019-12-12 15:06|只看该作者
就是要求标志位掉电不丢失啊,呵呵直接放FlashRom啊,就是我上面说的意思。
/*************第一个是数组号,第二个是页面,第三个是数组长度***************/
void My_Flash_Write(unsigned int *My_ptr,unsigned int BANK1_WRITE_START_ADDR,unsigned char LEN)
{
unsigned char ii;
unsigned int Address;
__disable_irq();
        FMC_Unlock();//跟上面一样,一个吊道理

          Address = BANK1_WRITE_START_ADDR;//首地址
    for(ii=0;ii<LEN;ii++)
        {
          FMCStatus = FMC_ProgramWord(Address, *My_ptr);//数据写入
    FMC_ClearBitState(FMC_FLAG_EOP | FMC_FLAG_WERR | FMC_FLAG_PERR );//清除标志   
          Address=Address+4; My_ptr++; my_delay(10);
        };

       
          FMC_Lock();//锁定
__enable_irq();
}

评分

参与人数 1威望 +2收起理由
SPR—— + 2很给力!
板凳
|2019-12-12 14:46|只看该作者
楼主的意思我没有完全弄明白,只能讲,我之前有项目需要每次关机都要自动保存相关数据,我都是在低压检测中断里面,先降低主频,然后把数据保存到Flashrom里面的。
地板
 楼主|2019-12-12 15:01|只看该作者
xdqfc 发表于 2019-12-12 14:46
楼主的意思我没有完全弄明白,只能讲,我之前有项目需要每次关机都要自动保存相关数据,我都是在低压检测中 ...

我刚接到单片机的项目,之前没有搞过,我有实现判断关机方式的办法,就是搞一个标志位,人为关机就置位,然后再次上电的时候读取标志位就可以知道上次怎么关机的了。标志位可以在关机的函数中置位。现在是这个标志位要掉电不丢失,而我也没有操作flash和bkp的经验,不知道怎么搞,希望大佬能告诉我详细操作的方法,写一个变量在内存里,再读出来
5
|2019-12-12 15:08|只看该作者
上面是我当初的一个项目,其中的Flash保存的,是GD32F130的,你要包含一下头文件,里面的延迟函数你可以不要用。
6
 楼主|2019-12-12 15:58|只看该作者
xdqfc 发表于 2019-12-12 15:08
上面是我当初的一个项目,其中的Flash保存的,是GD32F130的,你要包含一下头文件,里面的延迟函数你可以不 ...

好的,多谢老哥。这个只写一个数就好了,直接调函数,不用封装就好了。有没有别的什么简单的,比如我定义一个全局变量?这在重新上电的时候全局变量会丢吗?
7
|2019-12-12 17:40|只看该作者
SPR—— 发表于 2019-12-12 15:58
好的,多谢老哥。这个只写一个数就好了,直接调函数,不用封装就好了。有没有别的什么简单的,比如我定义 ...

呵呵,FlashRom要么不玩,要玩,起码1K起步,GD应该够的,不要小气。没有单独单元只放一个数吧,我反正没有仔细研究过。
8
|2019-12-12 19:37|只看该作者
xdqfc 发表于 2019-12-12 14:46
楼主的意思我没有完全弄明白,只能讲,我之前有项目需要每次关机都要自动保存相关数据,我都是在低压检测中 ...

需要先降主频吗? 我直接就是检测到电压降低后,擦写FLASH,然后等没电。
9
 楼主|2019-12-12 20:16|只看该作者
lvben5d 发表于 2019-12-12 19:37
需要先降主频吗? 我直接就是检测到电压降低后,擦写FLASH,然后等没电。 ...

对的,现在我想把标志位变量写进flash,然后读出来。看上面那个老哥的封装函数里面有一个写的函数,那官方的读flash的函数接口是什么?我百度上没有搜到包含的头文件这是为什么啊?
10
 楼主|2019-12-12 20:19|只看该作者
xdqfc 发表于 2019-12-12 17:40
呵呵,FlashRom要么不玩,要玩,起码1K起步,GD应该够的,不要小气。没有单独单元只放一个数吧,我反正没 ...

哈哈,不管多大空间,只要能放进去读出来就好了,我用  int *flsg=(int*)0x0800fff0; 这个直接往地址里面写,貌似没写进去,写1判断0,结果if还是执行了,不知道咋回事
11
|2019-12-12 23:48|只看该作者
基本思路:
1、假设0x01表示断电关机,0x02表示用户关机
2、上电就往flash某地址写入0x01
3、如是用户关机则写入0x02
不要等掉电再去写!

评分

参与人数 1威望 +1收起理由
SPR—— + 1
12
|2019-12-13 15:57|只看该作者
SPR—— 发表于 2019-12-12 20:19
哈哈,不管多大空间,只要能放进去读出来就好了,我用  int *flsg=(int*)0x0800fff0; 这个直接往地址里面 ...

小哥,你有没有先擦除啊,先定下来用哪一个扇区啊,你真的不了解flash的读写吗?
13
|2019-12-13 16:02|只看该作者
lvben5d 发表于 2019-12-12 19:37
需要先降主频吗? 我直接就是检测到电压降低后,擦写FLASH,然后等没电。 ...

降频的目的就是降低总电流,有时候主电源电容太小的话,那么一点点电不够flash操作,说不定flash还没有搞定,电就没有了,保险起见才这样做。
14
 楼主|2019-12-13 17:20|只看该作者
xdqfc 发表于 2019-12-13 15:57
小哥,你有没有先擦除啊,先定下来用哪一个扇区啊,你真的不了解flash的读写吗? ...

之前确实不了解,今天搞懂了,项目需求功能也实现了,回头看你说的简直不要太通俗易懂。主要是之前什么都不知道,多谢老哥!
15
 楼主|2019-12-13 17:22|只看该作者
Prry 发表于 2019-12-12 23:48
基本思路:
1、假设0x01表示断电关机,0x02表示用户关机
2、上电就往flash某地址写入0x01

多谢多谢,这个思路我之前就已经明白,就是中间操作寄存器不知道方法,现在已经搞定,感谢回复
16
 楼主|2019-12-13 17:41|只看该作者
问题已经解决,主要问题是在flash的操作上面,因为之前没接触过单片机,或者说没接触过flash,导致思路明确,完全没有办法实行。在此给出结贴以及经验,像我一样的新手参考。操作flash要确定要操作的地址(看手册,一般选择比较靠后的地址,因为flash前面存的是代码),然后就要擦除,解锁,写值,上锁。读flash没有接口,或者你自己可以封装,根据地址指针取值,网上应该都有的吧。顺便说一句,写flash的流程大概就是上面那位老哥给出的代码,如果要写简单的数据可能就不需要for循环,自己灵活更改。还有就是一般自己的项目资料大部分有外设的例程,可以参考。再次感谢各位的回复,以后再有问题还请多帮忙
17
 楼主|2019-12-13 17:55|只看该作者
根据论坛结贴的教程,完全找不到红色的我要结贴在哪里,暂时先这样了。谁会给我讲讲,以后回来结贴哈
18
|2019-12-14 14:45|只看该作者
本帖最后由 lvben5d 于 2019-12-14 14:47 编辑
SPR—— 发表于 2019-12-12 20:19
哈哈,不管多大空间,只要能放进去读出来就好了,我用  int *flsg=(int*)0x0800fff0; 这个直接往地址里面 ...

要解锁擦写FLASH区域的KEY的,否则写不进去哈!!! 要是代码随便可以写FALSH,那很容易出事哦。系统提供了擦写FLASH保护锁 寄存器
19
|2019-12-16 14:48|只看该作者
如图,可以查复位源寄存器判断复位源

Image 1.jpg(188.75 KB, 下载次数: 0)

Image 1.jpg
扫描二维码,随时随地手机跟帖

本版积分规则

我要发帖投诉建议创建版块

快速回复

您需要登录后才可以回帖
登录 | 注册

论坛热帖

在线客服 快速回复 返回顶部返回列表