【X806开发板试用】PWM呼吸灯、无刷电调、按键测试样例

环境配置

通过我上篇文章:【XR806开发板试用】Ubuntu环境配置,将配置摸清楚后,就可以开始愉快的编写代码了😄

视频演示

https://www.bilibili.com/video/BV1NF411B74o/?aid=295027788&cid=467687216&page=1

https://www.bilibili.com/video/BV1yR4y1W7aa/?aid=337519010&cid=467692707&page=1

https://www.bilibili.com/video/BV1iY411H73w/?aid=252527215&cid=467695434&page=1

编写思路

寻找使用

为了节省更多的flash空间,在xr872/xr808/xr806芯片上把大部分的驱动都已经做了rom化处理,即出厂的时候已经把外设驱动都集成到rom当中,因此默认sdk中驱动的代码是不能修改的。而客户有时候调试需要在驱动层添加一些打印信息或者修改外设驱动的配置,此时则需要舍弃rom化的驱动,自己在源代码上添加相应的驱动了。
在这里插入图片描述

文件中还提供一下模板可以供我们参考:
在这里插入图片描述

寻找一些预定义

在这里插入图片描述

在这里插入图片描述

代码部分

PWM文件夹BUILD.gn

import("//device/xradio/xr806/liteos_m/config.gni")     #必须,config中定义了头文件路径和关键宏定义

static_library("app_pwm") {
   configs = []

   sources = [
  "main.c",
   ]

   cflags = board_cflags

   include_dirs = board_include_dirs
   include_dirs += [
    ".",
    "//base/iot_hardware/peripheral/interfaces/kits",
    "//device/xradio/xr806/xr_skylark/project", 
   ]
}

PWM文件夹下main.c

#include <stdio.h>
#include "ohos_init.h"                                  
#include "kernel/os/os.h"
#include "iot_gpio.h"
#include "driver/chip/hal_pwm.h"

static OS_Thread_t g_main_thread; 

#define PWM_OUTPUT_CHL PWM_GROUP1_CH2 
#define PWM_OUTPUT_MODE       PWM_CYCLE_MODE

#define GPIO_INPUT_PORT            GPIO_PORT_A
#define GPIO_INPUT_PIN             GPIO_PIN_11

int max_duty_ratio=0;

static void gpio_input_init(void)
{
	GPIO_InitParam param;
	param.driving = GPIO_DRIVING_LEVEL_1;
	param.mode = GPIOx_Pn_F0_INPUT;
	param.pull = GPIO_PULL_NONE;
	HAL_GPIO_Init(GPIO_INPUT_PORT, GPIO_INPUT_PIN, &param);
}

static  uint8_t gpio_input_read(void)
{
	return (uint8_t)HAL_GPIO_ReadPin(GPIO_INPUT_PORT, GPIO_INPUT_PIN);
}

static void gpio_input_deinit(void)
{
	HAL_GPIO_DeInit(GPIO_INPUT_PORT, GPIO_INPUT_PIN);
}

static void gpio_input_test(void)
{
	printf("gpio input test start.\n");

	gpio_input_init();

	uint8_t i;
	for (i = 0; i < 10; i++) {
		printf("gpio level: %d\n", gpio_input_read());
		OS_MSleep(500);
	}

}

static void pwm_cycle_mode_Set(void)
{
    HAL_Status status = HAL_ERROR;
    PWM_ClkParam clk_param;
    PWM_ChInitParam ch_param;

    clk_param.clk = PWM_CLK_HOSC;
    clk_param.div = PWM_SRC_CLK_DIV_1;

    status = HAL_PWM_GroupClkCfg(PWM_OUTPUT_CHL, &clk_param);
    if (status != HAL_OK)
        printf("%s(): %d, PWM group clk config error\n", __func__, __LINE__);

    ch_param.hz = 50;
    ch_param.mode = PWM_OUTPUT_MODE;
    ch_param.polarity = PWM_HIGHLEVE;
    max_duty_ratio = HAL_PWM_ChInit(PWM_OUTPUT_CHL, &ch_param);
    if (max_duty_ratio == -1)
        printf("%s(): %d, PWM ch init error\n", __func__, __LINE__);

    printf("max_duty_ratio=%d\n", max_duty_ratio);
    status = HAL_PWM_ChSetDutyRatio(PWM_OUTPUT_CHL, 0);
    if (status != HAL_OK)
        printf("%s(): %d, PWM set duty ratio error\n", __func__, __LINE__);

    status = HAL_PWM_EnableCh(PWM_OUTPUT_CHL, PWM_OUTPUT_MODE, 1);
    if (status != HAL_OK)
        printf("%s(): %d, PWM ch enable error\n", __func__, __LINE__);

}
static void key_scan(void)
{
	HAL_Status status = HAL_ERROR;
	if(!gpio_input_read())
	{
		status = HAL_PWM_ChSetDutyRatio(PWM_OUTPUT_CHL, 10* max_duty_ratio /100);
    			if (status != HAL_OK)
    			printf("%s(): %d, PWM set duty ratio error\n", __func__, __LINE__);
	}else {
		status = HAL_PWM_ChSetDutyRatio(PWM_OUTPUT_CHL, 5* max_duty_ratio /100);
    			if (status != HAL_OK)
    			printf("%s(): %d, PWM set duty ratio error\n", __func__, __LINE__);
	}
}


static void MainThread(void *arg)                                               
{
  HAL_Status status = HAL_ERROR;
  //printf("LED_PWM test start\r\n");
  pwm_cycle_mode_Set();
  gpio_input_init();
  OS_MSleep(10);
  //printf("gpio input test start.\n");
  status = HAL_PWM_ChSetDutyRatio(PWM_OUTPUT_CHL, 5* max_duty_ratio /100);
    	if (status != HAL_OK)
    	printf("%s(): %d, PWM set duty ratio error\n", __func__, __LINE__);
  while (1) {
  	key_scan();
	
  /*
     for(int i=0;i<=100;i++)
     {
     	status = HAL_PWM_ChSetDutyRatio(PWM_OUTPUT_CHL, i * max_duty_ratio /100);
    	if (status != HAL_OK)
        	printf("%s(): %d, PWM set duty ratio error\n", __func__, __LINE__);
        OS_MSleep(30);
     }
     for(int i=100;i>0;i--)
     {
     	status = HAL_PWM_ChSetDutyRatio(PWM_OUTPUT_CHL, i * max_duty_ratio /100);
    	if (status != HAL_OK)
        	printf("%s(): %d, PWM set duty ratio error\n", __func__, __LINE__);
        OS_MSleep(30);
     }
     */
  }
}

void PWMMain(void) {
    if (OS_ThreadCreate(&g_main_thread, "MainThread", MainThread, NULL, OS_THREAD_PRIO_APP, 4 * 1024) != OS_OK) {
        printf("[ERR] Create MainThread Failed\n");
    }
}

SYS_RUN(PWMMain);

上层BUILD.gn

group("ohosdemo") {
    deps = [
        #"hello_demo:app_hello",
        #"LED:app_IO",
        #"iot_peripheral:app_peripheral",
        #"wlan_demo:app_WlanTest",
        "PWM:app_pwm",
    ]
}

固件文件

(https://musetransfer.com/s/4y1q3qor5)](链接文件(有效期至2022年12月24日))

总结

通过最近的学习,也逐渐对这块板子熟悉起来,等过段时间再来和大家分享我所学,本期就到这里😄。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

v-on监听多个方法

方法1&#xff1a; 这个方法可以使用多个事件&#xff0c;比如点击事件、右击事件&#xff0c;左边的是事件名称&#xff0c;右边的是方法名称 <el-button type"success" v-on"{contextmenu:box,click:click}" round>成功按钮</el-button>co…

Python实现力扣经典面试题——删除有序数组中的重复项 II

题目:删除有序数组中的重复项 II 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外…

12. Springboot集成Dubbo3(三)Dubbo-Admin

目录 1、前言 2、安装 2.1、下载Dubbo-admin 2.2、修改配置 2.3、编译前端 2.4、访问 2.5、加载自己的服务 2.6、服务测试 2.7、其他 3、小结 1、前言 Dubbo Admin是用于管理Dubbo服务的基于Web的管理工具。Dubbo Admin提供了一个用户友好的界面&#xff0c;用于在分…

初学学习408之数据结构--数据结构基本概念

初学学习408之数据结构我们先来了解一下数据结构的基本概念。 数据结构&#xff1a;是相互之间存在一种或多种特定关系的数据元素的集合。 本内容来源于参考书籍《大话数据结构》与《王道数据结构》。除去书籍中的内容&#xff0c;作为初学者的我会尽力详细直白地介绍数据结构的…

Java面试——锁

​ 公平锁&#xff1a; 是指多个线程按照申请锁的顺序来获取锁&#xff0c;有点先来后到的意思。在并发环境中&#xff0c;每个线程在获取锁时会先查看此锁维护的队列&#xff0c;如果为空&#xff0c;或者当前线程是等待队列的第一个&#xff0c;就占有锁&#xff0c;否则就会…

7zip压缩工具的Linux命令

Macos系统自带的压缩工具&#xff0c;压缩效果一点都不好&#xff0c;压缩效果不明显&#xff0c;果断用7ZIP软件&#xff0c;但是在mac系统下&#xff0c;7zip是没有可视化界面的&#xff0c;只有通过命令是操作。 1 安装方式 &#xff08;1&#xff09;源码安装 https://ww…

vuex配置和使用(vue3配置)

个人理解可能会有所偏差 1、基础使用 首先在创建项目时可以选择vuex和一些其他的配置&#xff0c;如果选择那么他会自动创建store文件夹生成默认格式&#xff0c;如果没有选择可以使用指令&#xff1a; npm install vuexnext --save 然后手动创建即可 import { createStore }…

SpringBoot 学习笔记

文章目录 一、IoC二、AOP三、bean3.1 bean 生命周期3.2 三种依赖注入方式3.3 bean 线程安全 四、SpringMVC五、常用注解5.1 Scope5.2 PostConstruct 和 PreDestroy5.3 Component 和 Bean5.4 Autowired 和 Resource 六、基于 ApplicationContextAware 实现工厂模式七、事务失效八…

docker创建mongodb数据库容器

介绍 本文将通过docker创建一个mongodb数据库容器 1. 拉取mongo镜像 docker pull mongo:3.63.6版本是一个稳定的版本&#xff0c;可以选择安装此版本。 2. 创建并启动主数据库 容器数据卷配置 /docker/mongodb/master/data # 数据库数据目录&#xff08;宿主机&am…

下载huggingface数据集到本地并读取.arrow文件遇到的问题

文章目录 1. 524MB中文维基百科语料&#xff08;需要下载的数据集&#xff09;2. 下载 hugging face 网站上的数据集3. 读取 .arrow 文件报错代码4. 纠正后代码 1. 524MB中文维基百科语料&#xff08;需要下载的数据集&#xff09; 2. 下载 hugging face 网站上的数据集 要将H…

springboot+vue前后端分离适配cas认证的跨域问题

0. cas服务搭建参考:CAS 5.3服务器搭建_cas-overlay-CSDN博客 1. 参照springsecurity适配cas的方式, 一直失败, 无奈关闭springssecurity认证 2. 后端服务适配cas: 参考前后端分离项目(springbootvue)接入单点登录cas_前后端分离做cas单点登录-CSDN博客 1) 引入maven依赖 …

Word页码怎么设置?6个提升效率好方法!

“我刚刚编辑完一个Word文档&#xff0c;想给它加上页码&#xff0c;但是我还不知道应该怎么操作。大家平常是怎么给Word设置页码的呢&#xff1f;” 在使用Word编辑文档时&#xff0c;页码的设置是一个常见的需求。无论是为了方便阅读&#xff0c;还是为了符合特定的格式要求&…

亿道丨三防平板丨如何从多方面选择合适的三防加固平板?

在如今这个信息爆炸的时代&#xff0c;移动设备已经成为我们生活和工作的必备工具。然而&#xff0c;在一些特殊的场合中&#xff0c;普通的平板电脑可能无法满足需求&#xff0c;比如工厂车间、野外作业、极端天气等环境下。此时&#xff0c;三防平板就成了不二之选。那么&…

怎么免费找回误删文件?这5个数据恢复工具能救你一命

如果不小心删除了文件&#xff0c;不要慌张&#xff0c;今天这个视频将为大家推荐5个最好的文件恢复软件。 误删文件是很多人在日常生活中都会遇到的问题&#xff0c;而找回丢失的数据更是至关重要。现在&#xff0c;有许多文件恢复软件可以帮助您快速找回丢失的重要文件。这些…

flutter sliver 多种滚动组合开发指南

flutter sliver 多种滚动组合开发指南 视频 https://youtu.be/4mho1kZ_YQU https://www.bilibili.com/video/BV1WW4y1d7ZC/ 前言 有不少同学工作中遇到需要把几个不同滚动行为组件&#xff08;顶部 appBar、内容固定块、tabBar 切换、tabBarView视图、自适应高度、横向滚动&a…

【前端素材】推荐优质后台管理系统Uena平台模板(附源码)

一、需求分析 后台管理系统&#xff08;或称作管理后台、管理系统、后台管理平台&#xff09;是一种专门用于管理网站、应用程序或系统后台运营的软件系统。它通常由一系列功能模块组成&#xff0c;为管理员提供了管理、监控和控制网站或应用程序的各个方面的工具和界面。以下…

sonar-java 手写一个规则-单元测试分析

前言 最近做项目&#xff0c;定制sonar规则&#xff0c;提高Java代码质量&#xff0c;在编写的sonar规则&#xff0c;做验证时&#xff0c;使用单元测试有一些简单的心得感悟&#xff0c;分享出来。 自定义规则模式 sonar的自定义规则很简单&#xff0c;一般而言有2种模式可…

基于自适应波束成形算法的matlab性能仿真,对比SG和RLS两种方法

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于自适应波束成形算法的matlab性能仿真,对比SG和RLS两种方法. 2.测试软件版本以及运行结果展示 MATLAB2022a版本运行 3.核心程序 ........................…

智慧农业之农产品溯源管理

总体设计 系统采用RFID无线射频识别技术对产品的生产、加工、运输、包装、配送等各个环节实施全程监控与可追溯。利用射频识别(RFID)、红外感应器、激光扫描器、传感器等信息传感设备,把任何物品与互联网连接起来,进行信息交换和通讯,以实现智能化识别、定位、跟踪、监控…

stable diffusion学习笔记 手部修复

图片手部修复原理 某张图片在生成后&#xff0c;仅有手部表现不符合预期&#xff08;多指&#xff0c;畸形等&#xff09;。这种情况下我们通常使用【局部重绘】的方式对该图片的手部进行【图生图】操作&#xff0c;重新绘制手部区域。 但是仅采用重绘的方式也很难保证生成的…