OpenEdv-开源电子网

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

Flash模仿EEPROM实验

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2014-12-9
在线时间
0 小时
发表于 2014-12-9 20:24:14 | 显示全部楼层 |阅读模式
5金钱
实验中,我想将捕获到的内部温度传感器的温度值写到FLASH_SAVE_ADDR,然后从中读取到该写 入的温度值,可是我一执行,就发现程序会停到STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)datatemp,SIZE); 这句话不在执行任何源程序,也就是死机的状态,请您帮忙解惑一下,谢谢,希望能尽快回复:

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

使用道具 举报

19

主题

702

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3339
金钱
3339
注册时间
2013-7-30
在线时间
708 小时
发表于 2014-12-9 21:28:35 | 显示全部楼层
读取到的温度值是什么数据类型?放在什么地方?datatemp是一个数组,建议你可以给datatemp直接赋值,然后测试一下STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)datatemp,SIZE);这个函数有没有问题
思想很重要,无论做人还是编程!
我的技术公众号【微联智控工作室】
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2014-12-9
在线时间
0 小时
 楼主| 发表于 2014-12-9 21:47:29 | 显示全部楼层
回复【2楼】小温:
---------------------------------
这个函数没有问题,我试过了,你可以看一下我的源码:
请您帮忙看一下,谢谢,希望能尽快回复:
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "key.h"
#include "lcd.h"
#include "stmflash.h"  
#include "tsensor.h"

//ALIENTEK Mini STM32开发板范例代码26
//FLASH模拟EEPROM实验  
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司 

//要写入到STM32 FLASH的字符串数组
//const u8 TEXT_Buffer[]={"STM32 FLASH TEST"};
 u8 TEXT_Buffer[10000];
 u8 flag1=0;
 u8 flag2=0;
float temperate;
#define SIZE sizeof(TEXT_Buffer) //数组长度
#define FLASH_SAVE_ADDR  0X08020000 //设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)
//获取内部温度传感器的值
void GetTemper()
{
u16 adcx;
float temp;

adcx=T_Get_Adc_Average((uint8_t)0x10,10);
// LCD_ShowxNum(132,250,adcx,4,16,0);//显示ADC的值
temp=(float)adcx*(3.3/4096);
temperate=temp;//保存温度传感器的电压值
adcx=temp;
// LCD_ShowxNum(132,270,adcx,1,16,0);     //显示电压值整数部分
temp-=(u8)temp;     //减掉整数部分  
// LCD_ShowxNum(148,270,temp*1000,3,16,0X80); //显示电压小数部分
  temperate=(1.43-temperate)/0.0043+25; //计算出当前温度值  
LCD_ShowxNum(140,290,(u8)temperate,2,16,0); //显示温度整数部分
temperate-=(u8)temperate;  
LCD_ShowxNum(164,290,temperate*100,2,16,0X80);//显示温度小数部分
}
void ShowString_Init()
{
//显示提示信息      
POINT_COLOR=BLUE;//设置字体为蓝色
// LCD_ShowString(60,250,200,16,16,"TEMP_VAL:");      
// LCD_ShowString(60,270,200,16,16,"TEMP_VOL: .   V");      
LCD_ShowString(60,290,200,16,16,"TEMPERATE:  .  C");
}

int main(void)
 { 
u8 key;
u16 adcx;
float temp;
//u8 TEXT_Buffer[100];
u8 datatemp[SIZE];
  NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
delay_init();     //延时函数初始化  
uart_init(9600); //串口初始化为9600
LED_Init();   //初始化与LED连接的硬件接口
LCD_Init();   //初始化LCD 
  KEY_Init(); //按键初始化
T_Adc_Init();   //ADC初始化
  OINT_COLOR=RED;//设置字体为红色 
LCD_ShowString(60,50,200,16,16,"Mini STM32");
LCD_ShowString(60,70,200,16,16,"FLASH EEPROM TEST");
LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(60,110,200,16,16,"2014/3/12");  
LCD_ShowString(60,130,200,16,16,"WK_UP:Read KEY0:Write");
POINT_COLOR=BLUE;
//显示提示信息      
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(60,150,200,16,16,"TEMP_VAL:");      
LCD_ShowString(60,170,200,16,16,"TEMP_VOL:0.000V");      
LCD_ShowString(60,190,200,16,16,"TEMPERATE:00.00C");
while(1)
{
if(flag1==0)
{
u16 adcx;
float temp;
adcx=T_Get_Adc_Average((uint8_t)0x10,10);
LCD_ShowxNum(132,150,adcx,4,16,0);//显示ADC的值
temp=(float)adcx*(3.3/4096);
temperate=temp;//保存温度传感器的电压值
adcx=temp;
LCD_ShowxNum(132,170,adcx,1,16,0);     //显示电压值整数部分
temp-=(u8)temp;     //减掉整数部分  
LCD_ShowxNum(148,170,temp*1000,3,16,0X80); //显示电压小数部分
  temperate=(1.43-temperate)/0.0043+25; //计算出当前温度值  
LCD_ShowxNum(140,190,(u8)temperate,2,16,0); //显示温度整数部分
temperate-=(u8)temperate;  
LCD_ShowxNum(164,190,temperate*100,2,16,0X80);//显示温度小数部分
}
if(flag2=1){
TEXT_Buffer[0]=temperate;
STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);
LCD_ShowString(60,230,200,16,16,"FLASH Write Finished!");//提示传送完成
}
key=KEY_Scan(0);
switch(key)
{
case KEY0_PRES:
LCD_Fill(0,230,239,319,WHITE);//清除半屏    
LCD_ShowString(60,230,200,16,16,"Start Write FLASH....");
adcx=T_Get_Adc_Average((uint8_t)0x10,10);//电压值整数部分
temp=(float)adcx*(3.3/4096);
temperate=temp;//保存温度传感器的电压值
  temperate=(1.43-temperate)/0.0043+25; //计算出当前温度值
flag1=1;
flag2=1;
break;
case WKUP_PRES:
ShowString_Init();
LCD_ShowString(60,230,200,16,16,"Start Read FLASH.... ");
flag1=0;
// adcx=T_Get_Adc_Average((uint8_t)0x10,10);
// temp=(float)adcx*(3.3/4096);
// temperate=temp;//保存温度传感器的电压值
// temperate=(1.43-temperate)/0.0043+25; //计算出当前温度值  
// LCD_ShowxNum(140,290,(u8)temperate,2,16,0); //显示温度整数部分
// temperate-=(u8)temperate;  
// LCD_ShowxNum(164,290,temperate*100,2,16,0X80);//显示温度小数部分
//
LCD_ShowString(60,270,200,16,16,"The Data Readed Is:  ");//提示传送完成
STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)datatemp,SIZE);
LCD_ShowString(60,270,200,16,16,datatemp);//显示读到的字符串
break;
}
}     

}

请尽快回复,谢谢!
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5782
金钱
5782
注册时间
2013-11-22
在线时间
1212 小时
发表于 2014-12-9 22:14:28 | 显示全部楼层


LZ   这儿是什么意思     而且 即使flag2用作判断  也不见有对它清零的啊??
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 05:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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