Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
初学者请教RT-Thread1.0.0中USART1通讯问题
发布于 2012-02-28 22:57:41 浏览:5846
订阅该版
将《编程指南》中设备驱动部分的例子在STM32f107金牛开发板上运行,编译通过,但是无法正常运行,代码如下,驱动部分没有变动,请帮忙看下哪部分有问题?还是缺少了哪一部分?多谢了。 ``` #include
#include
#define UART1_GPIO GPIOA #define UART1_GPIO_RX (GPIO_Pin_10) #define UART1_GPIO_TX (GPIO_Pin_9) void rt_hw_message_init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 , ENABLE); GPIO_InitStructure.GPIO_Pin = UART1_GPIO_RX; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(UART1_GPIO, &GPIO_InitStructure); /* Configure USART1 Tx (PA.09) as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = UART1_GPIO_TX; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(UART1_GPIO, &GPIO_InitStructure); } //UART接收消息结构 struct rx_msg { rt_device_t dev; rt_size_t size; }; //用于接收消息的消息队列 static rt_mq_t rx_mq; //接收线程的接收缓冲区 static char uart_rx_buffer[64]; //数据达到回调函数 rt_err_t uart_input(rt_device_t dev,rt_size_t size) { struct rx_msg msg; msg.dev=dev; msg.size=size; //发送消息到消息队列中 rt_mq_send(rx_mq,&msg,sizeof(struct rx_msg)); return RT_EOK; } static void rt_message_thread_entry(void* parameter) { int count=0; struct rx_msg msg; rt_device_t device,write_device; rt_err_t result=RT_EOK; rt_hw_message_init(); device=rt_device_find("USART1"); if(device!=RT_NULL) { //设置回调函数及打开设备 rt_device_set_rx_indicate(device,uart_input); rt_device_open(device,RT_DEVICE_OFLAG_RDWR); } //设置写设备 write_device=device; while(1) { //从消息队列中读取消息 result=rt_mq_recv(rx_mq,&msg,sizeof(struct rx_msg),50); if(result==-RT_ETIMEOUT) { //接收超时 rt_kprintf("timeout count:%d ,++count"); } //成功收到信息 if(result==RT_EOK) { rt_uint32_t rx_length; rx_length=(sizeof(uart_rx_buffer)-1)>msg.size? msg.size:sizeof(uart_rx_buffer)-1; //读取消息 rx_length=rt_device_read(msg.dev,0,&uart_rx_buffer[0],rx_length); uart_rx_buffer[rx_length]=' '; //写到写设备中 if(write_device!=RT_NULL) rt_device_write(write_device,0,&uart_rx_buffer[0],rx_length); } } } int rt_application_init() { rt_thread_t message_thread; message_thread=rt_thread_create("message", rt_message_thread_entry,RT_NULL, 1024,10,10); rt_thread_startup(message_thread); } ```
查看更多
9
个回答
默认排序
按发布时间排序
bernard
2012-02-28
这家伙很懒,什么也没写!
指南中多少页的代码?
liyan2007828
2012-02-28
这家伙很懒,什么也没写!
143页的
bernard
2012-02-29
这家伙很懒,什么也没写!
这个代码你是否调试过? 用list_device()查看过当前系统中存在的设备吗?从你的代码来看,如果驱动代码你未改过的话, device=rt_device_find("USART1"); 这句话返回的肯定是RT_NULL,即系统中不存在以USART1为名字的设备。RTT是不推荐使用大写形式的名字信息。
liyan2007828
2012-02-29
这家伙很懒,什么也没写!
>这个代码你是否调试过? > >用list_device()查看过当前系统中存在的设备吗?从你的代码来看,如果驱动代码你未改过的话, >device=rt_device_find("USART1"); > >这句话返回的肯定是RT_NULL,即系统中不存在以USART1为名字的设备。RTT是不推荐使用大写形式的名字信息。 --- 编译是通过的,将device=rt_device_find("USART1");中的USART1改成了uart1,还是无法正常运行。 代码的目的是通过串口调试软件,向USART1中输入数据,产生接收中断,然后将接收到的数据返回给电脑。 有两点疑问: 1、是否需要在application.c中对“消息队列”和usart1初始化,如何初始化; 2、STM32F107的金牛开发板不能仿真,如何使用list_device()查看过当前系统中存在的设备呢?
bernard
2012-03-01
这家伙很懒,什么也没写!
建议,入门时: 先跑kernel + led 然后是kernel + finsh shell finsh shell在RT-Thread里占据极为重要的角色,如果不了解shell的操作、使用方法,再去接触其他的都是吃力的。 在有了kernel + finsh shell之后,可以慢慢接触一些kernel example,然后才是device。
liyan2007828
2012-03-01
这家伙很懒,什么也没写!
好的,谢谢 bernard的耐心提示。
taurus3g
2012-03-04
这家伙很懒,什么也没写!
V 0.3.0 版本中,包括在V1.0.0 同样, 无法采用UART1 的接收的问题: 这里的原因: 在启动代码里(start_rvds.s): DCD USART1_IRQHandler ; USART1 但是在uart.c 文件内,没有定义: 这个中断的服务。 所以ARMCC 采取的默认程序,就是WHILE(1); 但是在serial.c 内 完成定义一个串口中断的接收服务函数: /* ISR for serial interrupt */ void rt_hw_serial_isr(rt_device_t device) { rt_base_t level; struct stm32_serial_device* uart = (struct stm32_serial_device*) device->private; struct stm32_serial_int_rx* int_rx = uart->int_rx; if(USART_GetITStatus(uart->uart_device, USART_IT_RXNE) != RESET) { /* interrupt mode receive */ RT_ASSERT(device->flag & RT_DEVICE_FLAG_INT_RX); /* save on rx buffer */ while (uart->uart_device->SR & USART_FLAG_RXNE) { /* disable interrupt */ level = rt_hw_interrupt_disable(); /* save character */ int_rx->rx_buffer[int_rx->save_index] = uart->uart_device->DR & 0xff; int_rx->save_index ++; if (int_rx->save_index >= UART_RX_BUFFER_SIZE) int_rx->save_index = 0; /* if the next position is read index, discard this 'read char' */ if (int_rx->save_index == int_rx->read_index) { int_rx->read_index ++; if (int_rx->read_index >= UART_RX_BUFFER_SIZE) int_rx->read_index = 0; } /* enable interrupt */ rt_hw_interrupt_enable(level); } /* clear interrupt */ USART_ClearITPendingBit(uart->uart_device, USART_IT_RXNE); /* invoke callback */ if (device->rx_indicate != RT_NULL) { rt_size_t rx_length; /* get rx length */ rx_length = int_rx->read_index > int_rx->save_index ? UART_RX_BUFFER_SIZE - int_rx->read_index + int_rx->save_index : int_rx->save_index - int_rx->read_index; device->rx_indicate(device, rx_length); } } if (USART_GetITStatus(uart->uart_device, USART_IT_TC) != RESET) { /* clear interrupt */ USART_ClearITPendingBit(uart->uart_device, USART_IT_TC); } } 解决方法: 1) 在uart.c 文件内加入: 位置在 #if def RT_USING_UART1 的有效范围内: void USART1_IRQHandler() __attribute__ ((alias("Rt_uart1_irq_handler"))); void Rt_uart1_irq_handler(void) { /* Call into the generic code to handle the IRQ for this specific device */ rt_hw_serial_isr( & uart1_device); } 不知大侠,这样是否正确?
bernard
2012-03-05
这家伙很懒,什么也没写!
有这个问题吗?不可能 void USART1_IRQHandler(void) 这个函数的实现在stm32f10x_it.c中。
撰写答案
登录
注册新账号
关注者
0
被浏览
5.8k
关于作者
liyan2007828
这家伙很懒,什么也没写!
提问
2
回答
16
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
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
RT Thread 源码分析笔记 :线程和调度器
2
RT-Thread项目助手v0.2.0 - 支持Env Windows
3
RttreadV5.10上,GD32F450Z RTC时间显示问题
4
rt-smart启动流程分析
5
EtherKit快速上手PROFINET
热门标签
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
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
聚散无由
2
篇文章
12
次点赞
Wade
2
篇文章
2
次点赞
xiaorui
1
篇文章
1
次点赞
zhuzhuzhu
1
篇文章
1
次点赞
catcatbing
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部