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-