打印
[STM32F2]

STM32F215 串口问题

[复制链接]
1651|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
最近在用STM32F215做一个厂测工具,把四路串口的数据,通过usb hid协议传到pc端,数据量非常大,每秒大约有8k的log, 我必须把log记录下来。方案如下。
1. 我使用了USART1, USART2 UART5 USART6。
2. 在USART中开启RXNE中断,当收到RXNE中断,启动DMA接收数据, 关闭RXNE中断,打开IDEL中断
3. 当收到dam中断时,重新开启DMA接收
4. 当收到IDEL中断,关闭DMA接收,启动RXNE中断

现碰到问题如下,usart1 usart2 usart6都是可以正常工作的,uart5出现以下问题
使用串口工具,发送1个字符,可以先进入RXNE中断,然后在进入IDEL中断
在次使用串口发送1个字符,先进入RXNE中断,然后进去DMA中断。其它的串口都不会。

想问一下香主,进入IDEL中断的要求是什么,TX,RX需要什么电平状态,整个过程,没有使用TX发送一个字节,所以不会是TX引起不能进入idel模式
沙发
prettyxp|  楼主 | 2014-7-22 11:51 | 只看该作者
我在DMA控制器中,开始了传输完成中断,现论上,没有传输完NDTR设定的字节数,不应该产生中断呀!但是为什么第二次会产生DMA中呢

使用特权

评论回复
板凳
prettyxp|  楼主 | 2014-7-22 11:51 | 只看该作者
static void UART_DMA_Interrupt( void *Param )
{
        OS_ERR err;
        unsigned int cr;
        struct UART_DEVICE *uart = (struct UART_DEVICE *)Param;
        unsigned int sr = uart->uart->SR;
        uart->uart->SR = 0;
        cr = uart->uart->CR1;
        if ( (cr & 0x10) && (sr & 0x10) ){
                //IDEL ¼à²âµ½×ÜÏß¿ÕÏÐ
                uart->RecvDMA.DMA->CR = 0;       
                uart->current_buffer->Recv_Size = sizeof(uart->current_buffer->buffer) - uart->RecvDMA.DMA->NDTR;
                uart->RecvDMA.DMA->NDTR = 0;
                OSQPost( &uart->Recv_Queue, (void *)uart->current_buffer, 1,OS_OPT_POST_NO_SCHED |  OS_OPT_POST_ALL | OS_OPT_POST_FIFO, &err );
                uart->uart->CR1 |= (0x20);
                uart->uart->CR1 &= (~0x10);
        }
        if ( (cr & 0x20) && (sr & 0x20) ){
                //RXNE ¶ÁÊý¾Ý¼Ä´æÆ÷·Ç¿Õ
                uart->uart->CR1 |= (0x10);
                if ( uart->current_buffer == NULL ){
                        uart->current_buffer = &uart->Recv[0];
                }else if ( uart->current_buffer == &uart->Recv[0] ){
                        uart->current_buffer = &uart->Recv[1];
                }else if ( uart->current_buffer == &uart->Recv[1] ){
                        uart->current_buffer = &uart->Recv[2];
                }else if ( uart->current_buffer == &uart->Recv[2] ){
                        uart->current_buffer = &uart->Recv[3];
                }else{
                        uart->current_buffer = &uart->Recv[0];
                }
                USART_DMA_Recv( uart->RecvDMA.DMA, (void *)&uart->uart->DR, uart->current_buffer, sizeof(uart->current_buffer->buffer) );
                uart->uart->CR1 &= (~0x20);
        }
        cr = uart->uart->CR1;
}

使用特权

评论回复
地板
prettyxp|  楼主 | 2014-7-22 11:52 | 只看该作者
static void UART_Recv_DMA_Interrupt( void *Param )
{
        OS_ERR err;
        struct UART_DMA *Channel = (struct UART_DMA *)Param;
        DMA_TypeDef *DMA = get_dma( Channel->DMA );
        int flag = get_dma_stream( Channel->DMA );
        unsigned int isr = (0 == flag ? DMA->LISR : DMA->HISR);
        unsigned int ccr = Channel->DMA->CR;
        register struct UART_RECV *pbuf = NULL;
        register struct UART_RECV *current = Channel->device->current_buffer;
        isr &= get_dma_mask( Channel->DMA );
        if ( 0 == flag ){
                DMA->LIFCR |= isr;
        }else{
                DMA->HIFCR |= isr;
        }
        current->Recv_Size = sizeof(current->buffer);
        if ( current == NULL ){
                pbuf = &Channel->device->Recv[0];
        }else if ( current == &Channel->device->Recv[0] ){
                pbuf = &Channel->device->Recv[1];
        }else if ( current == &Channel->device->Recv[1] ){
                pbuf = &Channel->device->Recv[2];
        }else if ( current == &Channel->device->Recv[2] ){
                pbuf = &Channel->device->Recv[3];
        }else{
                pbuf = &Channel->device->Recv[0];
        }
        Channel->device->current_buffer = pbuf;
        USART_DMA_Recv( Channel->device->RecvDMA.DMA, (void *)&Channel->device->uart->DR, pbuf, sizeof(pbuf->buffer) );
        OSQPost( &Channel->device->Recv_Queue, (void *)current, 1, OS_OPT_POST_NO_SCHED | OS_OPT_POST_ALL | OS_OPT_POST_FIFO, &err );
}

使用特权

评论回复
5
prettyxp|  楼主 | 2014-7-22 11:53 | 只看该作者
我已经把相关代码贴出来了,麻烦香主有空帮我看一下逻辑

使用特权

评论回复
6
prettyxp|  楼主 | 2014-7-22 14:44 | 只看该作者
本帖最后由 prettyxp 于 2014-7-22 14:46 编辑

原理图

使用特权

评论回复
7
airwill| | 2014-7-23 10:19 | 只看该作者
看看问题是不是在这里?

使用特权

评论回复
8
prettyxp|  楼主 | 2014-7-23 16:44 | 只看该作者
airwill 发表于 2014-7-23 10:19
看看问题是不是在这里?

我直接从CPU飞线(USART3)到R111的另一端,并断开r111, 也存在这种现象

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

34

帖子

0

粉丝