初识RT-Thread
做世界级的 OS,让万物互联,信息畅通无阻。
成为未来 AIoT 领域最为主流的操作系统平台。
简介
RT-Thread 是一个集实时操作系统(RTOS)内核、中间件组件和开发者社区于一体
的技术平台,由熊谱翔先生
带领并集合开源社区力量开发而成,RT-Thread 也是一个组件完整丰富、高度可伸缩、简易开发、超低功耗、高安全性
的物联网操作系统
。
前景
RT-Thread 具备一个 IoT OS 平台所需的所有关键组件,例如GUI、网络协议栈、安全传输、低功耗组件等等。经过11年的累积发展,RT-Thread 已经拥有一个国内最大的嵌入式开源社区
,同时被广泛应用于能源、车载、医疗、消费电子等多个行业,累积装机量超过 14亿 台,成为国人自主开发
、国内最成熟稳定和装机量最大的开源 RTOS
。
软件生态
RT-Thread 拥有良好的软件生态
,支持市面上所有主流的编译工具如 GCC、Keil、IAR 等,工具链完善、友好,支持各类标准接口,如 POSIX、CMSIS、C++应用环境、Javascript 执行环境等,方便开发者移植各类应用程序。商用支持所有主流MCU架构,如 ARM Cortex-M/R/A, MIPS, X86, Xtensa, C-Sky, RISC-V,几乎支持市场上所有主流的 MCU 和 Wi-Fi 芯片。
实验准备
- 编程工具:
RT-Thread studio
- 开发板:
潘多拉STM32L475
实验需求
- 1.使用按键控制蜂鸣器和电机,当按下KEY0 后电机左转,当按下KEY1 后电机
右转,当按下KEY2 后电机停止,当按住WK_UP 时蜂鸣器鸣叫,松开WK_UP 后蜂鸣器关闭。
- 2.其中KEY0 KEY1 KEY2 三个按键会触发中断,通过pin 设备的中断回调函数控制电机,WK_UP 按键通过轮询的方式控制蜂鸣器鸣叫。
操作流程
新建RT-Thread工程
RT-Thread Studio界面介绍
代码编写
烧录
串口监视
代码演示
1.头文件
1 2 3
| #include <rtthread.h> #include <rtdevice.h> #include <board.h>
|
2.宏定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #define PIN_KEY0 GET_PIN(D, 10) #define PIN_KEY1 GET_PIN(D, 9) #define PIN_KEY2 GET_PIN(D, 8) #define PIN_WK_UP GET_PIN(C,13)
#define PIN_MOTOR_A GET_PIN(A,1) #define PIN_MOTOR_B GET_PIN(A,0)
#define PIN_BEEP GET_PIN(B,2)
enum { MOTOR_STOP, MOTOR_LEFT, MOTOR_RIGHT };
|
3.void motor_ctrl(rt_uint8_t turn) //电机控制函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| void motor_ctrl(rt_uint8_t turn) { if (turn == MOTOR_STOP) { rt_pin_write(PIN_MOTOR_A, PIN_LOW); rt_pin_write(PIN_MOTOR_B, PIN_LOW); } else if (turn == MOTOR_LEFT) { rt_pin_write(PIN_MOTOR_A, PIN_LOW); rt_pin_write(PIN_MOTOR_B, PIN_HIGH); } else if (turn == MOTOR_RIGHT) { rt_pin_write(PIN_MOTOR_A, PIN_HIGH); rt_pin_write(PIN_MOTOR_B, PIN_LOW); } else { rt_kprintf("err parameter ! Please enter 0-2."); } }
|
4.void beep_ctrl(rt_uint8_t on) //蜂鸣器控制函数
1 2 3 4 5 6 7 8 9 10 11
| void beep_ctrl(rt_uint8_t on) { if (on) { rt_pin_write(PIN_BEEP, PIN_HIGH); } else { rt_pin_write(PIN_BEEP, PIN_LOW); } }
|
5.void irq_callback(void *args) // 中断回调函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| void irq_callback(void *args) { rt_uint32_t sign = (rt_uint32_t)args; switch (sign) { case PIN_KEY0: motor_ctrl(MOTOR_LEFT); rt_kprintf("KEY0 interrupt. motor turn left."); break; case PIN_KEY1: motor_ctrl(MOTOR_RIGHT); rt_kprintf("KEY1 interrupt. motor turn right."); break; case PIN_KEY2: motor_ctrl(MOTOR_STOP); rt_kprintf("KEY2 interrupt. motor stop."); break; default: rt_kprintf("error sign= %d !", sign); break; } }
|
6.主函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| int main(void) { unsigned int count = 1;
rt_pin_mode(PIN_KEY0, PIN_MODE_INPUT_PULLUP); rt_pin_mode(PIN_KEY1, PIN_MODE_INPUT_PULLUP); rt_pin_mode(PIN_KEY2, PIN_MODE_INPUT_PULLUP); rt_pin_mode(PIN_WK_UP, PIN_MODE_INPUT_PULLDOWN);
rt_pin_mode(PIN_MOTOR_A, PIN_MODE_OUTPUT); rt_pin_mode(PIN_MOTOR_B, PIN_MODE_OUTPUT);
rt_pin_mode(PIN_BEEP, PIN_MODE_OUTPUT);
rt_pin_attach_irq(PIN_KEY0, PIN_IRQ_MODE_FALLING , irq_callback , (void *)PIN_KEY0 ); rt_pin_attach_irq(PIN_KEY1, PIN_IRQ_MODE_FALLING , irq_callback , (void *)PIN_KEY1 ); rt_pin_attach_irq(PIN_KEY2, PIN_IRQ_MODE_FALLING , irq_callback , (void *)PIN_KEY2 );
rt_pin_irq_enable(PIN_KEY0, PIN_IRQ_ENABLE); rt_pin_irq_enable(PIN_KEY1, PIN_IRQ_ENABLE); rt_pin_irq_enable(PIN_KEY2, PIN_IRQ_ENABLE); while (count > 0) { if (rt_pin_read(PIN_WK_UP) == PIN_HIGH) { rt_thread_mdelay(50); if (rt_pin_read(PIN_WK_UP) == PIN_HIGH) { rt_kprintf("WK_UP pressed. beep on."); beep_ctrl(1); } } else { beep_ctrl(0); } rt_thread_mdelay(10); count++; }
return 0; }
|
原理讲解
通过按键引脚、电机以及蜂鸣器的输入输出模式,并对按键设置中断编写中断回调函数,在使能中断后。
1.电机控制:当有外部事件触发引脚状态(按下按键)时,中断回调函数对特定的触发引脚进行判断,并执行相应的操作
2.蜂鸣器控制:在主函数中循环执行判断是否WK_UP按键是否按下,按下触发蜂鸣器响,松开停止发声。
按键 |
功能 |
KEY0 |
电机左转 |
KEY1 |
电机右转 |
KEY2 |
电机停止 |
WK_UP |
蜂鸣器响 |