1.寫這個文章主要是介紹整理一下關于SWD協議,感覺網上對它的介紹不多。再就是自己進行一個學習記錄的總結。豐富一下網絡的資料。
正文:
首先,SWD協議是ARM內核調試器的一種通信協議。ST的單片機stm32103系列的調試端口可以是jtag或者是SWD的端口。今天主要說一下用一個單片機的IO口模擬swd協議來燒錄另一片單片機。主要參考文檔<<ARM?Debug Interface Architecture Specification ADIv5.0 to ADIv5.2 >>
SWD協議簡單來說可以說是另一種方式來配置單片機內部寄存器,通過它可以配置單片機內部幾乎所有的寄存器(不太嚴謹)。想用SWD協議和單片機進行通信首先必須了解DP,AP所相關寄存器。關于DP,AP所包含的寄存器的具體意義就自己慢慢看文檔理解。我說的主要是其中可能會出問題的地方:1.當用SWD協議進行通信的時候首先是發送jtag轉SWD接口的命令。2.就是關于協議的讀寫,我理解的是數據會在時鐘的下降沿的時候進行采樣(我這樣寫的程序沒有任何問題)。在上升沿的時候進行數據的翻轉。
讀協議:
我們可以看到協議先發送命令然后目標機回應數據,根據回應%20的值進行判斷是否準備好或者錯誤或者等待。接下來的就是可以讀取的數據。這個讀的協議沒什么問題。
寫協議:這是需要重點注意的地方
我當時寫數據的時候發現有時候寫的進去不會報錯,有的時候寫的數據會報錯。當時很是不解看示波器波形也都是沒什么問題。后來經過自己反復實驗在寫數據之后也就是校驗位之后再加一個周期的時鐘。后來發現文檔上最后竟然還有一個時鐘周期,當時沒有注意。這告訴我千萬不要忽略文檔上任何一個小的細節。一般來說像ARM這種大公司的官方文檔還是很可靠的。
%20 %20 %20 %20 當通信協議都沒有問題了,就可以通過通信協議修改單片機內部的寄存器了。我們可以看到每次讀寫的數據都是32位的數據,但是發現當想通過它來寫內部Flash的時候發現對flash的寫操作只能是半字(16位)的形式。此時就需要修改AP寄存器組的CSW寄存器SIZE位。以此改變傳輸的位。這里發現網上很多都沒有介紹。當可以燒寫flash的時候已經就可以制作一個離線下載器了。%20
%20 %20 %20 %20 %20 %20 %20關于SWD數據一級一級的進行傳遞的方式,看文檔一般都可以理解的。參考下圖:
|
新聞熱點
疑難解答