void uart2_init(u32 bound,u8 DMA) //?®??2??????????
{
//GPIO?????è??
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// DMA_InitTypeDef DMA_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); //????USART2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE); //??????????????GPIOA?±??
USART_DeInit(USART2); //?????®??2
//USART2_TX PA.2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //???????ì????
GPIO_Init(GPIOA, &GPIO_InitStructure); //??????PA2
//USART2_RX   A.3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PA3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//????????
GPIO_Init(GPIOA, &GPIO_InitStructure); //??????PA3
//Usart2 NVIC ????
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1; //??????????3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //×???????0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ?¨??????
NVIC_Init(&NVIC_InitStructure); //?ù?????¨????????????VIC?????÷
//USART ???????è??
USART_InitStructure.USART_BaudRate = bound; //??°??è????9600;
USART_InitStructure.USART_WordLength = USART_WordLength_9b; //×??¤??8??????????
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(USART2, &USART_InitStructure); //???????®??2
if (DMA){
USART_ITConfig(USART2, USART_IT_TXE, DISABLE); //??±?·???????
USART_ITConfig(USART2,USART_IT_RXNE,DISABLE); //??±?????????
USART_ITConfig(USART2,USART_IT_IDLE,ENABLE); //????????????????
USART_Cmd(USART2, ENABLE); //?????®??2
USART2_DMA_RX();
}
else
{
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //????????????
USART_ITConfig(USART2,USART_IT_IDLE,DISABLE); //??±?????????????
//USART_ITConfig(USART2, USART_IT_TXE, ENABLE); //????·???????
USART_Cmd(USART2, ENABLE); //?????®??2
}
void USART2_DMA_RX(void)
{
//?®????DMA????
DMA_InitTypeDef DMA_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel6_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//????DMA?±??
DMA_Cmd(DMA1_Channel6,DISABLE); //?????¨??
DMA_DeInit(DMA1_Channel6); //DMA1?¨??????
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART2->DR); //???è???·
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)RXDData; //???????·
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //dma????·??ò???ò
DMA_InitStructure.DMA_BufferSize = 3;
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??????????
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //?è??DMA????????±?
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //?è??DMA??2??memory????±??????à·???
DMA_Init(DMA1_Channel6,&DMA_InitStructure);
DMA_Cmd(DMA1_Channel6,ENABLE); //?????¨??
USART_DMACmd(USART2,USART_DMAReq_Rx,ENABLE); //????DMA·???????
}
void USART2_IRQHandler(void)
{
// uint32_t temp = 0;
if(USART_GetITStatus(USART2, USART_IT_IDLE)==SET) //???????????
{
//temp = USART2->SR; //??SR,???DR????
// temp = USART2->DR; //?USART_IT_IDLE??
LED1=~LED1;
DMA_Cmd(DMA1_Channel6,DISABLE); //??DMA??,??????????
DMA_Cmd(DMA1_Channel6,ENABLE); //??DMA??
}
用DMA方式不行,用中断方式就可以,是不是哪里不对,菜鸟求助
|