OpenEdv-开源电子网

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

程序在在断电重启后eeprom储存的数据丢失,请给位大神看下程序有没有问题

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2019-7-24
在线时间
2 小时
发表于 2019-7-24 15:26:09 | 显示全部楼层 |阅读模式
1金钱
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "bmp.h"
#include "usart.h"
//#include "i2c_ee.h"
#include "adc.h"
#include "rtc.h"
#include "stmflash.h"

#include "24cxx.h"


#include "mpu6050.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h"
#include "math.h"

#define pai 3.1415926
#define N   5




#define CS_OFF            GPIO_ResetBits(GPIOB, GPIO_Pin_9)
#define CS_ON           GPIO_SetBits(GPIOB, GPIO_Pin_9)
//#define LED_NEGATION       GPIO_WriteBit(GPIOB, GPIO_Pin_6, (BitAction)!GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_6))

#define SLK_OFF            GPIO_ResetBits(GPIOB, GPIO_Pin_8)
#define SLK_ON           GPIO_SetBits(GPIOB, GPIO_Pin_8)

#define POWER_OFF            GPIO_ResetBits(GPIOA, GPIO_Pin_1)
#define POWER_ON           GPIO_SetBits(GPIOA, GPIO_Pin_1)

#define LED_OFF            GPIO_ResetBits(GPIOB, GPIO_Pin_1)
#define LED_ON           GPIO_SetBits(GPIOB, GPIO_Pin_1)

#define KEY               GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)

#define DI1               GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5)
#define DI2               GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6)
#define DI3               GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7)

#define  EEP_Firstpage      0x0000
u8 I2c_Buf_Write[256]={0};
u8 I2c_Buf_Read[256]={0};

u8 const  flash_Buf_Write[256]={0};
u8 const  flash_Buf_Read[256]={0};
//STMFLASH_Write(flash_Buf_Write,(u16*)I2c_Buf_Write,256);
//STMFLASH_Read((u32)flash_Buf_Write,(u16*)I2c_Buf_Read,256);

void GPIOB_Init(void);
void AS5045(void);
void WDD35D4(void);
void ZiJian(void);
void I2C_XieRu(void);
void I2C_DuChu(void);
void I2C_ShuChu(void);
void DianLiang_JianCe(void);
void AnJian_ChuLi(void);
float MiddlevalueFilter(void);


u8 y,num_KEY,num_I2C,num_DiYa,num_QianYa,BZ_power,BZ_BaoCun;
s16 DataX,DataY,DataZ,printf_Data;

// DataX,DataY,DataZ,printf_Data;
u8 ii;//用于for循环
float pitch,roll,yaw;                 //???
short aacx,aacy,aacz;                //??????????
short temp;                                        //??          
float accccy;//mpu6050角度
float accccy_buf[N];//连续读mpu6050数据缓存
float accccy_eve;//mpu6050取中值
u16 acccy;//换算用于显示





int main(void)
{


                 float zzz;
                delay_init();                     //延时函数初始化          
                NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
                OLED_Init();                        //初始化OLED  
                GPIOB_Init();
          uart_init(38400);         
         AT24CXX_Init();         
          MPU_Init();                                        //初始化MPU6050  
          Adc_Init();                                  //ADC初始化
          RTC_Init();                                  //RTC初始化
                POWER_OFF;
          LED_OFF;
          delay_ms(1000);
                POWER_ON;
                LED_ON;
                BZ_power=1;
                num_KEY=0;
                ZiJian();
                 DataX=0;
                 DataY=0;
                 DataZ=0;

                OLED_Clear();//清屏
               
                OLED_DrawBMP(0,0,128,8,BMP3); //欢迎界面
                delay_ms(1500);
                OLED_Clear();//清屏
                delay_ms(200);
                OLED_DianLiang(Get_Adc_Average(ADC_Channel_4,32));//显示电量
                delay_ms(1000);
                delay_ms(1000);
                OLED_Clear();//清屏
                I2C_DuChu();  
        OLED_Clear();//清屏
        OLED_DrawBMP(0,0,128,8,BMP2); //界面
       
        while(1)
        {       
                if(BZ_power==1)//电源标志
                {
                                AS5045();//选用AS5045传感器
                                shuiping(DataX*0.87891+53);//写入水平值
                                if(DataY>=20)//偏移值
                                {
                                chuizhi(DataY*0.8789-20);//写入垂直值  偏移值524对应的度数
                                }
                        else
                                {
                                chuizhi(DataY*0.8789+3580);//写入垂直值
                                }
                                DianLiang_JianCe();//电量检测
                                AnJian_ChuLi();//按键处理程序

if(GetAngleFromACC(0)<0)
{
        zzz = 90.0;
}
else {
zzz=fabs(GetAngleFromACC(0));
                if(zzz<4.1)
                zzz=4.1-zzz;
                 else
                 zzz=zzz-4.1;
}


                                acccy=(int)(zzz*100);
                                pianjiao(acccy);//写入偏角值  显示度数
                               

//////////////////////////////////////////////////////////////////////
                }
        }         

}


float MiddlevalueFilter()
{
        unsigned char jjj,kkk;
        float temp;
        for (jjj=0;jjj<N-1;jjj++)
        {
                for (kkk=0;kkk<N-jjj;kkk++)
                {
                        if(accccy_buf[kkk]>accccy_buf[kkk+1])
                        {
                                temp = accccy_buf[kkk];
                                accccy_buf[kkk] = accccy_buf[kkk+1];
                                accccy_buf[kkk+1] = temp;
                        }
                }
        }
return accccy_buf[(N-1)/2];
}  


void AS5045(void)//AS5045传感器
{
        u32 AS5045D1,AS5045D2,AS5045D3;
       
       
        u8 i;
    CS_OFF;
    AS5045D1=0;
                AS5045D2=0;
                AS5045D3=0;
    delay_us(10);
    SLK_OFF;
    delay_us(1);
    for(i=0;i<18;i++)
    {
        delay_us(1);
        SLK_ON;
        delay_us(1);
        AS5045D1=(AS5045D1<<1)|DI1;
                AS5045D2=(AS5045D2<<1)|DI2;
                AS5045D3=(AS5045D3<<1)|DI3;
        SLK_OFF;  
    }
    delay_us(2);
    CS_ON;
                DataX=(DataX+(AS5045D1>>6))/2;
                DataY=(DataY+(AS5045D2>>6))/2;
                DataZ=(DataZ+(AS5045D3>>6))/2;
//                printf("---------------------------DataY----------------------------%d\r\n", DataY);

               
}




void WDD35D4(void)//WDD35D4传感器
{
                DataX=(DataX+Get_Adc_Average(ADC_Channel_5,32))/2;
                DataY=(DataY+Get_Adc_Average(ADC_Channel_6,32))/2;
                DataZ=(DataZ+Get_Adc_Average(ADC_Channel_7,32))/2;
}




void I2C_XieRu(void)//保存数据到EEPROM
{

        num_I2C++;
        if(num_I2C>=20)//最多保存20组数据
                num_I2C=0;
        I2c_Buf_Write[240]=num_I2C;//写入起始标志
       
                I2c_Buf_Write[num_I2C*12+0]=DataX%256;
                I2c_Buf_Write[num_I2C*12+1]=DataX/256;
                I2c_Buf_Write[num_I2C*12+2]=DataY%256;
                I2c_Buf_Write[num_I2C*12+3]=DataY/256;
                I2c_Buf_Write[num_I2C*12+4]=acccy%256;
                I2c_Buf_Write[num_I2C*12+5]=acccy/256;
       
                I2c_Buf_Write[num_I2C*12+6]=calendar.min;//分
                I2c_Buf_Write[num_I2C*12+7]=calendar.hour;//时
                I2c_Buf_Write[num_I2C*12+8]=calendar.w_date;//日
                I2c_Buf_Write[num_I2C*12+9]=calendar.w_month;//月
                I2c_Buf_Write[num_I2C*12+10]=calendar.w_year%256;//年L
                I2c_Buf_Write[num_I2C*12+11]=calendar.w_year/256;//年H

                AT24CXX_Write( EEP_Firstpage, I2c_Buf_Write, 256);        //写入

       
//                STMFLASH_Write((u32)flash_Buf_Write,(u16*)I2c_Buf_Write,256);
}




void I2C_DuChu(void)//读出EEPROM数据
{
                u8 i;
                AT24CXX_Read( EEP_Firstpage, I2c_Buf_Write, 256); //读出
//                STMFLASH_Read((u32)flash_Buf_Write,(u16*)I2c_Buf_Read,256);
                for(i=0;i<240;i++)
                {
                                I2c_Buf_Write[i]=I2c_Buf_Read[i];
                }
                num_I2C=I2c_Buf_Read[240];
}




void I2C_ShuChu(void)//printf输出EEPROM数据
{
                u8 i,num;
                double Data;
                AT24CXX_Read( EEP_Firstpage, I2c_Buf_Read, 256); //读出
       
//                STMFLASH_Read((u32)flash_Buf_Write,(u16*)I2c_Buf_Read,256);
                num_I2C=I2c_Buf_Read[240];
                for(i=0;i<20;i++)
                {
                                num=((num_I2C+i+1)%20)*12;
                               
                                if((20-i)<10)
                                                printf("%d",0);
                                printf("%d.",20-i);//序号
                                printf("%d-",(I2c_Buf_Read[num+11]<<8)+I2c_Buf_Read[num+10]);//年
                               
                                if(I2c_Buf_Read[num+9]<10)
                                                printf("%d",0);
                                printf("%d-",I2c_Buf_Read[num+9]);//月
                               
                                if(I2c_Buf_Read[num+8]<10)
                                                printf("%d",0);
                                printf("%d  ",I2c_Buf_Read[num+8]);//日
                       
                                if(I2c_Buf_Read[num+7]<10)//时
                                                printf("%d",0);
                                printf("%d:",I2c_Buf_Read[num+7]);
                               
                                if(I2c_Buf_Read[num+6]<10)
                                                printf("%d",0);
                                printf("%d   ",I2c_Buf_Read[num+6]);//分
                               
                                printf("X=");
                                printf_Data=((I2c_Buf_Read[num+1]<<8)+I2c_Buf_Read[num+0])*0.87891+53;
                                Data=printf_Data;
                                printf("%.1f  ",Data/10);
                                if(printf_Data<1000)
                                                printf("   ");
                                if(printf_Data<100)
                                                printf("  ");
                               
                                printf("Y=");
                               
//                                //缪修改
                                        if(((I2c_Buf_Read[num+3]<<8)+I2c_Buf_Read[num+2])>=20)    //偏移值
                                {

                                        printf_Data=((I2c_Buf_Read[num+3]<<8)+I2c_Buf_Read[num+2])*0.87891-20; //偏移值524对应的度数
                                }
                        else
                                {
                                                printf_Data=((I2c_Buf_Read[num+3]<<8)+I2c_Buf_Read[num+2])*0.87891+3580;
                                }
                               
                               
//                        printf_Data=((I2c_Buf_Read[num+3]<<8)+I2c_Buf_Read[num+2])*0.87891;
                                Data=printf_Data;
                                printf("%.1f  ",Data/10);
                                if(printf_Data<1000)
                                                printf("   ");
                                if(printf_Data<100)
                                                printf("  ");
                               
                                printf("Z=");
                                printf_Data=((I2c_Buf_Read[num+5]<<8)+I2c_Buf_Read[num+4]);
                                Data=printf_Data+1.7;
                                printf("%.1f",Data/100);
                               
                                printf("\r\n");
                }
}




void DianLiang_JianCe(void)//电量检测
{
                if(Get_Adc_Average(ADC_Channel_7,10)<=2110)//电量低监测 低于1.7V 1.7/3.3*4096=2110
                {
                                num_DiYa++;
                                if(num_DiYa>=13)//电量指示闪烁
                                {
                                                num_DiYa=0;
                                                OLED_Clear();//清屏
                                                delay_ms(20);
                                                OLED_DianLiang(Get_Adc_Average(ADC_Channel_7,32));//显示电量
                                                delay_ms(600);
                                                OLED_Clear();//清屏
                                                delay_ms(20);
                                                OLED_DrawBMP(0,0,128,8,BMP2); //界面
                                }
                                if(Get_Adc_Average(ADC_Channel_7,10)<=1986)//欠压监测 1.6v  1986
                                {
                                                num_QianYa++;
                                                if(num_QianYa>=10)//欠压1秒关机
                                                {
                                                                OLED_Clear();//清屏
                                                                delay_ms(20);
                                                                OLED_DianLiang(2967);//显示电量
                                                                delay_ms(600);
                                                                OLED_DianLiang(2890);//显示电量
                                                                delay_ms(600);
                                                                OLED_DianLiang(2813);//显示电量
                                                                delay_ms(600);
                                                                OLED_DianLiang(2698);//显示电量
                                                                delay_ms(600);
                                                                OLED_DianLiang(2621);//显示电量
                                                                delay_ms(600);
                                                                OLED_Clear();//清屏
                                                                BZ_power=0;//清电源标志位
                                                                POWER_OFF;//关闭电源
                                                                LED_OFF;
                                                }
                                }
                                else
                                {
                                                if(num_QianYa!=0)
                                                        num_QianYa--;
                                }
                }       
       
                else
                {
                        if(num_DiYa!=0)
                                                num_DiYa--;
                }
}




void AnJian_ChuLi(void)//按键处理程序
{
                if(KEY==0)//若按键按下
                {                                               
                                num_KEY++;//计数增加 PS:不用消抖可忽略按键毛刺
                                if(num_KEY>=100)//连续按下超过2秒//(num_KEY>=20
                                {
                                        OLED_Clear();//清屏
                                        BZ_power=0;//清电源标志位
                                        POWER_OFF;//关闭电源
                                        LED_OFF;
                                }
                                delay_ms(10);
                                if((KEY==0)&&(num_KEY<=14)&&(BZ_power==1))//延时10mS若按键还是按下   //num_KEY<=2
                                {
                                                BZ_BaoCun=1;//保存标志位
                                                LED_OFF;
                                }
                                if((num_KEY>=15)&&(BZ_power==1))//若按键连续按下超过1秒//num_KEY>=10
                                {
                                                BZ_BaoCun=0;//清空保存标志位
                                                LED_ON;
                                }
                }
                else//若按键松手
                {
                                delay_ms(10);
                                if(num_KEY!=0)//若按下计时不等于0
                                                num_KEY--;//减小按键计时 PS:不用消抖可忽略按键毛刺
                                if((KEY==1)&&(BZ_BaoCun==1)&&(BZ_power==1))//消抖后
                                {       
                                                BZ_BaoCun=0;//清空保存标志位
                                                OLED_Clear();//清屏
                                                delay_ms(200);
                                       
                                                I2C_XieRu();
                                                OLED_DrawBMP(0,2,128,6,BMP4);  //显示保存成功
                                       
                                                I2C_ShuChu();
                                       
                                                LED_ON;
                                                delay_ms(1000);
                                                OLED_Clear();//清屏
                                                delay_ms(200);
                                                OLED_DrawBMP(0,0,128,8,BMP2); //显示界面
                                }
                }
}




void ZiJian(void)//自检
{
//                AS5045();
                if(Get_Adc_Average(ADC_Channel_7,10)<=1986)//欠压监测 1.6V
                {
                                delay_ms(20);
                                if(Get_Adc_Average(ADC_Channel_7,10)<=1986)    //1986
                                {
                                                OLED_Clear();//清屏
                                                delay_ms(20);
                                                OLED_DianLiang(2957);//显示电量2957
                                        delay_ms(600);
                                                OLED_DianLiang(2890);//显示电量2890
                                        delay_ms(600);
                                                OLED_DianLiang(2813);//显示电量2813
                                        delay_ms(600);
                                                OLED_DianLiang(2698);//显示电量2698
                                        delay_ms(600);
                                                OLED_DianLiang(2621);//显示电量2621
                                        delay_ms(600);
       
                                                OLED_Clear();//清屏
                                                BZ_power=0;//清电源标志位
                                                POWER_OFF;//关闭电源
                                                LED_OFF;
                                                while(1);
                                }
                }
//                else  if(Get_Adc_Average(ADC_Channel_7,20)>=2575)//充电监测 4.15V  4.15/2/3.3*4096=2575
//                                {
//                                                num_QianYa++;
//                                                if(num_QianYa>=13)//欠压1秒关机
//                                                {
//                                                                OLED_Clear();//清屏
//                                                                delay_ms(20);
//                                                                OLED_DianLiang(2967);//显示电量
//                                                                delay_ms(400);
//                                                                OLED_Clear();//清屏
//                                                        delay_ms(400);
//                                                                OLED_DianLiang(2967);//显示电量
//                                                                delay_ms(600);
//                                                                OLED_Clear();//清屏
//                                                        delay_ms(600);
//                                                                OLED_DianLiang(2967);//显示电量
//                                                                delay_ms(600);
//                                                                OLED_Clear();//清屏
//                                                        delay_ms(600);
//                                                                OLED_DianLiang(2967);//显示电量
//                                                                delay_ms(600);
//                                                                OLED_Clear();//清屏
//                                                        delay_ms(600);
//                                                                OLED_DianLiang(2967);//显示电量
//                                                       
//                                       
//                                                }
//                                }
//               
               
}




void GPIOB_Init(void)         //IO配置
{                                               
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_8|GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
       
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
       
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-7-25 02:35:27 | 显示全部楼层
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2019-7-24
在线时间
2 小时
 楼主| 发表于 2019-7-25 13:56:01 | 显示全部楼层

原子哥,问下有没有at24c512n的驱动程序,我怀疑是驱动程序有问题数据没成功写入
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-7-26 02:54:43 | 显示全部楼层
周志轩 发表于 2019-7-25 13:56
原子哥,问下有没有at24c512n的驱动程序,我怀疑是驱动程序有问题数据没成功写入

没有,但是用我们例程改不难
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-7 15:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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