C STM32F103x_XL闪存组2保持忙碌状态

C 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,第二个内存库在我尝试写入它时就进入忙碌状态,然后它一直处于忙碌状态,直到我关闭电源。擦除工作正常,但写入失败。 我确实解锁了所有闪光灯,并确保所有时钟都已初始化以

我将STM32F103ZG与STM32F10xU StdPeriph库一起使用。我开始与Keil ARM-MDK一起开发该项目,但现在转到GCC。 到目前为止,转换过程相当顺利。我使用FLASH的最后一页作为配置页来存储特定于产品的参数。这是一个页面,显然位于银行2。在某些情况下,这些配置参数需要在运行时更新,但现在我已经转移到GCC,第二个内存库在我尝试写入它时就进入忙碌状态,然后它一直处于忙碌状态,直到我关闭电源。擦除工作正常,但写入失败。 我确实解锁了所有闪光灯,并确保所有时钟都已初始化以访问闪光灯。一些论坛上的其他帖子建议我的链接器文件有问题,但我使用的所有示例都没有区别

如果有人能告诉我我做错了什么,我将非常感激

谢谢

H


我设法解决了我的问题。 当我转到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位写入访问都将被破坏

因为我在这个阶段不需要优化,所以我将不使用它

任何关于如何正确更新这些函数以用于优化的建议都将不胜感激

享受


H

objdump对已编译的二进制文件有何评论?这些部分是什么,它们的地址,大小,属性?我认为你应该发布你用来编程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 = .);

 }