ROS stm32F4串列埠 DMA通訊

2021-10-13 15:31:27 字數 1605 閱讀 1707

本博文基於stm32f407,利用uart3傳送資料,並由uart3接收ros通過串列埠傳送的資料後由uart1傳送回ros。以下,主要針對於除錯過程中的問題的總結

傳送協議:01

2 …11

0xaa

0xadata

初始化:

mydma_config_inter

(dma1_stream3,dma_channel_4,

(u32)

&usart3->dr,

(u32)txbuffer,

txbuffersize,dma1_stream3_irqn, dma_dir_memorytoperipheral)

;

主函式使能uart3傳送

usart_dmacmd

(usart3, usart_dmareq_tx, enable)

;mydma_enable

(dma1_stream3, txbuffersize)

;

在**中要注意初始化傳送的大小應該和在主函式使能傳送的大小應該一致,如果不一致會出現資料錯位,導致ros在解析資料的過程中會把後續接收的資料過程中,直接認為資料不對而直接丟棄資料。

在除錯過程中,一開始只開啟了空閒中斷,但是一直出現ros第一次傳送的資料無法接收,而後續的資料可以接收到。後面才發現空閒中斷無法接收第一次傳送的資料。

解決方法:

初始化時開啟接收中斷,進入接收中斷後在開啟空閒中斷並關閉接收中斷

void

usart3_irqhandler

(void

)// 接收中斷if(

usart_getitstatus

(usart3, usart_it_rxne)

!= reset)

}

以下是接收資料後直接開啟uart1,並通過uart1傳送,並通過長度判斷來實現對不定長的資料的接收

void

dma1_stream1_irqhandler()

dma_clearflag

(dma1_stream1, dma_flag_tcif1|dma_flag_feif1|dma_flag_teif1|dma_flag_htif1|dma_flag_dmeif1)

;dma_setcurrdatacounter

(dma1_stream1, usart_rec_len)

;dma_cmd

(dma1_stream1, enable);}

}

while

(ros::ok(

))ros_info

("posx: [%f],posy: [%f],vx: [%f],vy.: [%f],angular_v: [%f],pose_angular: [%f]"

, posx.fvalue,posy.fvalue,vx.fvalue,vy.fvalue,angular_v.fvalue,pose_angular.fvalue);}

ros::

spinonce()

;}}

後續會公開**,請期待我的**分享,謝謝!

STM32 串列埠DMA(一)

今天調usart,資料在晶元內部用dma傳到串列埠快取,發現dma真的很好,很快,而且不消耗系統資源。只是在傳輸完的時候中斷的標誌置位。下面解釋一下程式。void dma configuration void 再弄幾個重要的語句。這裡是開始dma傳輸前的一些準備工作,將usart1模組設定成dma方...

STM32F103 串列埠 DMA中斷實現資料收發

02 stm32f103 串列埠 dma中斷實現資料收發 講了 串列埠 dma空閒中斷實現不定長資料收發的功能,除了利用空閒中斷實現資料收發,還可以利用dma的中斷實現資料的收發,不同之處是後者不能實現不定長資料的接收,本文講解dma中斷的方式實現資料的收發。使用dma的中斷時,無需配置串列埠的中斷...

STM32F103 串列埠DMA 庫函式程式設計

串列埠dma實質上就是在dma控制器的控制下將記憶體中的資料 比如我們定義的乙個陣列 乙個位元組乙個位元組複製到,串列埠資料暫存器,然後傳送出去,傳送過程由dma控制,不用我們 控制。而對於傳統串列埠傳送,要傳送字串一般是要用迴圈語句,而用dma只需要配置好相關暫存器就可以自動傳送字串。dma時鐘和...