2017-06-14 1798 views
1

我試圖在STM32L4芯片的存儲器閃存中寫入數據。這將在編程上下文中完成,其中我使用C調用ST-Link實用程序命令行在STM32的OTP中寫入64位數據

所以這裏是閃存的一個例子:

   0    4    8    C 
0x1FFF7000 FFFFFFFF  FFFFFFFF  FFFFFFFF  FFFFFFFF 

到目前爲止,我已經能夠只寫32位64位數據空間

   0    4    8    C 
0x1FFF7000 AAAAAAAF  FFFFFFFF  BBBCCCDD  FFFFFFFF 

寫入時在第一個32位上,第二個32位被鎖定。因此,考慮到存儲在以前的狀態,下面的文字是不允許的:

   0    4    8    C 
0x1FFF7000 AAAAAAAF  00000001  BBBCCCDD  FFFFFFFF 
          ^^       ^^ 
         Not allowed      Locked 

我只能在64位數據空間寫數據,這是由大小32位的限制,一次。 我發現這很奇特,因爲沒有理由這樣處理內存。

編輯:這是唯一正確的,因爲我想在OTP寫的,這似乎是正常工作時,我寫的其他地方

第一個可能的解決方案

answer上一個問題我的這個報價:

2級:沒有調試
在此級別,保證級別1得到保證。 此外,Cortex®-M4調試端口,從RAM啓動(引導RAM 模式)和從系統存儲器(引導加載程序模式)啓動沒有更多的可用的 。在用戶執行模式(啓動FLASH模式)下,所有操作 被允許在閃存主內存上。 ...
級別2 根本無法刪除:這是一個不可逆轉的操作。

有什麼辦法,啓用2級將讓我在64位的內存空間寫32位兩次?

第二個可能的解決方案

展望芯片的documentation,我已經找到了閃存編程序列(102頁):

  1. 檢查沒有Flash主存儲器的操作正在進行由檢查Flash狀態寄存器(FLASH_SR)中的BSY位。
  2. 檢查並清除由於之前的節目所有的錯誤編程標誌。如果不是,則設置PGSERR。
  3. 設置在閃存控制寄存器(FLASH_CR)的PG位。
  4. 在主內存塊或OTP區域內的所需內存地址執行數據寫入操作。只有雙字可以編程爲 。 - 與雙 字對齊的地址寫第一個字 - 寫第二個字
  5. 等到BSY位在寄存器FLASH_SR清除。
  6. 檢查在FLASH_SR寄存器中設置了EOP標誌(表示編程操作成功),並通過軟件清除。
  7. 如果沒有更多的編程請求,清除FLASH_SR寄存器中的PG位。

我一直無法理解真正的那是什麼PG步驟位但是當我試圖將其設置,寫作是不允許的。

我使用ST-Link Utility進行寫入,命令-w32根據手冊應該允許我在寄存器上寫入。

-w32也支持寫入閃存,OTP,SRAM和R/W寄存器

此外,步似乎來形容我對抗的確切問題,但我可以」不瞭解它提出的解決方案。

有關如何解決任何解決方案的任何提示將是一個保佑。此外,由於我對嵌入式低級別詞彙表不太瞭解,請不要猶豫編輯我的問題以使其更清楚。

回答

5

你觀察此行爲的原因是下述(從STM32L4x5 STM32L4x6 RM):

1K字節(128雙字)OTP(一次性可編程)的用戶 數據字節。 OTP區域僅在Bank 1中可用。 OTP數據不能被 擦除,並且只能寫入一次。如果只有一個位爲0,則 整個雙字不能再被寫,甚至與價值 0×0000 0000 0000 0000

這意味着,OTP區域組織爲64位值,並寫入到它應該是「原子的」,這意味着你一次寫入所有64位。在64位中的任何一位設置0會鎖定整個雙字以進一步寫入。在你的例子中,這意味着,如果你嘗試使用-w8以8位批量寫入該值,那麼你只能在給定的雙字(64位)中寫出8位的第一個字節。

反過來,這意味着即使ST-Link Utility手冊指出-w32允許對OTP區域進行編程,它也只意味着可以指定OTP作爲要寫入的目標地址,而不一定是您將要能夠正確編程每個雙字的所有位。這看起來像是一個疏忽,儘管對此你沒有太多的辦法。

我會親自嘗試將使用-P命令將其編程:

Description: Loads binary, Intel Hex or Motorola S-record file into device memory without 
verification. For hex and srec format, the address is relevant. 
Syntax: -P <File_Path> [<Address>] 
Examples: -P C:\file.srec 
-P C:\file.bin 0x08002000 
-P C:\file.hex 

我沒有測試它自己,但現在對我來說,似乎是可以讓你唯一的可能性「原子地」通過ST-Link將64位值編程爲OTP。

+0

它工作得很好,非常感謝! – Badda