【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 21



extern 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_H

extern 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_ID

static OS_Thread_t g_main_thread;

static int uart_init(void)
{
	HAL_Status status = HAL_ERROR;
	UART_InitParam param;

	param.baudRate = 9600;   // 波特率为9600
	param.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_cflags



   include_dirs = board_include_dirs

   include_dirs += [

      "//kernel/liteos_m/kernel/arch/include",

      "include",

      "//base/iot_hardware/peripheral/interfaces/kits",

   ]

}

7.修改ohosdemo/BUILD.gn

在这里插入图片描述

三、编译,下载。

在这里插入图片描述

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

四、效果

1.终端输出

在这里插入图片描述

2.视频展示

视频链接

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

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

相关文章

C#多线程(4)——任务并行库TPL

文章目录 1 什么是TPL2 创建与启动任务3 等待任务4 任务中的异常处理5 取消任务 1 什么是TPL T P L \textcolor{red}{TPL} TPL&#xff08;Task Parallel Library&#xff09;任务并行库&#xff0c;是从.NetFramwork4.0后引入的基于异步操作的一组API。TPL的底层是基于多线程实…

C语言第三十六弹---文件操作(中)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 文件操作 1、文件的顺序读写 1.1、顺序读写函数介绍 1.1.1、fgetc 与 fputc 1.1.2、fgets 与 fputs 1.1.3、fscanf 与 fprintf 1.1.4、fread 与 fwrite 1.…

基于状态机的按键消抖实现

摸鱼记录 Day_14 !(^O^)y review 在day_13中以按键状态判断为例学习了状态分析基于状态机的按键消抖原理-CSDN博客 分析得到了下图&#xff1a; 今日任务&#xff1a;完成此过程 !(^O^)y 小梅哥对应视频&#xff1a; 15B 基于状态机的按键消抖Verilog实现_哔哩哔哩…

《乱弹篇(23)读书摘录》

之前逾月&#xff0c;偷得闲遐&#xff0c;在腾迅视频看了两部以宋朝历史为背景的电视剧《后宫》和《清平乐》&#xff0c;觉得好看并觉得有所裨益&#xff0c;但之后就再也难以找到能让人有耐心去看完的一部电视剧了。在一阵儿唏嘘感叹后&#xff0c;便去读书网搜索小说书读&a…

砝码称重 蓝桥杯

在C中&#xff0c;fabs()和abs()都用于计算数字的绝对值&#xff0c;但它们之间有一些区别。 fabs(double x)&#xff1a;计算浮点数x的绝对值&#xff0c;返回一个double类型的结果。 abs(int x)&#xff1a;计算整数x的绝对值&#xff0c;返回一个int类型的结果。 数组的默…

PolarDB for PostgreSQL-概述

阿里云数据库的概述 本篇罗列了一些知识点和结构。 日志 2. 同步复制&#xff1a;下降20% 异步复制&#xff1a;数据丢失风险&#xff0c; 部署 1.示例&#xff1a; vim polarx.toml 1.测试主库和备库数据一致性 备库是否一致性读 一个节点荡掉&#xff0c;提供服务。 GMS CN…

HCIP —— BGP --- 路由反射器和联邦

目录 IBGP的水平分割 解决办法 路由反射器 --- RR 反射器的环路问题如何解决&#xff1f;&#xff1f;&#xff1f; 1.Originator_ID 起源者ID 2.Cluster_List --- 簇列表 RR的配置 联邦的配置 1.联邦和其他AS设备建EBGP对等体 2.联邦内部IBGP建立对等体 3.联邦内部E…

数据管理【总结】

大数据&#xff1a;是指极其庞大的数据集&#xff0c;通常具备五大特征&#xff08;5个V&#xff09;&#xff1a;数据量大&#xff08;Volume&#xff09;、数据类型多样&#xff08;Variety&#xff09;、数据生成速度快&#xff08;Velocity&#xff09;、数据真实性高&…

最新Claude3注册教程:解决Claude3 Opus被封无法发送手机验证码问题

Claude3注册指南&#xff1a;解决无法发送手机验证码问题 Anthropic在3月4日宣布推出最新的大型语言模型&#xff08;LLM&#xff09;系列——Claude 3。这一系列模型在多种认知任务上树立了新的性能标准&#xff0c;包括Claude 3 Haiku、Claude 3 Sonnet 和 Claude 3 Opus三个…

2024年纯前端VUE在线编辑微软Office/金山WPS的Word文档,支持私有化部署!

现在&#xff0c;随着数字化进程渗透到到各行各业&#xff0c;数据安全已经成为了数字化革命中的重要组成部分&#xff0c;而在线Office成在OA、ERP、文档系统中得到了广泛的应用&#xff0c;为我国的信息化事业也做出了巨大贡献。随着操作系统、浏览器及Office软件的不断升级和…

node的安装与介绍

安装 下载地址 node官网首页就会有两个安装选择&#xff0c;会根据当前电脑的系统自动显示对应的安装包&#xff0c;一个长期维护版&#xff08;LTS&#xff09;,一个是尝鲜版&#xff0c;记住选择LTS版本 安装指定版本下载截图 安装过程截图&#xff08;非常简单&#xff…

短剧小程序:掌中剧院,随时演绎精彩

在快节奏的现代生活中&#xff0c;人们越来越追求高效与便捷。为了满足广大用户对短剧内容的热爱和追求&#xff0c;我们推出了全新的短剧小程序&#xff0c;让精彩剧情触手可及&#xff0c;随时随地为您带来欢乐与感动。 一、轻松点播&#xff0c;随享短剧魅力 通过短剧小程…

Talk|加州大学圣地亚哥分校程旭欣:视觉反馈下足式机器人的全身操作与运动

本期为TechBeat人工智能社区第576期线上Talk。 北京时间3月6日(周三)20:00&#xff0c;加州大学圣地亚哥分校博士生—程旭欣的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “视觉反馈下足式机器人的全身操作与运动”&#xff0c;向大家系统地介绍…

【开源】JAVA+Vue.js实现大学生相亲网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询会员4.2 查询相亲大会4.3 新增留言4.4 查询新闻4.5 新增新闻 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的大学生相亲网站&#xff0c;包含了会员管理模块、新闻管…

Vue开发实例(十)Tabs标签页打开、关闭与路由之间的关系

创建标签页 一、创建标签页二、点击菜单展示新标签页1、将标签数据作为全局使用2、菜单点击增加标签页3、处理重复标签4、关闭标签页 三、点击标签页操作问题1&#xff1a;点击标签页选中菜单进行高亮展示问题2&#xff1a;点击标签页路由也要跳转 四、解决bug 先展示最终效果 …

项目管理工具进度猫:自我管理的应用

在飞速发展的现代社会中&#xff0c;每个人都面临着巨大的竞争压力&#xff0c;如何在这激烈的环境中脱颖而出&#xff0c;实现个人的成长与成功&#xff1f;答案就在我们的日常行为中——自我管理。 一、自我管理的定义 自我管理&#xff0c;简单来说&#xff0c;就是对自己…

mysql8安装配置(最新版)

目录 一、下载mysql8 二、安装mysql8 三、配置mysql 一、下载mysql8 下载链接&#xff1a;https://pan.quark.cn/s/58d9072e51c4 二、安装mysql8 双击msi文件 选择custom 根据所需选择组件 修改安装路径 选中execute&#xff0c;安装&#xff0c;弹出提示安装VS的提示框之后…

LT6813/ADBMS1818底层驱动---均衡控制

1、LT6813采用内部均衡的原理 2、平衡控制结构体 根据数据库中读取的控制值设置平衡。要为单元设置平衡&#xff0c;必须将相应的位写入配置寄存器中。LTC 驱动程序仅执行数据库中 BMS 写入的数据。 参数 ltc_stateLTC 状态机的状态pSpi接口指向 SPI 配置的指针pTxBuff &…

Android SDK2 (实操三个小目标)

书接上回&#xff1a;Android SDK 1&#xff08;概览&#xff09;-CSDN博客 今天讲讲三个实际练手内容&#xff0c;用的是瑞星微的sdk。 1 实操编译Android.bp 首先还是感叹下&#xff0c;现在的系统真的越搞越复杂&#xff0c;最早只有gcc&#xff0c;后面多了make&#xf…

2.3_9 读者-写者问题

2.3_9 读者-写者问题 &#xff08;一&#xff09;问题描述 有读者和写者两组并发进程&#xff0c;共享一个文件&#xff0c;当两个或两个以上的读进程同时访问共享数据时不会产生副作用&#xff0c;但若某个写进程和其他进程&#xff08;读进程或写进程&#xff09;同时访问共…