打印

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

[复制链接]
1831|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SPR——|  楼主 | 2019-12-12 13:49 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
想要板子能够自动识别是用户自行关电,还是异常掉电关机,根据判断从而在下次上电的时候做出不同的动作。请教各位,有何办法能实现这个判断?在关电的函数里写一个寄存器,上电的时候读寄存器来判断?那么操作哪个空闲的寄存器,怎么读写寄存器呢?新人求教,多谢各位大佬!

使用特权

评论回复
来自 2楼
xdqfc| | 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 很给力!
板凳
xdqfc| | 2019-12-12 14:46 | 只看该作者
楼主的意思我没有完全弄明白,只能讲,我之前有项目需要每次关机都要自动保存相关数据,我都是在低压检测中断里面,先降低主频,然后把数据保存到Flashrom里面的。

使用特权

评论回复
地板
SPR——|  楼主 | 2019-12-12 15:01 | 只看该作者
xdqfc 发表于 2019-12-12 14:46
楼主的意思我没有完全弄明白,只能讲,我之前有项目需要每次关机都要自动保存相关数据,我都是在低压检测中 ...

我刚接到单片机的项目,之前没有搞过,我有实现判断关机方式的办法,就是搞一个标志位,人为关机就置位,然后再次上电的时候读取标志位就可以知道上次怎么关机的了。标志位可以在关机的函数中置位。现在是这个标志位要掉电不丢失,而我也没有操作flash和bkp的经验,不知道怎么搞,希望大佬能告诉我详细操作的方法,写一个变量在内存里,再读出来

使用特权

评论回复
5
xdqfc| | 2019-12-12 15:08 | 只看该作者
上面是我当初的一个项目,其中的Flash保存的,是GD32F130的,你要包含一下头文件,里面的延迟函数你可以不要用。

使用特权

评论回复
6
SPR——|  楼主 | 2019-12-12 15:58 | 只看该作者
xdqfc 发表于 2019-12-12 15:08
上面是我当初的一个项目,其中的Flash保存的,是GD32F130的,你要包含一下头文件,里面的延迟函数你可以不 ...

好的,多谢老哥。这个只写一个数就好了,直接调函数,不用封装就好了。有没有别的什么简单的,比如我定义一个全局变量?这在重新上电的时候全局变量会丢吗?

使用特权

评论回复
7
xdqfc| | 2019-12-12 17:40 | 只看该作者
SPR—— 发表于 2019-12-12 15:58
好的,多谢老哥。这个只写一个数就好了,直接调函数,不用封装就好了。有没有别的什么简单的,比如我定义 ...

呵呵,FlashRom要么不玩,要玩,起码1K起步,GD应该够的,不要小气。没有单独单元只放一个数吧,我反正没有仔细研究过。

使用特权

评论回复
8
lvben5d| | 2019-12-12 19:37 | 只看该作者
xdqfc 发表于 2019-12-12 14:46
楼主的意思我没有完全弄明白,只能讲,我之前有项目需要每次关机都要自动保存相关数据,我都是在低压检测中 ...

需要先降主频吗? 我直接就是检测到电压降低后,擦写FLASH,然后等没电。

使用特权

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

对的,现在我想把标志位变量写进flash,然后读出来。看上面那个老哥的封装函数里面有一个写的函数,那官方的读flash的函数接口是什么?我百度上没有搜到包含的头文件这是为什么啊?

使用特权

评论回复
10
SPR——|  楼主 | 2019-12-12 20:19 | 只看该作者
xdqfc 发表于 2019-12-12 17:40
呵呵,FlashRom要么不玩,要玩,起码1K起步,GD应该够的,不要小气。没有单独单元只放一个数吧,我反正没 ...

哈哈,不管多大空间,只要能放进去读出来就好了,我用  int *flsg=(int*)0x0800fff0; 这个直接往地址里面写,貌似没写进去,写1判断0,结果if还是执行了,不知道咋回事

使用特权

评论回复
11
Prry| | 2019-12-12 23:48 | 只看该作者
基本思路:
1、假设0x01表示断电关机,0x02表示用户关机
2、上电就往flash某地址写入0x01
3、如是用户关机则写入0x02
不要等掉电再去写!

使用特权

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

小哥,你有没有先擦除啊,先定下来用哪一个扇区啊,你真的不了解flash的读写吗?

使用特权

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

降频的目的就是降低总电流,有时候主电源电容太小的话,那么一点点电不够flash操作,说不定flash还没有搞定,电就没有了,保险起见才这样做。

使用特权

评论回复
14
SPR——|  楼主 | 2019-12-13 17:20 | 只看该作者
xdqfc 发表于 2019-12-13 15:57
小哥,你有没有先擦除啊,先定下来用哪一个扇区啊,你真的不了解flash的读写吗? ...

之前确实不了解,今天搞懂了,项目需求功能也实现了,回头看你说的简直不要太通俗易懂。主要是之前什么都不知道,多谢老哥!

使用特权

评论回复
15
SPR——|  楼主 | 2019-12-13 17:22 | 只看该作者
Prry 发表于 2019-12-12 23:48
基本思路:
1、假设0x01表示断电关机,0x02表示用户关机
2、上电就往flash某地址写入0x01

多谢多谢,这个思路我之前就已经明白,就是中间操作寄存器不知道方法,现在已经搞定,感谢回复

使用特权

评论回复
16
SPR——|  楼主 | 2019-12-13 17:41 | 只看该作者
问题已经解决,主要问题是在flash的操作上面,因为之前没接触过单片机,或者说没接触过flash,导致思路明确,完全没有办法实行。在此给出结贴以及经验,像我一样的新手参考。操作flash要确定要操作的地址(看手册,一般选择比较靠后的地址,因为flash前面存的是代码),然后就要擦除,解锁,写值,上锁。读flash没有接口,或者你自己可以封装,根据地址指针取值,网上应该都有的吧。顺便说一句,写flash的流程大概就是上面那位老哥给出的代码,如果要写简单的数据可能就不需要for循环,自己灵活更改。还有就是一般自己的项目资料大部分有外设的例程,可以参考。再次感谢各位的回复,以后再有问题还请多帮忙

使用特权

评论回复
17
SPR——|  楼主 | 2019-12-13 17:55 | 只看该作者
根据论坛结贴的教程,完全找不到红色的我要结贴在哪里,暂时先这样了。谁会给我讲讲,以后回来结贴哈

使用特权

评论回复
18
lvben5d| | 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
CharryW| | 2019-12-16 14:48 | 只看该作者
如图,可以查复位源寄存器判断复位源

Image 1.jpg (188.75 KB )

Image 1.jpg

使用特权

评论回复
20
clvert| | 2020-3-11 14:54 | 只看该作者
官方的历程里,有关于读写FLASH的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

499

帖子

0

粉丝