【编译报错】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 天前 上传 点击文件名下载附件



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。