|
- #define USART1_BUFF_SIZE 1024
- uint8_t usart1_tx_buffer[USART1_BUFF_SIZE]; /* 串口發(fā)送緩存 */
- uint8_t usart1_rx_buffer[USART1_BUFF_SIZE]; /* 串口接受緩存 */
- uint16_t usart1_tx_flag = 0; /* 接收一幀數(shù)據(jù)標(biāo)志,并記錄接收數(shù)據(jù)個(gè)數(shù) */
- /********************************************************************************************************
- ** 函數(shù): USART1_Init, 串口1初始化
- **------------------------------------------------------------------------------------------------------
- ** 參數(shù):bound 波特蘭
- ** 返回: 無
- ********************************************************************************************************/
- void USART1_Init(uint32_t bound)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- /* 打開GPIO和USART部件的時(shí)鐘 */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
- /* 配置GPIO的模式和IO口 */
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; // 串口輸出PA9(TX)
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; // IO口頻率
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; // 復(fù)用推挽輸出
- GPIO_Init(GPIOA,&GPIO_InitStructure); // 初始化
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; // 串口輸入PA10(RX)
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;// 浮空輸入
- GPIO_Init(GPIOA,&GPIO_InitStructure); // 初始化
- /* 配置串口硬件參數(shù) */
- USART_InitStructure.USART_BaudRate = bound; /* 波特率 */
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;
- USART_InitStructure.USART_StopBits = USART_StopBits_1;
- 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);
- USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); /* 使能串口空閑中斷 */
- USART_ClearFlag(USART1, USART_FLAG_TC | USART_FLAG_IDLE);
- USART_Cmd(USART1, ENABLE); /* 使能串口 */
- /* 開啟串口收發(fā)DMA請求 */
- USART_DMACmd(USART1,USART_DMAReq_Tx | USART_DMAReq_Rx,ENABLE);
- /* 使能串口1中斷 */
- NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
- /********************************************************************************************************
- ** 函數(shù): USART1_DMA_Init, 串口1初始化。 配置串口1的DMA,并開啟DMA接收中斷。
- **------------------------------------------------------------------------------------------------------
- ** 參數(shù): 無
- ** 返回: 無
- ********************************************************************************************************/
- void USART1_DMA_Init(void)
- {
- DMA_InitTypeDef DMA_InitStructure;
- /* 打開DMA通道時(shí)鐘 */
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
- DMA_DeInit(DMA1_Channel4);//TX 通道
- DMA_DeInit(DMA1_Channel5);//RX 通道
- /* TX 通道 配置*/
- DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->DR);
- DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)usart1_tx_buffer;
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
- DMA_InitStructure.DMA_BufferSize = 0;
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
- DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
- DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
- DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
- DMA_Init(DMA1_Channel4,&DMA_InitStructure);
- /* RX 通道 配置*/
- DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->DR);
- DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)usart1_rx_buffer;
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
- DMA_InitStructure.DMA_BufferSize = USART1_BUFF_SIZE;
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
- DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
- DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
- DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
- DMA_Init(DMA1_Channel5,&DMA_InitStructure);
- /* 使能DMA收發(fā)通道 */
- DMA_Cmd(DMA1_Channel4,ENABLE);
- DMA_Cmd(DMA1_Channel5,ENABLE);
- /* 這里沒有使用DMA接收完成或者發(fā)送完成中斷,如需要,可以在這里添加 */
- }
- /**
- * @brief This function handles usart1 interrupt request.
- * @param None
- * @retval None
- */
- void USART1_IRQHandler(void)
- {
- uint8_t ClearFlag;
- uint16_t Count = 0;
- /* 處理接收空閑中斷 */
- if (USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
- {
- /* 清除標(biāo)志:先讀SR,再讀DR */
- ClearFlag = USART1->SR;
- ClearFlag = USART1->DR;
-
- /* 獲取接收數(shù)據(jù)個(gè)數(shù) */
- Count = DMA_GetCurrDataCounter(DMA1_Channel5);
- usart1_tx_flag = USART1_BUFF_SIZE - Count;
- /* 處理數(shù)據(jù),這里用于演示,將收到的數(shù)據(jù)使用DMA發(fā)送出去 */
- memcpy((uint8_t *)usart1_tx_buffer, (uint8_t *)usart1_rx_buffer, usart1_tx_flag);
- /* DMA接收復(fù)位 */
- DMA_Cmd(DMA1_Channel5,DISABLE);
- DMA_SetCurrDataCounter(DMA1_Channel5,USART1_BUFF_SIZE);
- DMA_Cmd(DMA1_Channel5,ENABLE);
- }
- }
復(fù)制代碼
|
評分
-
查看全部評分
|