网站建设的软硬件平台,企业营销推广怎么做,做网站利润,视频 主题 wordpress一、程序简介
该程序是基于OpenHarmony标准系统编写的基础外设类#xff1a;RGB LED。
目前已在凌蒙派-RK3568开发板跑通。详细资料请参考官网#xff1a;https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk3568-openharmony/tree/master/samples/b02_hdf_rgb_led。 …一、程序简介
该程序是基于OpenHarmony标准系统编写的基础外设类RGB LED。
目前已在凌蒙派-RK3568开发板跑通。详细资料请参考官网https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk3568-openharmony/tree/master/samples/b02_hdf_rgb_led。
详细资料请参考OpenHarmony官网
GPIO平台驱动开发GPIO应用程序开发
二、硬件设计
RGB LED灯整体硬件电路如下图所示,硬件电路中包含了三个GPIO控制管脚控制RGB LED灯低电平点亮LED灯高电平熄灭LED灯。电路简单这边不对此进行多余的说明。 三、程序解析
1、目录结构
b02_hdf_rgb_led
├── config # HDF资源配置文件目录├── config.hcs # 接口IO配置文件├── device_info.hcs # 设备信息配置文件
├── drivers # 内核HDF驱动程序目录├── rgb_led_drv.c # 内核HDF驱动程序├── Makefile # 内核HDF驱动编译脚本
├── figures # MD文档图片
├── BUILD.gn # GN文件
├── rgb_led.c # 应用层控制程序
2、内核HDF驱动程序
1接口函数
函数名HdfRgbLedDriverInit.功能说明HDF初始化注册读取HDF资源配置文件获取三色灯控制GPIO管脚。
int32_t HdfRgbLedDriverInit(struct HdfDeviceObject *deviceObject)
{if (deviceObject NULL) {HDF_LOGE(g_rgbLedDriverEntry: %s failed, __func__);return HDF_ERR_INVALID_OBJECT;}struct DeviceResourceIface *CfgOps NULL;CfgOps DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);if (CfgOps NULL || CfgOps-GetUint32 NULL) {HDF_LOGE(%s: DeviceResourceGetIfaceInstance failed, __func__);return HDF_FAILURE;}if (CfgOps-GetUint32(deviceObject-property, rgb_led_version, g_rgbLedCfg.rgb_led_version, 0) ! HDF_SUCCESS) {HDF_LOGE(%s: read rgb_led_version failed, __func__);return HDF_FAILURE;}if (CfgOps-GetUint32(deviceObject-property, rgb_led_red, g_rgbLedCfg.rgb_led_red, 0) ! HDF_SUCCESS) {g_rgbLedCfg.rgb_led_version 0;HDF_LOGE(%s: read rgb_led_red failed, __func__);return HDF_FAILURE;}if (CfgOps-GetUint32(deviceObject-property, rgb_led_green, g_rgbLedCfg.rgb_led_green, 0) ! HDF_SUCCESS) {g_rgbLedCfg.rgb_led_version 0;HDF_LOGE(%s: read rgb_led_green failed, __func__);return HDF_FAILURE;}if (CfgOps-GetUint32(deviceObject-property, rgb_led_blue, g_rgbLedCfg.rgb_led_blue, 0) ! HDF_SUCCESS) {g_rgbLedCfg.rgb_led_version 0;HDF_LOGE(%s: read rgb_led_blue failed, __func__);return HDF_FAILURE;}HDF_LOGI(g_rgbLedDriverEntry: %s success, __func__);return HDF_SUCCESS;
}
函数名HdfRgbLedDriverRelease。功能说明HDF去注册。
void HdfRgbLedDriverRelease(struct HdfDeviceObject *deviceObject)
{if (deviceObject NULL) {HDF_LOGE(g_rgbLedDriverEntry: %s failed, __func__);return;}HDF_LOGI(g_rgbLedDriverEntry: %s success, __func__);return;
}
函数名HdfRgbLedDriverBind。功能说明HDF绑定解析函数。
int32_t HdfRgbLedDriverBind(struct HdfDeviceObject *deviceObject)
{if (deviceObject NULL) {HDF_LOGE(g_rgbLedDriverEntry: %s failed, __func__);return HDF_ERR_INVALID_OBJECT;}static struct IDeviceIoService ledDriverServ {.Dispatch rgbLedDriverDispatch,};deviceObject-service (struct IDeviceIoService *)(ledDriverServ);HDF_LOGI(g_rgbLedDriverEntry: %s success NodeName[%s], __func__,deviceObject-property-name);return HDF_SUCCESS;
}
函数名rgbLedDriverDispatch。功能说明解析函数解析应用层下发的命令执行命令对应操作RGB_LED_WRITE控制三色灯亮灭。
int32_t rgbLedDriverDispatch(struct HdfDeviceIoClient *client, int32_t cmdId,struct HdfSBuf *dataBuf, struct HdfSBuf *replyBuf)
{int32_t result HDF_FAILURE;int32_t rgbLedMode 0;if (client NULL || client-device NULL) {HDF_LOGE(driver device is NULL);return HDF_ERR_INVALID_OBJECT;}if (g_rgbLedCfg.rgb_led_version ! RGB_LED_VERSION) {HDF_LOGE(driver rgb_led_version not match);return HDF_FAILURE;}switch (cmdId) {case RGB_LED_WRITE:result HdfSbufReadInt32(dataBuf, rgbLedMode);if (result) {HDF_LOGI(%s: mode:[0x%X][%s%s%s], __func__, rgbLedMode,(rgbLedModeRGB_LED_RED_BIT)?R:-,(rgbLedModeRGB_LED_GREEN_BIT)?G:-,(rgbLedModeRGB_LED_BLUE_BIT)?B:-);LedGpioCtrl(g_rgbLedCfg.rgb_led_red, (rgbLedModeRGB_LED_RED_BIT)?LED_ON:LED_OFF);LedGpioCtrl(g_rgbLedCfg.rgb_led_green, (rgbLedModeRGB_LED_GREEN_BIT)?LED_ON:LED_OFF);LedGpioCtrl(g_rgbLedCfg.rgb_led_blue, (rgbLedModeRGB_LED_BLUE_BIT)?LED_ON:LED_OFF);}break;default:HDF_LOGE(%s: receiving unknown command, __func__);break;}return result;
}
函数名LedGpioCtrl。功能说明LED GPIO控制函数低电平点亮LED高电平熄灭LED。
static int32_t LedGpioCtrl(uint16_t gpio, int32_t mode)
{uint16_t level GPIO_VAL_HIGH;if (HDF_SUCCESS ! GpioSetDir(gpio, GPIO_DIR_OUT)) {HDF_LOGE(%s: GpioSetDir failed, __func__);return HDF_FAILURE;}if (mode LED_ON) {level GPIO_VAL_LOW;} else if (mode LED_OFF) {level GPIO_VAL_HIGH;}if (HDF_SUCCESS ! GpioWrite(gpio, level)) {HDF_LOGE(%s: GpioWrite failed, __func__);return HDF_FAILURE;}return HDF_SUCCESS;
}
3、应用层程序
1应用层代码分析
程序启动后获取命令行参数如果命令行不带参数RGB三色灯运行跑马灯如果命令行带参数根据传入的参数的低三位映射点亮对应的红灯、绿灯和蓝灯通过HdfIoServiceBind绑定RGB三色灯HDF服务获取HDF空间缓冲区向缓冲区写入需要控制的RGB三色灯低三位数据通过RGB_LED_WRITE命令下发到HDF驱动中从而控制RGB三色灯亮灭。程序运行结束回收HDF空间缓冲区和HDF服务。
int main(int argc, char* argv[])
{int ret HDF_SUCCESS;int32_t mode -1;if (argc ARGS_NUM) {mode atoi(argv[1]);/*low-3bits*/mode 0x7;HILOG_INFO(LOG_APP, [%s] main enter: mode[%s%s%s][0x%X],LOG_TAG,(modeRGB_LED_BLUE_BIT)?B:-,(modeRGB_LED_GREEN_BIT)?G:-,(modeRGB_LED_RED_BIT)?R:-,mode);printf(RGB mode[%s%s%s][0x%X]\n,(modeRGB_LED_BLUE_BIT)?B:-,(modeRGB_LED_GREEN_BIT)?G:-,(modeRGB_LED_RED_BIT)?R:-,mode);} else {HILOG_INFO(LOG_APP, [%s] main enter: auto test RGB LED, LOG_TAG);printf(auto test RGB LED\n);}struct HdfIoService *serv HdfIoServiceBind(RGB_LED_SERVICE_NAME);if (serv NULL) {HILOG_ERROR(LOG_APP, get service %s failed, RGB_LED_SERVICE_NAME);return -1;}struct HdfSBuf *data HdfSbufObtainDefaultSize();if (data NULL) {HILOG_ERROR(LOG_APP, obtain data failed);return -1;}if (mode -1) {mode 0x8;while (mode) {HdfSbufFlush(data);if (!HdfSbufWriteInt32(data, --mode)) {HILOG_ERROR(LOG_APP, write data failed);return -1;}ret serv-dispatcher-Dispatch(serv-object, RGB_LED_WRITE, data, NULL);sleep(1);}} else {if (!HdfSbufWriteInt32(data, mode)) {HILOG_ERROR(LOG_APP, write data failed);return -1;}ret serv-dispatcher-Dispatch(serv-object, RGB_LED_WRITE, data, NULL);}HdfSbufRecycle(data);HdfIoServiceRecycle(serv);HILOG_INFO(LOG_APP, [%s] main exit., LOG_TAG);return ret;
}
四、运行程序
系统启动后命令行运行命令
rgb_led
五、运行结果
运行结果
# rgb_led
auto test RGB LED# rgb_led 1
RGB mode[--R][0x1]
# rgb_led 2
RGB mode[-G-][0x2]
# rgb_led 3
RGB mode[-GR][0x3]
# rgb_led 4
RGB mode[B--][0x4]
# rgb_led 5
RGB mode[B-R][0x5]
# rgb_led 6
RGB mode[BG-][0x6]
# rgb_led 7
RGB mode[BGR][0x7] 最后推荐一款应用开发神器 扯个嗓子关于目前低代码在技术领域很活跃 低代码是什么一组数字技术工具平台能基于图形化拖拽、参数化配置等更为高效的方式实现快速构建、数据编排、连接生态、中台服务等。通过少量代码或不用代码实现数字化转型中的场景应用创新。它能缓解甚至解决庞大的市场需求与传统的开发生产力引发的供需关系矛盾问题是数字化转型过程中降本增效趋势下的产物。 这边介绍一款好用的低代码平台——JNPF快速开发平台。近年在市场表现和产品竞争力方面表现较为突出采用的是最新主流前后分离框架SpringBootMybatis-plusAnt-DesignVue3。代码生成器依赖性低灵活的扩展能力可灵活实现二次开发。 以JNPF为代表的企业级低代码平台为了支撑更高技术要求的应用开发从数据库建模、Web API构建到页面设计与传统软件开发几乎没有差异只是通过低代码可视化模式减少了构建“增删改查”功能的重复劳动还没有了解过低代码的伙伴可以尝试了解一下。 应用https://www.jnpfsoft.com/?csdn 有了它开发人员在开发过程中就可以轻松上手充分利用传统开发模式下积累的经验。所以低代码平台对于程序员来说有着很大帮助。