Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
嵌入式技术综合讨论
轻松理解uart驱动
发布于 2012-10-03 23:06:35 浏览:4037
订阅该版
看到wiki里面有专门的一个文档描述RTT下的uart驱动,描述的应该很详细,但是不太容易一下子理清思路,下面简单地概括的描述一下RTT下的uart驱动,有助于理清整个驱动框架。 按照调用次序分别进行阐述(stm32): rt_hw_board_init:这个函数是整个bsp的入口,在里面调用了rt_hw_usart_init函数。 rt_hw_usart_init:这个函数将进行uart初始化.此函数本身对具体的芯片提供的串口参数(USART_InitTypeDef)进行配置,然后调用一个rt_hw_serial_register函数进行注册工作。 rt_hw_serial_register:这个函数将会对传进来的rt_device_t对象进行初始化,初始化主要是对串口的一下统一接口进行指定。如下所示: ```device->type = RT_Device_Class_Char; device->rx_indicate = RT_NULL; device->tx_complete = RT_NULL; device->init = rt_serial_init; device->open = rt_serial_open; device->close = rt_serial_close; device->read = rt_serial_read; device->write = rt_serial_write; device->control = rt_serial_control; device->user_data = serial;``` 然后紧接着调用rt_device_register,这个函数是整个RTT的设备注册的接口。其实这个函数内部直接调用了rt_object_init来完成具体的device的注册动作的。注意的是调用rt_object_init的时候传递的device的parent域。 rt_object_init:到了这里将会把device的parent域内部的list节点加入到系统的设备链表中。这是通过rt_list_insert_after实现的。 也就是说我们的串口驱动最开始的那个rt_device_t对象device最终在RTT设备驱动中被记录的是其第一个域parent。而这个parent是整个RTT的对象管理通用类型struct rt_object。在struct rt_object管理的时候是通过不同的type来实现对多种不同类型的object来区分对待的。 最后我们倒回来看,整个uart的驱动算是初始化完成了,如果用这个uart的话,你还得进行一项操作,那就是你在学习RTT的过程当中所看到xxxx_set_device函数,比如rt_console_set_device是用来将我们的rt_kprintf函数重定向到指定名字的uart设备上。这样我们就可以用这个指定的uart来实现打印了。 我们就用rt_console_set_device来举例分析: rt_console_set_device:这个函数就想将以ascii字符串指定的名字的uart驱动附加在我们的虚拟console设备上。注意这里的ascii字符串是在我们注册uart驱动的时候指定的名字——在调用rt_hw_serial_register函数时传入的name。 系统在查找设备的时候调用rt_device_find也是根据这个名字来查找设备的。这里有一个需要特别注意的地方——RT_NAME_MAX。有关于RT_NAME_MAX在这里被提到的意义,我就不多说了,看卡代码就懂了。 还需要注意的是rt_device_find的实现,这个函数通过找到我们之前所注册的parent域,然后利用了一个技巧,这个技巧就是——由于parent是rt_device_t对象的第一个域,所以其parent的地址就等于整个device对象的地址。看如下代码: ```/* try to find device object */ information = &rt_object_container[RT_Object_Class_Device]; for (node = information->object_list.next; node != &(information->object_list); node = node->next) { object = rt_list_entry(node, struct rt_object, list); if (rt_strncmp(object->name, name, RT_NAME_MAX) == 0) { /* leave critical */ if (rt_thread_self() != RT_NULL) rt_exit_critical(); return (rt_device_t)object; } }``` 至此我们就可以使uart驱动为我们工作了! [s:175]
查看更多
1
个回答
默认排序
按发布时间排序
撰写答案
登录
注册新账号
关注者
0
被浏览
4k
关于作者
geniusgogo
这家伙很懒,什么也没写!
提问
42
回答
157
被采纳
7
关注TA
发私信
相关问题
1
开新板块了! 迅速占领第一帖!
2
有想玩点阵做电子钟的没?手上有屏
3
LED点阵屏硬件保护研究笔记
4
USB相关、Android、Arduino
5
Arduino即将发布ARM平台新产品
6
关于开关电源的同步整流技术
7
rt_thread_wizard使用教程
8
[转]开源如何盈利
9
FM3系列MCU的IO操作笔记。
10
转一个xoolhaha 的寻一起开发的帖子
推荐文章
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
env中添加lvgl软件包后,keil编译包--c99错误
3
【NXP-MCXA153】 定时器驱动移植
4
GD32F450 看门狗驱动适配
5
【NXP-MCXA153】看门狗驱动移植
热门标签
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
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
keil_MDK
msh
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
7
个答案
2
次被采纳
a1012112796
18
个答案
1
次被采纳
红枫
7
个答案
1
次被采纳
Ryan_CW
5
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
本月文章贡献
YZRD
3
篇文章
6
次点赞
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
11
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部