OpenEdv-开源电子网

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

【编译报错】STM32+KEIL+指定常量数组存储地址到FLASH最后512字节

[复制链接]

12

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
246
金钱
246
注册时间
2014-4-20
在线时间
58 小时
发表于 2019-7-12 15:44:16 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 邵明亚 于 2019-7-12 18:58 编辑

STM32F103RCT6,以战舰V3例程寄存器版的实验一为模板,Target中ROM的SIZE改成0x40000(256KB FLASH容量),在程序中定义256个16位常量数组到FLASH最后512字节即0x0803 FE00~0x0803 FFFF,
  1. #include "sys.h"         
  2. #include "delay.h"        
  3. #include "led.h"
  4. //ALIENTEK战舰STM32开发板 实验1
  5. //跑马灯 实验  
  6. //技术支持:www.openedv.com
  7. //广州市星翼电子科技有限公司


  8. const uint16_t gamma_red[256]__attribute__((at(0x0803FE00)))={
  9.         0 ,1 ,2 ,4 ,7 ,11 ,17 ,24 ,32 ,42 ,53 ,65 ,79 ,94 ,111 ,129 ,
  10.         148 ,169 ,192 ,216 ,242 ,270 ,299 ,330 ,362 ,396 ,432 ,469 ,508 ,549 ,591 ,635 ,
  11.         681 ,729 ,779 ,830 ,883 ,938 ,994 ,1053 ,1113 ,1175 ,1239 ,1305 ,1373 ,1443 ,1514 ,1587 ,
  12.         1663 ,1740 ,1819 ,1900 ,1983 ,2068 ,2154 ,2243 ,2334 ,2427 ,2521 ,2618 ,2717 ,2817 ,2920 ,3024 ,
  13.         3131 ,3240 ,3350 ,3463 ,3578 ,3694 ,3813 ,3934 ,4057 ,4182 ,4309 ,4438 ,4569 ,4703 ,4838 ,4976 ,
  14.         5115 ,5257 ,5401 ,5547 ,5695 ,5845 ,5998 ,6152 ,6309 ,6467 ,6628 ,6792 ,6957 ,7124 ,7294 ,7466 ,
  15.         7640 ,7816 ,7994 ,8175 ,8358 ,8542 ,8730 ,8919 ,9111 ,9305 ,9501 ,9699 ,9899 ,10102 ,10307 ,10514 ,
  16.         10724 ,10936 ,11150 ,11366 ,11585 ,11806 ,12029 ,12254 ,12482 ,12712 ,12944 ,13179 ,13415 ,13655 ,13896 ,14140 ,
  17.         14386 ,14634 ,14885 ,15138 ,15394 ,15651 ,15911 ,16174 ,16439 ,16706 ,16975 ,17247 ,17521 ,17798 ,18076 ,18358 ,
  18.         18641 ,18927 ,19216 ,19506 ,19799 ,20095 ,20393 ,20693 ,20996 ,21301 ,21608 ,21918 ,22231 ,22545 ,22862 ,23182 ,
  19.         23504 ,23828 ,24155 ,24484 ,24816 ,25150 ,25487 ,25826 ,26167 ,26511 ,26857 ,27206 ,27558 ,27911 ,28267 ,28626 ,
  20.         28987 ,29351 ,29717 ,30085 ,30456 ,30830 ,31206 ,31584 ,31965 ,32349 ,32735 ,33123 ,33514 ,33907 ,34303 ,34702 ,
  21.         35103 ,35506 ,35912 ,36321 ,36732 ,37145 ,37561 ,37980 ,38401 ,38825 ,39251 ,39680 ,40111 ,40545 ,40981 ,41420 ,
  22.         41862 ,42306 ,42752 ,43202 ,43653 ,44108 ,44564 ,45024 ,45486 ,45950 ,46418 ,46887 ,47360 ,47834 ,48312 ,48792,
  23.         49275 ,49760 ,50248 ,50738 ,51231 ,51727 ,52225 ,52726 ,53229 ,53735 ,54244 ,54755 ,55269 ,55786 ,56305 ,56827,
  24.         57351 ,57878 ,58408 ,58940 ,59475 ,60013 ,60553 ,61096 ,61641 ,62189 ,62740 ,63294 ,63850 ,64408 ,64970 ,65534
  25. };



  26. int main(void)
  27. {                                 
  28.         Stm32_Clock_Init(9);//系统时钟设置
  29.         delay_init(72);                  //延时初始化
  30.         LED_Init();                          //初始化与LED连接的硬件接口
  31.         while(1)
  32.         {
  33.                 LED0=0;
  34.                 LED1=1;
  35.                 delay_ms(300);
  36.                 LED0=1;
  37.                 LED1=0;
  38.                 delay_ms(300);
  39.         }         
  40. }

复制代码


编译报错,好像是说超出FLASH容量
  1. ..\OBJ\test.axf: Error: L6220E: Load region LR_IROM1 size (262156 bytes) exceeds limit (262144 bytes). Region contains 260274 bytes of padding and 0 bytes of veneers (total 260274 bytes of linker generated content).
复制代码

于是把at(0x0803FE00))改成at(0x0803FD00)),然后编译,没有报错。查看生成的hex文件发现,在常量数组存储区之后,紧接着存放了12个0x00
  1. :10FEF000C9F0EDF214F53EF76AF998FBCAFDFEFF72
  2. :0CFF0000000000000000000000000000F5
  3. :0400000508000131BD
  4. :00000001FF
复制代码

把常量数组注释掉,编译,发现HEX文件末尾有8个0x00:
  1. :100550000C0000202C0500008801000800000000AD
  2. :08056000000000000000000093
  3. :0400000508000131BD
  4. :00000001FF
复制代码

问一下,为什么会生成的HEX要在FLASH中加几个0x00?
怎么解决定义常量到FLASH尾端报错问题?

实验1 跑马灯实验.rar (107.7 KB, 下载次数: 1)

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

使用道具 举报

12

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
246
金钱
246
注册时间
2014-4-20
在线时间
58 小时
 楼主| 发表于 2019-7-12 17:59:03 | 显示全部楼层
我是楼主。
现在发现,FLASH最后存储的是全局变量的初始化值。但不知道如何不让它存储或者存储到别的地址?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-7-13 02:35:15 | 显示全部楼层
邵明亚 发表于 2019-7-12 17:59
我是楼主。
现在发现,FLASH最后存储的是全局变量的初始化值。但不知道如何不让它存储或者存储到别的地址 ...

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

使用道具 举报

12

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
246
金钱
246
注册时间
2014-4-20
在线时间
58 小时
 楼主| 发表于 2019-7-15 13:36:07 | 显示全部楼层
本帖最后由 邵明亚 于 2019-7-15 13:38 编辑

我是楼主。

没有找到改变全局变量存放位置的办法!

只能这样避开:
常量数组存放在倒数2K空间之前,最后2K~1K由编译器存放全局变量(不大于1K)初始化值,“EEPROM”起始地址设置到最后1K空间。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 12:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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