0

我正在使用带有 STM32F10x_StdPeriph 库的 STM32F103ZG。我开始使用 Keil ARM-MDK 开发该项目,但现在转移到了 GCC。到目前为止,切换过程非常顺利。我使用FLASH的最后一页作为配置页来存储产品的具体参数。这个页面显然位于 bank 2。在某些情况下,这些配置参数需要在运行时更新,但是现在我已经转移到 GCC,当我尝试写入时,第二个 memory bank 进入忙碌状态然后它一直很忙,直到我重新启动电源。擦除工作正常,但写入失败。我确实解锁了所有 FLASH 并确保所有时钟都已初始化以访问 FLASH。几个论坛上的其他一些帖子表明我的链接器文件存在问题,但我使用的所有示例都没有区别。

如果有人能告诉我我做错了什么,我将不胜感激。

谢谢,

H

_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 = .);

 } 
4

1 回答 1

0

好吧,我设法解决了我的问题。当我转到 GCC 时,我显然必须重新编译 STM32F10x 外设库,并将优化设置保留为 -O3。这最初是不允许的,因为需要更改 __STREXH 和 __STREXL 核心函数才能构建所选优化。我在论坛上找到了以下解决方案:

改变 __ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); 到 __ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );

与此解决方案相关的一些评论指出此解决方案不会导致任何错误。

当我使用原始代码并将优化设置为 -O0 时,一切正常。片上 FLASH 接口的访问是 16 位的,因此如果你搞砸了上面提到的功能,所有的 16 位写访问都会搞砸。

由于我现阶段不需要优化,所以我将保持没有它。

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

享受,

H

于 2012-09-28T13:36:13.680 回答