(一)STM32L4(RT- Thread)——电机和蜂鸣器,独立按键,LED灯

news2024/10/6 5:59:07

(一)STM32L4(RT- Thread)——电机和蜂鸣器,独立按键,LED灯

文章目录

  • (一)STM32L4(RT- Thread)——电机和蜂鸣器,独立按键,LED灯
    • LED灯
      • 学习目标
      • 实验结果
      • 内容
      • 代码
      • 总结
    • 独立按键
      • 学习目标
      • 成果展示
      • 硬件知识
      • 代码
      • 总结
    • 电机和蜂鸣器
      • 学习目标
      • 成果展示
      • 硬件知识
        • 电机
        • 蜂鸣器
      • 代码
      • 讲解
      • 总结

LED灯

学习目标

今天我们来学习点亮潘多拉开发板的LED灯,同时也是首次在项目中使用RT - Thread操作系统,目前感觉变化不大,和裸机开发很像,可能到后面才能发现有不同之处吧,值得一提的是 RT - Thread 的日志系统通过串口打印信息到电脑,这一点还是比较好玩的,好了,让我们进入知识的讲解。

实验结果

WeChat

WeChat

内容

说实话点亮LED灯还是比较简单的,就是通过给高低电平来控制亮灭,这部分就不详细介绍了,主要来介绍一下RT - Thread。

代码

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

#define DBG_TAG "main"
#define DBG_LVL         DBG_LOG
#include <rtdbg.h>

/* 配置 LED 灯引脚 */          
#define LED_PIN              PIN_LED_R

int main(void)
{
    unsigned int count = 1;

    /* 设置 LED 引脚为输出模式 */
    rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);

    while (count > 0)
    {
        /* LED 灯亮 */
        rt_pin_write(LED_PIN, PIN_LOW);
        LOG_D("led on, count: %d", count);
        rt_thread_mdelay(500);

        /* LED 灯灭 */
        rt_pin_write(LED_PIN, PIN_HIGH);
        LOG_D("led off");
        rt_thread_mdelay(500);

        count++;
    }

    return 0;
}
void rt_pin_mode(rt_base_t pin, rt_base_t mode)

在这里插入图片描述

有关这个函数 ,我们来简单的介绍一下,学习途径当然是官方手册啦,这是可以设置的参数。

rt_pin_write(LED_PIN, PIN_LOW);

​ 这个就是设置低电平,比较简单。

LOG_D("led on, count: %d", count);
LOG_D("led off");

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TFOnldBN-1673401750609)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

​ 这个是通过串口来打印,结果如下。

在这里插入图片描述


​ 接下来我们来看一看RGB灯的实现,如果理解了上面的代码,就比较好理解。

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

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

/* 定义 LED 亮灭电平 */
#define LED_ON  (0)
#define LED_OFF (1)

/* 定义 8 组 LED 闪灯表,其顺序为 R G B */
static const rt_uint8_t _blink_tab[][3] =
{
    {LED_ON, LED_ON, LED_ON},
    {LED_OFF, LED_ON, LED_ON},
    {LED_ON, LED_OFF, LED_ON},
    {LED_ON, LED_ON, LED_OFF},
    {LED_OFF, LED_OFF, LED_ON},
    {LED_ON, LED_OFF, LED_OFF},
    {LED_OFF, LED_ON, LED_OFF},
    {LED_OFF, LED_OFF, LED_OFF},
};

int main(void)
{
    unsigned int count = 1;
    unsigned int group_num = sizeof(_blink_tab)/sizeof(_blink_tab[0]);
    unsigned int group_current;

    /* 设置 RGB 灯引脚为输出模式 */
    rt_pin_mode(PIN_LED_R, PIN_MODE_OUTPUT);
    rt_pin_mode(PIN_LED_G, PIN_MODE_OUTPUT);
    rt_pin_mode(PIN_LED_B, PIN_MODE_OUTPUT);

    while (count > 0)
    {
        /* 获得组编号 */
        group_current = count % group_num;

        /* 控制 RGB 灯 */
        rt_pin_write(PIN_LED_R, _blink_tab[group_current][0]);
        rt_pin_write(PIN_LED_G, _blink_tab[group_current][1]);
        rt_pin_write(PIN_LED_B, _blink_tab[group_current][2]);

        /* 输出 LOG 信息 */
        LOG_D("group: %d | red led [%-3.3s] | green led [%-3.3s] | blue led [%-3.3s]",
            group_current,
            _blink_tab[group_current][0] == LED_ON ? "ON" : "OFF",
            _blink_tab[group_current][1] == LED_ON ? "ON" : "OFF",
            _blink_tab[group_current][2] == LED_ON ? "ON" : "OFF");

        /* 延时一段时间 */
        rt_thread_mdelay(500);
        count++;
    }
    return 0;
}

在这里插入图片描述

​ 比较简单,就不介绍了。

总结

​ 总体来说目前还是比较简单的使用,遇到问题也可以自行查找资料解决,期待以后关于RT - Thread的学习。

独立按键

学习目标

​ 今天要介绍的是有关独立按键的知识,简单来说,非常简单,所以就不详细介绍了。

成果展示

独立按键

硬件知识

在这里插入图片描述

代码

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

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

int main(void)
{
    unsigned int count = 1;

    /* 设置 RGB 灯引脚的模式为输出模式 */
    rt_pin_mode(PIN_LED_R, PIN_MODE_OUTPUT);
	rt_pin_mode(PIN_LED_G, PIN_MODE_OUTPUT);
	rt_pin_mode(PIN_LED_B, PIN_MODE_OUTPUT);
    /* 设置 KEY 引脚的模式为输入模式 */
    rt_pin_mode(PIN_KEY0, PIN_MODE_INPUT);
	rt_pin_mode(PIN_KEY1, PIN_MODE_INPUT);
	rt_pin_mode(PIN_KEY2, PIN_MODE_INPUT);

    while (count > 0)
    {
        /* 读取按键 KEY 的引脚状态 */
        if (rt_pin_read(PIN_KEY0) == PIN_LOW)
        {
            rt_thread_mdelay(50);
            if (rt_pin_read(PIN_KEY0) == PIN_LOW)
            {
                /* 按键已被按下,输出 log,点亮 LED 灯 */
                LOG_D("KEY0 pressed!");
                rt_pin_write(PIN_LED_R, PIN_LOW);
            }
        }
		else if (rt_pin_read(PIN_KEY1) == PIN_LOW)
        {
            rt_thread_mdelay(50);
            if (rt_pin_read(PIN_KEY1) == PIN_LOW)
            {
                /* 按键已被按下,输出 log,点亮 LED 灯 */
                LOG_D("KEY1 pressed!");
				rt_pin_write(PIN_LED_G, PIN_LOW);
            }
        }
		else if (rt_pin_read(PIN_KEY2) == PIN_LOW)
        {
            rt_thread_mdelay(50);
            if (rt_pin_read(PIN_KEY2) == PIN_LOW)
            {
                /* 按键已被按下,输出 log,点亮 LED 灯 */
                LOG_D("KEY2 pressed!");
				rt_pin_write(PIN_LED_B, PIN_LOW);
            }
        }
        else 
        {
            /* 按键没被按下,熄灭 LED 灯 */
            rt_pin_write(PIN_LED_R, PIN_HIGH);
			rt_pin_write(PIN_LED_G, PIN_HIGH);
			rt_pin_write(PIN_LED_B, PIN_HIGH);
        }
        rt_thread_mdelay(10);
        count++;
    }
    return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pDnCQleW-1673401750612)(E:\照片\MarkDown\image-20230111093736022.png)]

总结

​ 下一个。

电机和蜂鸣器

学习目标

​ 接下来我们学习的是有关电机以及蜂鸣器的知识,其中用到了中断的知识点,还是有点意思的,接下来我们来看看吧!

成果展示

电机与蜂鸣器

硬件知识

电机

​ 有关电机的部分我们需要简单介绍一下,主要就是电机的驱动方式与电路连接,电机驱动芯片选用的是L9110S。

在这里插入图片描述

在这里插入图片描述

​ 其中驱动方式如下表所示,我们只需要给高低电平即可驱动电机。
在这里插入图片描述

蜂鸣器

​ 蜂鸣器就是一个简单的放大电路,之前在F407介绍过,在此就不介绍了。
在这里插入图片描述
在这里插入图片描述

代码

​ 代码如下,但是有些部分我们得要好好讲解一下,毕竟是第一次接触RT-Thread 的中断。

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

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

/* 枚举 */
enum
{
    MOTOR_STOP,
    MOTOR_LEFT,
    MOTOR_RIGHT
};

/* 电机控制 */
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
    {
        LOG_D("err parameter ! Please enter 0-2.");
    }
}

void beep_ctrl(rt_uint8_t on)
{
    if (on)
    {
        rt_pin_write(PIN_BEEP, PIN_HIGH);
    }
    else
    {
        rt_pin_write(PIN_BEEP, PIN_LOW);
    }
}

/* 中断回调 */
void irq_callback(void *args)
{
    rt_uint32_t sign = (rt_uint32_t)args;
    switch (sign)
    {
    case PIN_KEY0:
        motor_ctrl(MOTOR_LEFT);
        LOG_D("KEY0 interrupt. motor turn left.");
        break;
    case PIN_KEY1:
        motor_ctrl(MOTOR_RIGHT);
        LOG_D("KEY1 interrupt. motor turn right.");
        break;
    case PIN_KEY2:
        motor_ctrl(MOTOR_STOP);
        LOG_D("KEY2 interrupt. motor stop.");
        break;
    default:
        LOG_E("error sign= %d !", sign);
        break;
    }
}

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)
            {
                LOG_D("WK_UP pressed. beep on.");
                beep_ctrl(1);
            }
        }
        else
        {
            beep_ctrl(0);
        }
        rt_thread_mdelay(10);
        count++;
    }
    return 0;
}

在这里插入图片描述


讲解

 rt_pin_attach_irq(PIN_KEY0, PIN_IRQ_MODE_FALLING, irq_callback, (void *)PIN_KEY0);

​ 核心就是这个函数第一次见,关于参数什么的也不理解,所以我们首先去查找官方手册,看看官方的介绍。

rt_err_t rt_pin_attach_irq	(	rt_int32_t 	         pin,
                                rt_uint32_t 	     mode,
                                void(*)(void *args)  hdr,
                                void * 	             args 
)	

​ 参数含义如下所示,可以说是非常清楚了。

在这里插入图片描述

返回RT_EOK 成功;失败返回其他错误码。

总结

​ 本次还是收获比较大的,学习了RT-Thread 的中断,继续加油。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/154779.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5.8.2、TCP 的连接释放

1、释放流程图 释放流程图 2、TCP 使用 “四报文挥手” 释放连接的具体过程 TCP 通过 “四报文挥手” 来释放连接 数据传输结束后&#xff0c;TCP 通信双方都可以释放连接 现在 TCP 客户进程和 TCP 服务器进程都处于连接已建立状态\color{blue}连接已建立状态连接已建立状态…

k8s 文件 目录挂载

k8s 文件 目录挂载1.环境说明2.HostPath 挂载至宿主机3.挂载至nfs3.1 第一种3.2 第二种3.3 volumeClaimTemplates 挂载模板4.emptyDir-临时数据卷5.未完待续1.环境说明 k8s 1.24.3 2.HostPath 挂载至宿主机 apiVersion: v1 kind: Pod metadata:name: test-pd spec:container…

【Git 从入门到精通】Git是干什么的?

文章目录一、Git简介1.发展历史2.工作机制分析3.代码托管中心二、理解版本控制1.什么是版本控制&#xff1f;2.版本控制的好处3.版本控制的手段①集中式版本控制工具②分布式版本控制工具一、Git简介 Git 是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处…

Spool Print Fool(CVE-2022-21999 )提权漏洞

Spool Print Fool&#xff08;CVE-2022-21999 &#xff09;提权漏洞 文章目录 一、Print Spooler 简介二、漏洞简介三、影响版本四、本地复现五、漏洞修复 一、Print Spooler 简介 Print Spooler是打印后台处理服务&#xff0c;即管理所有本地和⽹络打印队列及控制所有打印⼯作…

Scala 模式匹配

文章目录Scala 模式匹配一、模式匹配1、基本语法2、语法说明3、案例示例二、模式守卫三、模式匹配类型1、匹配常量2、匹配类型3、匹配数组Scala 模式匹配 一、模式匹配 Scala 中的模式匹配类似于Java中的switch语法&#xff0c;但是scala 从语法中补充了更多的功能&#xff0…

Optional更优雅的判空

我们在日常的开发工作最经常碰到的异常就是空指针异常&#xff0c;排查起来非常麻烦影响开发效率。如果想避免这种问题&#xff0c;就要写大量的if(xx ! null){}这样的冗余代码&#xff0c;把自己的逻辑写入到括号内部&#xff0c;这样的代码看起来臃肿繁琐。JDK8中为我们提供了…

IP 分支组网解决方案

IP 分支机构组网解决方案在总部部署高性能设备作为中心网关&#xff0c;在各地分支机构分别部署一台产品作为分支机构接入网关&#xff0c;与总部网关进行加密的连接。融合多种产品特性&#xff0c;可有效、快速、安全的实现分支机构的远程接入。同时&#xff0c;采用集中管控平…

对象,类与面向对象编程 上

目录 前言 理解对象 属性的类型 数据属性【Data Properties】 访问器属性【Accessor Properties】 合并对象 对象标识及相等判定 增强的对象语法 1. 属性值简写 2.可计算属性 3.简写方法名 4.对象解构 5.嵌套解构 创建对象 工厂模式 构造函数模式 原型模式 原型…

【敲敲云】零代码平台快速入门指南—上篇

本文通过快速搭建一个《客户管理》应用&#xff0c;帮您快速掌握搭建敲敲云应用的基本思路和操作。 一、敲敲云简介 敲敲云是一个APaaS平台,零代码的应用搭建平台,无需编程简单易学,可以帮助业务人员在不写代码的情况下搭建个性化的CRM、ERP、OA等。敲敲云支持自动化工作流还可…

GIOU 附图说明

在目标检测中&#xff0c;常用IOU评价检测框和ground truth框的相似程度&#xff0c; IOU intersection / union. IOU的取值范围是[0,1]. 但是看下面这两种情况&#xff0c;两个目标框的距离是不一样的&#xff0c;这时它们的IOU都是0&#xff0c;反映不出来。 这时就可以用到…

【JavaGuide面试总结】Linux篇

【JavaGuide面试总结】Linux篇1.介绍一下inode2.说一下Linux系统的目录结构3.说一下Linux系统的文件类型1.介绍一下inode 硬盘的最小存储单位是扇区(Sector)&#xff0c;块(block)由多个扇区组成。文件数据存储在块中。块的最常见的大小是 4kb&#xff0c;约为 8 个连续的扇区…

Linux系统编程——共享内存映射(进程间通信)

目录mmap函数1.函数原型2.建立映射区3.注意事项4.父子进程间mmap通信4.无血缘关系进程间mmap通信写进程&#xff1a;读进程&#xff1a;附&#xff1a;文件用于进程间通信mmap函数 1.函数原型 void *mmap(void *addr&#xff0c;size_t length, int prot,int flags&#xff0…

代码随想录训练营第五十六天

1.两个字符串的删除操作 题583 ①dp数组含义 由于有两个数组比较&#xff0c;所以用二维数组dp。dp[i] [j]表示以i-1为结尾的word1和以j-1为结尾的word2达到相等需要删除的元素的个数。 ②递推公式 两种情况&#xff0c;当word[i-1] word2[j-1]时&#xff0c;有没有i-1为结…

【Linux】gcc编译器的使用(程序的翻译过程)

目  录1 程序的翻译1.1预处理&#xff08;进行宏替换&#xff09;1.2 编译&#xff08;生成汇编代码&#xff09;1.3 汇编&#xff08;生成机器可识别代码&#xff09;1.4 链接&#xff08;生成可执行文件或者库文件&#xff09;1.5 gcc常用选项总结程序的翻译过程包括&#…

Diffie-Hellman密钥协商算法探究

作者 | 魔王赵二狗 导读 隐私计算&#xff08;Privacy-preserving computation&#xff09;是指在保证数据提供方不泄露原始数据的前提下&#xff0c;对数据进行分析计算的一系列信息技术&#xff0c;保障数据在流通与融合过程中的可用不可见。而Diffie–Hellman密钥协商是一种…

2023-01-10 mysql列存储引擎-聚合多线程并行扫表-VCPackGuardian策略LOCK_ALL-概要设计

摘要: 当前的pack淘汰策略为LOCK_ONE, 在多线程切换时导致pack地址丢失。 新设计LOCK_ALL策略以保证多线程聚合正常工作。 设计思想: 多线程聚合运算期间, 对持有的pack不做淘汰业务中对pack的读取和释放保持原有逻辑架构设计: 静态结构: 动态结构: 上层业务通过VirtualCol…

【学习笔记之Linux】工具之vim基本介绍

vim基本认识 vim是一种多模式的编辑器&#xff0c;它是vi的升级版本&#xff0c;它兼容vi所有的指令并加入了一些新的特性在里面。vi是一个老式的文本编辑器&#xff0c;功能相当齐全&#xff0c;vim则是在vi之上更进了一步&#xff0c;拥有代码补全、编译及错误跳转等功能&…

pytorch OutOfMemoryError

torch.cuda.OutOfMemoryError before: self.memory deque(maxlen50000) after: self.memory deque(maxlen500) ok.... pytorch模型提示超出内存cuda runtime error(2): out of memory - pytorch中文网 看到这个提示&#xff0c;表示您的GPU内存不足。由于我们经常在PyTo…

做外贸有没有好的软件?

在外贸电商行业中&#xff0c;邮件营销是非常重要的一种营销方式之一。除了性价比高&#xff0c;他还能对目标客户进行精准营销。但是&#xff0c;对于刚开始做的公司来讲&#xff0c;不注意方法和细节也难收获到理想的营销效果。 一、问题 1&#xff09;不管理邮箱联系人 只…

13.Isaac教程--模型制作

模型制作 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 该软件包演示了具有软件定义装配工作流程的工厂场景。 在模拟工厂环境中&#xff0c;多个 AMR 在装配站之间运输材料&#xff0c;而每个装配站的机械臂拾取所需材料并将其放置在对接的 …