OpenEdv-开源电子网

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

向W25Q64存储数据

[复制链接]

6

主题

14

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2016-6-4
在线时间
6 小时
发表于 2016-6-6 21:57:18 | 显示全部楼层 |阅读模式
5金钱
这个例子怎么改才能把测到的电压值存储进FLSH里面,还能实现存储呢,怎么设置存储的个数呢。新手不太懂。#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"         
#include "w25qxx.h"         
#include "adc.h"
u8 TEXT_Buffer[7]={""};
#define SIZE sizeof(TEXT_Buffer)

/************************************************
ALIENTEK战舰STM32开发板实验24
SPI 实验   
技术支持:www.openedv.com
淘宝店铺:http://eboard.taobao.com
关注微信公众平台微信号:"正点原子",免费获取STM32资料。
广州市星翼电子科技有限公司  
作者:正点原子 @ALIENTEK
************************************************/

                                        
//要写入到W25Q64的字符串数组
int main(void)
{         
        u8 key;
        u16 i=0,adcx;
        u8 datatemp[SIZE];
        u32 FLASH_SIZE;
         float temp;
         
        delay_init();                     //延时函数初始化          
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        uart_init(115200);                 //串口初始化为115200
        LED_Init();                                  //初始化与LED连接的硬件接口
        LCD_Init();                                   //初始化LCD        
        KEY_Init();                                //按键初始化               
  Adc_Init();                                  //ADC初始化         
        W25QXX_Init();                        //W25QXX初始化

         
        POINT_COLOR=RED;//设置字体为红色
        LCD_ShowString(30,50,200,16,16,"WarShip STM32");       
        LCD_ShowString(30,70,200,16,16,"KEY1:Write  KEY0:Read");        //显示提示信息               
        LCD_ShowString(60,130,200,16,16,"ADC_CH0_VAL:");             
        LCD_ShowString(60,150,200,16,16,"ADC_CH0_VOL:0.000V");                 
        FLASH_SIZE=128*1024*1024;        //FLASH 大小为16M字节
        POINT_COLOR=BLUE;//设置字体为蓝色          
        while(1)
        {
               
               
                adcx=Get_Adc_Average(ADC_Channel_1,10);
                LCD_ShowxNum(156,130,adcx,4,16,0);//显示ADC的值
                temp=(float)adcx*(3.3/4095);
                printf("%f,%d,%d,%d,%d,%d,%d,%d\r\n",temp,0,0,0,0,0,0,0);
                adcx=temp;
                LCD_ShowxNum(156,150,adcx,1,16,0);//显示电压值
                temp-=adcx;
                temp*=1000;
                LCD_ShowxNum(172,150,temp,3,16,0X80);
                LED0=!LED0;
                delay_ms(10);       
               
                adcx=adcx*1000;
    TEXT_Buffer[0]=adcx/1000+0x30;
                TEXT_Buffer[1]='.';
                TEXT_Buffer[2]=adcx%1000/100+0x30;
          TEXT_Buffer[3]=adcx%1000%100/10+0x30;
                TEXT_Buffer[4]=adcx%1000%100%10+0x30;
                TEXT_Buffer[5]='V';
                TEXT_Buffer[6]='\0';


          key=KEY_Scan(0);
                if(key==KEY1_PRES)        //KEY1按下,写入W25QXX
                {
                        LCD_Fill(0,170,239,319,WHITE);//清除半屏   
                        LCD_ShowString(30,170,200,16,16,"Start Write W25Q128....");
                        W25QXX_Write((u8*)TEXT_Buffer,FLASH_SIZE-100,SIZE);                        //从倒数第100个地址处开始,写入SIZE长度的数据
                        LCD_ShowString(30,190,200,16,16,"W25Q128 Write Finished!");        //提示传送完成
                }
                if(key==KEY0_PRES)        //KEY0按下,读取字符串并显示
                {
                        LCD_ShowString(30,210,200,16,16,"Start Read W25Q128.... ");
                        W25QXX_Read(datatemp,FLASH_SIZE-100,SIZE);                                        //从倒数第100个地址处开始,读出SIZE个字节
                        LCD_ShowString(30,230,200,16,16,"The Data Readed Is:  ");        //提示传送完成
                        LCD_ShowString(180,230,200,16,16,datatemp);//显示读到的字符串
                }
                i++;
                delay_ms(10);
                if(i==20)
                {
                        LED0=!LED0;//提示系统正在运行       
                        i=0;
                }               
        }
}

最佳答案

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

懂了,这是因为adcx=3了,存进去的就是3,所以读出来的就是3.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

14

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2016-6-4
在线时间
6 小时
 楼主| 发表于 2016-6-6 21:57:19 | 显示全部楼层
懂了,这是因为adcx=3了,存进去的就是3,所以读出来的就是3.
回复

使用道具 举报

6

主题

14

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2016-6-4
在线时间
6 小时
 楼主| 发表于 2016-6-6 21:58:49 | 显示全部楼层
为什么存进去的小数点后面全是0.
回复

使用道具 举报

6

主题

14

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2016-6-4
在线时间
6 小时
 楼主| 发表于 2016-6-6 22:00:05 | 显示全部楼层
黑暗骑士55 发表于 2016-6-6 21:58
为什么存进去的小数点后面全是0.

有哪位大神愿意指导一下吗?
回复

使用道具 举报

10

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
500
金钱
500
注册时间
2014-9-1
在线时间
77 小时
发表于 2016-6-7 08:03:54 | 显示全部楼层
W25QXX_Write((u8*)TEXT_Buffer,FLASH_SIZE-100,SIZE);      
你存的是u8数组   读出来肯定没有小数
回复

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2014-6-15
在线时间
5 小时
发表于 2016-6-7 09:41:23 | 显示全部楼层
这个函数的输入参数是u8,也就是说写入芯片的都是字节。你可以把float化成四个字节的u8然后存储。最简单的方法是扩大100倍(根据小数位数来)然后移位
回复

使用道具 举报

8

主题

571

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2919
金钱
2919
注册时间
2016-5-13
在线时间
185 小时
发表于 2016-6-7 11:08:55 | 显示全部楼层
黑暗骑士55 发表于 2016-6-6 22:00
有哪位大神愿意指导一下吗?

保存小数的时候一般是保存成整数的形式。读取的时候在计算下就行了。
比如:
1.1235保存为write(11235,5);,读取的时候abc=read(addr,5)/1000.0;
参数5就是代表保存5位数字。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

6

主题

14

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2016-6-4
在线时间
6 小时
 楼主| 发表于 2016-6-7 13:35:16 | 显示全部楼层
能具体说一下怎么改吗,新手看不太懂。
回复

使用道具 举报

6

主题

14

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2016-6-4
在线时间
6 小时
 楼主| 发表于 2016-6-7 13:45:57 | 显示全部楼层
能给一段具体的语句吗 ?
回复

使用道具 举报

3

主题

548

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1383
金钱
1383
注册时间
2015-2-3
在线时间
197 小时
发表于 2016-6-9 08:51:18 来自手机 | 显示全部楼层
本帖最后由 yyx112358 于 2016-6-9 09:06 编辑

楼上说的方法都没有使用联合体union来得方便高效
[mw_shl_code=c,true]typedef        union
{
        float        f;
        unsigned char u[sizeof(float)];
}EXAMPLE;

void record(EXAMPLE        *p)
{
        //写入
        p->f=3.14159f;
        //.....
        W25Q64_WriteBlock(0,4,p->u);//地址0写入指针p->u指向的4字节
        //.....
        //读取
        W25Q64_ReadBlock(0,4,p->u);
}[/mw_shl_code]
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 11:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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