用BK7251播放音乐

单片机的第一道难关无疑是烧录,如果烧录解决了,那么就有资格挑战各种坑了。

BK7251播放MP3

一、折腾材料

1、软件SDK:

        bk7251_audio_release_20190826_0701(BK7251 rtt sdk),可以从github,gitee,淘宝(麻雀一号的资料包)中获得。

2、硬件材料:

1、正面和反面

118cc5177ec043a2826bb9cab915e4f5.png15f64f21709b4cd69aced03ed671a4c4.png

 2、折腾全家福

90bbbc4a30ac4b288492ae1deb0dbd23.jpg

3、特写 

BK7251本尊

563eef18a8ef4e86a0e4ebf65cfb0d08.jpg

转接板,将电源、SPI烧写口、串口2引出了。

af4d58367e3a4350aa9c9c374d165dcc.jpg

串口工具

f496931dff8e435faae53ebff56e58b7.jpg

 CH341,用SPI烧写和GPIO。

80483f3a193a453c85dec4de3ab18fbb.jpg

再来一张BK7251特写还是挺帅的,旁边的小兄弟LTK8002D 是一个3w的功放,后面要提到它。

7b20f3d590a8412d88470f58ad16b10a.jpg

二、资料收集 

BK7251:

 BK7251的引脚图,因为要播放音乐,需重点关注以下引脚:其中AUDRP和AUDRN是右声道输出正极和负极。AUDLP和AUDLN是左声道输出正极和负极。

LTK8002D:

三、开始

1、用到的资料和工具比较多,特意建了个文件夹放连接

2、编译:进到BK7251 根目录,点右键菜单中的conEmu Here,打开rt_thread env环境。

键入scons编译,我这里之前编译过,所以输出比较少。

3、用beken_packager打包bin

        beken_packager是rt_thread为beken开发的打包工具。用于将bootloader、编译的app和其他的用户数据bin打包在一起用于烧录。

        进入:bk7221u_release\tool\beken_packager。

其中,config_audio_4M_ROMFS.json的内容,这个文件描述了要打包文件的信息:

1、bootloader_7251_4M_ROMFS_uart2_20181220.bin是bootloader;

2、../../rtthread.bin是前面编译的app bin;

3、romfs_root.bin是数据bin,这个以后再说。

 config_audio_4M_ROMFS.json:

{
    "magic": "RT-Thread",
    "version": "0.1",
    "count": 2,
    "section": [
        {
            "firmware": "bootloader_7251_4M_ROMFS_uart2_20181220.bin",
            "version": "4M.1220",
            "partition": "bootloader",
            "start_addr": "0x00000000",
            "size": "65280"
        },
        {
            "firmware": "../../rtthread.bin",
            "version": "4M_ROMFS.1220",
            "partition": "app",
            "start_addr": "0x00011000",
            "size": "2244K"
        },
		{
            "firmware": "romfs_root.bin",
            "version": "4M_ROMFS.1220",
            "partition": "romfs",
            "start_addr": "0x00242000",
            "size": "544K"
        }
    ]
}

操作:将config_audio_4M_ROMFS.json拖到beken_packager.bat文件上,进行打包。生成结果all_4M_ROMFS.1220.bin

4、烧录

1、接上CH341,用SPI使能烧录

使能原理请参见:CH341 SPI方式烧录BK7231U-CSDN博客

运行这个python程序使能烧录

import random
import time
import numpy as np
from matplotlib import pyplot as plt
import os
import random
import numpy as np
from fractions import Fraction
import pyautogui
from PIL import Image
import binascii
import struct
import codecs
import binascii


## call ch341dll_wrap
from ch341dll_32bits_wrap.ch341dll_wrap  import *

#CEN:GPIO02
#
#
def GPIO_CEN_SET():
	result=ch341dll.CH341Set_D5_D0(hd.usb_id,0x04,0x04)
	if result==1:
		print("Set CEN hight success!\r\n")
def GPIO_CEN_CLR():
	result=ch341dll.CH341Set_D5_D0(hd.usb_id,0x04,0x00)
	if result==1:
		print("Set CEN low success!")

def ChipReset():
    # set CEN low for 1s
    GPIO_CEN_CLR()
    time.sleep(0.1)
    GPIO_CEN_SET()

def BK_EnterSPIMode(data):
	#dout = bytearray(250)
	
	#print("input data:",hex(data))
	#print('\r\n')
	send_buf = bytearray(25)
	#print("Send 250 '",hex(data),"'\r\n")
	for x in range(25):
		send_buf[x] = data
	send_buf=hd.ch341_spi4w_stream(bytes(send_buf))

	for x in range(25):
		send_buf[x] = 0x00
	send_buf=hd.ch341_spi4w_stream(bytes(send_buf))	

	
	for x in range(0,25):
		print(send_buf[x],end = " ")
			#print(hex(dout[x]),end = " ")
	print('\r\n')	
	if(send_buf[x]==b'\xd2'):
		return 1
	#print('\r\n')
	#print('----------------  test 1 0x9F-----------------------\r\n')
	###
	buf1 = bytearray(4)
	buf1[0]=0x9F
	buf1[1]=0x00
	buf1[2]=0x00
	buf1[3]=0x00
	#buf1=b'\x9F\x00\x00\x00'
	
	buf1=hd.ch341_spi4w_stream(bytes(buf1))
	out1=buf1[0]
	zeroCount=0;
	for x in range(1,4):
		if(buf1[x]==b'\x00'):
			zeroCount+=1
	for x in range(4):
		#print(hex(buf1[x]), end = ' \r\n')
		print(hex(buf1.raw[x]), end = ' ')
	#print(buf1.raw)
	print('\r\n')	
	
	#buf1[0]=0x00
	#buf1[1]=0x00
	#buf1[2]=0x00
	#buf1[3]=0x00
	#buf1=hd.ch341_spi4w_stream(bytes(buf1))
	#print(buf1.raw)
	print('\r\n')		
	#print('\r\n----------------  test 1 over -----------------------\r\n')
	if out1!=b'\x00' and zeroCount==3:
		return 1
	return 0
	###
	
def ReadStart(startaddr, filename, readlen):
    count = 0
    addr = startaddr
    f = open(filename, "wb")
    size = readlen
    size = (size+255)//256*256
    print("Reading")

    while count < size:
        print("count "+str(count) +"/"+str(size))
        send_buf = bytearray(4+256)
        send_buf[0] = 0x03
        send_buf[1] = (addr & 0xFF0000) >> 16
        send_buf[2] = (addr & 0xFF00) >> 8
        send_buf[3] = addr & 0xFF
        #result = spi.xfer2(send_buf)
        result=hd.ch341_spi4w_stream(bytes(send_buf))
        count += 256
        addr += 256
        #part = bytearray(result[4:4+256])
        part = bytearray(result[4:4+256])
        for x in range(256):
            print(hex(part[x]), end = '')
            print(" ", end = '')
        f.write(part)

    f.close()

    ChipReset()
    return True

	
hd = CH341DEV(0)
#hd.ch341_i2c_speed(3)
#ChipReset()
#ReadStart(0,"text.bin",0x11000)
for x in range(1,11):
    print('\r\n\r\n\r\n----------------try into BK_SPIMode-----------------------\r\n')
    print("attemp to make BK7321 into SpiMode , the [",x,"] Times\r\n")
    ChipReset()
    ifEnterSpiMode=BK_EnterSPIMode(0xD2)
    if(ifEnterSpiMode==1):
        print("\r\nEnter SpiMode success!!!\r\n")
        buf1 = bytearray(4)
        buf1=b'\x9F\x00\x00\x00'
        buf1=hd.ch341_spi4w_stream(bytes(buf1))
        buf1=b'\x00\x00\x00\x00'
        buf1=hd.ch341_spi4w_stream(bytes(buf1))
        for x in range(4):
            print(buf1[x],end=" ")
        break
    #print('\r\n.............................................................\r\n')
    time.sleep(1)
		
if ifEnterSpiMode!=1:
    print("Enter SpiMode failure!!!   let's run againt \r\n")	

结果:

2、然后用NeoProgrammer.exe烧录

操作步骤:打开要烧录的文件,上面的all_4M_ROMFS.1220.bin,点击第5个按键烧录。

5、接上喇叭和串口工具

打开SecureCRT.exe 工具,上电如果正常可以看到:

6、试验

1、help 

2、wifi w0 join xxx xxx

接入AP 

 3、ifconfig

4、cd romfs

5、player gyz.mp3

播放MP3 

 命令发送正常,player status查看状态也对,但就是没有声音输出。

后来发现LTK8002D的1引脚shutdown在player命令发出后一直处于高电位,而shutdown需要低电位才能播放。

shutdown接到了BK7231的GPIO9,所以就想把GPIO9设置为低电平就应该有输出

 利用一下sdk中GPIO sample例程。在GPIO_sample.c中修改:

#define LED0    9   //30

void led_thread_entry(void *parameter)
{
    rt_pin_mode(LED0, PIN_MODE_OUTPUT);

    rt_pin_write(LED0, PIN_LOW);

    // while (1)
    // {
    //     rt_pin_write(LED0, PIN_LOW);

    //     rt_thread_delay(rt_tick_from_millisecond(500));

    //     rt_pin_write(LED0, PIN_HIGH);

    //     rt_thread_delay(rt_tick_from_millisecond(500));
    // }
}

这样调用gpio这个例程就可以使shutdown设为低电平。

env环境键入:menuconfIg,使能 gpio sample

重新scons编译,然后打包,下载。

6、再次执行player、再执行gpio

有声音了

7、播放WEB server上的mp3

建了个WEB SERVER

WEB SERVER根目录下放了几个MP3

键入:player http://192.168.8.11/xing.mp3

键入:gpio

音量调小点:player volume 10

停止: player stop

四、总结

1、BK7231、BK7251、BK7252是一个系列的芯片,都有RT_THREAD SDK,开发需要了解一些RT_THREAD的知识。

2、RT_THREAD是一个rtos操作系统,操作系统有分区就不奇怪了,而分区是存在bootloader中的,官方提供了一个rt_partition_tool.exe的工具,可以查看和修改分区。下面就是bootloader_7251_4M_ROMFS_uart2_20181220.bin分区情况,这个分区对beken_packager打包是有用的,需要对应上。app是SDK应用分区;romfs是数据分区(可没有);dowload是OTA升级用分区。

3、romfs_root.bin可以包括一些数据信息如MP3,SDK中有文档说明如何生成,要注意和分区信息对应上。

也可用OTA方式将romfs_root.bin传上去,OTA打包工具选择不加密,固件分区名:filesystem。生成romfs_root.rbl,放到web server根目录下,用http_ota http://xx.xx.xx.xx/romfs_root.rbl传上去。

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

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

相关文章

HCIP网络的类型

一.网络类型&#xff1a; 点到点 BMA&#xff1a;广播型多路访问 -- 在一个MA网络中同时存在广播&#xff08;泛洪&#xff09;机制 NBMA&#xff1a;非广播型多路访问 -- 在一个MA网络中&#xff0c;没有泛洪机制-----不怎么使用了 MA&#xff1a;多路访问 -- 在一个…

基于光口的以太网 udp 回环实验

文章目录 前言一、系统框架整体设计二、系统工程及 IP 创建三、UDP回环模块修改说明四、接口讲解五、顶层模块设计六、下载验证前言 本章实验我们通过网络调试助手发送数据给 FPGA,FPGA通过光口接收数据并将数据使用 UDP 协议发送给电脑。 提示:任何文章不要过度深思!万事万…

电工技术实验-电路元件伏安特性测绘

一、 实验目的 1、学会识别常用电路元件的方法 2、验证线性电阻、非线性电阻元件的伏安特性 3、熟悉实验台上直流电工仪表和设备的使用方法 二、实验器材 可调直流稳压电源、直流数字毫安表、直流数字电压表、万用表 二极管、稳压管、白炽灯、线性电阻 三、实验原理 任…

低压防雷箱综合选型应用方案

低压防雷箱是一种用于保护低压配电系统免受雷电过电压的影响的装置&#xff0c;它主要由防雷箱模块、浪涌保护器SPD、接地线等组成。本文将介绍低压防雷箱的作用原理和行业应用解决方案&#xff0c;以及低压防雷箱的选型方法。 低压防雷箱的作用原理 低压防雷箱的作用原理是利…

革新区块链:代理合约与智能合约升级的未来

作者 张群&#xff08;赛联区块链教育首席讲师&#xff0c;工信部赛迪特聘资深专家&#xff0c;CSDN认证业界专家&#xff0c;微软认证专家&#xff0c;多家企业区块链产品顾问&#xff09;关注张群&#xff0c;为您提供一站式区块链技术和方案咨询。 代理合约&#xff08;Prox…

职业规划,软件开发工程师的岗位任职资格

软件工程师是指从事软件开发的人&#xff0c;主要的工作涉及到项目培训和项目设计两个方面。在实际工作中&#xff0c;软件工程师是一个广义的概念&#xff0c;包括了很多与软件相关的人员。除开最基础的编程语言&#xff0c;还有数据库语言等等。从事这份工作&#xff0c;需要…

多标签节点分类

Multi-Label Node Classification on Graph-Structured Data,TMLR’23 Code 学习笔记 图结构数据的多标签分类 节点表示或嵌入方法 通常会生成查找表&#xff0c;以便将相似的节点嵌入的更近。学习到的表示用作各种下游预测模块的输入特征。 表现突出的方法是基于随机游走(ran…

【Spring 篇】MyBatis注解开发:编写你的数据乐章

欢迎来到MyBatis的音乐殿堂&#xff01;在这个充满节奏和韵律的舞台上&#xff0c;注解是我们编写数据乐章的得力助手。无需繁琐的XML配置&#xff0c;通过简单而强大的注解&#xff0c;你将能够轻松地与数据库交互。在这篇博客中&#xff0c;我们将深入探讨MyBatis注解开发的精…

MySQL数据库 | 事务中的一些问题(重点)

文章目录 什么是事务&#xff1f;事务的几个特性(ACID) -重点原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability) Mysql中事务操作隐式事务显式事务 savepoint关键字只读事务事务中的一些问题&#xff08;重点&#xff09;隔离级别脏读解决办法 幻读解决…

C语言实战系列一:经典贪食蛇

C语言学习必须实战&#xff0c;并且学完语法后就必须立即用实战来巩固。一般需要10来个比较复杂的程序才能掌握C语言。今天就教大家第一个小程序&#xff0c;贪食蛇。 首先上代码 一、代码 #include <stdio.h> #include <stdlib.h> #include <curses.h> #…

Leetcode的AC指南 —— 栈与队列:20. 有效的括号

摘要&#xff1a; **Leetcode的AC指南 —— 栈与队列&#xff1a;20. 有效的括号 **。题目介绍&#xff1a;给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字…

Linux系统中内核音频驱动实现

本文以I2S接口为例介绍Linux内核音频相关知识。 一、名词介绍 下面是音频调试中常见的名词缩略语。 1、AEC&#xff08;Acoustic Echo Cancellor&#xff09;&#xff1a;回声消除。 2、AGC&#xff08;Automatic Gain Control&#xff09;&#xff1a;自动增益补偿&#xf…

ZEM20台式扫描电子显微镜在三元材料锂电池中的应用

在当今环保能源需求日益增长的背景下&#xff0c;新型储能材料特别是锂离子电池在新能源汽车和移动互联网设备中的应用越来越广泛。其中&#xff0c;以镍钴锰三元素为基础的分层材质因具有体系能量密度高、原材料来源广、合成过程相对简单等优势&#xff0c;被公认为最有应用前…

字符串展开(Python)

展开字符串中用-压缩的连续小写字母或者数字&#xff0c;不是压缩形式的-不用理会&#xff0c;-没有压缩字符的去除-。 (笔记模板由python脚本于2024年01月21日 18:18:19创建&#xff0c;本篇笔记适合熟悉 p y t h o n python python字符串和列表的coder翻阅) 【学习的细节是欢…

Java线程池七大参数详解和配置(面试重点)

一、corePoolSize核心线程数 二、maximunPoolSize最大线程数 三、keepAliveTime空闲线程存活时间 四、unit空闲线程存活时间的单位 五、workQueue线程工作队列 1、ArrayBlockingQueue FIFO有界阻塞队列 2、LinkedBlockingQueue FIFO无限队列 3、PriorityBlockingQueue V…

2023年度环境电器行业数据分析(洗地机、扫地机器人、吸尘器等)

在家电行业整体消费不振的环境下&#xff0c;环境电器市场也受到影响&#xff0c;2023年度市场大盘销售呈下滑趋势。根据鲸参谋平台的数据显示&#xff0c;2023年京东平台环境电器市场的销量累计约7100万&#xff0c;同比下滑约12%&#xff1b;销售额约360亿&#xff0c;同比下…

二.用户和权限管理(一)

用户和管理权限 1.用户管理1.1登录MySQL服务器1.2创建用户1.3修改用户1.4删除用户1.5设置当前用户密码1.6 修改其它用户密码 2.权限管理2.1权限列表2.2授予权限的原则2.3授予权限2.4产看权限2.5收回权限 3.权限表3.1user表3.2db表3.3tables_priv表和columns_priv表3.4procs_pri…

【iOS】UICollectionView使用

使用UITableView作为表格来展示数据完全没有问题&#xff0c;但仍有许多局限性&#xff0c;对于一些更加复杂的布局样式&#xff0c;就有些力不从心了 比如&#xff0c;UITableView只允许表格每一行只能显示一个cell&#xff0c;而不能在一行中显示多个cell&#xff0c;对于这…

IN操作符

目录 IN NOT IN Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 IN IN 指的是根据一个指定的范围进行数据查询 1.查询出员工编号是 7369、7566、7788、9999 的员工信息 利用前面学的知识,得出: SQL> set linesize 250 SQL>…

​第14节-高质量简历写作求职通关-在线测试

在线测试主要包括性格测试、综合能力测试、技能测试三类 性格测试 性格测试主要用于考察个人与工岗位的匹配程度 考察内容包含性格、能力、动机、价值观等&#xff0c;考察形式一般为给出相应的工作场景&#xff0c;让你选择最喜欢或者最不喜欢的答案 技能考试 这类测试一般是针…