OpenEdv-开源电子网

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

如何在FLASH中定义const float常量并赋值

[复制链接]

25

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2015-12-16
在线时间
32 小时
发表于 2023-5-17 16:52:14 | 显示全部楼层 |阅读模式
1金钱
请教,STM32L4xx,要在FLASH中,定义8个float常量,并且初始赋值均为1.0主程序创建8个变量,float ccc[8];
读取上述的常量,后面需要通过串口指令,修改这些值。每次上电,均从FLASH中读取这些值

其实就是相当于普通8位机的自带的EEPROM,先给EEPROM中赋值,8个float
然后读出这8个常数,到变量float ccc[8]中,然后根据串口指令,刷新这些变量,并存入到EEPROM中

现在换了MDK,STM32的,不会
请教,谢谢

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

使用道具 举报

70

主题

6756

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12983
金钱
12983
注册时间
2012-11-26
在线时间
3787 小时
发表于 2023-5-17 16:54:16 | 显示全部楼层
联合体转成4个字节的整数,然后其它的就一样了
回复

使用道具 举报

25

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2015-12-16
在线时间
32 小时
 楼主| 发表于 2023-5-17 16:58:27 | 显示全部楼层

用上面的办法,无法赋值,在线等,谢谢!
回复

使用道具 举报

25

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2015-12-16
在线时间
32 小时
 楼主| 发表于 2023-5-17 16:59:04 | 显示全部楼层
jermy_z 发表于 2023-5-17 16:54
联合体转成4个字节的整数,然后其它的就一样了

麻烦具体讲讲,谢谢!
回复

使用道具 举报

70

主题

6756

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12983
金钱
12983
注册时间
2012-11-26
在线时间
3787 小时
发表于 2023-5-17 17:08:00 | 显示全部楼层
kuheye 发表于 2023-5-17 16:59
麻烦具体讲讲,谢谢!

1、首先你讲的逻辑就是扯淡的,const怎么会被修改呢

2、如果看不懂我讲的,就去了解下联合体
学无止境
回复

使用道具 举报

25

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2015-12-16
在线时间
32 小时
 楼主| 发表于 2023-5-17 18:11:16 | 显示全部楼层
jermy_z 发表于 2023-5-17 17:08
1、首先你讲的逻辑就是扯淡的,const怎么会被修改呢

2、如果看不懂我讲的,就去了解下联合体

我的意思是类似EEPROM,烧录程序时候,要写入一个初始值,程序运行后将这些值读入变量中,运行时要根据串口指令,取修改这些值,
STM32中没有EEPROM,这就要使用FLASH来替代上述的用途
不知道我说清楚没?

请教,应该怎么做?谢谢!
再请教,应该如何描述,才不会造成逻辑“扯淡”
回复

使用道具 举报

25

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2015-12-16
在线时间
32 小时
 楼主| 发表于 2023-5-17 19:20:07 | 显示全部楼层
我使用的是STM32L433RC芯片
现在是无法在FLASH指定地址,创建CONST,下面语句均失败
volatile const uint32_t u32Flash[8] __attribute__((section(".ARM._at_0x08010000"))) = {100,200,300,400,500,600,700,801};
const uint32_t tmp[8] __attribute__((section(".ARM._at_0x0803ff00"))) = {100, 200, 300, 400, 500, 600, 700, 800};
static const float tmp_ccc[8] __attribute__((at(0x0803ff00)))={1.01,2.02,3.03,4.04,5.05,6,7,8};

不管是说明类型的数据:float, uint32_t都不行,在调试窗口看,全部是0XFF


回复

使用道具 举报

25

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2015-12-16
在线时间
32 小时
 楼主| 发表于 2023-5-17 19:20:28 | 显示全部楼层

如果写出下面这样,则出错无法编译
static const float tmp32  [8] __attribute__((at(0x0803fe00)))={1,2,3,4,5,6,7,8};
static const uint32_t tmp32  [8] __attribute__((at(0x0803fe00)))={1,2,3,4,5,6,7,8};

最后求助chat_GPT,给出的代码为:
const float tmp_ccc[8] __attribute__((section(".0x0803fd00"))) = {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f};
可以编译,但仿真看内存窗口,依旧为0xFF,


折腾,明天再说吧

回复

使用道具 举报

11

主题

2130

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4724
金钱
4724
注册时间
2015-1-10
在线时间
590 小时
发表于 2023-5-18 16:52:44 | 显示全部楼层
首先const无法修改,其次你这个需求就直接用flash替代eeprom就行了,上电查询flash没有值,没有就新建,有就导入
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 14:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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