静的ボイド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の}