【XR806开发板试用】串口驱动JQ8900播放音乐

一、硬件连接

1.JQ8900引脚定义

在这里插入图片描述

通过阅读JQ8900的数据手册,可以了解到驱动JQ8900有许多种方式,IO驱动,一线串口驱动(VPP),两线串口驱动(RX,TX),这里我使用两线串口驱动。所以我需要连接到XR806开发板的一组串口上。

2.XR806开发板串口

通过查阅手册可以知道XR806有3组串口, 我选择串口1进行通信,也就是PB14,PB15引脚。
在这里插入图片描述

3.开发板和模块连接

我们只需要将开发板的PB15引脚接到JQ8900模块的TX引脚,开发板的PB14引脚接到JQ8900模块的RX引脚。
在这里插入图片描述

二、软件编写

1.程序思路

通过串口1驱动JQ8900模块播放音乐,通过XR806的按键去控制音乐的切换(播放,暂停,上一曲,下一曲,停止等),每按下一次按键,XR806板载LED就会进行一次取反操作,用来显示按键按下效果。

2.创建工程结构

目录结构如下面红框所示。
在这里插入图片描述

3.编写代码

1.key.h

#ifndef _KEY_H
#define _KEY_H#define GPIO_ID_PA11 11
#define GPIO_ID_PA21 21extern uint8_t key_status ; 
extern uint8_t key_value;void key_init(void);
void key_scan(void);#endif

2.key.c

#include <stdio.h>
#include "ohos_init.h"                                                          //
#include "kernel/os/os.h"
#include "iot_gpio.h"                                                           //
#include "key.h"uint8_t key_status = 1; 
uint8_t key_value = 0;void key_init(void)
{printf("key test start\r\n");IoTGpioInit(GPIO_ID_PA11);                                                    // 初始化IO口,io口复位为悬空输入IoTGpioSetDir(GPIO_ID_PA11, IOT_GPIO_DIR_IN);                               IoTGpioInit(GPIO_ID_PA21);                                                    // 初始化IO口,io口复位为悬空输入IoTGpioSetDir(GPIO_ID_PA21, IOT_GPIO_DIR_OUT);                                // 设置IO口为输出模式}void key_scan(void)
{uint8_t keyVal = 1;uint8_t ledVal = 0;IoTGpioGetInputVal(GPIO_ID_PA11,&keyVal);// printf("keyVal:%d\r\n",keyVal);if(keyVal == 0){OS_MSleep(10);IoTGpioGetInputVal(GPIO_ID_PA11,&keyVal);if(keyVal == 0){key_status = 1;key_value ++;if(key_status == 5)key_value = 1;//  按键执行操作IoTGpioGetOutputVal(GPIO_ID_PA21,&ledVal);//  printf("ledVal:%d\r\n",ledVal);if(ledVal == 1){IoTGpioSetOutputVal(GPIO_ID_PA21, 0);   //  printf(" set  0\r\n"); }else{IoTGpioSetOutputVal(GPIO_ID_PA21, 1);    //   printf(" set  1\r\n");}// IoTGpioGetOutputVal(GPIO_ID_PA21,ledVal);// printf("ledVal set after:%d\r\n",ledVal);while(keyVal == 0){IoTGpioGetInputVal(GPIO_ID_PA11,&keyVal);}}}
}

3.JQ8900.h

#ifndef _JQ8900_H
#define _JQ8900_Hextern const uint8_t  play_Buffer[4];
extern const uint8_t  pause_Buffer[4];
extern const uint8_t  stop_Buffer[4];
extern const uint8_t  previous_Buffer[4];
extern const uint8_t  next_Buffer[4];#endif

4.JQ8900.c


#include <stdio.h>
#include "ohos_init.h"                                                          //
#include "kernel/os/os.h"
#include <string.h>
#include "driver/chip/hal_uart.h"
#include "JQ8900.h"#define UARTID UART1_ID/* 音量为0-30级 上电默认为20 */
uint8_t JQ8900Volume = 20; const uint8_t  play_Buffer[4] = {0xAA,0x02,0x00,0xAC};
const uint8_t  pause_Buffer[4] = {0xAA,0x03,0x00,0xAD};
const uint8_t  stop_Buffer[4] = {0xAA,0x04,0x00,0xAE};
const uint8_t  previous_Buffer[4] = {0xAA,0x05,0x00,0xAF};
const uint8_t  next_Buffer[4] = {0xAA,0x06,0x00,0xB0};
/* 其他命令请查看数据手册*//* 串口发送一个字节 */
void JQ8900_SendChar(char val)
{HAL_UART_Transmit_Poll(UARTID, (uint8_t *)val, 1);
}

5.main.c

#include <stdio.h>
#include "ohos_init.h"                                                          //
#include "kernel/os/os.h"
#include "iot_gpio.h"                                                           //
#include <string.h>
#include "driver/chip/hal_uart.h"
#include "key.h"
#include "JQ8900.h"#define UARTID UART1_IDstatic OS_Thread_t g_main_thread;static int uart_init(void)
{HAL_Status status = HAL_ERROR;UART_InitParam param;param.baudRate = 9600;   // 波特率为9600param.dataBits = UART_DATA_BITS_8;param.stopBits = UART_STOP_BITS_1;param.parity = UART_PARITY_NONE;param.isAutoHwFlowCtrl = 0;status = HAL_UART_Init(UARTID, &param);if (status != HAL_OK)printf("uart init error %d\n", status);return status;
}static void MainThread(void *arg)                                               
{key_init(); uart_init();printf("you can connect to uart1 serial com.\n");printf("uart%d used for echo.\n", UARTID);while (1) {key_scan();if(key_status == 1){  // 按键按下,可以进行操作key_status = 0;switch(key_value){case 0:HAL_UART_Transmit_Poll(UARTID, (uint8_t *)play_Buffer, 4);break;case 1:HAL_UART_Transmit_Poll(UARTID, (uint8_t *)pause_Buffer, 4);break;case 2:HAL_UART_Transmit_Poll(UARTID, (uint8_t *)play_Buffer, 4);break;case 3:HAL_UART_Transmit_Poll(UARTID, (uint8_t *)previous_Buffer, 4);break;case 4:HAL_UART_Transmit_Poll(UARTID, (uint8_t *)next_Buffer, 4);break;}  }}
}void UARTMain(void)                                                             
{printf("UART Test Start\n");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(UARTMain);                                                               // Harmony线程入口

6.BUILD.gn

import("//device/xradio/xr806/liteos_m/config.gni")static_library("app_uart") {configs = []sources = ["src/main.c","src/JQ8900.c","src/key.c",]cflags = board_cflagsinclude_dirs = board_include_dirsinclude_dirs += ["//kernel/liteos_m/kernel/arch/include","include","//base/iot_hardware/peripheral/interfaces/kits",]}

7.修改ohosdemo/BUILD.gn

在这里插入图片描述

三、编译,下载。

在这里插入图片描述

下载过程我就不写了,可以去看上一篇文章。

四、效果

1.终端输出

在这里插入图片描述

2.视频展示

视频链接

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

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

相关文章

VSCode设置

VSCode设置 VSCode设置1.双击和点击显示设置2.快捷键设置 VSCode设置 1.双击和点击显示设置 VSCode设置双击才能打开文件、文件夹 打开文件夹&#xff1a;在设置页中搜索 expandMode,将 singleClick 改为 doubleClick 即可。 双击打开文件&#xff1a;在设置页中搜索workben…

Unity性能优化篇(八) 导入的模型网格优化设置

模型导入Unity后&#xff0c;可以选中这个模型&#xff0c;在Inspector窗口设置它的属性。下面说的都是可自定义选择优化的地方 Model选择卡: 1.在Model选项卡&#xff0c;启用Mesh Compression可以压缩模型&#xff0c;压缩程度越高&#xff0c;模型精度越低&#xff0c;但是…

Python实现插入排序算法

Python实现插入排序算法 以下是使用Python实现插入排序算法的示例代码&#xff1a; def insertion_sort(arr):n len(arr)for i in range(1, n):key arr[i]j i - 1# 将比key大的元素向右移动一位while j > 0 and arr[j] > key:arr[j 1] arr[j]j - 1arr[j 1] key# …

(3)(3.3) MAVLink高延迟协议

文章目录 前言 1 配置 2 说明 3 消息说明 前言 ArduPilot 支持 MAVLink 高延迟协议(MAVLink High Latency)。该协议专为卫星或 LoRA 等低带宽或高成本链路而设计。 在此协议中&#xff0c;每 5s 只发送一次 HIGH_LATENCY2 MAVLink 信息。对 MAVLink 命令或请求&#xff08…

【力扣hot100】刷题笔记Day24

前言 组会前一点不慌&#xff0c;反正跑不出好东西&#xff0c;能应付就行&#xff0c;早上直接刷题 70. 爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 动态规划 class Solution:def climbStairs(self, n: int) -> int:dp [0] * (n1) # dp[n]表示爬n阶楼梯需要多少格…

npm run dev(pnpm run dev) 的过程都做了什么?

pnpm run dev 命令执行的过程通常涉及以下步骤: 解析命令: 当你在项目中运行 pnpm run dev 时,pnpm 首先会查找项目根目录下的 package.json 文件。在这个文件的 scripts 字段里,它会找到名为 "dev" 的脚本定义。执行脚本: 根据 package.json 中 "dev"…

no main manifest attribute, in demo.jar的原因和解决办法

一、问题描述 当我们用java -jar demo.jar --httpPorts8081打算启动我们的jar文件时&#xff0c;系统给出了题目中的错误提示&#xff1a; no main manifest attribute, in demo.jar 二、问题分析 根据提示&#xff0c;很明显是说找不到main入口&#xff0c;为什么是这样呢&a…

sql执行计划需要关注那些内容?

执行explain会返回那些字段(加粗标红为主要关注字段)&#xff1f; 1、id&#xff1a;执行计划中每个操作的唯一标识&#xff0c;多表联查的时候会出现多条数据id是一样的 2、select_type&#xff1a;查询类型&#xff0c;常见类型有&#xff1a;SIMPLE、PRIMARY、UNION、SUBQUE…

什么是 Golang 类型断言

类型断言&#xff1a;用于检查某个接口是否包含某个具体类型&#xff0c;语法x.(T)&#xff0c;x是一个接口类型表达式&#xff0c;T是具体的类型&#xff0c;如果x包含的值可以被转换成T类型&#xff0c;则是ok 在Go语言中&#xff0c;任何类型的值都属于空接口类型。空接口类…

pytest测试框架使用基础06 fixture——parametrize

pytest.mark.parametrize 允许在测试函数或类中定义多组参数和 fixtures。 参数化场景&#xff1a; 只有测试数据和预期结果不一样&#xff0c;但操作步骤是一样的测试用例是可以用上参数化的。 创建test_cases02.py文件 示例一&#xff1a;未参数化 1.脚本代码&#xff1a; #…

nginx代理参数proxy_pass

proxy_pass参数用于配置反向代理&#xff0c;指定客户端请求被转发到后端服务器&#xff0c;后端地址可以是域名、ip端口URI 代理后端报错提示本地找不到CSS文件、JavaScript文件或图片 例如&#xff1a; nginx &#xff1a;10.1.74.109 后端服务&#xff1a;http://10.1.74.…

「MyBatis」MyBatis面试宝典:全面解析常见问题和难点

这里写目录标题 1. 什么是mybatis&#xff1f;2.怎么理解持久层&#xff1f;3. 说一说Mybaits的优点和缺点4. #{}和${}的区别是什么&#xff1f;5. PreparedStatement类6. mybatis的一级缓存和二级缓存7. Mybatis中 Dao接口和XML文件的SQL如何建立关联 面试题-》&#xff1a;My…

Hive Thrift Server

hive-site.xml配置文件 <property><name>hive.server2.thrift.bind.host</name><value>node1</value> </property>hive.server2.thrift.bind.host: This property determines the host address to which the HiveServer2 Thrift service …

pyqt学习网站

PySide 6.PyQt 6快速开发与实战最新章节_孙洋洋著_掌阅小说网 PyQt6开发及实例 - 知乎 Python开发GUI常用库PyQt6和PySide6介绍之一&#xff1a;简介与安装_pyside6 pyqt-CSDN博客 Qt for Python

HBase 的安装与部署

目录 1 启动 zookeeper2 启动 Hadoop3 HBase 的安装与部署4 HBase 高可用 1 启动 zookeeper [huweihadoop101 ~]$ bin/zk_cluster.sh start2 启动 Hadoop [huweihadoop101 ~]$ bin/hdp_cluster.sh start3 HBase 的安装与部署 &#xff08;1&#xff09;将 hbase-2.0.5-bin.tar.…

视频压缩会影响画质吗?正确答案在这里!

在当今数字时代&#xff0c;我们生活在一个高清、甚至是4K视频的世界中。随之而来的是巨大的视频文件大小&#xff0c;这在存储、传输和分享方面都带来了一些挑战。为了解决这一问题&#xff0c;许多人转向视频压缩&#xff0c;以便更有效地管理和共享视频内容。 然而&#xf…

c++ Windows获取软件安装列表信息

链接 #include <windows.h> #include <stdio.h> #include <iostream> #include <vector>using namespace std;#ifndef MSVCR #define _T #define _tcscpy strcpy #define _stprintf sprintf #define _tcscmp strcmp #endifclass SetupSoftInfo { publ…

嵌入式开发的常用软件、学习资源网站推荐

1、软件推荐 1.1、文本编辑软件 ——Notepad 1、适合编写和查看文本文件&#xff0c;也可以安装插件来查看二进制文件、对比文件 2、参考博客&#xff1a;《Notepad实用小技巧》&#xff1b; 1.2、PDF文件阅读软件——福昕PDF阅读器 福昕PDF阅读器&#xff0c;在官网就可以下载…

「Vue3系列」Vue3 混入(mixins)

文章目录 一、Vue3 混入二、Vue3 混入-选项合并1. 数据对象&#xff08;Data&#xff09;2. 方法&#xff08;Methods&#xff09;3. 计算属性&#xff08;Computed&#xff09;4. 侦听器&#xff08;Watchers&#xff09;5. 生命周期钩子&#xff08;Lifecycle Hooks&#xff…

终于用上最新的Claude-3-opus和Claude-3-sonnet!

3 月 4 日&#xff0c;被称为 OpenAI 最强竞争对手的大模型公司 Anthropic 宣布推出 Claude3 系列模型&#xff0c;与 Gemini 类似&#xff0c;模型按照大小分为三个&#xff1a;Claude 3 Haiku、Claude 3 Sonnet 和 Claude 3 Opus。Opus 目前在官方发布的测试成绩中全方位超越…