シリアルDMA

静的ボイドUsart1Init(INT iBaudRate)
{ 
    #ifの(TX_USE_MODE == USE_MODE_DMA)|| (RX_USE_MODE == USE_MODE_DMA)
    DMA_InitTypeDef DMA_InitStructure。
    #endifの
    GPIO_InitTypeDef GPIO_InitStructure。
    NVIC_InitTypeDef NVIC_InitStructure; 
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO、ENABLE); 
    RCC_AHBPeriphClockCmd(RCC_AHBENR_DMA1EN | RCC_AHBENR_DMA2EN、ENABLE); 

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz。
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9。// TX 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP。
    GPIO_Init(GPIOA、&GPIO_InitStructure)。
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10。//処方箋
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU。
    (GPIOA、&GPIO_InitStructure付き)GPIO_Init; 

    Usart1BaseInit(iBaudRate); 
    の#if(TX_USE_MODE = USE_MODE_POL!)
    FifoInit(&gsstUsart1TxFifo、gsucUsart1TxBuf、はsizeof(gsucUsart1TxBuf)、Usart1TxCrtCtrl、FALSE); 
    #endifの
    の#if(RX_USE_MODE = USE_MODE_POL!)
    FifoInit(&gsstUsart1RxFifo、 gsucUsart1RxBuf、はsizeof(gsucUsart1RxBuf)、Usart1RxCrtCtrl、TRUE); 
    #endifの
    
    の#if(TX_USE_MODE == USE_MODE_DMA)
    DMA_InitStructure.DMA_BufferSize =はsizeof(gsucUsart1TxBuf); // DMAチャネルのDMAバッファサイズ
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //データ送信方向は、周辺機器に送信メモリから読み出される 
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // DMAチャネルxは、メモリ転送にメモリに設定されていません
		//メモリ
    DMA_InitStructure.DMA_MemoryBaseAddr =(U32)(gsucUsart1TxBuf) ; // DMA メモリベースアドレス 
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //データ幅は8ビット
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //メモリ・アドレス・レジスタで増分
		
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //通常モードで動作キャッシュ
		//周辺
    DMA_InitStructure.DMA_PeripheralBaseAddr(= U32)(&USART1-> DR) ; // DMA 周辺基地アドレスUSART1 
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //周辺データ8ビット幅
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //周辺アドレスレジスタ定数
		
    DMA_InitStructure.DMA_Priority = DMA_Priority_High; // DMAチャネルX高い優先順位有する
    DMA_Cmd(DMA1_Channel4、DISABLEを); // !!ディセーブル状態CNDTRレジスタはUPDATEすることができます
    DMA_Init(DMA1_Channel4、&DMA_InitStructure); // パラメータがレジスタDMA_InitStructがDMAチャネルUSART1_Tx_DMA_Channelを初期化し、指定が同定 
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte。
    DMA_ITConfig(DMA1_Channel4、DMA_IT_TC、ENABLE) ; // ===================== DMA_IT_TCは、 周辺のアドレスへの送信データのみ起こる充填として定義される
    (DMA1_Channel4、DISABLE DMA_Cmdを); // DISABLE    
    
    USART_DMACmd(USART1、USART_DMAReq_Tx、ENABLE); 
    #endifの

    の#if(RX_USE_MODE == USE_MODE_DMA)
    DMA_InitStructure.DMA_BufferSize =はsizeof(gsucUsart1RxBuf); 
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //データ伝送方向は、周辺から読み取らメモリ[周辺データソース] 
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; 
    DMA_InitStructure.DMA_MemoryBaseAddr =(U32)(gsucUsart1RxBuf); 
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable。 
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //この文は、設定されたDMA転送モードにある:連続ループモードでは、だけではなく、1回の訪問は、訪問(またはプレス取扱説明書をお聞きした後、指名手配されている場合それは共通モードに設定することができます)停止しないアクセスするときには、訪問する訪問する時間です:DMA_Mode_Normal。
    = DMA_InitStructure.DMA_PeripheralBaseAddr(U32)(&USART1-> DR); 
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; 
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; 
    DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; // 
    DMA_Cmd(DMA1_Channel5、DISABLE); // STATE CNDTR DISABLE !!!! UPDATE REGISTERすることができる
    。DMA_Init(DMA1_Channel5、&DMA_InitStructure)
    DMA_Cmd(DMA1_Channel5、ENABLE); 
    
    USART_ITConfig(USART1、USART_IT_IDLE、ENABLE)。  
    USART_DMACmd(USART1、USART_DMAReq_Rx、ENABLE)。
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 
    #elifの(RX_USE_MODE == USE_MODE_INT)
    USART_ITConfig(USART1、USART_IT_RXNE、ENABLE)。  
    #endifの
    
    ; USART_Cmd(USART1、ENABLE)  

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn。
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 
    NVIC_InitStructure.NVIC_IRQChannelCmdは= ENABLE; 
    NVIC_Init(&NVIC_InitStructure)。

    #if(TX_USE_MODE == USE_MODE_DMA)
    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn。// TX DMA 
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 
    NVIC_InitStructure.NVIC_IRQChannelCmdは= ENABLE; 
    NVIC_Init(&NVIC_InitStructure)。
    #endifの
}

  

/ ************************************************* **************** 
 関数名:USART1_IRQHandlerの
 機能説明:
 入力パラメータ:
 出力パラメータ:
 戻り説明:
 他の:
 *************** ************************************************** / 
空隙USART1_IRQHandler(ボイド)
{ 
    の#if(RX_USE_MODE == USE_MODE_INT)
    IF((USART1-> CR1の&USART_FLAG_RXNE)&&(USART1-> SR&USART_FLAG_RXNE))
	{ 
		U8 ucData = USART1-> DR; 
        UsartRxCheckSymbol(&gsstCnter1、ucData) ; 
        FifoPushByte(&gsstUsart1RxFifo、ucData); 
	} 
    #endifの 
        INT = FifoPopByteのiData(&gsstUsart1TxFifo); 
        IF(のiData>= 0) 
        { 
    の#if(TX_USE_MODE == USE_MODE_INT)
    IF((USART1-> CR1の&USART_FLAG_TXE)&&(USART1-> SR&USART_FLAG_TXE))
    { 
			USART1-> DR =(U8)(のiData)。
        } 
		{ 
			USART1-> CR1&=〜USART_FLAG_TXE。
		} 
    } 
    #endifの
    の#if(RX_USE_MODE == USE_MODE_DMA)
    IF((USART1-> CR1&USART_FLAG_IDLE)&&(USART1-> SR&USART_FLAG_IDLE))//空闲才中断
    { 
        INT iInPoint = USART1-> SR。
        iInPoint = USART1-> DR。
        iInPoint =はsizeof(gsucUsart1RxBuf) - DMA1_Channel5-> CNDTR。
        UsartRxDMACheckReset(&gsstUsart1RxFifo、&gsstCnter1、iInPoint)。
        FifoPushSetPoint(&gsstUsart1RxFifo、iInPoint)。
    } 
    #endifの
} 

の#if(TX_USE_MODE == USE_MODE_DMA)
 関数名:DMA1_Channel4_IRQHandlerの
 機能説明:
 入力パラメータ:
 出力パラメータ:
 戻り値の説明:
 その他:
 ******************************* ********************************** / 
空隙DMA1_Channel4_IRQHandler(ボイド)
{ 
    stUsartDmaOperationArgs_t stArgs = {FALSE、256、DMA1_Channel4 }; // FALSEがチェックされていない
    DMA_ClearITPendingBit(DMA1_IT_TC4)を、
    FifoSafeOperation(&gsstUsart1TxFifo、UsartTxDMAOperation、&stArgs); 
}

  

静的ボイドUsart1Init(INT iBaudRate){#ifの(TX_USE_MODE == USE_MODE_DMA)|| (RX_USE_MODE == USE_MODE_DMA)DMA_InitTypeDef DMA_InitStructure。#endifのGPIO_InitTypeDef GPIO_InitStructure。NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO、ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBENR_DMA1EN | RCC_AHBENR_DMA2EN、ENABLE);
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz。GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9。// TX GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP。GPIO_Init(GPIOA、&GPIO_InitStructure)。GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10。// RX GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU。GPIO_Init(GPIOA、&GPIO_InitStructure)。
    Usart1BaseInit(iBaudRate);の#if(TX_USE_MODE = USE_MODE_POL!)FifoInit(&gsstUsart1TxFifo、gsucUsart1TxBuf、はsizeof(gsucUsart1TxBuf)、Usart1TxCrtCtrl、FALSE); #endifのの#if FifoInit(&gsstUsart1RxFifo、gsucUsart1RxBuf、はsizeof(gsucUsart1RxBuf)、(RX_USE_MODE = USE_MODE_POL!) TRUE Usart1RxCrtCtrl); #endifのの#if(TX_USE_MODE == USE_MODE_DMA)DMA_InitStructure.DMA_BufferSize =はsizeof(gsucUsart1TxBuf); // DMA DMAチャネルのバッファサイズDMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST、データ伝送の//方向、送信がメモリから読み出されます周辺DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // DMAチャネルは、メモリ転送//メモリDMA_InitStructure.DMA_MemoryBaseAddr =(U32)(gsucUsart1TxBuf)にXメモリに設定されていない; // DMAメモリベースアドレスDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //データ8 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enableの幅; //メモリアドレスレジスタはDMA_InitStructureをインクリメントされます。DMA_Mode = DMA_Mode_Normal; //通常モードで動作し、キャッシュ周辺DMA_InitStructure.DMA_PeripheralBaseAddr =(U32)(&USART1-> DR); // DMA周辺基地アドレスUSART1 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //周辺データ幅8 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //周辺アドレスレジスタ定数DMA_InitStructure.DMA_Priority = DMA_Priority_High; //!!ディセーブル状態CNDTR登録することができる; // DMAチャネルxがDMA_Cmd(DMA1_Channel4、DISABLE)は、より高い優先度を有しますUPDATE DMA_Init(DMA1_Channel4、&DMA_InitStructure); //レジスタDMA_ITConfig DMA_InitStruct初期化パラメータは、DMAチャネルUSART1_Tx_DMA_Channel指定は(DMA1_Channel4、DMA_IT_TC、ENABLE)を同定し; // ============== =======周辺アドレスへの送信データのみDMA_Cmd(DMA1_Channel4、DISABLE)を発生するように充填されたDMA_IT_TC定義; // DISABLE USART_DMACmd(USART1、USART_DMAReq_Tx、ENABLE); #endifのをUSART1-> DR); // DMA周辺基地アドレスUSART1 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //周辺データ8ビットDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable幅; //ペリフェラルアドレスレジスタ定数DMA_InitStructure.DMA_Priority = DMA_Priority_High; /高優先度DMA_Cmd(DMA1_Channel4、DISABLE)と/ X DMAチャネル; //!!ディセーブル状態CNDTRレジスタUPDATE DMA_Init(DMA1_Channel4、&DMA_InitStructure)をすることができる; // USART1_Tx_DMA_Channel DMA_InitStruct同定DMA初期化パラメータで指定されたチャンネルに応じてDMA_ITConfig(DMA1_Channel4、DMA_IT_TC、ENABLE)を登録; // ===================== DMA_IT_TC周辺アドレス完全DMA_Cmdに送信データとして定義される(DMA1_Channel4を発生しません、DISABLE); // DISABLE USART_DMACmd(USART1、USART_DMAReq_Tx、ENABLE); #endifのUSART1-> DR); // DMA周辺基地アドレスUSART1 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //周辺データ8ビットDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable幅; //ペリフェラルアドレスレジスタ定数DMA_InitStructure.DMA_Priority = DMA_Priority_High; /高優先度DMA_Cmd(DMA1_Channel4、DISABLE)と/ X DMAチャネル; //!!ディセーブル状態CNDTRレジスタUPDATE DMA_Init(DMA1_Channel4、&DMA_InitStructure)をすることができる; // USART1_Tx_DMA_Channel DMA_InitStruct同定DMA初期化パラメータで指定されたチャンネルに応じてDMA_ITConfig(DMA1_Channel4、DMA_IT_TC、ENABLE)を登録; // ===================== DMA_IT_TC周辺アドレス完全DMA_Cmdに送信データとして定義される(DMA1_Channel4を発生しません、DISABLE); // DISABLE USART_DMACmd(USART1、USART_DMAReq_Tx、ENABLE); #endifのDMA_PeripheralInc = DMA_PeripheralInc_Disable; //ペリフェラルアドレスレジスタ定数DMA_InitStructure.DMA_Priority = DMA_Priority_High; // DMAチャネルxは、より高い優先度DMA_Cmd(DMA1_Channel4、DISABLE)を有し; //!!ディセーブル状態CNDTRレジスタはUPDATE DMA_Init(DMA1_Channel4することができます、&​​DMA_InitStructure); //レジスタDMA_ITConfig DMA_InitStruct初期化パラメータは、DMAチャネルUSART1_Tx_DMA_Channelは(DMA1_Channel4、DMA_IT_TC、ENABLE)同定指定; // ================== ===周辺アドレスへの送信データのみDMA_Cmd(DMA1_Channel4、DISABLE)発生満たさとしてDMA_IT_TC定義; // DISABLE USART_DMACmd(USART1、USART_DMAReq_Tx、ENABLE); #endifのをDMA_PeripheralInc = DMA_PeripheralInc_Disable; //ペリフェラルアドレスレジスタ定数DMA_InitStructure.DMA_Priority = DMA_Priority_High; // DMAチャネルxは、より高い優先度DMA_Cmd(DMA1_Channel4、DISABLE)を有し; //!!ディセーブル状態CNDTRレジスタはUPDATE DMA_Init(DMA1_Channel4することができます、&​​DMA_InitStructure); //レジスタDMA_ITConfig DMA_InitStruct初期化パラメータは、DMAチャネルUSART1_Tx_DMA_Channelは(DMA1_Channel4、DMA_IT_TC、ENABLE)同定指定; // ================== ===周辺アドレスへの送信データのみDMA_Cmd(DMA1_Channel4、DISABLE)発生満たさとしてDMA_IT_TC定義; // DISABLE USART_DMACmd(USART1、USART_DMAReq_Tx、ENABLE); #endifのをDMA_IT_TC、ENABLE); // ===================== DMA_IT_TCはDMA_Cmd(DMA1_Channel4、DISABLE)のみ起こるフル周辺アドレスに送信データとして定義され; // DISABLE USART_DMACmd(USART1、USART_DMAReq_Tx、ENABLE); #endifのDMA_IT_TC、ENABLE); // ===================== DMA_IT_TCはDMA_Cmd(DMA1_Channel4、DISABLE)のみ起こるフル周辺アドレスに送信データとして定義され; // DISABLE USART_DMACmd(USART1、USART_DMAReq_Tx、ENABLE); #endifの
    #if(RX_USE_MODE == USE_MODE_DMA)DMA_InitStructure.DMA_BufferSize =はsizeof(gsucUsart1RxBuf); DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //データ伝送方向、周辺メモリ[周辺データソース] DMA_InitStructure.DMA_M2M = DMA_M2M_Disableから読み取る。DMA_InitStructure .DMA_MemoryBaseAddr =(U32)(gsucUsart1RxBuf); DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //セットフレーズがDMA転送モードである:、連続ループモードちょうど1回の訪問であればDMA_Mode_Normal:(あなたが訪問にそれにアクセスしたいとき、それは停止にアクセスするときに、あること、ない依頼する操作手順は、またはを押して)、コモンモードに設定することができた後、訪問しないでください。DMA_InitStructure.DMA_PeripheralBaseAddr =(U32)(&USART1-> DR); DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh。// DMA_Cmd(DMA1_Channel5、DISABLE)。// !!!! DISABLE STATE CNDTR REGISTERはUPDATE DMA_Init(DMA1_Channel5、&DMA_InitStructure)することができます。DMA_Cmd(DMA1_Channel5、ENABLE)。USART_ITConfig(USART1、USART_IT_IDLE、ENABLE)。USART_DMACmd(USART1、USART_DMAReq_Rx、ENABLE)。#elifの(RX_USE_MODE == USE_MODE_INT)USART_ITConfig(USART1、USART_IT_RXNE、ENABLE)。; USART_Cmd(USART1、ENABLE)#ENDIF  
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn。NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmdは= ENABLE; NVIC_Init(&NVIC_InitStructure)。
    #if(TX_USE_MODE == USE_MODE_DMA)NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn。// TX DMA NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmdは= ENABLE; NVIC_Init(&NVIC_InitStructure)。#endifの}

おすすめ

転載: www.cnblogs.com/icaowu/p/12537024.html