新手上路
- 积分
- 47
- 金钱
- 47
- 注册时间
- 2017-6-27
- 在线时间
- 12 小时
|
本帖最后由 Jurry 于 2018-1-13 22:27 编辑
先上代码:
VOID Usart3Init(UINT32 udBound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* UART3 Port remap */
//GPIO_PinRemapConfig(GPIO_FullRemap_USART3,ENABLE);
/* USART3_TX, GPIOB.10 */
GPIO_InitStructure.GPIO_Pin = PinUsartTx3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(PortUSART3, &GPIO_InitStructure);
/* USART3_RX, GPIOB.11 */
GPIO_InitStructure.GPIO_Pin = PinUsartRx3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(PortUSART3, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = udBound;
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(USART3, &USART_InitStructure);
USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);
USART_Cmd(USART3, ENABLE);
USART_ClearFlag(USART3, USART_FLAG_TC);
DMA_DeInit(DMA1_Channel7);
DMA_InitStructure.DMA_PeripheralBaseAddr = (UINT32)(&USART3->DR);
DMA_InitStructure.DMA_MemoryBaseAddr = (UINT32)pcRcvUART3->Data_RX_BUF;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = lenUsartRcv;
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_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel7,&DMA_InitStructure);
/* DMA_IT_TC DMA_IT_TE */
DMA_ITConfig(DMA1_Channel7, DMA_IT_TC, ENABLE);
DMA_ITConfig(DMA1_Channel7, DMA_IT_TE, ENABLE);
USART_DMACmd(USART3,USART_DMAReq_Rx,ENABLE);
DMA_Cmd(DMA1_Channel7,ENABLE);
/* USART3-NVICÅäÖã¬ÇàÕ¼óÅÏè¼¶2£¬×óóÅÏè¼¶3 */
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* DMA-NVICÅäÖã¬ÇàÕ¼óÅÏè¼¶2£¬×óóÅÏè¼¶2 */
// NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel7_IRQn;
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
// NVIC_Init(&NVIC_InitStructure);
}
void USART3_IRQHandler( void )
{
UINT16 udDataTmp;
if(RESET != USART_GetITStatus(USART3,USART_IT_IDLE))
{
udDataTmp = USART3->SR;
udDataTmp = USART3->DR;
DMA_Cmd(DMA1_Channel7,DISABLE);
pcRcvUART3->InfBit.FramLength = lenUsartRcv - DMA_GetCurrDataCounter(DMA1_Channel7);
printf("UART3 Receive Data length is: %d\r\n",pcRcvUART3->InfBit.FramLength);
USART_ClearITPendingBit(USART3,USART_IT_IDLE);
DMA_SetCurrDataCounter(DMA1_Channel7,lenUsartRcv);
DMA_Cmd(DMA1_Channel7,ENABLE);
/* UART3 receive done! UART1_FSM start */
pcRcvUART3->InfBit.FramFinishFlag = 1;
//TcpClosedFlag = strstr ( pcRcvUART3->Data_RX_BUF, "CLOSED\r\n" ) ? 1 : 0;
}
}
VOID DMA1_Channel7_IRQHandler(VOID)
{
DMA_Cmd(DMA1_Channel7,DISABLE);
pcRcvUART3->InfBit.FramLength = lenUsartRcv - DMA_GetCurrDataCounter(DMA1_Channel7);
printf("UART3-1 Receive Data length is: %d\r\n",pcRcvUART3->InfBit.FramLength);
DMA_ClearITPendingBit(DMA1_IT_TC7);
DMA_ClearITPendingBit(DMA1_IT_TE7);
DMA1_Channel7->CNDTR = lenUsartRcv;
DMA_Cmd(DMA1_Channel7, ENABLE);
}
/*****************************************************************************************************************
********************************************分割线****************************************************************
*****************************************************************************************************************/
状况描述: UART1 UART2使用同样的代码结构可以进行正常收发
但对于UART3, 发送没有啥问题,可以正常发送数据
但是接收出现了问题,进入接收中断时:
pcRcvUART3->InfBit.FramLength = lenUsartRcv - DMA_GetCurrDataCounter(DMA1_Channel7);
DMA_GetCurrDataCounter(DMA1_Channel7)值一直不变,大小为lenUsartRcv
这种情况一般是DMA没有进行数据搬运吧,但是DMA配置检查了好多遍也感觉没啥问题
UART3的两个GPIO口,GPIOB_10 GPIOB_11
与IIC是复用的,但是我实际中并没有使用IIC
困扰了一天,还是没有解决
恳请哪位高人指点,谢谢啦
|
|