STM32 region `FLASH‘ overflowed by xxx bytes 问题解决

STM32 Region `FLASH’ overflowed by xxx bytes 问题解决

1. 问题现象

用STM32CUBEIDE建立的STM32L031工程,在使能HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1);时,也即使能串口2的接收中断时,build project时报错 Region FLASH overflowed by xxx bytes。
在这里插入图片描述在这里插入图片描述

2. 不正确的解决方式

网上有一种介绍的方式,将工程目录下的编译脚本文件进行修改,打开ld文件
在这里插入图片描述
修改FLASH (rx)值为更大的值, 如36K
在这里插入图片描述
修改之后,build成功可以下载进芯片,但是程序跑不起来。STM32L031只有32K Flash空间,人为增加软件识别的空间大小,并不能解决问题。

3. 正确的解决方式

因为采用非中断的轮询(polling)方式接收串口数据成功,基本判断是编译优化对uart中断方式接收产生的代码过大。所以可进行编译优化的调整。

在STM32CUBEIDE的Project–Properties里,找到Optimization选项
在这里插入图片描述
将debug和release的编译优化,都选择Optimize for size
在这里插入图片描述
在这里插入图片描述
或者所有类型都采用Optimize for size
在这里插入图片描述
Apply后退出。代码里敲个空格,保存后重新build project,编译链接成功。下载到芯片,串口中断接收运行正常。

ST升级了STM32CUBEIDE版本后,菜单布局如发生变化,找到相应位置设置即可:
在这里插入图片描述

4. 注意事项

如果采用了空间节省的编译方式,某个原本运行正常的代码逻辑出现异常,则需要针对编译保护该部分代码的运行完整性,通过增加 __IO 在原来的变量定义之前, 实现volatile变量。
如原来的定义为:

uint32_t mv;
function mf(void)
{
  int x;
  ......    
}

修改为:

__IO uint32_t mv;
function mf(void)
{
  __IO int x;
  ......    
}

5. 编程方式调整

如果采用库函数编译出的版本正好超出了FLASH容量一点点,可以考虑采用资源节约主义编程方式,调整后有可能不更换更大容量芯片而实现FLASH资源够用,参考:《STM32/STM8资源节约主义编程方式》

如果是启用了官方浮点打印库而导致编译结果溢出于FLASH空间,可以采用非官方的浮点转字符串函数,参考:《STM32 UART串口printf函数应用及浮点打印代码空间节省 (HAL)》

-End-

  • 16
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PegasusYu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值