SWIM接口及STM8燒錄過程


1. 硬件連接

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

 

 

 

上圖SWIM_IN為輸入IO,SWIM為輸出IO。

 

2. 編碼格式

SWIM協議使用歸零碼,且支持兩種速率。

 

 

高速模式

 

 

低速模式

 

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

 

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

 

3. 通訊協議

 

 

上圖為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個字節數據的函數。

 

4. 寫操作

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

 

 

- WOTF,寫命令,即010。

- N,需要發送的數據長度,以字節為單位。

- 三個字節表示的地址。

- N個字節的數據。

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

 

 

 

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

 

5. 讀操作

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

 

 

- ROTF,讀命令,即001

- N,要讀的數據長度,單位為字節

- 三個字節表示地址

- 設備返回的N個字節的數據。

 

需要注意的是,收到數據后,程序需要盡快校驗數據正確與否,並返回ACK(邏輯1)或者NACK(邏輯0)。下圖為實際的讀操作過程:

 

 

6. 復位操作

復位操作有兩種,第一種為發送復位命令,即發送SRST。第二種為拉低 總線16us以上。

下圖為發送SRST

 

 

下圖為拉低總線

 

 

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

 

7. 輸入激活序列

在上電之后,SWIM總線是沒有被激活的,需要輸入特定的序列才能激活。序列如下:

 

 

詳細的描述請參考手冊。這里一個函數就實現了,挺簡單。

 

 

 

8. 配置寄存器,激活SWIM功能

激活之后,還不能對所有的寄存器進行讀寫,必須配置SWIM_CSR寄存器

 

 

 

 

實現上面8步之后,整個SWIM接口及其通訊就都打通了,程序中應該實現了以下函數:

1. Write()。這個函數實現SWIM寫命令和寫單個字節的功能。

2. SWIM_Write。這個函數實現了SWIM往某個寄存器寫若干數據的功能。

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

4. SWIM_Active()。這個函數實現了激活序列。

5. SWIM_RST(),SWIM_H_RST()。這兩個函數實現兩種復位功能。

 

9. STM8 Flash燒錄預備知識

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

- 字節編程

- 字編程

- 塊編程

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

 

 

第一種方法,在某些型號的MCU上,只能支持字節操作。第二種方法,所有型號都支持,但需要先下載一個ICP驅動到RAM中。這兩種方法,官方都沒有提供詳細的文檔描述。因此,只能先使用邏輯分析儀分析STLink工具的下載過程,然后仿照其方法進行操作。

 

10. 邏輯分析儀分析

一般的邏輯分析儀都沒有SWIM協議,因此買的時候注意要買開放接口的邏輯分析儀,然后自己編寫。編寫的時候沒必要考慮異常情況,盡量簡單抓出所有下載過程即可。一般半天即可搞定。

 

我這里抓取了其數據之后,分析部分過程如下:

 

 

 

STLink下載是使用官方描述的第二種方法,即先下載一個驅動到RAM中,然后不停的將整塊數據送到RAM中的某特定地址,然后等待驅動將firmware數據寫入到flash中。簡單描述一下過程如下:

- 激活SWIM

- 配置若干寄存器

- 使能flash讀寫

- 下載驅動到RAM中

- 按照協議下載firmware數據到特定地址

- 等待驅動將數據寫入flash

- 繼續下一步寫入

 

11. 寫代碼

有了上述的實現,以及資料。基本就可以完成整個的程序設計。整個程序需要實現的功能如下,名字即功能。最后的接口為Download()。

 

 

 

12. 參考資料

《UM0470》,介紹SWIM接口

《PM0051》,介紹STM8 flash編程相關步驟

《RM0061》,接收STM8 flash寄存器相關

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM