STM32F103 CAN中斷傳送功能的再次討論

2022-05-14 07:52:19 字數 845 閱讀 2052

**:  

我在之前的一篇部落格日誌中,寫過關於can傳送功能如何使用,但是當時由於時間匆忙,趕專案,按照對usart中斷傳送的理解,在資料成功傳送出去的情況下,寫了那篇誤人子弟的日誌,在這裡向大家道歉,實在不好意思,現在我重新闡述下can中斷傳送原理。

1、usart傳送中斷與can傳送中斷的區別

usart傳送中斷,是因為傳送緩衝區為空,can傳送中斷的中斷源是成功(或者abort)傳送一次,正是這種區別誤導了我。

2、我之前的can中斷傳送的處理方法是,將資料填充到傳送緩衝區,由can中斷提取進行傳送,為了啟動can的傳送,我寫了一句話can->stxmailbox[0].tir |= 1;就是啟動傳送,我以為在這以後can執行的動作是:產生中斷,將資料從傳送緩衝區提取,傳送,進入完成中斷,判斷有無資料,沒有就關閉中斷,否則繼續傳送。但是can實際執行的動作是:傳送,進入傳送完成中斷,提取資料,傳送,進入完成中斷,判斷有無資料,沒有就關閉中斷,否則繼續傳送。由此可見,can實際上是多傳送了一次資料,這個資料就是當前can暫存器裡面的資料,而這次傳送,應用層和can中斷程式裡都沒有參與,所以是不被發現的,這也據解釋了為什麼對方收到的資料比我傳送的資料多,在a傳送大量資料的時候,b做應答,但是每次都請求傳送,由於速度快,b每次實際傳送了同樣的資料給a,a所以收到 很多相同的資料。

3、解決辦法,就是應用層呼叫can傳送資料時,將資料填充到緩衝區,使能中斷,但是不請求傳送,因為使能中斷,在中斷裡面傳送,傳送完畢後關閉中斷。這裡有兩點需要注意:1是第一次的時候沒有所謂的傳送完成中斷,所以程式開始要產生乙個傳送完成中斷,以啟動傳送中斷,第二就是為了使用中斷傳送,在傳送中斷函式裡,要判斷當前是否有資料傳送,有的話可以清除中斷標誌,沒有的話只能關閉中斷,不能清除中斷,否則下次據沒法傳送了。

stm32f103can匯流排過濾器配置

can過濾器的配置 f103 hal1.8 系列 can的過濾器的配置是對can接收到的報文進行過濾的配置,在stm32晶元中,可以對can的報文進行過濾,從而省略cpu的處理過程。can的過濾模式 f103中為應用程式提供了14個位寬可變 可配置的過濾器組,每個過濾器組由2個32位暫存器,can ...

STM32F103 CAN通訊波特率的計算方法

如果主機與從機,波特率不一致,很難正常的通訊。函式名 can mode config 描述 can的模式 配置 輸入 無 輸出 無 呼叫 內部呼叫 static void can mode config void else endif can init can1,can initstructure ...

stm32f103外部中斷

void extix init void 外部中斷0服務程式 void exti9 5 irqhandler void 這是簡單的外部中斷的配置,pc7作為中斷輸入 上面補充io口的初始化 gpio initstructure.gpio mode gpio mode ipu pc6配置為快充指示 1...