OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2976|回复: 5

战舰V3PVD中断写flash问题(不使用BKP)

[复制链接]

8

主题

33

帖子

0

精华

高级会员

Rank: 4

积分
872
金钱
872
注册时间
2017-8-1
在线时间
85 小时
发表于 2017-8-21 10:50:21 | 显示全部楼层 |阅读模式
5金钱
想实现在断电前写flash,但是读取出来的结果是乱码,看下有没有大佬看出是什么问题代码如下:
/***********************************
* 文件名:main.c
* 作者:Kyle
* 日期:20170818
* 描述:任务2测试
* 版本:1.0
* 版本信息:测试flash保存,测试断电状态
* 芯片类型:stm32f103ze
* 库版本:V3.5.0
***********************************/

#include "stm32f10x.h"
#include "usart.h"
#include "delay.h"
#include "stmflash.h"

//要写入到STM32 FLASH的字符串数组
const u8 TEXT_Buffer[]={"2"};
#define SIZE sizeof(TEXT_Buffer)  //数组长度
#define FLASH_SAVE_ADDR  0X08011000  //设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)

void PWR_PVD_Init(void)
{   
    NVIC_InitTypeDef NVIC_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟

    NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn;           //使能PVD所在的外部中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;       //子优先级0
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;          //使能外部中断通道
    NVIC_Init(&NVIC_InitStructure);

    EXTI_StructInit(&EXTI_InitStructure);
    EXTI_InitStructure.EXTI_Line = EXTI_Line16;             //PVD连接到中断线16上
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;     //使用中断模式
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  //电压低于阀值时产生中断
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;               //使能中断线
    EXTI_Init(&EXTI_InitStructure);                         //初始

    PWR_PVDLevelConfig(PWR_PVDLevel_2V8);//设定监控阀值
    PWR_PVDCmd(ENABLE);//使能PVD     
}

void PVD_IRQHandler(void)
{
    EXTI_ClearITPendingBit(EXTI_Line16);//清中断
                if(PWR_GetFlagStatus(PWR_FLAG_PVDO))
         {                 
                  STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);
         }
}


int main(void)
{
        //初始化
        u8 datatemp[SIZE];
        delay_init();                     //延时函数初始化          
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        uart_init(115200);                 //串口初始化为115200
        PWR_PVD_Init();
       
       
        //STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);
       
        //读flash数据
        printf("\r\nstart\r\n");
        while(1)
        {
          //printf("\r\n读取信息:%d\r\n",BKP_ReadBackupRegister(BKP_DR9));
                STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)datatemp,SIZE);
                printf("\r\n读取信息:%s\r\n",datatemp);
                delay_ms(1000);
        }

        return 0;
}


中断写flash读取结果乱码

中断写flash读取结果乱码

最佳答案

查看完整内容[请看2#楼]

ok了,执行代码如下 /*********************************** * 文件名:main.c * 作者:Kyle * 日期:20170818 * 描述:任务2测试 * 版本:1.0 * 版本信息:测试flash保存,测试断电状态 * 芯片类型:stm32f103rb * 库版本:V3.5.0 ***********************************/ #include "stm32f10x.h" #include "usart.h" #include "delay.h" #include "stmflash.h" //要写入到STM32 FLASH的字符串数组 const u8 TEX ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

33

帖子

0

精华

高级会员

Rank: 4

积分
872
金钱
872
注册时间
2017-8-1
在线时间
85 小时
 楼主| 发表于 2017-8-21 10:50:22 | 显示全部楼层
ok了,执行代码如下
/***********************************
* 文件名:main.c
* 作者:Kyle
* 日期:20170818
* 描述:任务2测试
* 版本:1.0
* 版本信息:测试flash保存,测试断电状态
* 芯片类型:stm32f103rb
* 库版本:V3.5.0
***********************************/

#include "stm32f10x.h"
#include "usart.h"
#include "delay.h"
#include "stmflash.h"

//要写入到STM32 FLASH的字符串数组
const u8 TEXT_Buffer[]={"cccc"};
#define SIZE sizeof(TEXT_Buffer)                //数组长度
#define FLASH_SAVE_ADDR  0x08001800                //设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)

//u16 num = 35;

volatile FLASH_Status FLASHStatus = FLASH_COMPLETE;/*FLASH擦除完成标志*/

void PWR_PVD_Init(void)
{   
    NVIC_InitTypeDef NVIC_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;
     
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟

    NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn;           //使能PVD所在的外部中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;       //子优先级0
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;          //使能外部中断通道
    NVIC_Init(&NVIC_InitStructure);
     
    EXTI_StructInit(&EXTI_InitStructure);
    EXTI_InitStructure.EXTI_Line = EXTI_Line16;             //PVD连接到中断线16上
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;     //使用中断模式
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  //电压低于阀值时产生中断
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;               //使能中断线
    EXTI_Init(&EXTI_InitStructure);                         //初始
     
    PWR_PVDLevelConfig(PWR_PVDLevel_2V9);//设定监控阀值
    PWR_PVDCmd(ENABLE);//使能PVD     
}

void PVD_IRQHandler(void)
{
    EXTI_ClearITPendingBit(EXTI_Line16);//清中断
                if(PWR_GetFlagStatus(PWR_FLAG_PVDO))
                {
                        /*
                        //使能BKP并保存
                        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);//使能PWR和BKP外设时钟
                        PWR_BackupAccessCmd(ENABLE);//使能后备寄存器访问
                        BKP_WriteBackupRegister(BKP_DR9,num);
                        */
                       
                        //写flash
                        //STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);
                        FLASH_Unlock();
                       
                        FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
                       
                        STMFLASH_Write_NoCheck(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);
                       
                        FLASH_Lock();
                }       
}

int main(void)
{
        //初始化
        u8 datatemp[SIZE];
        delay_init();                     //延时函数初始化          
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        uart_init(115200);                 //串口初始化为115200
        PWR_PVD_Init();
       
       
        //STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);
       
        //读flash数据
        printf("\r\nstart\r\n");
        while(1)
        {
          //printf("\r\n读取BKP信息:%d\r\n",BKP_ReadBackupRegister(BKP_DR9));
                STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)datatemp,SIZE);
                printf("\r\n读取FLASH信息:%s\r\n",datatemp);
               
               
                //擦除
                FLASH_Unlock();
                FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
                FLASHStatus = FLASH_ErasePage((uint32_t)0x08001800);
                FLASH_Lock();
               
               
                delay_ms(1000);
        }

        return 0;
}
运行结果如下:
[2017-08-21 05:04:22.262]
start[2017-08-21 05:04:22.280]
[2017-08-21 05:04:22.280]
读取FLASH信息:bbbb[2017-08-21 05:04:22.280]
[2017-08-21 05:04:31.262]
读取FLASH信息:??????????[2017-08-21 05:04:31.276]
[2017-08-21 05:04:40.140]
start[2017-08-21 05:04:40.169]
[2017-08-21 05:04:40.169]
读取FLASH信息:cccc[2017-08-21 05:04:40.169]
[2017-08-21 05:04:49.140]
读取FLASH信息:??????????[2017-08-21 05:04:49.155]
回复

使用道具 举报

8

主题

33

帖子

0

精华

高级会员

Rank: 4

积分
872
金钱
872
注册时间
2017-8-1
在线时间
85 小时
 楼主| 发表于 2017-8-21 11:57:14 | 显示全部楼层
难道是因为STMFLASH_Write函数执行时间太长所导致的吗?我尝试下
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
198
金钱
198
注册时间
2017-7-25
在线时间
39 小时
发表于 2017-8-21 14:16:39 | 显示全部楼层
sizeof(TEXT_Buffer)=2
然后你自行体会吧
回复

使用道具 举报

8

主题

33

帖子

0

精华

高级会员

Rank: 4

积分
872
金钱
872
注册时间
2017-8-1
在线时间
85 小时
 楼主| 发表于 2017-8-21 15:42:01 | 显示全部楼层
17602515236 发表于 2017-8-21 14:16
sizeof(TEXT_Buffer)=2
然后你自行体会吧

不懂。我把这句话放在main可以运行,放在pvd中断却显示乱码,跟字节有关系吗?
回复

使用道具 举报

8

主题

33

帖子

0

精华

高级会员

Rank: 4

积分
872
金钱
872
注册时间
2017-8-1
在线时间
85 小时
 楼主| 发表于 2017-8-21 17:22:45 | 显示全部楼层
赤少君 发表于 2017-8-21 17:19
ok了,执行代码如下
/***********************************
* 文件名:main.c

我的思路就是断电之后pvd中断只负责写就ok,过后上电把这页清空笨方法,但是能运行
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 22:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表