rt-thread中的串口初始化过程

嵌入式系统:rt-thread

开发板:STM32F429

上了嵌入式操作系统的程序结构复杂,所以串口初始化的过程也不如裸机程序直观明了,在需要根据实际情况修改串口时,就会存在找不到相关程序位置的现象,所以接下来,对rt-thread中的串口初始化过程进行一下梳理。

1.首先在rt-thread的内核Kernelcomponents.c文件中,有一个rtthread_startup()函数,该函数被$Sub$$main()__low_level_init()entry()三个函数中均有调用,而这三个函数中,具体执行哪个,取决于宏定义,而三个函数前对应的宏定义__CC_ARM__CLANG_ARM__ICCARM____GNUC__是MDK中使用的编译器来选择的。这里推测应该是使用的$Sub$$main()函数。而该函数中$Sub$$的作用就是在main函数执行前,先执行以下这个函数中的代码,即rtthread_startup()函数。

2.rtthread_startup()函数中,主要是rt-thread进行板级的一些初始化,如打印rt-thread的logo信息,系统时钟的初始化,系统调度初始化,空闲进程的初始化等。其中rt_hw_board_init()函数中,就是对一些板级硬件的初始化,该函数的定义位于drv_common.c文件中。

  • 13
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
RT-Thread作品秀】基于加速度计的智能灯光控制系统作者:明哲 概述这个项目灵感来源于实际生活。我家住在农村,在晚上起夜上厕所是一件难事,虽然对年轻人来说是比较简单的,但是对于老年人确是一件比较麻烦是事情,最主要的是在醒来后去开灯是十分危险的。为了解决这个问题我想到一个自动开灯的方案,就是通过手环来时间开灯。整体分文手环部分、主控部分、灯光控制部分、以及屏幕显示部分。 开发环境硬件:ART-Pi、3.5寸SPI屏幕 RT-Thread版本:4.0.3 开发工具及版本:RT-Thread Studio 1.1.5 keil5 RT-Thread使用情况概述RT-Thread主要使用组等分别为:finsh命令、DFS、POSIX、SPI、串口、Pin与lic。自己还将ucGUI移植到了RT-Thread。 硬件框架硬件部分主要是采用开发板作为系统核心、手环采用STM32单片机。其灯光控制部分采用LED模拟,蓝牙使用HC05蓝牙模块。手环部分主要是加速度计与电源模块,电源主要是锂电池供电,这个我已经成功的制作了一个电源管理模块。电源管理模块主要是对USB以及锂电池电压实现变换,其充电芯片使用MCP73833,电池升压部分使用TPS61230,降压部分使用TLV75733。 软件框架 软件模块说明 main.c文件主要用于初始化,以及开启线程 Display.c用于存放GuI创建的窗口、按钮等控件以及GUI测试函数 ugui_config.h用于配置uGUI。 ugui.c用于存放GUI函数。 Ugui_port.c主要是液晶屏底层驱动与Gui驱动之间的配置 演示效果 代码地址在附件。 比赛感悟 随着RT-Thread大赛结束,我的作品最终没有达到我理想的要求而结束。这是我参加工作后第一次参加这样的比赛,经过这次比赛之后感触颇多,学到的东西也很多。 首先,总结分析一下失败的原因。最主要的是时间的把控,由于工作比较繁忙,我趁着自己的空闲时间完成了整体的框架,作为一名硬件工程师我也是第一次接触OS系统,虽然很难,但是我仍然享受着比赛的过程。虽然时间比较紧张,但是我还是完成了整体的框架制作。 然后,总结一下经过这次比赛的收获。经过这次比赛之后,自我感觉到自己收获了很多的东西,与书本上学到的所不同。虽然这次比赛以失败而宣告结束,但是我觉得在这次比赛的全过程,包括RT-Thread系统的学习,这也为我以后的工作又添加了一份新的技能。在这个过程也让我学会了做事必须严谨、认真。 最后感谢电路城的官方人员给我们这次机会,可以接触到这么优秀的国产嵌入式系统,也不由余力的创办这次大赛,谢谢。
RT-Thread Studio 使用串口设备,可以按照以下步骤进行: 1. 在设备管理器找到串口设备,并记录下其名称和端口号。 2. 在 RT-Thread Studio 创建一个名为 uart 的设备对象,并设置好其配置参数,如波特率、数据位、停止位和校验位等。 3. 在应用程序调用相应的 API 函数来进行串口通信,如发送数据、接收数据等。 以下是一个使用串口设备的示例代码: ```c #include <rtthread.h> #include <rthw.h> #define UART_NAME "uart1" // 串口设备名称 #define UART_BUFSZ 128 // 缓冲区大小 static rt_device_t uart_dev; // 串口设备对象 static char uart_buffer[UART_BUFSZ];// 串口数据缓冲区 static void uart_thread_entry(void *parameter) { rt_size_t rx_len; while (1) { rt_memset(uart_buffer, 0, UART_BUFSZ); // 从串口设备读取数据 rx_len = rt_device_read(uart_dev, 0, uart_buffer, UART_BUFSZ); if (rx_len > 0) { // 处理接收到的数据 rt_kprintf("Received: %s\n", uart_buffer); } // 延时一段时间 rt_thread_mdelay(10); } } int main(void) { // 初始化串口设备 uart_dev = rt_device_find(UART_NAME); rt_device_open(uart_dev, RT_DEVICE_FLAG_RDWR); // 创建串口线程 rt_thread_t tid = rt_thread_create("uart", uart_thread_entry, RT_NULL, 1024, 25, 5); rt_thread_startup(tid); return 0; } ``` 在上述代码,首先通过 rt_device_find() 函数找到名为 uart1 的串口设备,并通过 rt_device_open() 函数打开该设备。然后创建一个名为 uart 的线程,该线程不断从串口设备读取数据,并进行处理。可以根据实际需要修改线程的优先级、堆栈大小等参数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值