LED的C语言应用程序

2023-05-16

引言

在本文中,用C语言编写一个LED灯的应用程序,对文章《基于HDF的LED驱动程序开发》(1)、(2)中开发的LED灯的驱动程序进行测试。

另外,在编写LED灯的应用程序时,我们会用到很多由HDF框架提供的API。为了便于查阅这这些API的用法,建议大家在阅读本文的同时,打开文章《HDF驱动框架的API》(1)、(2)、(3)。在这几篇文章中汇集了本文所用到的API。当然,你也可以直接去阅读这些API的源码和官方说明文档。

本文参考了小熊派BearPi-HM_Micro_Small开发板的部分教程。

https://gitee.com/bearpi/bearpi-hm_micro_small  

在阅读本文之前,确保已阅读了《小熊派BearPi-HM_Micro_Small之Hello_World》。

一、编写源程序

首先,在路径applications/BearPi/BearPi-HM_Micro/samples/dandelion下新建一个文件夹:my_led_app

然后,在文件夹my_led_app中新建一个文件:my_led_app.c,接下来我们在这个文件中编写源程序。

这个应用程序没有用户图形界面,只能以命令行的形式运行:./my_led 参数 ,命令参数有三种取值:0、1、2,分别控制LED关闭、打开和状态切换。

在源程序my_led_app.c中,除了一些头文件和宏定义之外,主要包括以下两个函数:

函数描述
int main(int argc, char **argv)应用程序的主函数
static int LedWriteRead(struct HdfIoService *serv, uint8_t sendData, uint8_t *recvData)向驱动程序发送数据,然后接收驱动程序的响应。

1.1 头文件、宏定义

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdio.h>

#include "hdf_log.h"
#include "hdf_sbuf.h"
#include "hdf_io_service_if.h"

#define LED_WRITE_READ  1         //应用程序下发给LED驱动的命令字。1:写;0:读。
#define LED_SERVICE     "hdf_led" //LED驱动对外提供的服务的名称,与驱动配置中的名称一致。

1.2 主函数

int main(int argc, char **argv)
{
    int i;
    
    // 打印输出在终端中输入的命令行
    for (i=0; i < argc; i++)
    {
        printf("\r\nArgument %d is %s.\r\n", i, argv[i]);
    }

    // 获取驱动提供的服务 
    struct HdfIoService *serv = HdfIoServiceBind(LED_SERVICE);
    if (serv == NULL)
    {
        printf("fail to get service %s!\r\n", LED_SERVICE);
        return HDF_FAILURE;
    }
    
    // 向驱动发送LED的控制数据,从驱动接收LED当前的状态
    uint8_t replyData = 0;
    LedWriteRead(serv, atoi(argv[1]), &replyData);
    printf("\r\nGet reply is: %d\r\n", replyData);

    // 回收资源
    HdfIoServiceRecycle(serv);

	// 退出程序
    printf("exit");
    return HDF_SUCCESS;
}

main函数中,使用到了HDF提供的接口函数:HdfIoServiceBindHdfIoServiceRecycle,以及结构体HdfIoService

1.3 LedWriteRead函数

LedWriteRead函数在主函数main中被调用,用于与内核态的驱动程序交换数据。第1个参数serv:指向驱动服务对象(HdfIoService结构体)的指针;第2个参数sendData:向驱动程序下发的数据;第3个参数recvData:指向一个变量的指针,该变量用于存放从驱动函数收到的应答数据。

static int LedWriteRead(struct HdfIoService *serv, uint8_t sendData, uint8_t *recvData)
{
    int ret = HDF_SUCCESS;

    // 创建一个缓冲区,用于向驱动发送数据
    struct HdfSBuf *data = HdfSBufObtainDefaultSize();
    if (data == NULL)
    {
        printf("fail to obtain sbuf data!\r\n");
        return HDF_FAILURE;
    }

    // 创建一个缓冲区,用于从驱动接收响应
    struct HdfSBuf *reply = HdfSBufObtainDefaultSize();
    if (reply == NULL)
    {
        printf("fail to obtain sbuf reply!\r\n");
        ret = HDF_DEV_ERR_NO_MEMORY;
        goto out;
    }

    // 把要下发给驱动的数据写入缓冲区 
    if (!HdfSbufWriteUint8(data, sendData))
    {
        printf("fail to write sbuf!\r\n");
        ret = HDF_FAILURE;
        goto out;
    }

    // 调用应用态的Dispatch函数与驱动交互 
    ret = serv->dispatcher->Dispatch(&serv->object, LED_WRITE_READ, data, reply);
    if (ret != HDF_SUCCESS)
    {
        printf("fail to send service call!\r\n");
        goto out;
    }

    // 从缓冲区中读取驱动的响应数据
    if (!HdfSbufReadUint8(reply, recvData))
    {
        printf("fail to get service call reply!\r\n");
        ret = HDF_ERR_INVALID_OBJECT;
        goto out;
    }

out:
    // 回收缓冲区
    HdfSBufRecycle(data);
    HdfSBufRecycle(reply);
    
    return ret;
}

main函数中,使用到了HDF提供的接口函数:HdfSBufObtainDefaultSizeHdfSbufWriteUint8HdfSbufReadUint8HdfSBufRecycle,以及结构体HdfSBufHdfIoService

二、编写/修改编译脚本

1、在文件夹my_led_app下新建一个文件:BUILD.gn,在这个文件中编写源程序my_led_app.c的编译脚本:

import("//build/lite/config/component/lite_component.gni")

HDF_FRAMEWORKS = "//drivers/framework"

executable("my_led_exe") {
    output_name = "my_led"     
    sources = [
        "my_led_app.c",
    ]   
    include_dirs = [
    "$HDF_FRAMEWORKS/ability/sbuf/include",
    "$HDF_FRAMEWORKS/core/shared/include",
    "$HDF_FRAMEWORKS/core/host/include",
    "$HDF_FRAMEWORKS/core/master/include",
    "$HDF_FRAMEWORKS/include/core",
    "$HDF_FRAMEWORKS/include/utils",
    "$HDF_FRAMEWORKS/utils/include",
    "$HDF_FRAMEWORKS/include/osal",
    "//drivers/adapter/uhdf/posix/include",
    "//third_party/bounds_checking_function/include",
    "//base/hiviewdfx/hilog_lite/interfaces/native/innerkits",
    ]
    deps = [
        "//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared",
        "//drivers/adapter/uhdf/manager:hdf_core",
        "//drivers/adapter/uhdf/posix:hdf_posix_osal",
    ]
}

executable("my_led_exe")用于声明一个名为my_led_exe的、类型为executable的目标(target),指示编译构建子系统将源码my_led_app.c编译成名为my_led的可执行文件。

output_name用于指定编译生成的可执行文件的名称。

sources列表中是编译构建所需要的源码文件。

include_dirs列表中是源码文件中引用的头文件的路径。

deps列表中是编译构建时需要依赖的其他库。

2、修改文件夹dandelion下的编译脚本文件:BUILD.gn

import("//build/lite/config/component/lite_component.gni")

lite_component("dandelion_app") {
    features = [
        "hello_world:hello_world_exe",
        "my_led_app:my_led_app",
    ]
}

lite_component是在build/lite/config/component/lite_component.gni中定义的一个template,用于将上面那个名为my_led_exe的target纳入到名为my_led_app的编译构建目标里面。

三、编译、烧写

参考《小熊派BearPi-HM_Micro_Small之Hello_World》第五、六部分。

四、测试

待系统启动完毕后,在串口终端中依次执行以下命令:

./bin/my_led 1
./bin/my_led 0
./bin/my_led 2

将分别控制小熊派BearPi-HM_Micro_Small开发板上的LED点亮、熄灭、状态切换,串口终端终端输出入下图所示:

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LED的C语言应用程序 的相关文章

  • STM32裸机开发(3) — 使用汇编点亮LED灯

    STM32裸机开发 xff08 3 xff09 使用汇编点亮LED灯 一 启动流程 对于STM32F103从flash的启动流程如下 xff1a 首先设置栈 xff1a CPU会从0x08000000读取值 xff0c 用来设置SP 不使用
  • 阿尔法点亮LED灯(一)汇编语言

    文章目录 前言一 GPIO介绍1 MX6U IO 复用2 MX6U IO 配置3 GPIO 配置4 GPIO 时钟使能5 61 61 GPIO的使用步骤 61 61 二 程序编写1 使能 GPIO1 时钟2 设置 GPIO1 IO03 的复
  • 使用STM32点亮LED

    多学多练 一 题目描述二 设计思路三 寄存器实现01 时钟配置02 模式设置03 代码编写04 创建工程文件 四 HAL库实现01 安装 STM32CubeMX02 安装HAL库03 新建工程04 Keil仿真调试 五 硬件连接六 逻辑仿真
  • 04 点亮LED 汇编

    1 原理图 从原理图看到 xff0c 3个LED分别由GPF4 GPF5和GPF6控制 2 寄存器描述 GPF4 GPF5和GPF6可用作输入输出 xff0c 或中断功能 要点亮LED xff0c 需要将IO设置为输出模式 xff0c 并输
  • LED的使用纯汇编和C语言的点亮

    概述 我们通过观察原理图可以发现LED灯有四个分别连接在GPM4 1 GPM4 2 GPM4 3 GPM4 4上面 xff0c 这时候我们去查询我们板子4412的说明书 xff0c 去寻址寄存器的配置 初始化的时候我们需要将他配置为输出模式
  • STM32使用寄存器工程模板点亮一个LED灯

    1 环境说明 xff08 1 xff09 使用的是普中STM32F103开发板 xff08 2 xff09 keil 5软件 2 目的 点亮开发板上的LED1灯 3 步骤 xff08 1 xff09 定义一系列寄存器的宏 span clas
  • Error: L6218E: Undefined symbol LED_Init (referred from main.o).

    在使用Keil软件的过程中 xff0c 经常会出现这种报错 xff0c undefined symbol xxxx referred from xxx o 这个时候大多是 c文件没有被包含在相应的路径中 xff0c o文件在我们的工程中没有
  • 使用platform框架实现led流水灯和按键中断开启风扇

    需求 xff1a 使用platform框架实现led流水灯和按键中断开启风扇 实现过程 xff1a 设备树文件 xff1a dts v1 include 34 stm32mp157 dtsi 34 include 34 stm32mp15x
  • STM32之按键点亮LED灯(中断法)

    目录 1 操作思路 2 用CubeMX工具生成的代码 main的主函数 3 GPIO代码 gpio c 4 编写中断服务函数 5 用外部中断共用入口函数 xff0c 来调用外部中断处理回调函数 6 编写外部中断处理回调函数 xff08 在这
  • 51 汇编语言编程:8个按键控制8个LED

    89C51汇编语言写8个按键控制8个LED 按键接P2口 xff0c LED接P1口 有6按键 xff0c 按下对应LED长亮 xff0c 重复按下 xff0c LED灭 xff1b 有两个特殊按键 xff0c 按下 xff0c 对应LED
  • LED驱动电路的分析

    文章目录 一 方案一 1 电路工作原理 2 组件选择 3 个人分析 二 方案二 在方案一的基础上改进 1 电路工作原理 2 个人分析 三 方案三 在方案一的基础上改进 1 电路工作原理 2 个人分析 参考连接 常见驱动电路的分析 一 方案一
  • imx6ull 正点原子设备树适配韦东山的开发板 (一)顺利启动,配置led,button

    设备树在公司经常用到 有时候很多驱动编写也就是替换设备树 所以拿韦老师的板子练手设备树 这次尝试直接拿正点的设备书改成韦老师的板子能用 对比 正点原子的设备树结构图 韦东山的设备树结构图 从因为蓝色的是开发板厂商对开发板自己的优化 所以我们
  • Linux驱动编程篇(四)——LED驱动(二)LED驱动框架

    为应对多种芯片或开发板适配的LED驱动程序 xff0c 同时减少开发流程 xff0c 故需要在APP 驱动程序 硬件三个部分中添加一个部分 xff0c 用于放置各单板LED驱动程序的公共部分 一 LED驱动程序框架的流程图 二 对于公共部分
  • STM32上第一个程序-GPIO控制LED-第3季第5部分-朱有鹏-专题视频课程

    STM32上第一个程序 GPIO控制LED 第3季第5部分 759人已学习 课程介绍 本课程是 朱有鹏老师单片机完全学习系列课程 第3季第5个课程 xff0c 从零开始带大家写代码控制板载LED xff0c 并且用三个版本的开发板都实现了功
  • RK3308 按键Key与LED灯

    硬件原理图 LED指示灯 麦克风阵列子板上使用12颗RGB灯作为效果指示灯 用户可以通过I2C总线配置LED灯驱动IC来是实现不同场景下的灯效 按键Key 麦克风阵列子板上集成五个控制按键 xff0c 分别为 xff1a 控制音量增减的VO
  • ..\OBJ\LED.axf: Error: L6218E: Undefined symbol xTaskGetSchedulerState (referred from delay.o).

    文章目录 前言解决办法 前言 在学习FreeRTOS移植后 xff0c 编译出现 OBJ LED axf Error L6218E Undefined symbol xTaskGetSchedulerState referred from
  • LED驱动IC TM1616,TM1650,TM1651替代兼容型号(VK,AIP)

    产品型号 xff1a VK1650 产品品牌 xff1a VINKA 永嘉微电 永嘉微 封装形式 xff1a SOP16 概述 VK1650 是一种带键盘扫描电路接口的 LED 驱动控制专用电路 内部集成有 MCU 输入输出控制数字 接口
  • 查找到 LED 的距离

    想象一下 您有一个圣诞树风格的 LED 灯 距相机的距离为 D 了解了 LED 灯 例如形状和强度 和相机 例如焦距 的属性 是否可以使用快照计算从相机到 LED 灯的距离 如果是 测量的准确度如何 明亮的光源本身对此不利因为明亮的光线通常
  • 将 Arduino RGB LED 从一种颜色渐变为另一种颜色?

    目前 我已成功让 LED 灯循环显示我选择的八种颜色 一切都工作正常 除了我想要一种更自然的感觉 并且想要从一种颜色褪色 过渡到下一种颜色 而不是让它们互相替换 到目前为止 这是我的代码 int redPin 11 int greenPin
  • 我可以检测 Android 设备上是否存在“LED 通知”吗?

    背景 我有一个带有通知的应用程序 我想支持 LED 通知 并且它运行良好 在我的偏好中 我允许用户自定义 LED 通知 问题 如果设备不支持 LED 自定义选项 我不想显示这些选项 因为这可能会让用户感到困惑 如果您拥有的只是廉价的 And

随机推荐

  • 【原创】Ubuntu Server 22.04 LTS 设置主机信息以及IP地址

    1 安装网络工具 xff0c 我们需要nmcli这个工具 span class token function apt get span span class token function install span y network man
  • 【PC微信探秘】把C#的DLL注入到微信中

    NET的DLL不能直接注入 xff0c 需要两步 xff1a 先把C 43 43 的DLL注入 xff0c 然后C 43 43 把 NET的DLL引入 xff1a span class token comment dllmain cpp 定
  • 「xrdp」- 使用 Windows 远程 Linux 主机 @20210130

    xrdp xrdp xff0c 是 RDP 协议的服务端实现 xff0c 基于 FreeRDP 和 rdesktop 的工作 xff0c xrdp 使用 RDP xff08 远程桌面协议 xff09 向用户呈现图形化界面 该项目提供一个功能
  • 使用 STM32CubeMx + VSCode 开发 STM32

    使用 STM32CubeMx 43 VSCode 开发 STM32 目的 1 使用 STM32CubeMX配置STM32开发板 xff0c 生成Makefile工程 2 使用 VSCode 开发并调试 环境及工具 1 STM32CubeMx
  • Rust 编程之道-类型系统

    类型系统 基本类型 一切皆表达式 xff0c 表达式皆有值 xff0c 值皆有类型 xff0c 所以一切皆类型 包括 xff1a 基本类型复合类型作用域返回值 Option xff1c T xff1e Result xff1c T xff0
  • 揭露网络电脑短视频营销号中的套路【完全】

    1 temp 骗局 这是存放缓存文件的文件夹 xff0c 位置在C Users 用户名 AppData Local Temp win 43 r输入 temp xff0c 我们点进去 xff0c 看到文件雀氏非常多 xff0c 但是再一看大小
  • 用中断实现流水灯

    include lt stm32f4xx h gt define GPIO Pin 6 0x0040 LED2 define GPIO Pin 7 0x0080 LED1 define PLL M 8 define PLL N 336 de
  • debian 无法使用apt-get解决办法

    刚装完debian xff0c 发现直接apt get是用不了的 xff0c 系统会提示你插入DVD xff0c 其实是源的配置问题 xff0c 只需要在apt的源里面修改下配置就可以了 打开apt源文件 sudo vi etc apt s
  • 蜗牛星际C单黑群晖加USB网卡做链路聚合

    黑群晖挂载USB网卡 一不小心入了群晖的坑 xff0c 然后就是不停的折腾 xff0c 入手一个蜗牛星际C单 xff0c 装好DS918 43 后 xff0c 家里有ASUS RT AC5300 xff0c 就想着搞个链路聚合 首先当然是去
  • CentOS 7 安装zoneminder

    这里写自定义目录标题 CentOS 7 安装zoneminder1 安装centos系统 xff0c 最小化安装2 配置源3 安装 zoneminder 以及环境4 关闭SELinux5 配置时区6 添加php网页支持7 安装配置数据库8
  • linux deploy linux 安装mariadb 无法启动解决办法

    这里写自定义目录标题 linux deploy linux 安装mariadb 无法启动解决办法 linux deploy linux 安装mariadb 无法启动解决办法 手头一个旧手机 xff0c 就想来折腾一番 xff0c 装到数据库
  • linux deploy 安装debian11 armhf中安装Zoneminder

    linux deploy 安装debian11 stable armhf 中安装Zoneminder 折腾了无数遍 xff0c 然后感觉也没啥用 安装linux deploy 手机获取root权限 安装debian xff08 armhf
  • OpenWRT 中创建docker Openwrt和其他宿主机中的docker容器通信

    这里写自定义目录标题 OpenWRT 中使用创建docker Openwrt和其他宿主机中的docker容器通信网络拓扑一 准备1 openwrt镜像 xff0c 2 安装pve 二 PVE配置1 网络配置2 创建docker networ
  • sublime text自定义clang format插件格式化C++代码

    本文内容为在windows平台上通过 sublime text开发自定义插件实现调用clang format对C C 43 43 代码进行格式化 需要安装LLVM xff0c 下载链接 xff1a https github com llvm
  • 四种方法实现UITableView的cell高度自动计算

    UITableview是iOS开发中使用最频繁的一个控件 xff0c 在实际开发中 xff0c 我们经常需要定制cell xff0c 让cell显示图片 文字等 由于cell包含的图片和文字是根据服务器返回的数据进行填充的 xff0c 这就
  • iOS贝塞尔曲线(UIBezierPath)的基本使用方法

    简介 UIBezierPath是对Core Graphics框架的一个封装 xff0c 使用UIBezierPath类我们可以画出圆形 xff08 弧线 xff09 或者多边形 xff08 比如 xff1a 矩形 xff09 等形状 xff
  • 手机termux免root安装kali:一步到位+图形界面

    1 工具 xff1a 安卓 xff08 包括鸿蒙 xff09 手机 WiFi 充足的电量 脑子 2 浏览器搜索termux xff0c vnc viewer xff0c 下载安装 3 对抗华为纯净模式需要一些操作 xff0c 先断网 xff
  • iOS 谓词(NSPredicate)

    文档定义 NSPredicate xff1a A definition of logical conditions used to constrain a search either for a fetch or for in memory
  • 在Ubuntu20.04中安装中文输入法

    引言 在Ubuntu系统中 xff0c 无论是写文档还是在程序中写注释 xff0c 都经常需要用到中文输入法 本文简单介绍了三种输入法框架 xff0c 然后详细介绍了在Ubuntu 20 04系统中 xff0c IBus框架和Fcitx框架
  • LED的C语言应用程序

    引言 在本文中 xff0c 用C语言编写一个LED灯的应用程序 xff0c 对文章 基于HDF的LED驱动程序开发 xff08 1 xff09 xff08 2 xff09 中开发的LED灯的驱动程序进行测试 另外 xff0c 在编写LED灯