wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 546|回復: 0
打印 上一主題 下一主題
收起左側

STM32L151 DMA+UART空閑中斷收發數據

[復制鏈接]
跳轉到指定樓層
樓主
ID:573999 發表于 2025-8-24 10:32 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#ifndef __BSP_UART_H
#define __BSP_UART_H



#define USART1_TX_LEN 1024
#define USART1_RX_LEN 1024

#define USART2_TX_LEN 1024
#define USART2_RX_LEN 1024

#define USART3_TX_LEN 1024
#define USART3_RX_LEN 1024

void Uart1_Init(void);
void Uart1_DMA_TxConfig(uint8_t TransSize);
void Uart1_DMA_RxConfig(void);

void Uart2_Init(void);
void Uart2_DMA_TxConfig(uint8_t TransSize);
void Uart2_DMA_RxConfig(void);

void Uart3_Init(void);
void Uart3_DMA_TxConfig(uint8_t TransSize);
void Uart3_DMA_RxConfig(void);

#endif
//接收緩存區
uint8_t Uart1_Rx_Flag;//接收到數據請求標志
uint8_t Uart1_Rx_Buf[USART1_RX_LEN];//接收緩沖,最USART1_RX_LEN個字節
//發送緩存區
uint8_t Uart1_Tx_Buf[USART1_TX_LEN];//發送緩沖,最USART1_TX_LEN個字節

uint16_t Uart1_ReceiveSize;

//接收緩存區
uint8_t Uart2_Rx_Flag;//接收到數據請求標志
uint8_t Uart2_Rx_Buf[USART2_RX_LEN];//接收緩沖,最USART1_RX_LEN個字節
//發送緩存區
uint8_t Uart2_Tx_Buf[USART2_TX_LEN];//發送緩沖,最USART1_TX_LEN個字節

uint16_t Uart2_ReceiveSize;

//接收緩存區
uint8_t Uart3_Rx_Flag;//接收到數據請求標志
uint8_t Uart3_Rx_Buf[USART3_RX_LEN];//接收緩沖,最USART1_RX_LEN個字節
//發送緩存區
uint8_t Uart3_Tx_Buf[USART3_TX_LEN];//發送緩沖,最USART1_TX_LEN個字節

uint16_t Uart3_ReceiveSize;
/**
  * @brief  Configures the UART1.
  * @param  None
  * @retval None
  */
static void UART1_Configuration(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
       
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);//使能GPIOA時鐘
       
        //打開 UART 時鐘
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
        //Enable DMA1 clock
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
       
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
        //USART1_TX   PA9
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
       
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //復用推挽輸出
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9
       
        //USART1_RX          PA10
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA10
       
       
        //配置串口硬件參數
        USART_InitStructure.USART_BaudRate = 115200;//波特率
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1_5;
        USART_InitStructure.USART_Parity = USART_Parity_No ;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_Init(USART1, &USART_InitStructure);
}

/**
  * @brief  Configures the UART2.
  * @param  None
  * @retval None
  */
static void UART2_Configuration(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
       
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);//使能GPIOA時鐘
       
        //打開 UART 時鐘
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
        //Enable DMA1 clock
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
       
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2);
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2);
        //USART2_TX   PA2
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
       
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //復用推挽輸出
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA2
       
        //USART2_RX          PA3
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
        GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA3
       
       
        //配置串口硬件參數
        USART_InitStructure.USART_BaudRate = 115200;//波特率
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1_5;
        USART_InitStructure.USART_Parity = USART_Parity_No ;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_Init(USART2, &USART_InitStructure);
}
/**
  * @brief  Configures the UART3.
  * @param  None
  * @retval None
  */
static void UART3_Configuration(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
       
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);//使能GPIOB時鐘
       
        //打開 UART 時鐘
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
        //Enable DMA1 clock
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
       
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3);
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3);
        //USART3_TX   PB10
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
       
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //復用推挽輸出
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB10
       
        //USART3_RX          PB11
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
        GPIO_Init(GPIOB, &GPIO_InitStructure);  //初始化PB11
       
       
        //配置串口硬件參數
        USART_InitStructure.USART_BaudRate = 115200;//波特率
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1_5;
        USART_InitStructure.USART_Parity = USART_Parity_No ;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_Init(USART3, &USART_InitStructure);
}

/**
  * @brief  初始化CPU的USART1串口硬件設備
  * @param  None
  * @retval None
  */
void Uart1_Init(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
       
        UART1_Configuration();
       
        //設置中斷
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;      
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;      
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
        //配置串口中斷
        USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
        USART_ITConfig(USART1, USART_IT_TC,   DISABLE);
        USART_ITConfig(USART1, USART_IT_TXE,  DISABLE);
       
        USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//使能IDLE中斷

        USART_Cmd(USART1, ENABLE);
        USART_ClearFlag(USART1, USART_FLAG_TC);//清發送完成標志,Transmission Complete flag
}
/**
  * @brief  初始化CPU的USART2串口硬件設備
  * @param  None
  * @retval None
  */
void Uart2_Init(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
       
        UART2_Configuration();
       
        //設置中斷
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;      
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;      
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        //配置串口中斷
        USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
        USART_ITConfig(USART2, USART_IT_TC,   DISABLE);
        USART_ITConfig(USART2, USART_IT_TXE,  DISABLE);
       
        USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);//使能IDLE中斷

        USART_Cmd(USART2, ENABLE);
        USART_ClearFlag(USART2, USART_FLAG_TC);//清發送完成標志,Transmission Complete flag
}
/**
  * @brief  初始化CPU的USART3串口硬件設備
  * @param  None
  * @retval None
  */
void Uart3_Init(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
       
        UART3_Configuration();
       
        //設置中斷
        NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;      
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;      
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        //配置串口中斷
        USART_ITConfig(USART3, USART_IT_RXNE, DISABLE);
        USART_ITConfig(USART3, USART_IT_TC,   DISABLE);
        USART_ITConfig(USART3, USART_IT_TXE,  DISABLE);
       
        USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);//使能IDLE中斷

        USART_Cmd(USART3, ENABLE);
        USART_ClearFlag(USART3, USART_FLAG_TC);//清發送完成標志,Transmission Complete flag
}

//
void Uart1_DMA_TxConfig(uint8_t TransSize)
{
        DMA_InitTypeDef  DMA_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        DMA_DeInit(DMA1_Channel4);
       
        //DMA外設USART1基地址  
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->DR);  
        //DMA內存基地址  
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Uart1_Tx_Buf;  
        //外設作為數據傳輸的目的地  
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  
        //DMA通道的DMA緩存的大小
        DMA_InitStructure.DMA_BufferSize = TransSize;
        //外設地址寄存器不變
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  
        //內存地址寄存器遞增   
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  
        //數據寬度為8位
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  
        //數據寬度為8位  
        DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;  
        //工作在正常模式
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  
        //DMA通道 x擁有高優先級
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
        //
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
       
        //根據DMA_InitStruct中指定的參數初始化DMA的通道
        DMA_Init(DMA1_Channel4, &DMA_InitStructure);
       
        DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);
        //使能 USART DMA TX 請求
        USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
       
        //使能 DMA Stream 中斷通道
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
        //Enable DMA1_Channel4
        DMA_Cmd(DMA1_Channel4, DISABLE);
}
//
void Uart2_DMA_TxConfig(uint8_t TransSize)
{
        DMA_InitTypeDef  DMA_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        DMA_DeInit(DMA1_Channel7);
       
        //DMA外設USART1基地址  
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART2->DR);  
        //DMA內存基地址  
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Uart2_Tx_Buf;  
        //外設作為數據傳輸的目的地  
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  
        //DMA通道的DMA緩存的大小
        DMA_InitStructure.DMA_BufferSize = TransSize;
        //外設地址寄存器不變
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  
        //內存地址寄存器遞增   
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  
        //數據寬度為8位
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  
        //數據寬度為8位  
        DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;  
        //工作在正常模式
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  
        //DMA通道 x擁有高優先級
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
        //
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
       
        //根據DMA_InitStruct中指定的參數初始化DMA的通道
        DMA_Init(DMA1_Channel7, &DMA_InitStructure);
       
        DMA_ITConfig(DMA1_Channel7, DMA_IT_TC, ENABLE);
        //使能 USART DMA TX 請求
        USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE);
       
        //使能 DMA Stream 中斷通道
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel7_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
        //Enable DMA1_Channel
        DMA_Cmd(DMA1_Channel7, DISABLE);
}
//
void Uart3_DMA_TxConfig(uint8_t TransSize)
{
        DMA_InitTypeDef  DMA_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        DMA_DeInit(DMA1_Channel2);
       
        //DMA外設USART1基地址  
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART3->DR);  
        //DMA內存基地址  
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Uart3_Tx_Buf;  
        //外設作為數據傳輸的目的地  
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  
        //DMA通道的DMA緩存的大小
        DMA_InitStructure.DMA_BufferSize = TransSize;
        //外設地址寄存器不變
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  
        //內存地址寄存器遞增   
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  
        //數據寬度為8位
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  
        //數據寬度為8位  
        DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;  
        //工作在正常模式
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  
        //DMA通道 x擁有高優先級
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
        //
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
       
        //根據DMA_InitStruct中指定的參數初始化DMA的通道
        DMA_Init(DMA1_Channel2, &DMA_InitStructure);
       
        DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE);
        //使能 USART DMA TX 請求
        USART_DMACmd(USART3, USART_DMAReq_Tx, ENABLE);
       
        //使能 DMA Stream 中斷通道
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
        //Enable DMA1_Channel
        DMA_Cmd(DMA1_Channel2, DISABLE);
}
//
void Uart1_DMA_RxConfig(void)
{
        DMA_InitTypeDef  DMA_InitStructure;

        //DMA1的通道配置
        DMA_DeInit(DMA1_Channel5);  
       
        //DMA外設USART1基地址  
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->DR);  
        //DMA內存基地址
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Uart1_Rx_Buf;  
        //內存作為數據傳輸的目的地
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  
        //DMA通道的DMA緩存的大小
        DMA_InitStructure.DMA_BufferSize = USART1_RX_LEN;  
        //外設地址寄存器不變   
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  
        //內存地址寄存器遞增   
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  
        //數據寬度為8位  
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  
        //數據寬度為8位  
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;  
        //工作在正常模式  
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  
        //DMA通道 x擁有中優先級
        DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;   
        //
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  

        //根據DMA_InitStruct中指定的參數初始化DMA的通道         
        DMA_Init(DMA1_Channel5, &DMA_InitStructure);   
        //使能 USART DMA RX 請求
        USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
       
        DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,ENABLE);
        //Enable DMA1_Channel5
        DMA_Cmd(DMA1_Channel5,ENABLE);
       
}

//
void Uart2_DMA_RxConfig(void)
{
        DMA_InitTypeDef  DMA_InitStructure;

        //DMA1的通道配置
        DMA_DeInit(DMA1_Channel6);  
       
        //DMA外設USART1基地址  
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART2->DR);  
        //DMA內存基地址
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Uart2_Rx_Buf;  
        //內存作為數據傳輸的目的地
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  
        //DMA通道的DMA緩存的大小
        DMA_InitStructure.DMA_BufferSize = USART2_RX_LEN;  
        //外設地址寄存器不變   
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  
        //內存地址寄存器遞增   
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  
        //數據寬度為8位  
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  
        //數據寬度為8位  
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;  
        //工作在正常模式  
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  
        //DMA通道 x擁有中優先級
        DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;   
        //
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  

        //根據DMA_InitStruct中指定的參數初始化DMA的通道         
        DMA_Init(DMA1_Channel6, &DMA_InitStructure);   
        //使能 USART DMA RX 請求
        USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE);
       
        DMA_ITConfig(DMA1_Channel6,DMA_IT_TC,ENABLE);
        //Enable DMA1_Channel
        DMA_Cmd(DMA1_Channel6,ENABLE);
       
}

//
void Uart3_DMA_RxConfig(void)
{
        DMA_InitTypeDef  DMA_InitStructure;

        //DMA1的通道配置
        DMA_DeInit(DMA1_Channel3);  
       
        //DMA外設USART1基地址  
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART3->DR);  
        //DMA內存基地址
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Uart3_Rx_Buf;  
        //內存作為數據傳輸的目的地
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  
        //DMA通道的DMA緩存的大小
        DMA_InitStructure.DMA_BufferSize = USART3_RX_LEN;  
        //外設地址寄存器不變   
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  
        //內存地址寄存器遞增   
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  
        //數據寬度為8位  
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  
        //數據寬度為8位  
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;  
        //工作在正常模式  
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  
        //DMA通道 x擁有中優先級
        DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;   
        //
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  

        //根據DMA_InitStruct中指定的參數初始化DMA的通道         
        DMA_Init(DMA1_Channel3, &DMA_InitStructure);   
        //使能 USART DMA RX 請求
        USART_DMACmd(USART3, USART_DMAReq_Rx, ENABLE);
       
        DMA_ITConfig(DMA1_Channel3,DMA_IT_TC,ENABLE);
        //Enable DMA1_Channel
        DMA_Cmd(DMA1_Channel3,ENABLE);
       
}
/*
*********************************************************************************************************
*        函 數 名: DMA1_Channel4_IRQHandler
*        功能說明: 串口1在DMA方式下的發送中斷
*        形    參: 無
*        返 回 值: 無
*********************************************************************************************************
*/
void DMA1_Channel4_IRQHandler(void)
{
         
        if(DMA_GetITStatus(DMA1_IT_TC4)==SET) //UART Trans Complete
        {
                DMA_ClearFlag(DMA1_FLAG_TC4);
                //DataHold=0;
                DMA_Cmd(DMA1_Channel4, DISABLE);
        }
}
/*
*********************************************************************************************************
*        函 數 名: DMA1_Channel7_IRQHandler
*        功能說明: 串口2在DMA方式下的發送中斷
*        形    參: 無
*        返 回 值: 無
*********************************************************************************************************
*/
void DMA1_Channel7_IRQHandler(void)
{
         
        if(DMA_GetITStatus(DMA1_IT_TC7)==SET) //UART Trans Complete
        {
                DMA_ClearFlag(DMA1_FLAG_TC7);
                //DataHold=0;
                DMA_Cmd(DMA1_Channel7, DISABLE);
        }
}
/*
*********************************************************************************************************
*        函 數 名: DMA1_Channel2_IRQHandler
*        功能說明: 串口3在DMA方式下的發送中斷
*        形    參: 無
*        返 回 值: 無
*********************************************************************************************************
*/
void DMA1_Channel2_IRQHandler(void)
{
         
        if(DMA_GetITStatus(DMA1_IT_TC2)==SET) //UART Trans Complete
        {
                DMA_ClearFlag(DMA1_FLAG_TC2);
                //DataHold=0;
                DMA_Cmd(DMA1_Channel2, DISABLE);
        }
}
/*
*********************************************************************************************************
*        函 數 名: USART1_IRQHandler
*        功能說明: 串口1空閑中斷
*        形    參: 無
*        返 回 值: 無
* IDLE要由軟件序列清除依次讀取USART1->SR和USART1->DR
*********************************************************************************************************
*/
void USART1_IRQHandler(void)
{
        uint16_t tmp;
        if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET)
        {
                DMA_Cmd(DMA1_Channel5, DISABLE); //關閉DMA,防止處理其間有數據

                tmp = USART1->SR;
                tmp = USART1->DR;
                tmp++;
               
                Uart1_ReceiveSize =USART1_RX_LEN - DMA_GetCurrDataCounter(DMA1_Channel5);
                if(Uart1_ReceiveSize!=0)
                        Uart1_Rx_Flag=1;
                DMA_ClearFlag(DMA1_FLAG_GL5 | DMA1_FLAG_TC5 | DMA1_FLAG_HT5 | DMA1_FLAG_TE5);//清DMA1_Channel5傳輸完成標志
                DMA_SetCurrDataCounter(DMA1_Channel5, USART1_RX_LEN);
                DMA_Cmd(DMA1_Channel5, ENABLE);     //打開DMA,防止處理其間有數據
        }
}
/*
*********************************************************************************************************
*        函 數 名: USART2_IRQHandler
*        功能說明: 串口2空閑中斷
*        形    參: 無
*        返 回 值: 無
* IDLE要由軟件序列清除依次讀取USART2->SR和USART2->DR
*********************************************************************************************************
*/
void USART2_IRQHandler(void)
{
        uint16_t tmp;
        if(USART_GetITStatus(USART2,USART_IT_IDLE) != RESET)
        {
                DMA_Cmd(DMA1_Channel6, DISABLE); //關閉DMA,防止處理其間有數據

                tmp = USART2->SR;
                tmp = USART2->DR;
                tmp++;
               
                Uart2_ReceiveSize =USART2_RX_LEN - DMA_GetCurrDataCounter(DMA1_Channel6);
                if(Uart2_ReceiveSize!=0)
                        Uart2_Rx_Flag=1;
                DMA_ClearFlag(DMA1_FLAG_GL6 | DMA1_FLAG_TC6 | DMA1_FLAG_HT6 | DMA1_FLAG_TE6);//清DMA1_Channel6傳輸完成標志
                DMA_SetCurrDataCounter(DMA1_Channel6, USART2_RX_LEN);
                DMA_Cmd(DMA1_Channel6, ENABLE);     //打開DMA,防止處理其間有數據
        }
}
/*
*********************************************************************************************************
*        函 數 名: USART3_IRQHandler
*        功能說明: 串口3空閑中斷
*        形    參: 無
*        返 回 值: 無
* IDLE要由軟件序列清除依次讀取USART3->SR和USART3->DR
*********************************************************************************************************
*/
void USART3_IRQHandler(void)
{
        uint16_t tmp;
        if(USART_GetITStatus(USART3,USART_IT_IDLE) != RESET)
        {
                DMA_Cmd(DMA1_Channel3, DISABLE); //關閉DMA,防止處理其間有數據

                tmp = USART3->SR;
                tmp = USART3->DR;
                tmp++;
               
                Uart3_ReceiveSize =USART3_RX_LEN - DMA_GetCurrDataCounter(DMA1_Channel3);
                if(Uart3_ReceiveSize!=0)
                        Uart3_Rx_Flag=1;
                DMA_ClearFlag(DMA1_FLAG_GL3 | DMA1_FLAG_TC3 | DMA1_FLAG_HT3 | DMA1_FLAG_TE3);//清DMA1_Channel3傳輸完成標志
                DMA_SetCurrDataCounter(DMA1_Channel3, USART3_RX_LEN);
                DMA_Cmd(DMA1_Channel3, ENABLE);     //打開DMA,防止處理其間有數據
        }
}
/**********************************************(END OF FILE)**********************************************/


//初始化示例,使用前必須調用
Uart1_Init();
Uart1_DMA_TxConfig(40);       
Uart1_DMA_RxConfig();       

Uart2_Init();       
Uart2_DMA_TxConfig(40);       
Uart2_DMA_RxConfig();
               
Uart3_Init();       
Uart3_DMA_TxConfig(40);       
Uart3_DMA_RxConfig();


//Uart Echo Test
/*Uart Data*/
void Uart_Data_Process(void)
{
        uint16_t i;
       
        if(Uart1_Rx_Flag==1)
        {
                Uart1_Rx_Flag=0;
               

                for(i=0;i<Uart1_ReceiveSize;i++)
                        Uart1_Tx_Buf[i]=Uart1_Rx_Buf[i];
                DMA_SetCurrDataCounter(DMA1_Channel4,Uart1_ReceiveSize);
                DMA_Cmd(DMA1_Channel4, ENABLE);

        }
       
        if(Uart2_Rx_Flag==1)
        {
                Uart2_Rx_Flag=0;
               

                for(i=0;i<Uart2_ReceiveSize;i++)
                        Uart2_Tx_Buf[i]=Uart2_Rx_Buf[i];
                DMA_SetCurrDataCounter(DMA1_Channel7,Uart2_ReceiveSize);
                DMA_Cmd(DMA1_Channel7, ENABLE);

        }
       
        if(Uart3_Rx_Flag==1)
        {
                Uart3_Rx_Flag=0;
               

                for(i=0;i<Uart3_ReceiveSize;i++)
                        Uart3_Tx_Buf[i]=Uart3_Rx_Buf[i];
                DMA_SetCurrDataCounter(DMA1_Channel2,Uart3_ReceiveSize);
                DMA_Cmd(DMA1_Channel2, ENABLE);

        }
}


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
欧美一区二区三区播放| 亚洲欧洲av| 午夜影院网站| 免费国产麻豆传| 日本一级片免费看| 欧美多人猛交狂配| 黄色国产小视频| 一区二区三区四区免费视频| 91在线观看免费高清| 色偷偷偷亚洲综合网另类| 91精品欧美一区二区三区综合在 | 哺乳一区二区三区中文视频| 欧美aaaaaaa| 天堂在线观看免费视频| 任我爽在线视频| 草草久久久无码国产专区| 国产精品推荐精品| 欧美中文在线免费| 一本一本久久a久久精品牛牛影视| 国产精品视频yy9299一区| 精品一区免费av| 日韩欧美大片| 久久久久九九精品影院| 免费电影网站在线视频观看福利| 久久久久久77777| www日本高清| 最新中文字幕免费视频| 九色91在线视频| 国产欧美精品一区二区三区-老狼| 九九热这里只有在线精品视| 国产视频精品一区二区三区| 欧美高清激情brazzers| 精品久久久久久久久久久久| www.色精品| 国产一区二区三区国产| 久久久久久久久伊人| 成人丝袜高跟foot| 国产精品国产精品国产专区不蜜 | 久久深夜福利免费观看| 精品久久久网站| 欧美精品黑人性xxxx| 在线免费观看日本一区| 色悠悠久久综合| 欧美日韩中文字幕| 欧美日韩性视频在线| 亚洲国产精品天堂| 午夜视频在线观看一区二区| 亚洲一区av在线| 亚洲电影在线播放| 日韩精品一区二区三区四区视频| 日韩一区国产二区欧美三区| 欧美日韩在线三级| 91精品国产综合久久久久久漫画| 在线观看91精品国产麻豆| 欧美日本一区二区三区| 日韩一区二区三区视频| 精品国产91久久久久久久妲己| 精品日韩一区二区| 精品视频在线播放免| 亚洲无限av看| 久久成人精品一区二区三区| 久久人人爽人人爽人人片av高请| 91po在线观看91精品国产性色| 97在线精品国自产拍中文| 欧美性视频精品| 国产精品激情av电影在线观看| 国产福利视频一区二区| 国产精品视频区1| 91大片在线观看| 欧美日韩精品免费观看| 自拍另类欧美| 精品这里只有精品| 亚洲欧洲日本精品| 色哟哟网站在线观看| 中文字幕免费高清| 午夜剧场免费在线观看| 日韩欧美激情视频| 这里只有久久精品视频| 99久久婷婷国产一区二区三区| 日韩一级片免费观看| 男女爱爱视频免费| 四虎国产成人免费观看 | 久久国产精品免费看| 久久高清免费视频| 日韩精品久久久久久免费| 99精品人妻无码专区在线视频区| 在线观看xxx| 在线免费电影网| 国产经典视频一区| 在线日本中文字幕| gay欧美网站| 欧一区二区三区| 99久久久久| 快she精品国产999| 成人免费毛片嘿嘿连载视频| 国产精品色哟哟| 亚洲高清免费视频| 日韩在线视频网| 91高潮在线观看| 只有这里有精品| 波多野结衣50连登视频| 久久久久无码国产精品一区李宗瑞| jizz大全欧美jizzcom| 免费黄色日本网站| 一级性生活视频| 一卡二卡三卡视频| 日本a在线天堂| a级黄色一级片| 天天夜碰日日摸日日澡性色av| 国产三级国产精品国产专区50| 国产精品专区一| 成人在线观看视频网站| 国产91在线免费| 日韩乱码人妻无码中文字幕久久| 亚洲av无码乱码国产麻豆| 99久免费精品视频在线观78| 国产在线视频福利| 天天综合网站| 正在播放日韩欧美一页| 国产成人小视频| 精品久久久久久电影| 亚洲欧美成人网| 国产精品三级美女白浆呻吟| 亚洲欧洲一区二区福利| 九九九九九国产| 操她视频在线观看| 亚洲第一黄色片| 0608新视觉| 成人日批视频| 国产精品视频一区视频二区 | 欧美v亚洲v综合ⅴ国产v| 久久99久久久久久久噜噜| 国产精品日韩欧美一区二区三区| 日韩精品视频一区二区在线观看| 中文字幕无码日韩专区免费| 天天干视频在线观看| 久草一本av| 国产韩日精品| 99精品国产在热久久下载| 久久久一区二区三区| 欧美一级国产精品| 国产精品日韩欧美大师| 六月婷婷激情综合| 高清国产在线观看| 无套内谢的新婚少妇国语播放| 国产网红在线| 外国电影一区二区| 亚洲在线电影| 亚洲第一搞黄网站| 久久亚洲私人国产精品va| 久久久久久亚洲精品不卡4k岛国| 国产精品嫩草影院8vv8| 精品美女久久久久| 爽爽影院免费观看视频| 性欧美1819sex性高清大胸| 精品毛片免费观看| 91首页免费视频| 精品国产三级a在线观看| 国产欧美韩国高清| 最近中文字幕一区二区| 人妻少妇无码精品视频区| 亚洲欧美综合一区二区| 一二三四社区在线视频6| 日韩一区二区三区四区五区 | 欧洲猛交xxxx乱大交3| 最近更新在线中文字幕一页| 黄网在线观看| 国产欧美日韩一区二区三区四区| 成人污视频在线观看| 欧美一级日韩不卡播放免费| 国产精品午夜国产小视频| 九色porny91| 国产无遮挡又黄又爽又色视频| h视频在线网站| 日本精品在线中文字幕| 日韩精品91亚洲二区在线观看 | 国产精品资源在线| 欧美精品xxxxbbbb| 亚洲一区二区三区香蕉| 亚洲欧洲日韩综合| 精品国产伦一区二区三区| 最新四虎影在线在永久观看www| 亚洲三区欧美一区国产二区| 国产福利一区在线| 亚洲国产女人aaa毛片在线| 国产精成人品localhost| 成人无码www在线看免费| 中文字幕色站| 欧美婷婷久久五月精品三区| 久久电影tv| 午夜在线一区| 7777女厕盗摄久久久| 7777精品久久久大香线蕉小说| 一区二区传媒有限公司| 久久爱一区二区| 先锋资源一区| 欧洲免费在线视频| 一区二区三区中文| 久久久噜噜噜久久人人看| 日韩三级影视基地| 色噜噜一区二区| 欧美精品色哟哟| 国产羞羞视频| 男男gay无套免费视频欧美| 国产精品全国免费观看高清 | 欧美久久久久久久| 一区二区成人免费视频| 人人天天夜夜| 欧美偷窥清纯综合图区| 最新成人av在线| 日韩免费不卡av| 动漫av在线免费观看| 日本卡一卡2卡3卡4精品卡网站| 英国三级经典在线观看| 国产一区二区不卡| 在线视频一区二区| 欧美日韩在线中文| 精品美女www爽爽爽视频| 亚洲性图自拍| 你懂的成人av| 欧美日韩色一区| 欧美日韩在线一区二区三区| 久草国产在线视频| av女同在线| 欧美在线精品一区| 在线91免费看| 最近看过的日韩成人| 中文字幕理论片| 黄色网页在线看| 九色|91porny| 久久精品一区中文字幕| 欧美一级xxxx| 精品国内一区二区三区免费视频 | 久久久国产午夜精品| 久久频这里精品99香蕉| 又大又长粗又爽又黄少妇视频| 国产老女人av| 精品亚洲免a| 欧美日韩亚洲视频| 精品一区在线播放| 最新中文字幕一区| 国产精品久久麻豆| 精品在线免费观看| 中文字幕国产精品久久| 精品999在线| 国产精品免费麻豆入口| 欧美电影完整版在线观看| 欧美日韩亚洲91| 日韩免费毛片| 国产富婆一级全黄大片| 鲁鲁在线中文| 国产精品理论片在线观看| 91精品免费| 日本视频免费在线| 麻豆传媒视频在线| 粉嫩一区二区三区性色av| 性色av一区二区咪爱| 91成年人网站| 蜜芽视频在线观看| 免费成人在线观看视频| 欧美区二区三区| 小早川怜子久久精品中文字幕| 99re6热在线精品视频播放| 国产欧美日本| 久久资源免费视频| 久久久久亚洲av无码专区桃色| 97香蕉久久| 麻豆精品视频在线| 97久久精品人搡人人玩 | xfplay资源站夜色先锋| 国产精品国产| 欧美视频第二页| 久久精品magnetxturnbtih| 中文字幕永久在线| 日本天堂在线观看| av在线播放一区二区三区| 伊人久久久久久久久久久| 91久久国产综合久久蜜月精品| 欧美色图亚洲视频| 国产福利在线播放麻豆| av不卡在线观看| 国产精品久久激情| 圆产精品久久久久久久久久久| hd国产人妖ts另类视频| 欧美日韩亚洲精品内裤| 免费观看亚洲视频| 黄色三级电影网站| 国产最新精品免费| 国产精品一区二区三| 亚洲天堂一区在线| 日本欧美在线| 8x8x8国产精品| 久久久久久久久久毛片| 全部孕妇毛片丰满孕妇孕交| 免费美女久久99| 国产精品成人一区二区三区吃奶| 天堂网视频在线| 色诱色偷偷久久综合| 欧美日韩国产在线观看| 无需播放器的av| 免费高清特黄a大片| 精品一二线国产| 91久久精品在线| 久久国产高清视频| av在线网页| 国语对白精品一区二区| 国语自产偷拍精品视频偷| 91女人18毛片水多国产| 欧美色资源站| 亚洲天天在线日亚洲洲精| 日本乱子伦xxxx| 欧美hdxxx| 欧美性猛交xxxx乱大交蜜桃| 欧美一级黄色影院| 自拍av在线| 国产亚洲精久久久久久| 一区二区不卡在线| 女人天堂在线视频| 久热成人在线视频| 成人国产一区二区| 天天躁日日躁狠狠躁喷水| 91精品国产自产在线观看永久∴ | 97在线视频免费播放| 国产sm主人调教女m视频| 国产成人影院| 国产日韩欧美另类| 三级视频在线看| 欧美日本一区| 国产精品高清在线观看| 国产人妖一区二区三区| 精品72久久久久中文字幕| 最新69国产成人精品视频免费| 久草视频免费在线播放| 国产专区精品| 亚洲午夜未满十八勿入免费观看全集| 国产成人精品视频免费| 亚洲天堂一区二区| 亚洲精品一区二区三区在线观看 | 国产在线精选视频| 奶水喷射视频一区| 91国产在线免费观看| 四虎影院成人| 人人超碰91尤物精品国产| 香蕉视频免费版| 激情四房婷婷| 在线观看免费成人| mm131美女视频| 日韩av一级| 亚洲天堂网在线观看| 国产精品7777| 久久综合影院| 久久久久久美女| 国产黄色av片| 亚洲免费影院| 欧美二区三区| 91原色影院| 国产精品日日摸夜夜摸av| 国产二区视频在线| 蜜桃在线视频| 久久久人成影片一区二区三区观看| 图片专区亚洲欧美另类| 国产精品―色哟哟| 国产亚洲精品精品精品| 欧美hd在线| 伊人情人网综合| 色呦呦在线看| 九九精品视频在线| 国产在线麻豆精品| 亚洲一二三区不卡| 久久久久久福利| 媚黑女一区二区| 国产a级片免费观看| 亚洲欧洲二区| 51精品国产人成在线观看| 一二三区在线| 亚洲天堂男人天堂| 精品卡1卡2卡三卡免费网站| 亚洲最大成人网4388xx| 久久久久久久久久99| 久久国产高清| 99sesese| 啪啪激情综合网| 久久亚洲国产精品日日av夜夜| 天天在线视频色| 久久这里有精品视频| 国产精品爱久久久久久久小说| 亚洲制服丝袜av| 国产 日韩 欧美 在线| 精品一二三四区| 亚洲av综合色区无码另类小说| 精品一级毛片| 亚洲中文字幕无码一区二区三区| 粉嫩一区二区| 91麻豆国产语对白在线观看| 麻豆av电影在线观看| 日韩在线观看网址| 黑人巨大狂躁日本妞在线观看 | 男人天堂手机在线| 欧美高清视频一区二区| www.99色|