SWIM介面及STM8燒錄過程

2022-03-16 09:57:59 字數 2827 閱讀 7038

swim介面只需要一根傳輸線,即可完成雙向的傳輸。傳輸過程,都是由主控制端(host)發起,裝置端然後做出反應。host端需要在乙個匯流排上實現讀和寫,那就是說必須要同時接乙個輸出io和乙個輸入io(也可以用同乙個,開漏的情況下,io可以同時讀寫),且輸出io必須設計成開漏,匯流排上掛接上拉電阻,以便隨時交出控制權。硬體連線如下:

上圖swim_in為輸入io,swim為輸出io。

swim協議使用歸零碼,且支援兩種速率。

高速模式

低速模式

這兩種模式都是使用8m的clock同步(上圖中的箭頭)。高速模式下,2個低電平加8個高電平表示1;8個低電平加2個高電平表示0。低速模式下,2個低電平加20個高電平表示1;20個低電平加2個高電平表示0。

程式的第一步就是要實現這兩種速率的編碼輸出。通常情況下,使用io口加延時即可達到目的。只不過,延時時間需要使用示波器觀測,然後多次調節才能比較準。另外,在翻轉io的過程中,注意要關掉所有中斷,避免被打斷。

上圖為host到裝置端的通訊過程,主要由命令和資料組成。命令佔6個bit,資料佔11個bit。

- command。黑體部分為command,由5個bit組成。第乙個bit固定為0,稱之為header,b0~b2為預定義的命令。pb為b0~b2異或之後的值,ack為裝置返回的電平。下圖為預定義的三種命令:

- data。data也是由固定的0的header,加上8個bit的資料,加上資料異或校驗,然後裝置返回的ack組成。下圖是實際通訊過程的截圖:

從裝置到host的通訊格式也是如此,但header就由0變為1。然後ack由host傳送。

程式的第二步,就需要實現這個通訊協議。即實現預定義的三種命令的函式,以及傳送1個位元組資料的函式。

有了上述的函式,就可以實現乙個寫的操作。乙個完整的寫操作由一下步驟組成:

- wotf,寫命令,即010。

- n,需要傳送的資料長度,以位元組為單位。

- 三個位元組表示的位址。

- n個位元組的資料。

下圖為乙個實際的寫操作過程:

程式的第三步就是需要實現這乙個功能。

這是乙個可選功能,如果不需要驗證的話,可以不實現。實現過程和寫操作是一樣的。

- rotf,讀命令,即001

- n,要讀的資料長度,單位為位元組

- 三個位元組表示位址

- 裝置返回的n個位元組的資料。

需要注意的是,收到資料後,程式需要盡快校驗資料正確與否,並返回ack(邏輯1)或者nack(邏輯0)。下圖為實際的讀操作過程:

復位操作有兩種,第一種為傳送復位命令,即傳送srst。第二種為拉低 匯流排16us以上。

下圖為傳送srst

下圖為拉低匯流排

這兩種復位操作有細微的區別。詳細請參考手冊《um4070》

在上電之後,swim匯流排是沒有被啟用的,需要輸入特定的序列才能啟用。序列如下:

詳細的描述請參考手冊。這裡乙個函式就實現了,挺簡單。

啟用之後,還不能對所有的暫存器進行讀寫,必須配置swim_csr暫存器

實現上面8步之後,整個swim介面及其通訊就都打通了,程式中應該實現了以下函式:

1. write()。這個函式實現swim寫命令和寫單個位元組的功能。

2. swim_write。這個函式實現了swim往某個暫存器寫若干資料的功能。

3. swim_read。前期可以不實現該功能。

4. swim_active()。這個函式實現了啟用序列。

5. swim_rst(),swim_h_rst()。這兩個函式實現兩種復位功能。

官方手冊上,提供了三種flash操作的方式。

- 位元組程式設計

- 字程式設計

- 塊程式設計

並提供了兩種使用swim燒錄的方法:

我這裡抓取了其資料之後,分析部分過程如下:

- 啟用swim

- 配置若干暫存器

- 使能flash讀寫

- 等待驅動將資料寫入flash

- 繼續下一步寫入

有了上述的實現,以及資料。基本就可以完成整個的程式設計。整個程式需要實現的功能如下,名字即功能。最後的介面為download()。

《um0470》,介紹swim介面

《pm0051》,介紹stm8 flash程式設計相關步驟

《rm0061》,接收stm8 flash暫存器相關

STM8 開發備忘

前段時間寫了一點stm8的 現在總結一下。iar 指的是iar embedded workbench。又稱為ewstm8。我是用的是ewstm8 2105 autorun.exe。破解後會報乙個庫載入失敗。沒有關係可以繼續用。1.檢視晶元型號 專案右鍵 選項 目標,我的是stm8l151g6。可以根...

STM8擦除方法

使用stvp燒錄stm8,擦除選項一直為灰 擦除方法 第一步 在option byte裡面,把rop選項設為read out protection on,然後燒錄 依次選擇program,current tab 第二步 繼續在option byte裡面,把rop選項設為read out protec...

stm8使用atomthreads專案

error lc036 no block or place matches the pattern ro code section text in atomport asm iar.o section text code section near func.text code 編譯成功 但發現iar...