初级会员

- 积分
- 95
- 金钱
- 95
- 注册时间
- 2015-3-30
- 在线时间
- 33 小时
|
20金钱
void uart_init(u32 bound)
{
//GPIO¶Ë¿úéèÖÃ
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //ê1ÄüUSART1£¬GPIOAê±Öó
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //ê1ÄüDMA′«êä
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3|RCC_APB1Periph_USART2,ENABLE);//ê1ÄüUSART2ê±Öó
USART_DeInit(USART3); //¸′λ′®¿ú1
//USART1_TX PA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸′óÃíÆíìêä3ö
GPIO_Init(GPIOB, &GPIO_InitStructure); //3õê¼»ˉPA9
//USART1_RX PA.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿Õêäèë
GPIO_Init(GPIOB, &GPIO_InitStructure); //3õê¼»ˉPA10
//Usart1 NVIC ÅäÖÃ
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//ÇàÕ¼óÅÏè¼¶3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //×óóÅÏè¼¶3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQí¨μàê1Äü
NVIC_Init(&NVIC_InitStructure); //¸ù¾YÖ¸¶¨μÄ2Îêy3õê¼»ˉVIC¼Ä′æÆ÷
//USART 3õê¼»ˉéèÖÃ
USART_InitStructure.USART_BaudRate = bound;//ò»°ãéèÖÃÎa9600;
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(USART3, &USART_InitStructure); //3õê¼»ˉ′®¿ú
/// USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);//¿aÆô¿ÕÏDÖD¶Ï
//USART_DMACmd(USART3,USART_DMAReq_Rx,ENABLE); //ê1Äü′®¿ú1 DMA½óêÕ
// USART_Cmd(USART3, ENABLE); //ê1Äü′®¿ú
//Ïàó|μÄDMAÅäÖÃ
DMA_DeInit(DMA1_Channel3); //½«DMAμÄí¨μà5¼Ä′æÆ÷ÖØéèÎaè±ê¡Öμ ′®¿ú1¶Ôó|μÄêÇDMAí¨μà5
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART3->DR; //DMAíaéèADC»ùμØÖ·
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)DMA_Rece_Buf; //DMAÄú′æ»ùμØÖ·
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //êy¾Y′«êä·½Ïò£¬′óíaéè¶áè¡·¢Ëíμ½Äú′æ
DMA_InitStructure.DMA_BufferSize = DMA_Rec_Len; //DMAí¨μàμÄDMA»o′æμÄ′óD¡
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //íaéèμØÖ·¼Ä′æÆ÷2»±ä
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //Äú′æμØÖ·¼Ä′æÆ÷μYÔö
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //êy¾Y¿í¶èÎa8λ
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //êy¾Y¿í¶èÎa8λ
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //1¤×÷ÔúÕy3£»o′æÄ£ê½
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //DMAí¨μà xóμóDÖDóÅÏè¼¶
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMAí¨μàxûóDéèÖÃÎaÄú′æμ½Äú′æ′«êä
DMA_Init(DMA1_Channel3, &DMA_InitStructure); //¸ù¾YDMA_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉDMAμÄí¨μàUSART1_Tx_DMA_ChannelËù±êê¶μļÄ′æÆ÷
USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);//¿aÆô¿ÕÏDÖD¶Ï
USART_DMACmd(USART3,USART_DMAReq_Rx,ENABLE); //ê1Äü′®¿ú1 DMA½óêÕ
USART_Cmd(USART3, ENABLE);
DMA_Cmd(DMA1_Channel3, ENABLE); //Õyê½Çy¶ˉDMA′«êä
}
//ÖØD»ָ′DMAÖ¸Õë
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{
DMA_Cmd(DMA_CHx, DISABLE ); //1رÕUSART1 TX DMA1 ËùÖ¸ê¾μÄí¨μà
DMA_SetCurrDataCounter(DMA_CHx,DMA_Rec_Len);//DMAí¨μàμÄDMA»o′æμÄ′óD¡
DMA_Cmd(DMA_CHx, ENABLE); //ê1ÄüUSART1 TX DMA1 ËùÖ¸ê¾μÄí¨μà
}
//·¢Ëílen¸ö×Ö½ú.
//buf:·¢ËíÇøê×μØÖ·
//len:·¢ËíμÄ×Ö½úêy
void Usart3_Send(u8 *buf,u8 len)
{
u8 t;
for(t=0;t<len;t++) //Ñ-»··¢Ëíêy¾Y
{
while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
USART_SendData(USART3,buf[t]);
}
while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
}
//′®¿úÖD¶Ïoˉêy
void USART3_IRQHandler(void) //′®¿ú1ÖD¶Ï·tÎñ3ìDò
{
#ifdef OS_TICKS_PER_SEC //èç1ûê±Öó½úÅÄêy¶¨òåáË,ËμÃ÷òaê1óÃucosIIáË.
OSIntEnter();
#endif
if(USART_GetITStatus(USART3, USART_IT_IDLE) != RESET) //½óêÕÖD¶Ï(½óêÕμ½μÄêy¾Y±ØDëêÇ0x0d 0x0a½áÎ2)
{
MYDMA_Enable(DMA1_Channel3);
USART_ReceiveData(USART3);//¶áè¡êy¾Y ×¢òa£oÕa¾ä±ØDëòa£¬·ñÔò2»Äü1»Çå3yÖD¶Ï±ê־λ¡£Îòò22»ÖaμàÎaé¶£¡
//Usart1_Rec_Cnt = DMA_Rec_Len-DMA_GetCurrDataCounter(DMA1_Channel3); //Ëã3ö½ó±¾Ö¡êy¾Y3¤¶è
//if(DMA_Rece_Buf[5]==0x01)
//{
// GPIO_SetBits(GPIOD,GPIO_Pin_0);
//delay_ms(1000);
// GPIO_ResetBits(GPIOD,GPIO_Pin_0);
//}
//memset(DMA_Rece_Buf,0,200);
//***********Ö¡êy¾Y′|àíoˉêy************//
//printf ("The lenght:%d\r\n",Usart1_Rec_Cnt);
//printf ("The data:\r\n");
//Usart1_Send(DMA_Rece_Buf,Usart1_Rec_Cnt);
//printf ("\r\nOver! \r\n");
//*************************************//
USART_ClearITPendingBit(USART3, USART_IT_IDLE); //Çå3yÖD¶Ï±êÖ¾
// MYDMA_Enable(DMA1_Channel3); //»Ö¸′DMAÖ¸Õ룬μè′yÏÂò»′ÎμĽóêÕ
// DMA_Cmd(DMA1_Channel3, ENABLE);
}
#ifdef OS_TICKS_PER_SEC //èç1ûê±Öó½úÅÄêy¶¨òåáË,ËμÃ÷òaê1óÃucosIIáË.
OSIntExit();
#endif
}
求大神帮忙看下,谢谢
|
|