RT-Thread是一个国产实时操作系统。

使用的平台:秉火STM32 Cortex-M3内核开发板,RT-Thread v3.1.3。

RT-Thread移植

以秉火-指南者STM32F103VE6为例。参考官方文档,Git仓库,在keil5中添加RT-Thread内核,并下载源码:

git clone git@github.com:RT-Thread/rt-thread.git

用keil5打开rt-thread\bsp\stm32\stm32f103-fire-arbitrary\project.uvprojx,修改下载器配置,选择芯片STM32F103VE6,并修改main.c中的LED管脚,因为此例程使用的是STM32F103ZET6芯片版本。

/* defined the LED0 pin: PF7 */
//#define LED0_PIN    GET_PIN(F, 7)
#define LED0_PIN    GET_PIN(B, 0) //LED_G
#define LED1_PIN    GET_PIN(B, 1) //LED_B
#define LED2_PIN    GET_PIN(B, 5) //LED_R
int main(void)
{int count = 1;/* set LED0 pin mode to output */rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT);rt_pin_write(LED0_PIN, PIN_LOW);rt_pin_write(LED1_PIN, PIN_LOW);rt_pin_write(LED2_PIN, PIN_LOW);while (count++){rt_pin_write(LED0_PIN, PIN_LOW);//rt_kprintf("SET LOW\n");rt_thread_mdelay(100);rt_pin_write(LED0_PIN, PIN_HIGH);  //OFF ???!//rt_kprintf("SET HIGH\n");rt_thread_mdelay(100);rt_pin_write(LED1_PIN, PIN_LOW);rt_thread_mdelay(100);rt_pin_write(LED1_PIN, PIN_HIGH);rt_thread_mdelay(100);rt_pin_write(LED2_PIN, PIN_LOW);rt_thread_mdelay(100);rt_pin_write(LED2_PIN, PIN_HIGH);rt_thread_mdelay(100);}return RT_EOK;
}

值得注意的是,PIN_HIGH会使灯关闭,PIN_LOW会使灯关闭,这一点还没有搞清楚。在控制台输出使用rt_kprintf()函数,输出在UART串口,连接电脑即可显示。

RT-Thread Qemu仿真

参考QEMU-Ubuntu,图片访问有问题,建议下载仓库查看readme。

UART读取北斗数据

在STM32F103指南者上引脚如下,其中UART1为console串口,输出信息。

PIN NAME PIN ADDR
UART1_RX PIN A9
UART1_TX PIN A10
UART3_RX PIN B10
UART3_TX PIN B11

连接北斗单元至UART3,在固件库版本中将UART1输出重定向为printf,将UART3输入重定向为scanf,这样就很轻松的读取到北斗的数据。同样的,在RT Thread版本中,在使用UART3之前首先需要定义设备和管脚,并打开:

//board.c
/*------------------------ UART3 CONFIG BEGIN -------------------------*/
#define BSP_USING_UART3
#define UART3_TX_PORT GPIOB
#define UART3_RX_PORT GPIOB
#define UART3_TX_PIN GPIO_PIN_10
#define UART3_RX_PIN GPIO_PIN_11
/*------------------------  UART3 CONFIG END  -------------------------*/

在main.c的路径下创建uart3.c文件,添加如下内容:

#include <rtthread.h>
#include <rtdevice.h>#define SAMPLE_UART_NAME "uart3"
static struct rt_semaphore rx_sem;
static rt_device_t serial;static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{rt_sem_release(&rx_sem);return RT_EOK;
}static void serial_thread_entry(void *parameter)
{char ch;while (1){while (rt_device_read(serial, -1, &ch, 1) != 1){rt_sem_take(&rx_sem, RT_WAITING_FOREVER);}rt_kprintf("%c", ch);ch = ch + 1;//rt_device_write(serial, 0, &ch, 1);}
}static int uart_sample(int argc, char *argv[])
{struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;config.baud_rate = BAUD_RATE_38400;config.data_bits = DATA_BITS_8;config.stop_bits = STOP_BITS_1;config.bufsz = 128;config.parity = PARITY_NONE;rt_err_t ret = RT_EOK;char uart_name[RT_NAME_MAX];char str[] = "hello RT-Thread!\r\n";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!\n", uart_name);return RT_ERROR;}rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config);rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);rt_device_set_rx_indicate(serial, uart_input);rt_device_write(serial, 0, str, (sizeof(str) - 1));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;
}MSH_CMD_EXPORT(uart_sample, uart device sample);

该文件中,最后一句完成看自定义命令的添加。完成以上配置后,下载后打开串口输入命令查看结果:

管脚中断

通过按键1和2改变灯的亮灭。这里主要使用了管脚输入输出和中断输入。

#include <rtthread.h>
#include <rtdevice.h>#define LED0_PIN_NUM 16  /* PB0  */
#define KEY0_PIN_NUM 0   /* PA0  */
#define KEY1_PIN_NUM 45  /* PC13 */void led_on(void *args)
{rt_kprintf("turn on led!\n");rt_pin_write(LED0_PIN_NUM, PIN_LOW);
}void led_off(void *args)
{rt_kprintf("turn off led!\n");rt_pin_write(LED0_PIN_NUM, PIN_HIGH);
}static void key_led_sample(void)
{rt_pin_mode(LED0_PIN_NUM, PIN_MODE_OUTPUT); rt_pin_write(LED0_PIN_NUM, PIN_LOW);rt_pin_mode(KEY0_PIN_NUM, PIN_MODE_INPUT_PULLUP); /* 绑定中断,下降沿模式,回调函数名为led_off */rt_pin_attach_irq(KEY0_PIN_NUM, PIN_IRQ_MODE_FALLING, led_on, RT_NULL);/* 使能中断 */rt_pin_irq_enable(KEY0_PIN_NUM, PIN_IRQ_ENABLE);rt_pin_mode(KEY1_PIN_NUM, PIN_MODE_INPUT_PULLUP);rt_pin_attach_irq(KEY1_PIN_NUM, PIN_IRQ_MODE_FALLING, led_off, RT_NULL);rt_pin_irq_enable(KEY1_PIN_NUM, PIN_IRQ_ENABLE);
}MSH_CMD_EXPORT(key_led_sample, key led sample);

STM32 RT-Thread OS实战相关推荐

  1. STM32 + RT Thread OS 学习笔记[五]

    1.  触摸屏驱动 触摸屏驱动的原理非常简单,从硬件得到坐标数据,数据加工(适配屏幕分辨率,偏移量调整),最后调用rtgui_server_post_event()函数向GUI服务端发送坐标信息. 奋 ...

  2. 关于RT thread系统节拍时钟的配置

    关于RT thread系统节拍时钟的配置                  -----本文基于rt-thread-3.1.3版本编写 首先,使用RTthread OS时,要配置(或者明白)它的系统节拍 ...

  3. Yeelink平台使用——远程控制 RT Thread + LwIP+ STM32

    1.前言     [2014年4月重写该博文]     经过若干时间的努力终于搞定了STM32+LwIP和yeelink平台的数据互通,在学习的过程中大部分时间花在以太网协议栈学习上,但是在RT Th ...

  4. 正点原子delay函数移植到rt thread操作系统(HAL库)

    正点原子教程中涉及到的操作系统只涉及了UCOS的教程,其中例程的system文件夹中的delay.c函数只是适配了UCOS. 下面将delay.c函数移植到rt thread中,使用的bsp是rt t ...

  5. stm32f407单片机rt thread 片外spi flash OTA升级配置示例

    参考地址https://www.rt-thread.org/document/site/application-note/system/rtboot/an0028-rtboot/ 第一步,生成Boot ...

  6. 使用RT Thread设备框架封装一个I2C设备——DS3231

    使用RT Thread设备框架封装一个I2C设备--DS3231 前言 ENV配置 I2C测试 将ds3231封装成一个字符设备 结语 前言 学习rt thread的I2C的时候,恰巧手上的板子留了d ...

  7. rt thread studio使用QBOOT和片外flash实现OTA升级

    我们这里要使用单片机外部flash作为OTA的下载分区,外部flash硬件连接关系 PB3-->SPI3_CLK PB4-->SPI3_MISO PB5-->SPI3_MOSI PE ...

  8. 基于Linux的kfifo移植到STM32(支持os的互斥访问)

    基于Linux的kfifo移植到STM32(支持os的互斥访问) 声明:本文为杰杰原创,转载请说明出处 https://blog.csdn.net/jiejiemcu/article/details/ ...

  9. rt thread 使用FAL遇到fal_init() undefined reference

    rt thread FAL 0.5版,之前有没有不知道,遇到一个坑. 在main.cpp里面已经 #include <fal.h> fal_init() 编译报错,说 fal_init() ...

最新文章

  1. opencv隔点采样(下采样)
  2. dubbo 部分 配置的关系-dubbo github 官方案例
  3. 0513JS基础:数组内置方法、数学函数、时间函数
  4. python是一种编译的编程语言_Python这种编程语言
  5. [转]程序员趣味读物:谈谈Unicode编码
  6. Visual Studio查找搜索类和方法的快捷方法
  7. 找出两列表的共有元素python_python 找出两个dataframe中不同的元素
  8. [剑指offer]面试题17:合并两个排序的链表
  9. shell题库选择题_shell 练习题
  10. SpringBoot 自定义监听器(Listener)
  11. getaway网关转发去前缀_蚂蚁金服 Service Mesh 大规模落地系列 - 网关篇
  12. Sketch 55 for mac(矢量绘图软件) v55.2中文永久激活版
  13. iPhone照片备份与恢复
  14. 双线服务器托管有哪些优势?
  15. 安全邮箱怎么注册?邮箱地址是什么?怎么写?快速了解tomvip邮箱
  16. 编辑ListView(Edit,Update,Inse
  17. 佳能打印机手机显示未连接服务器,佳能打印机出现服务器设置密码
  18. 十则:程序员“笑话”据说只有真正的程序员才看得懂
  19. 中国大学mooc乐学python答案_中国大学mooc慕课_乐学Python_章节期末网课答案
  20. 如何正确使用手机拍摄证件照

热门文章

  1. c++ map遍历方法 for循环
  2. html 鼠标放在div悬停事件,用js给div添加鼠标悬停事件
  3. 宁夏大学印度联合计算机,计算机联合党总支
  4. php函数substr、mb_substr、mb_strcut截取中文比较
  5. python计算身份证校验位
  6. ESP8266入门学习(一)
  7. 【JSP实验报告】手把手教Web项目=jsp+tomcat+MySQL
  8. 6岁男童乞讨养残疾父亲 遭商家空头支票(图)
  9. 脱贫了,大凉山人民是这样查询档案的
  10. 设计了一个支撑 数亿 用户的系统