OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4358|回复: 3

STM32F103 UART3使用DMA空闲检测接收不定长数据使用困惑

[复制链接]

1

主题

8

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2017-6-27
在线时间
12 小时
发表于 2018-1-13 21:44:31 | 显示全部楼层 |阅读模式
本帖最后由 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
困扰了一天,还是没有解决
恳请哪位高人指点,谢谢啦




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2017-6-27
在线时间
12 小时
 楼主| 发表于 2018-1-13 22:28:48 | 显示全部楼层
本帖最后由 Jurry 于 2018-1-13 23:01 编辑

尴尬了,DMA通道整错了我的SPI1  UART3需要共用一个DMA通道了


1515855630(1).png
回复 支持 反对

使用道具 举报

19

主题

51

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1906
金钱
1906
注册时间
2017-10-8
在线时间
230 小时
发表于 2018-3-12 22:34:47 | 显示全部楼层
DMA_DeInit(DMA1_Channel7);楼主,我感觉您这个地方有点问题,应该是Channel3吧,您看看是吗
回复 支持 反对

使用道具 举报

19

主题

51

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1906
金钱
1906
注册时间
2017-10-8
在线时间
230 小时
发表于 2018-3-13 09:38:56 | 显示全部楼层
楼主,不好意思,又打扰您了,麻烦问您一下,您在进行串口2,3实验的时候,硬件是怎样连接的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 10:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表