C STM32F103x_XL闪存组2保持忙碌状态
我将STM32F103ZG与STM32F10xU StdPeriph库一起使用。我开始与Keil ARM-MDK一起开发该项目,但现在转到GCC。 到目前为止,转换过程相当顺利。我使用FLASH的最后一页作为配置页来存储特定于产品的参数。这是一个页面,显然位于银行2。在某些情况下,这些配置参数需要在运行时更新,但现在我已经转移到GCC,第二个内存库在我尝试写入它时就进入忙碌状态,然后它一直处于忙碌状态,直到我关闭电源。擦除工作正常,但写入失败。 我确实解锁了所有闪光灯,并确保所有时钟都已初始化以访问闪光灯。一些论坛上的其他帖子建议我的链接器文件有问题,但我使用的所有示例都没有区别 如果有人能告诉我我做错了什么,我将非常感激 谢谢 HC STM32F103x_XL闪存组2保持忙碌状态,c,gcc,embedded,stm32,flash-memory,C,Gcc,Embedded,Stm32,Flash Memory,我将STM32F103ZG与STM32F10xU StdPeriph库一起使用。我开始与Keil ARM-MDK一起开发该项目,但现在转到GCC。 到目前为止,转换过程相当顺利。我使用FLASH的最后一页作为配置页来存储特定于产品的参数。这是一个页面,显然位于银行2。在某些情况下,这些配置参数需要在运行时更新,但现在我已经转移到GCC,第二个内存库在我尝试写入它时就进入忙碌状态,然后它一直处于忙碌状态,直到我关闭电源。擦除工作正常,但写入失败。 我确实解锁了所有闪光灯,并确保所有时钟都已初始化以
我设法解决了我的问题。 当我转到GCC时,我显然必须重新编译STM32F10x外围库,并将优化设置设为-O3。最初不允许这样做,因为需要更改_STREXH和_STREXL核心函数,以便为所选优化构建。我在论坛上找到了以下解决方案: 更改ASM volatile(“strexh%0,%2,[%1]”:“=r”(结果):“r”(地址),“r”(值));到 __ASM volatile(“strexh%0、%2、[%1]”:“=&r”(结果):“r”(地址),“r”(值)) 与此解决方案相关的一些注释指定此解决方案不会导致任何错误 当我使用原始代码并将优化设置为-O0时,一切正常。对片上闪存接口的访问是16位的,因此,如果您破坏了上述功能,所有16位写入访问都将被破坏 因为我在这个阶段不需要优化,所以我将不使用它 任何关于如何正确更新这些函数以用于优化的建议都将不胜感激 享受
Hobjdump对已编译的二进制文件有何评论?这些部分是什么,它们的地址,大小,属性?我认为你应该发布你用来编程flash的代码。另外,这段代码是否在Keil中工作,而现在在GCC中不工作,或者这段新代码在您使用Keil时不在代码库中?这段代码与Keil上使用的代码完全相同。只是在GCC中重建了它。我保持编译器和链接器选项相同(尽可能地保持,因为Keil有一些GCC中不可用的特定选项)。根据ST提供的STM32外设库,该代码仅调用解锁、擦除、读取和写入函数。
_Min_Heap_Size = 0x800; /* required amount of heap */
_Min_Stack_Size = 0x800; /* required amount of stack */
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 0x10000
FLASH_CFG (rx) : ORIGIN = 0x080FF800, LENGTH = 0x80
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x18000
}
SECTIONS
{
.text :
{
_stext = .; /* Provide the name for the start of this section */
CREATE_OBJECT_SYMBOLS
KEEP(*(.vectors))
*(.text)
*(.text.*)
. = ALIGN(4); /* Align the start of the rodata part */
*(.rodata)
*(.rodata.*)
*(.glue_7)
*(.glue_7t)
. = ALIGN(4); /* Align the end of the section */
} > FLASH
_etext = .; /* Provide the name for the end of this section */
.data : AT (_etext)
{
. = ALIGN(4); /* Align the start of the section */
_sdata = .; /* Provide the name for the start of this section */
*(.data)
*(.data.*)
. = ALIGN(4); /* Align the start of the fastrun part */
*(.fastrun)
*(.fastrun.*)
. = ALIGN(4); /* Align the end of the section */
} > RAM
_edata = .; /* Provide the name for the end of this section */
.bss :
{
. = ALIGN(4); /* Align the start of the section */
_sbss = .; /* Provide the name for the start of this section */
*(.bss)
*(.bss.*)
. = ALIGN(4); /* Align the end of the section */
} > RAM
_ebss = .; /* Provide the name for the end of this section */
._user_heap_stack :
{
. = ALIGN(4);
. = . + _Min_Heap_Size;
. = . + _Min_Stack_Size;
. = ALIGN(4);
} >RAM
_estack = ORIGIN(RAM) + LENGTH(RAM);
.static_cfg :
{
. = ALIGN(4);
*(.static_cfg)
*(.static_cfg.*)
. = ALIGN(4);
} > FLASH_CFG
_estatic_cfg = .;
_end = .;
PROVIDE (end = .);
}