【玩转 RT-Thread】 RT-Thread Studio —— 按键控制电机正反转、蜂鸣器

简介: 【玩转 RT-Thread】 RT-Thread Studio —— 按键控制电机正反转、蜂鸣器

文章目录

一、初识RT-Thread

做世界级的 OS,让万物互联,信息畅通无阻。

成为未来 AIoT 领域最为主流的操作系统平台。

1.简介

RT-Thread 是一个集实时操作系统(RTOS)内核、中间件组件和开发者社区于一体的技术平台,由熊谱翔先生带领并集合开源社区力量开发而成,RT-Thread 也是一个组件完整丰富、高度可伸缩、简易开发、超低功耗、高安全性物联网操作系统

2.前景

RT-Thread 具备一个 IoT OS 平台所需的所有关键组件,例如GUI、网络协议栈、安全传输、低功耗组件等等。经过11年的累积发展,RT-Thread 已经拥有一个国内最大的嵌入式开源社区,同时被广泛应用于能源、车载、医疗、消费电子等多个行业,累积装机量超过 14亿 台,成为国人自主开发、国内最成熟稳定和装机量最大的开源 RTOS

3.软件生态

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 按键通过轮询的方式控制蜂鸣器鸣叫。

四、操作流程

1.新建RT-Thread工程

2.RT-Thread Studio界面介绍

3.代码编写

4.烧录

5.串口监视

五、代码演示

1.头文件

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>

2.宏定义

//按键初始化
#define PIN_KEY0 GET_PIN(D, 10) // PD10: KEY0 --> KEY
#define PIN_KEY1 GET_PIN(D, 9) // PD9: KEY1 --> KEY
#define PIN_KEY2 GET_PIN(D, 8) // PD8: KEY2 --> KEY
#define PIN_WK_UP GET_PIN(C,13)//PC13:WK_UP
//电机初始化
#define PIN_MOTOR_A GET_PIN(A,1)//PA1:MOTOR_A
#define PIN_MOTOR_B GET_PIN(A,0)//PA0:MOTOR_B
//蜂鸣器初始化
#define PIN_BEEP GET_PIN(B,2)//PB2:BEEP
enum
{
    MOTOR_STOP,
    MOTOR_LEFT,
    MOTOR_RIGHT
};

3.void motor_ctrl(rt_uint8_t turn) //电机控制函数

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) //蜂鸣器控制函数

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) // 中断回调函数

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.主函数

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 蜂鸣器响


相关文章
|
图形学 容器
QT chart图表(温度曲线实战)
QT chart图表(温度曲线实战)
1114 0
|
芯片
最详细STM32,cubeMX 按键点亮 led
最详细STM32,cubeMX 按键点亮 led
852 0
|
IDE 编译器 开发工具
C/C++ IDE环境 (Qt Creator visual studio等) Cmake工程不显示头文件的解决方案
C/C++ IDE环境 (Qt Creator visual studio等) Cmake工程不显示头文件的解决方案
1217 0
|
监控 Java Shell
基于python+uiautomator2,2020.12月最新库的使用方法,更新watcher使用方法(三)
WatchContext,目前的这个watch_context是用threading启动的,每2s检查一次 目前还只有click这一种触发操作
2030 0
|
移动开发 小程序 Linux
【Linux】Linux和Window下\r与\n的区别、git命令行的使用
目录 1. 回车换行符在Window下和在Linux下的区别: 1.1回车换行符: 1. 2.行缓冲区打印: 1.3进度条小程序 :
700 0
|
关系型数据库 芯片
ovp过压过流保护芯片,大电流限流,高压,选型大齐全
本文介绍了过压保护(OVP)和过流限流保护(OCP)的基本概念及其应用场景,如蓝牙耳机、充电宝等。文中推荐了几款平芯微的OVP/OCP保护芯片,包括单OVP芯片PW1600、W2609A、PW2605,以及OVP和OCP二合一的PW1605、PW1558A、PW1515等,详细列出了各芯片的主要特点和适用范围。
ovp过压过流保护芯片,大电流限流,高压,选型大齐全
构造LR(1)分析表和LALR(1)分析表
构造LR(1)分析表和LALR(1)分析表
836 3
|
缓存 JavaScript Java
苍穹外卖开发心得(下)
苍穹外卖开发心得(下)
573 5
|
缓存 编译器 C++
第十五问:volatile是什么?有什么用?
本文深入探讨了C/C++中的`volatile`关键字,解释了其防止编译器不当优化、保证多线程间可见性和确保硬件状态正确读写的作用。同时,文章也指出了使用`volatile`可能带来的性能影响,并强调了它在多线程同步中的局限性。通过具体示例,帮助读者更好地理解和应用这一强大工具。
|
消息中间件 Linux 芯片
RT-Thread快速入门-体验RT-Thread
RT-Thread快速入门-体验RT-Thread
670 0
RT-Thread快速入门-体验RT-Thread