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

2019-07-20 22:36发布

本帖最后由 邵明亚 于 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 est.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, 下载次数: 0) 7 天前 上传 点击文件名下载附件



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
邵明亚
1楼-- · 2019-07-20 22:52
我是楼主。
现在发现,FLASH最后存储的是全局变量的初始化值。但不知道如何不让它存储或者存储到别的地址?
正点原子
2楼-- · 2019-07-21 00:20
 精彩回答 2  元偷偷看……
邵明亚
3楼-- · 2019-07-21 01:44
本帖最后由 邵明亚 于 2019-7-15 13:38 编辑

我是楼主。

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

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

一周热门 更多>