0

STM32F10x_StdPeriph ライブラリで STM32F103ZG を使用しています。Keil ARM-MDK を使用してプロジェクトの開発を開始しましたが、現在は GCC に移行しています。これまでのところ、切り替えは非常にスムーズに進んでいます。FLASH の最後のページを構成ページとして使用して、製品固有のパラメーターを保存します。これは明らかにバンク 2 にあるページです。場合によっては、これらの構成パラメーターを実行時に更新する必要がありますが、GCC に移行したので、書き込みを試みるとすぐに 2 番目のメモリ バンクがビジー状態になります。それから、電源を入れ直すまでビジーのままです。消去は正常に動作しますが、書き込みは失敗します。すべての 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コア関数を変更する必要があったため、これは最初は許可されませんでした。フォーラムで次の解決策を見つけました。

change __ASM volatile( "strexh%0、%2、[%1]": "= r"(結果): "r"(addr)、 "r"(値)); to __ASM volatile( "strexh%0、%2、[%1]": "=&r"(結果): "r"(addr)、 "r"(値));

このソリューションに関連するいくつかのコメントは、このソリューションがエラーを引き起こさないことを指定しました。

元のコードを使用して最適化を-O0に設定すると、すべてが正常に機能します。オンチップFLASHインターフェイスへのアクセスは16ビットであるため、上記の機能を台無しにすると、すべての16ビット書き込みアクセスが台無しになります。

この段階では最適化は必要ないので、最適化を行わないでおきます。

最適化で使用するためにこれらの関数を正しく更新する方法についての提案をいただければ幸いです。

楽しみ、

H

于 2012-09-28T13:36:13.680 に答える