新手入门
- 积分
- 3
- 金钱
- 3
- 注册时间
- 2020-6-17
- 在线时间
- 1 小时
|
3金钱
#include "usart.h"
#include "dma.h"
#include "sys.h"
#define UART_RX_LEN 128
u8 ccc=0;
u8 Res;
void uart_init(u32 bound){
//GPIO¶Ë¿úéèÖÃ
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //ê1ÄüUSART1£¬GPIOAê±Öó
//USART1_TX GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸′óÃíÆíìêä3ö
GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉGPIOA.9
//USART1_RX GPIOA.103õê¼»ˉ
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿Õêäèë
GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉGPIOA.10
//Usart1 NVIC ÅäÖÃ
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//ÇàÕ¼óÅÏè¼¶3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //×óóÅÏè¼¶3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQí¨μàê1Äü
NVIC_Init(&NVIC_InitStructure); //¸ù¾YÖ¸¶¨μÄ2Îêy3õê¼»ˉVIC¼Ä′æÆ÷
//USART 3õê¼»ˉéèÖÃ
USART_InitStructure.USART_BaudRate = bound;//′®¿ú2¨ìØÂê
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö3¤Îa8λêy¾Y¸ñê½
USART_InitStructure.USART_StopBits = USART_StopBits_1;//ò»¸öí£Ö1λ
USART_InitStructure.USART_Parity = USART_Parity_No;//ÎTÆæÅ¼D£Ñéλ
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎTó2¼têy¾Yá÷¿ØÖÆ
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //êÕ·¢Ä£ê½
USART_Init(USART1, &USART_InitStructure); //3õê¼»ˉ′®¿ú1
// USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//¿aÆô′®¿ú½óêüÖD¶Ï
USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
USART_Cmd(USART1, ENABLE);
//ê1Äü′®¿ú1
}
void USART1_IRQHandler(void) //′®¿ú1ÖD¶Ï·tÎñ3ìDò
{
ccc=25;
if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)//??!????if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)???
{
USART_ReceiveData(USART1);
}
if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET) //½óêÕÖD¶Ï(½óêÕμ½μÄêy¾Y±ØDëêÇ0x0d 0x0a½áÎ2)
{
USART1->SR;
USART1->DR;
ccc=2;
Receive_DataPack();
USART_ReceiveData(USART1);
}
// if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
// {
//
//
// Receive_DataPack();
// }
}
void Receive_DataPack(void)
{
uint32_t buff_length;
DMA_Cmd(DMA1_Channel5, DISABLE);
DMA_ClearFlag( DMA1_FLAG_TC5 );
buff_length = UART_RX_LEN - DMA_GetCurrDataCounter(DMA1_Channel5);
ccc=1;
DMA_SetCurrDataCounter(DMA1_Channel5,UART_RX_LEN);
DMA_Cmd(DMA1_Channel5, ENABLE);
}
#include"public.h"
/*′®¿ú½óêÕDMA»o′æ*/
uint8_t Uart_Rx[UART_RX_LEN] = {0};
/*′®¿ú·¢ËíDMA»o′æ*/
uint8_t Uart_Send_Buffer[100]={0};
uint8_t Data_Receive_Usart=0;
void usart_dma_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* ÅäÖÃGPIOμÄÄ£ê½oíIO¿ú */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; //TX
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //¸′óÃíÆíìêä3ö
GPIO_Init(GPIOA,&GPIO_InitStructure); //3õê¼»ˉ′®¿úêäèëIO
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; //RX
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //Ä£Äaêäèë
GPIO_Init(GPIOA,&GPIO_InitStructure);
/*3õê¼»ˉ′®¿ú½óêÕoí·¢Ëíoˉêy*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE);
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_InitStructure.USART_BaudRate = DEFAULT_BAUD;
/*3õê¼»ˉ′®¿ú*/
USART_Init(USART1,&USART_InitStructure);
/*ÖD¶ÏÅäÖÃ*/
USART_ITConfig(USART1,USART_IT_TC,DISABLE);
USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);
USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);
//ÅäÖÃUART1ÖD¶Ï
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //í¨μàéèÖÃÎa′®¿ú1ÖD¶Ï
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //ÖD¶ÏÕ¼Ïèμè¼¶0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //ÖD¶ÏÏìó|óÅÏè¼¶0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //′ò¿aÖD¶Ï
NVIC_Init(&NVIC_InitStructure);
/*DMA·¢ËíÖD¶ÏéèÖÃ*/
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/*DMA1í¨μà4ÅäÖ÷¢Ëí*/
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel4);
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Uart_Send_Buffer;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 100;
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_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel4,&DMA_InitStructure);
DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);
//DMA_Cmd(DMA1_Channel4, ENABLE);//ê1Äüí¨μà4£¬ò»°ã·¢ËíμÄê±oòÔùê1Äü
/*DMA1í¨μà5ÅäÖýóêÕ*/
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel5);
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Uart_Rx;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = UART_RX_LEN;
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);
/*ê1Äüí¨μà5*/
DMA_Cmd(DMA1_Channel5,ENABLE);
//2éóÃDMA·½ê½·¢Ëí
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);
//2éóÃDMA·½ê½½óêÕ
USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);
//Æô¶ˉ′®¿ú
USART_Cmd(USART1, ENABLE);
}
/**@ brief ê1Äü·¢Ëíêy¾Y
*
* Æô¶ˉDMAêy¾Y·¢Ëí1|Äü
*
* @param size±íê¾Dèòa·¢ËíμÄDMAÖDêy¾Yμĸöêy
*/
void uart_dma_send_enable(uint16_t size)
{
DMA1_Channel4->CNDTR = (uint16_t)size;
DMA_Cmd(DMA1_Channel4, ENABLE);
}
/**@ brief′®¿ú1½óêÕÖD¶Ï
*
* êÕμ½ò»Ö¡êy¾Y½øèëò»′Σ¬½øDDDMAμĶáè¡
*
*/
void USART1_IRQHandler(void)
{
uint32_t temp = 0;
uint16_t i = 0;
if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
{
//USART_ClearFlag(USART1,USART_IT_IDLE);
temp = USART1->SR;
temp = USART1->DR; //ÇåUSART_IT_IDLE±êÖ¾
DMA_Cmd(DMA1_Channel5,DISABLE);
temp = UART_RX_LEN - DMA_GetCurrDataCounter(DMA1_Channel5);
for (i = 0;i < temp;i++)
{
Data_Receive_Usart = Uart_Rx;
//+++¶ÔêÕμ½μÄêy¾Y¼óò»o󻨷¢3öè¥
Uart_Send_Buffer=Data_Receive_Usart+1;
uart_dma_send_enable(temp);
//+++
}
//éèÖÃ′«êäêy¾Y3¤¶è
DMA_SetCurrDataCounter(DMA1_Channel5,UART_RX_LEN);
//′ò¿aDMA
DMA_Cmd(DMA1_Channel5,ENABLE);
}
}
/**@ brief DMA·¢ËíÖD¶Ï
*
* ·¢Ëíêy¾Y£¬½«DMAÖDμÄêy¾Y·¢Ëí3öè¥
*
*/
void DMA1_Channel4_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_FLAG_TC4)==SET)
{
DMA_ClearFlag(DMA1_FLAG_GL4);
DMA_Cmd(DMA1_Channel4, DISABLE);
}
}
|
|