STM32掉电检测+Flash存取

发布者:创意火舞最新更新时间:2016-09-26 来源: eefocus关键字:STM32  掉电检测  Flash存取 手机看文章 扫描二维码
随时随地手机看文章
STM32有PVD的掉电检测功能,flash也可以直接存取;就动了用flash掉电保存参数的念头。 
1、搞定Flash擦、写函数。 
void  F_ErasePage(u32 Page_Address) 

 U32 tmp; 
 while((FLASH->SR&FLASH_FLAG_BSY)==FLASH_FLAG_BSY) 
 {  //PutCnstStr2Usart1("waiting\n"); } 
 FLASH->SR |= FLASH_FLAG_PGERR; 
 FLASH->CR |= CR_PER_Set; 
 FLASH->AR=Page_Address; 
 FLASH->CR |= CR_STRT_Set; 
  while((FLASH->SR&FLASH_FLAG_BSY)==FLASH_FLAG_BSY) 
 {  //PutCnstStr2Usart1("waiting\n"); } 
 FLASH->CR &= ~CR_PER_Set;//这个不能忘 
 } 
void FLASH_Program(u32 Address, u16 Data) 

 U32 tmp; 
Fstart: 
 if((FLASH->CR&CR_LOCK_Set)==CR_LOCK_Set)  //如果写被锁死 
 { 
  FLASH->KEYR = FLASH_KEY1; 
    FLASH->KEYR = FLASH_KEY2; 
    //PutCnstStr2Usart1("Unclock\n"); 
 } 
  while((FLASH->SR&FLASH_FLAG_BSY)==FLASH_FLAG_BSY) 
 { 
  //PutCnstStr2Usart1("waiting\n"); 
 } 
 FLASH->CR |= CR_PG_Set; 
 *(vu16*)Address = Data;  
 FLASH->CR &= ~CR_PG_Set; 
 if((FLASH->SR&FLASH_FLAG_PGERR)==FLASH_FLAG_PGERR) 
 {     
  //PutCnstStr2Usart1("No earase\n"); 
  F_ErasePage(Address); 
  goto Fstart;//竟然用了goto,咳咳^_^ 
 } 

有了这两个函数基本就行了,反正一次要擦一个page,全拿过来保存参数就行了,比较可靠。 
U16 const flashdata[1024]__at(0x08001000);//因为flash一次能且只能写16bit,另外访问奇地址会出错。 
还有不要忘了#include ,绝对定位全靠它了。 
将要保存的参数放到一个结构里面,每次上电复位的时候加载,需要存储时写入flash 
2、搞定掉电检测 

void PVD_Init(void) 

 NVIC_InitTypeDef NVIC_InitStruct; 
 NVIC_InitStruct.NVIC_IRQChannel = PVD_IRQChannel; 
 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00; 
 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00; 
 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; 
  RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 | 
RCC_APB1Periph_TIM4 | RCC_APB1Periph_USART2|RCC_APB1Periph_PWR, ENABLE); //_PWR, ENABLE); // 这个是必需的 
PWR->CR |=  1<<4;//使能 
PWR->CR |=  0xE0;//2.9V检测  
 NVIC_Init(&NVIC_InitStruct);//借用一下库,允许中断 
 } 
寄存器设置有效,手动置相应中断标志可进入中断 
3、联合工作,失败 
void PVD_IRQHandler(void) 

 U16 i; 
 U32 tmp; 
 tmp = 0x08001000; 

 if((PWR->CSR & PWR_FLAG_PVDO)==PWR_FLAG_PVDO) //低于阈值(电压回升也会中断) 
 { 
  F_ErasePage(tmp); 
  for(i=0;i<2000;i++) 
  { 
   FLASH_Program(tmp,i); 
   tmp+=2; 
  } 
 } 


分析:1、Vdda经过LC滤波可能会比Vdd掉的慢,而据说stm32会因此产生检测问题。2、电源回路电容量小,时间来不及。 
尝试:从ATX电源上拆了一个1000uF的电容,接上,无改善。 
思考:把掉电检测跟电源脚做在一起实在意义不大,一般情况下MCU的电源都是经过LDO稳压的,掉电检测使用专门的IO,可以用稳压器前的电压用于检测。 
由于目前还不能对电路板进行破坏性改造,手头也没有示波器,可调电源,暂时放弃对此做进一步的研究。 
套用某大人物的逻辑,这次尝试是部分失败
关键字:STM32  掉电检测  Flash存取 引用地址:STM32掉电检测+Flash存取

上一篇:STM32 GPIO寄存器ODR BSRR BRR
下一篇:stm32快速学习6——SysTick 定时1s控制LED

推荐阅读最新更新时间:2024-03-16 15:12

STM32是如何进入中断服务函数xxx_IRQHandler的
今天在看stm32的中断,一时间不理解stm32主函数是如何进入中断函数的,按C编程的理解,会有个特定的入口之类的,但是看demo过程中没有发现入口。 以串口中断服务函数void USART1_IRQHandler(void) 为例,首先用到串口中断,需要先设定串口中断初始化以及串口初始化,另外void USART1_IRQHandler(void) 中断服务函数也应该写好。 发现在stm32的启动文件startup_stm32f10x_md.s中写到 DCD USART1_IRQHandler 其中DCD是一条数据定义伪指令,用于分配一片连续的字存储单元并用指定的数据初始化。 库里定义 #define USART1 ((
[单片机]
STM32 | 串口空闲中断接收不定长数据(DMA方式)
在使用STM32的串口接收数据的时候,我们常常会使用接收中断的方式来接收数据,常用的是RXNE。这里分享另一种接收数据的方式——IDLE中断(PS:本文的例子运行在STM32F103ZET6上)。 一、IDLE中断什么时候发生? IDLE就是串口收到一帧数据后,发生的中断。什么是一帧数据呢?比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据。 二、RXNE中断和IDLE中断的区别? 当接收到1个字节,就会产生RXNE中断,当接收到一帧数据,就会产生IDLE中断。比如给单片机一次性发送了8个字节,就会产生8次RXNE中断,1次IDLE中断。 三、IDLE中断如何配
[单片机]
<font color='red'>STM32</font> | 串口空闲中断接收不定长数据(DMA方式)
STM32系列第25篇--CAN总线
简介: CAN是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。由德国电气商博世公司在1986年率先提出。此后,CAN通过ISO11898及ISO11519进行了标准化。现在在欧洲已是汽车网络的标准协议。 CAN协议经过ISO标准化后有两个标准:ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准,而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准。 CAN具有很高的可靠性,广泛应用于:汽车电子、工业自动化、船舶、医疗设备、工业设备等方面。 特点: 多主控制。总线空闲时
[单片机]
<font color='red'>STM32</font>系列第25篇--CAN总线
MDK中STM32无法用printf()的问题
在用MDK调试STM32板子串口时,为了方便串口调试,调用了printf()函数,但是把.hex文件烧写进板子后却发现串口接收不到任何数据。用Keil仿真是,串口可以正确的输出。有点纳闷,然后调用USART_SendData()函数,发现串口可以接收到正确的数据,证明串口配置没有问题,问题应该是出在printf()函数上,参照ST公司的printf例子也不能在串口输出数据。由此可知应该是软件配置的原因。后面,百度,再AVR论坛上找到了答案。 如果使用的是MDK,请在工程属性的 Target -》 Code Generation 中勾选 Use MicroLIB 进行如上设置后编译一下,串口输出正确的数据。 #ifndef
[单片机]
通过STM32的C8t6获取DHT11的温湿度数据
本项目通过STM32的C8t6获取DHT11的温湿度数据,以及空气质量传感器MQ135,通过一块ESP8266模块连接wifi,把数据上传到机智云平台,可通过手机APP查看。 1、模块准备 一块STM32F103C8T6一块IIC的OLED模块一个DHT11一个MQ135空气质量模块一块ATK-8266wifi模块一个ST-link下载模块杜邦线若干 2、程序准备 首先,先让C8T6能够在OLED上正常显示温度、湿度、以及空气污染气体传感器。在这里我主要说一下MQ135的计算,至于DHT11如何显示温度湿度。关于MQ135:MQ-135气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(Sn02)。当传感器所处环
[单片机]
通过<font color='red'>STM32</font>的C8t6获取DHT11的温湿度数据
STM32 CAN 控制器
CAN简介 CAN是ControllerAreaNetwork的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需要,1986年德国电气商博世公司开发出面向汽车的CAN通信协议。此后,CAN通过ISO11898及ISO11519进行了标准化,现在在欧洲已是汽车网络的标准协议。 CAN控制器根据两根线上的电位差来判断总线电平。总线电平
[单片机]
stm32的任务调度方式和步骤
STM32的任务调度可以有两种方式 1)通过systick_handler定时器调度 2)执行一个系统调用 任务调度的步骤总结为如下: 保存程序的上下文即当前任务的寄存器,保存存储寄存器的任务堆栈的地址。 根据下一个任务的任务堆栈地址依次弹出下一个任务的16个寄存器。 堆栈中的寄存器保存顺序如下, XPSR SP(代表MSP或PSP,在任务调度完成后,根据PSP的值定位了是哪个任务) LR(存储函数的返回) R12 R3 R2 R1 R0 R11 R10 R9 R8 R7 R6 R5 R4
[单片机]
STM32触摸按键原理和电路设计
01触摸按键原理 触摸使用RC充放电原理: RC电路是指由电阻R和电容C组成的电路,它是脉冲产生和整形电路中常用的电路。 充电过程: 电源通过电阻给电容充电,由于一开始电容两端的电压为0,所以电压的电压都在电阻上,这时电流大,充电速度快。随着电容两端电压的上升,电阻两端的电压下降,电流也随之减小,充电速度小。充电的速度与电阻和电容的大小有关。电阻R越大,充电越慢,电容C越大,充电越慢。衡量充电速度的常数t(tao)=RC。 放电过程: 电容C通过电阻R放电,由于电容刚开始放电时电压为E,放电电流I=E/R,该电流很大,所以放电速度很快。随着电容不断的放电,电容的电压也随着下降。电流也很快减小。电容的放电速度与RC有关,R的阻值
[单片机]
<font color='red'>STM32</font>触摸按键原理和电路设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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