Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
UART
UART DMA传输接收不到数据
发布于 2019-09-20 01:49:48 浏览:2922
订阅该版
* 本帖最后由 aozima 于 2019-9-20 08:13 编辑 * 情况:使用的是官网给的例程[https://www.rt-thread.org/document/site/programming-manual/device/uart/uart/#dma](https://www.rt-thread.org/document/site/programming-manual/device/uart/uart/#dma) DMA接收轮询发送那个例程,没有使用msh命令,直接调用的,但是可以发送却没法接收到数据,请大佬看下程序给点指点 ```int stm32_hw_usart_init(void) { struct stm32_uart *uart; struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; RCC_Configuration(); GPIO_Configuration(); #ifdef RT_USING_UART1 /* 在rtconfig.h中配置 */ uart = &uart1; serial1.ops = &stm32_uart_ops; serial1.config = config; NVIC_Configuration(&uart1); /* register UART1 device */ rt_hw_serial_register(&serial1, "uart1", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart); #endif /* RT_USING_UART1 */ #ifdef RT_USING_UART2 uart = &uart2; serial2.ops = &stm32_uart_ops; serial2.config = config; NVIC_Configuration(&uart2); /* register UART1 device */ rt_hw_serial_register(&serial2, "uart2", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_DMA_RX, uart); #endif /* RT_USING_UART2 */ #ifdef RT_USING_UART3 uart = &uart3; serial3.ops = &stm32_uart_ops; serial3.config = config; NVIC_Configuration(&uart3); /* register UART3 device */ rt_hw_serial_register(&serial3, "uart3", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart); #endif /* RT_USING_UART3 */ return 0; } INIT_BOARD_EXPORT(stm32_hw_usart_init);``` ```int uart_dma_sample(void) { rt_err_t ret = RT_EOK; char uart_name[RT_NAME_MAX] = "uart2"; static char msg_pool[256]; char str[] = "hello RT-Thread!
"; // if (argc == 2) // { // rt_strncpy(uart_name, argv[1], RT_NAME_MAX); // } // else // { // rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX); // } /* 查找串口设备 */ serial = rt_device_find(uart_name); if (!serial) { rt_kprintf("find %s failed!
", uart_name); return RT_ERROR; } /* 初始化消息队列 */ rt_mq_init(&rx_mq, "rx_mq", msg_pool, /* 存放消息的缓冲区 */ sizeof(struct rx_msg), /* 一条消息的最大长度 */ sizeof(msg_pool), /* 存放消息的缓冲区大小 */ RT_IPC_FLAG_FIFO); /* 如果有多个线程等待,按照先来先得到的方法分配消息 */ /* 以 DMA 接收及轮询发送方式打开串口设备 */ rt_device_open(serial, RT_DEVICE_FLAG_DMA_RX); /* 设置接收回调函数 */ rt_device_set_rx_indicate(serial, uart_input); /* 发送字符串 */ rt_device_write(serial, 0, str, (sizeof(str) - 1)); /* 创建 serial 线程 */ rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10); /* 创建成功则启动线程 */ if (thread != RT_NULL) { rt_thread_startup(thread); } else { ret = RT_ERROR; } return ret; } /* 线程初始化 */ int rt_application_init() { uart_dma_sample(); return 0; }``` ```/** * This function will initial STM32 board. */ void rt_hw_board_init() { /* NVIC Configuration */ NVIC_Configuration(); /* 2-bit 抢占优先级, 2-bit 子优先级*/ /* Configure the SysTick */ SysTick_Configuration(); /* 主板上的硬件初始化 */ stm32_hw_usart_init(); /* 串口 */ stm32_hw_oled_spi_init(); /* SPI */ battery_adc_init(); /* ADC */ #ifdef RT_USING_CONSOLE rt_console_set_device(CONSOLE_DEVICE); #endif } /*@}*/``` ```/** * This function will startup RT-Thread RTOS. */ void rtthread_startup(void) { /* init board */ /* 板级初始化:包括中断向量、系统时钟、串口、SPI接口、GPIO、控制台等初始化 */ rt_hw_board_init(); /* show version */ /* 显示RT-Thread Logo 以及版本信息 */ rt_show_version(); /* init timer system */ /* 系统定时器初始化 */ rt_system_timer_init(); /* 系统堆空间内存初始化 */ rt_system_heap_init((void*)STM32_SRAM_BEGIN, (void*)STM32_SRAM_END); RTC_init(); //RTC时钟初始化 mount(); //挂载文件系统 // f_mount(FS_SD, NULL); /* init scheduler system */ /* 系统调度器初始化 */ rt_system_scheduler_init(); /* init application */ /* 应用程序初始化,创建自己的应用线程 */ rt_application_init(); #ifdef RT_USING_FINSH /* init finsh */ /* Finsh 系统初始化 */ finsh_system_init(); /* 将Finsh重定向到UART */ finsh_set_device( FINSH_DEVICE_NAME ); #endif /* init timer thread */ /* 创建定时器线程 */ rt_system_timer_thread_init(); /* 使用软件定时器时才需要软件定时器线程扫描软件定时器链表 */ /* init idle thread */ /* 创建系统空闲线程 */ rt_thread_idle_init(); /* start scheduler */ /* 启动系统调度器 */ rt_system_scheduler_start(); /* never reach here */ return; } /* 启动文件中的__main 最终会调用main()函数 */ int main(void) { /* disable interrupt first */ /* 关闭中断 */ rt_hw_interrupt_disable(); /* startup RT-Thread RTOS */ rtthread_startup(); return 0; } /*@}*/``` ![C74(]@68~6%[E3]C7I$JJD1.png](/uploads/201909/20/014713sp8n9fh9n0mhbph3.png) 调试的时候最后是创建成功线程执行了的,我想请教下还有哪些细节是我没注意到的,感谢
查看更多
13
个回答
默认排序
按发布时间排序
我夏了夏天
认证专家
2019-09-20
Life isn't about finding yourself, life is about creating yourself.
``` /* 以 DMA 接收及轮询发送方式打开串口设备 */ rt_device_open(serial, RT_DEVICE_FLAG_DMA_RX); ``` 设备打开时的配置只有 dma 接收,而没有开启发送功能? 还有注册设备填写的选项也检查一下。
CrazyH
2019-09-20
这家伙很懒,什么也没写!
1、DMA RX需要在ENV中开启 DMA支持的,目前rtt的bsp只支持DMA_RX
Hugh
2019-09-23
这家伙很懒,什么也没写!
是可以发送数据的,在串口中接收到了单片机发过来的字符串了
Hugh
2019-09-24
这家伙很懒,什么也没写!
>1、DMA RX需要在ENV中开启 DMA支持的,目前rtt的bsp只支持DMA_RX 在env中怎么配置呢?
tyustli
2019-09-24
这家伙很懒,什么也没写!
env 打开串口的时候会有选项,是否使用 DMA 功能,如果没有这个选项可以参考已有的 BSP 改一下 Kconfig 文件
Hugh
2019-09-24
这家伙很懒,什么也没写!
>env 打开串口的时候会有选项,是否使用 DMA 功能,如果没有这个选项可以参考已有的 BSP 改一下 Kconfig 文 ... 嗯嗯,谢谢,发现没有DMA_Configuration这个函数,准备补上这个函数试一下
Hugh
2019-10-09
这家伙很懒,什么也没写!
>env 打开串口的时候会有选项,是否使用 DMA 功能,如果没有这个选项可以参考已有的 BSP 改一下 Kconfig 文 ... 配置好DMA_Configuration后程序卡在了 serial->ops->dma_transmit(serial, data, length, RT_SERIAL_DMA_RX); 这个函数官网有说是stm32_dma_transmit(),这个是需要自己添加吗? ```c /* * Serial DMA routines */ rt_inline int _serial_dma_rx(struct rt_serial_device *serial, rt_uint8_t *data, int length) { rt_base_t level; int result = RT_EOK; struct rt_serial_rx_dma *rx_dma; RT_ASSERT((serial != RT_NULL) && (data != RT_NULL)); rx_dma = (struct rt_serial_rx_dma*)serial->serial_rx; RT_ASSERT(rx_dma != RT_NULL); level = rt_hw_interrupt_disable(); if (rx_dma->activated != RT_TRUE) { rx_dma->activated = RT_TRUE; serial->ops->dma_transmit(serial, data, length, RT_SERIAL_DMA_RX); } else result = -RT_EBUSY; rt_hw_interrupt_enable(level); if (result == RT_EOK) return length; rt_set_errno(result); return 0; } ```
tyustli
2019-10-09
这家伙很懒,什么也没写!
>配置好DMA_Configuration后程序卡在了 serial->ops->dma_transmit(serial, data, length, RT_SERIAL_DMA_ ... 楼主可以看一下这篇文章: https://club.rt-thread.org/ask/question/11854.html
Hugh
2019-10-09
这家伙很懒,什么也没写!
>楼主可以看一下这篇文章: https://club.rt-thread.org/ask/question/11854.html 好,谢谢
Hugh
2019-10-09
这家伙很懒,什么也没写!
>env 打开串口的时候会有选项,是否使用 DMA 功能,如果没有这个选项可以参考已有的 BSP 改一下 Kconfig 文 ... 请教一下,如果我看别的env中有很多选项比如DMA,关于那一块的配置是在哪里有文档啊
撰写答案
登录
注册新账号
关注者
0
被浏览
2.9k
关于作者
Hugh
这家伙很懒,什么也没写!
提问
3
回答
9
被采纳
0
关注TA
发私信
相关问题
1
rt thread 2.0.2 usart 接收缓存问题
2
关于STM32串口通信的问题
3
STM32F1+RTT串口接收终端数据丢失问题
4
UART TX丢数据?
5
RTT打开串口的时候如何自定义波特率呢?
6
STM32F4的USART数据接收问题
7
串口1234使用问题
8
串口接收回调函数
9
LPC18xx UART问题讨论
10
x1000串口配置的失败问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
5
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部