0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

中斷方式和DMA方式有什么不同

嵌入式應(yīng)用開發(fā) ? 來源:嵌入式應(yīng)用開發(fā) ? 作者:嵌入式應(yīng)用開發(fā) ? 2022-06-10 11:44 ? 次閱讀

1、中斷方式是在數(shù)據(jù)緩沖寄存區(qū)滿后,發(fā)中斷請求,CPU進行中斷處理。

2、DMA方式則是以數(shù)據(jù)塊為單位傳輸?shù)?,在所要求傳送的?shù)據(jù)塊全部傳送結(jié)束時要求CPU進行中斷處理,這樣大大減少CPU進行中斷處理的次數(shù)。 DMA方式不需CPU干預(yù)傳送操作 ,不占用CPU任何資源, 整個數(shù)據(jù)傳輸操作在一個稱為"DMA控制器"的控制下進行的。CPU除了在數(shù)據(jù)傳輸開始和結(jié)束時做一點處理外,在傳輸過程中CPU可以進行其他的工作。這樣,在大部分時間里,CPU和輸入輸出都處于并行操作。因此,使整個計算機系統(tǒng)的效率大大提高。 中斷方式是程序切換,每次操作需要保護和恢復(fù)現(xiàn)場,中斷次數(shù)多,CPU需要花較多的時間處理中斷,中斷次數(shù)多也會導致數(shù)據(jù)丟失。 但是DMA是必須利用中斷的,否則CPU無法得到數(shù)據(jù)已經(jīng)傳輸結(jié)束,當數(shù)據(jù)傳輸開始結(jié)束的時候,需要給CPU一個中斷信號,CPU進行處理.這個就大大的節(jié)約了CPU的資源。

3、中斷方式的數(shù)據(jù)傳送方向是由設(shè)備到CPU再到內(nèi)存,或者相反。

DMA方式的數(shù)據(jù)傳送則是將所傳輸?shù)臄?shù)據(jù)由設(shè)備直接送入內(nèi)存,或是由內(nèi)存直接送到設(shè)備。

可以實現(xiàn)DMA控制的接口pYYBAGKirlaAGRKrAALiWqpP6fk519.png
pYYBAGKivamAI3nzAAIk_RBMy5w859.png

代碼實現(xiàn) :

uint8_t SendBuff[SENDBUFF_SIZE];
uint8_t ReceiveBuff[RXBUFF_SIZE];
/**
  * @brief  USART1 TX DMA 配置,內(nèi)存到內(nèi)存
  * @param  無
  * @retval 無
  */
void DMA_Mem2Mem_Config(void)
{
        DMA_InitTypeDef DMA_InitStructure;
    
        /*開啟DMA時鐘*/
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);    

        /*設(shè)置DMA源地址*/
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SendBuff;

        /*設(shè)置DMA目的地址*/
        DMA_InitStructure.DMA_PeripheralBaseAddr =  (uint32_t)ReceiveBuff;       

        /*方向:從內(nèi)存SendBuff到內(nèi)存ReceiveBuff*/        
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;    

        /*傳輸大小DMA_BufferSize=SENDBUFF_SIZE*/    
        DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;

        /*ReceiveBuff地址自增*/      
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable; 

        /*SENDBUFF_SIZE地址自增*/
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;    

        /*ReceiveBuff數(shù)據(jù)單位*/    
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

        /*SENDBUFF_SIZE數(shù)據(jù)單位*/
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;     

        /*DMA模式:正常模式*/
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;

        /*優(yōu)先級:中*/    
        DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;  

        /*使能內(nèi)存到內(nèi)存的傳輸    */
        DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;

        /*配置DMA1的4通道*/           
        DMA_Init(DMA1_Channel4, &DMA_InitStructure);        
        
        /*失能DMA1的4通道,一旦使能就開始傳輸*/
        DMA_Cmd (DMA1_Channel4,DISABLE); 
}

DMA 中斷配置:

/**
  * @brief  DMA 中斷配置
  * @param  無
  * @retval 無
  */
void DMA_NVIC_Configuration(void)
{                                                                      
    NVIC_InitTypeDef NVIC_InitStructure;            
    
    /* 配置中斷源 */
    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);    

    /* 配置DMA發(fā)送完成后產(chǎn)生中斷 */            
    DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);
}

啟動傳輸:

DMA_Cmd (DMA1_Channel4,ENABLE); 

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10778

    瀏覽量

    210484
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    894

    瀏覽量

    41323
  • dma
    dma
    +關(guān)注

    關(guān)注

    3

    文章

    555

    瀏覽量

    100235
收藏 人收藏

    評論

    相關(guān)推薦

    求助關(guān)于DAQmx的中斷傳輸方式的例程

    本人接觸LABVIEW才一周的時間,需要做個關(guān)于數(shù)據(jù)采集編碼器脈沖測速的程序,T法。需要對脈沖的每個上升沿硬件觸發(fā)中斷??戳艘恍┨雍?,知道DAQmx的數(shù)據(jù)傳輸方式分為DMA和IRQ(中斷
    發(fā)表于 05-15 10:31

    STM32 DMA方式中斷方式查詢的區(qū)別 精選資料推薦

    CPU控制完成,如CPU程序查詢或中斷方式。利用中斷進行數(shù)據(jù)傳送,可以大大提高CPU的利用率。 2:中斷傳送是由CPU通過中斷服務(wù)程序來傳送
    發(fā)表于 08-16 08:41

    中斷和非DMA方式

    中斷和非DMA方式可以用于特殊場景,比如其它外設(shè)占據(jù)DMA負擔比較重而CPU又比較清閑的時候。1. STM32F429的AD轉(zhuǎn)換最高12bit12位分辨率意味著我們采集電壓的精度可以
    發(fā)表于 08-17 08:26

    請問stm32f407 adc的dma中斷方式是什么?

    請問stm32f407 adc的dma中斷方式是什么?
    發(fā)表于 11-16 06:49

    請問STM32 DMA方式中斷方式查詢之間什么區(qū)別?

    請問STM32 DMA方式中斷方式查詢之間什么區(qū)別?
    發(fā)表于 11-16 08:10

    中斷和非DMA方式可以用于哪些特殊場景?

    中斷和非DMA方式可以用于哪些特殊場景?
    發(fā)表于 11-18 07:16

    DMA通信編程與STM32串口中斷方式是什么

    目錄DMA通信原理DMA的基本介紹DMA工作原理STM32的DMA結(jié)構(gòu)DMA的主要特性DMA寄存
    發(fā)表于 12-10 06:04

    怎樣使用IDLE中斷+DMA接收的方式接收數(shù)據(jù)呢

    怎樣使用IDLE中斷+DMA接收的方式接收數(shù)據(jù)呢?怎樣使用IDLE中斷去判斷串口線是否空閑呢?
    發(fā)表于 01-27 06:20

    能否在audio-loopback例程中增加收發(fā)DMA,配置成雙緩沖方式或者半滿中斷方式?

    能否在audio-loopback例程中增加收發(fā)DMA,配置成雙緩沖方式或者半滿中斷方式
    發(fā)表于 05-26 06:50

    中斷方式閃爍【匯編版】

    中斷方式閃爍【匯編版】中斷方式閃爍【匯編版】中斷方式閃爍【匯編版】
    發(fā)表于 12-29 10:50 ?0次下載

    STM32 | 串口空閑中斷接收不定長數(shù)據(jù)(DMA方式

    在使用STM32的串口接收數(shù)據(jù)的時候,我們常常會使用接收中斷方式來接收數(shù)據(jù),常用的是RXNE。這里分享另一種接收數(shù)據(jù)的方式——IDLE中斷(PS:本文的例子運行在STM32F103Z
    發(fā)表于 11-20 12:51 ?17次下載
    STM32 | 串口空閑<b class='flag-5'>中斷</b>接收不定長數(shù)據(jù)(<b class='flag-5'>DMA</b><b class='flag-5'>方式</b>)

    DMA通信編程與STM32串口中斷方式

    目錄DMA通信原理DMA的基本介紹DMA工作原理STM32的DMA結(jié)構(gòu)DMA的主要特性DMA寄存
    發(fā)表于 11-26 19:21 ?13次下載
    <b class='flag-5'>DMA</b>通信編程與STM32串口<b class='flag-5'>中斷</b><b class='flag-5'>方式</b>

    STM32中斷DMA通信

    結(jié)果Ⅲ-DMA向上位機發(fā)送數(shù)據(jù)DMA1.創(chuàng)建STM32CubeMX工程2.keil代碼修改3.結(jié)果小結(jié)鏈接Ⅰ-中斷方式點燈中斷
    發(fā)表于 11-26 19:21 ?20次下載
    STM32<b class='flag-5'>中斷</b>與<b class='flag-5'>DMA</b>通信

    STM32 串口使用IDLE中斷+DMA接收(HAL庫函數(shù))

    1.9.0開發(fā)工具:MDK Keil 5.32二、原理過程在STM32上接9個串口,每個串口約收發(fā)50個字節(jié)數(shù)據(jù)每幀,若使用傳統(tǒng)的按字節(jié)中斷HAL_UART_Receive_IT()的方式,則會因中斷響應(yīng)過于頻繁導致系統(tǒng)響應(yīng)不
    發(fā)表于 12-02 21:06 ?40次下載
    STM32 串口使用IDLE<b class='flag-5'>中斷</b>+<b class='flag-5'>DMA</b>接收(HAL庫函數(shù))

    STM32 HAL庫開發(fā)學習筆記: USART1串口通訊(中斷方式) IDE-STM32CubeIDE

    STM32串口通訊三種方式,分別為阻塞(輪詢)、中斷、DMA。串口模式和配置 源代碼編寫
    發(fā)表于 12-24 18:52 ?19次下載
    STM32 HAL庫開發(fā)學習筆記: USART1串口通訊(<b class='flag-5'>中斷</b><b class='flag-5'>方式</b>) IDE-STM32CubeIDE