三 stm32之串列埠通訊DMA傳輸完成中斷

2022-08-01 09:36:11 字數 2348 閱讀 8909

一、dma功能簡介

首先嘮叨一下dma的基本概念,dma的出現大大減輕了cpu的工作量。在硬體系統中,主要由cpu(核心)、外設、記憶體(sram)、匯流排等結構組成,資料經常要在記憶體和外設之間,外設和外設之間轉移。例如:cpu需要處理從外設採集回來的資料,cpu需要先將資料從adc外設的暫存器讀取到記憶體中(變數)去,然後進行運算處理,這是一般的解決方法。cpu的資源是非常寶貴的,我們可以設法把轉移的工作交給其他部件來完成,cpu把更多的資源用於資料運算和中斷響應上,如此dma便登場了。dma正是為cpu分擔資料轉移工作,因為dma的存在,cpu才被解放出來,它可以在資料轉移的同時進行資料運算,相應中斷,大大提高了效率。

二、dma的主要特性

三、dma中斷特性

四、dma之串列埠通訊

我們實現乙個簡單的功能,在dma中處理串列埠通訊,把資料轉移的工作交給dma,dma把資料從記憶體(陣列)到外設(串列埠)的轉移,在main函式中不斷進行閃燈操作,這樣我們可以看到dma在工作的時候cpu也在工作。非常有必要複習一下dma的對應關係,我們知道stm32總共有2個dma控制器(dma1有7個通道,dma2有5個通道),每個通道專門用來管理來自乙個或多個外設對儲存器訪問的請求,還有乙個仲裁器來協調dma請求的優先順序(優先順序分:很高、高、中等、低),這可不是隨便對應的。

1、led初始化程式如下:

void led_gpio_config(void)

這個地方地方沒什麼要注意的,唯一要注意的就是輸入輸出模式,我們按需求這樣配就好了。

2、串列埠初始化

void usart3_config(void)

3、dma初始化

void usart3_dma_config(void)

在這裡我們要注意以下幾點:

(1)dma_initstructure.dma_peripheralbaseaddr = usart3_dr_base;這裡對應usart資料暫存器位址,這個位址我們是這樣定義的:#define usart3_dr_base  0x40004804,這個值是怎麼算出來的呢?我們可以檢視stm32儲存器對映表:

usart3的起始位址是0x40004800,我們檢視stm32串列埠資料暫存器偏移位址為0x04

因此我們可以計算到usart3資料暫存器位址為0x40004804

(2)我們資料傳輸方向記憶體(變數)到外設(串列埠),所以dma方向為記憶體到外設

(3)dma傳輸模式有兩種:dma_mode_normal(普通模式),dma只傳輸一次;dma_mode_circular(迴圈模式),dma迴圈傳輸,比如在ad採集時要配置成迴圈模式。

4、主函式

int main(void)

注意我們在這裡開啟了dma傳輸完成中斷。

(2)nvic初始化

static void nvic_configuration(void)

(3)中斷處理程式

我們在stm32f10x_it.c中編寫我們的中斷處理程式:

void dma1_channel2_irqhandler(void)

}

我們也可以這樣寫中斷處理程式:

void dma1_channel2_irqhandler(void)

}

這兩種寫法都行,我們在庫開發文件可以檢視。都代表dma的通道2傳輸完成中斷。  

(4)主函式

int main(void)

}

通過測試,我發現led燈並沒有像試想的那樣每次傳送完成後便觸發一次中斷,然後燈會間隔閃爍,而實際是第一次傳輸完成後燈點亮,之後就一直保持亮的狀態。剛開始我還以為dma只會觸發第一次中斷,後來仔細分析後才發現了問題。正確的**應該如下。

void dma1_channel2_irqhandler(void

)}

在這裡n是乙個區域性變數,如果不定義成靜態變數,每次出中斷時後n所佔的記憶體(棧)便會釋放,這樣再次進入後n還是會初始化為0.與我們要達到的效果不符。因此,在這裡我們把它指定為靜態變數,那麼記憶體就不會釋放,它會保持上一次的的值,修改之後達到了效果,每次傳輸完成3000個位元組後燈的狀態就會改變一次。

STM32之串列埠通訊

一 rs232通訊協議 1 概念 個人計算機上的通訊介面之一,由電子工業協會 electronic industries association,eia 所制定的非同步傳輸標準介面。2 電氣特性 邏輯1 mark 3v 15v 邏輯0 space 3 15v 3 介面 實現全雙工非同步通訊只需要三根...

stm32之串列埠通訊

1 首先對tx和rx進行配置 void init gpio void 2 對串列埠進行配置 3 對總中斷進行配置 4 傳送中斷 void usart1 it void 5 傳送位元組和字串 void usart sendbyte usart typedef pusartx,uint8 t ch vo...

stm32之串列埠DMA傳送與接收

硬體環境 stm32f103zet6戰艦開發板 軟體環境 mdk5 串列埠除錯助手 概念解析 dma direct memory access 直接儲存器訪問 dma作用 用來傳輸資料的,在 傳輸呢,可以在外設和儲存器之間,也可以在儲存器和儲存器之間。dma傳輸方式無需cpu直接控制傳輸,能使cpu...