STM32F4的USART数据接收问题

发布于 2017-02-22 13:56:26
STM32F407VET6+RT-Thread v2.1.0 beta,工程用的是BSP包中的stm32f4xx,MDK
出现的问题:
使用USART2,DMA中断模式,每次只接收上位机发送的前64个字节,就停止了中断。如果是INT_RX模式,每次只接收1个字节,只响应3次,设置如下:

初始化

void usart_dev_init(void)
{
rt_err_t res;

GPS_uart = rt_device_find("uart2");
if( GPS_uart == RT_NULL )
{
rt_kprintf("uart2 not found!!
");
return;
}

rt_device_set_rx_indicate(GPS_uart, GPS_usart_rx_indicate);
res = rt_device_open(GPS_uart, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_DMA_RX);
if (res != RT_EOK)
{
rt_kprintf("open GPS uart error: 0x%x", -res);
}
}

// 线程
static void threads_init(void)
{
rt_thread_t usart_rx_thread;

// USART rx thread. rx is interrupt.
usart_rx_thread = rt_thread_create("urx", usart_rx_thread_entry, RT_NULL, 1024, 3, 5);
rt_thread_startup(usart_rx_thread);
}



rt_err_t GPS_usart_rx_indicate(rt_device_t dev, rt_size_t size)
{
rt_sem_release(&rx_sem);
return RT_EOK;
}

void usart_rx_thread_entry(void *p)
{
rt_bool_t result;

while( rt_sem_take(&rx_sem, RT_WAITING_FOREVER) == RT_EOK )
{
register rt_base_t temp;

// Clear the semaphore.
temp = rt_hw_interrupt_disable();
rx_sem.value = 0;
rt_hw_interrupt_enable(temp);

while( 1 )
{
int len;

// read data.
len = rt_device_read(GPSBD_uart, 0, rx_buf, RX_BUF_SIZE);

usart_bytes_recv += len;

// If receive data is empty and break
if( len == 0 )
{
break;
}
}
}
rt_kprintf("Error taking semaphore, usart rx exit!
");
}


我看usart.c的函数dma_uart_config()中已经设置为DMA_InitStructure.DMA_Mode = DMA_Mode_Circular啦,为什么还是只响应一次中断呢?还有哪个细节没处理好吗?请高手指点指点。

查看更多

关注者
0
被浏览
3.3k
3 个回答
viyjk99
viyjk99 2017-02-22
把serial.h中的

RT_SERIAL_RB_BUFSZ 修改为1024,即解决。


#ifndef RT_SERIAL_RB_BUFSZ
#define RT_SERIAL_RB_BUFSZ 1024 //64
#endif


后面慢慢学习下RTT的用法。
armink
armink 2017-02-26
RT_SERIAL_RB_BUFSZ 可以定义在 rtconfig.h 中,这样不用修改核心源码。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览