STM32MP157-Linux音频应用编程-简易语音助手

STM32驱动JQ8900语音模块 水了一篇文章,不过也完成了对JQ8900模块的进一步应用。 阅读详情


前言

本篇分享:

Linux应用编程之音频编程,使用户用户可以使用语音控制开发板上的LED灯和蜂鸣器模块。

环境介绍:

系统:Linux
硬件:正点原子STM32MP157开发板
声卡:开发板自带


STM32MP157简易语音助手

实现目标 :用户可以使用语音控制开发板上的LED灯和蜂鸣器模块。
知识点 : C语言、文件IO、alsa-lib 库、libcurl库、API调用、字符串解析、多线程。

在上一篇STM32MP157语音识别项目中,由于之前使用的交叉编译器无法正常编译使用了libcurl库的程序,导致不得不使用execl函数调用CURL指令实现(可能是由于交叉编译器的C库版本和libcurl库的C库版本不同导致)。这样的程序不够灵活(依赖操作系统提供的指令和参数格式)且性能低(调用指令时需要花费额外的系统开销和时间,包括切换上下文、启动子进程、进行系统调用等操作,而使用c库函数则避免了这些额外的开销 )。所以,这次继续沿用Linux语音识别项目中用到的libcurl库来实现。

alsa-lib简介:

alsa-lib是一套 Linux 应用层的 C 语言函数库,为音频应用程序开发提供了一套统一、标准的接口,应用程序只需调用这一套 API 即可完成对底层声卡设备的操控,譬如播放与录音。
用户空间的alsa-lib对应用程序提供了统一的API 接口,这样可以隐藏驱动层的实现细节,简化了应用 程序的实现难度、无需应用程序开发人员直接去读写音频设备节点。所以,主要就是学习alsa-lib库函数的使用、如何基于alsa-lib库函数开发音频应用程序。
alsa-lib官方说明文档:https://www.alsa-project.org/alsa-doc/alsa-lib/

移植alsa-lib库:

正点STM32MP157开发板出厂已移植(非广告!),需要请参考其他教程。

要在嵌入式Linux系统上运行使用alsa-lib库的程序,需要移植alsa-lib库,可以参考网上移植alsa-lib库的方法,或自行下载alsa-lib资源包,自行编译移植。

开源ALSA架构的官网地址:https://www.alsa-project.org/wiki/Main_Page

libcurl库简介:

libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies和用户认证。

官网地址:http://curl.haxx.se/

移植libcurl库:

正点STM32MP157开发板出厂已移植(非广告!),需要请参考其他教程。

注意:curl指令和libcurl是两个不同的东西,虽然它们都用于处理HTTP请求,但是有以下区别:

  • curl指令是一个命令行工具,而libcurl是一个C语言的库,可以通过函数调用使用。
  • curl指令可以直接在终端中运行,而libcurl需要在编程时使用。
  • curl指令的功能相对简单,主要用于从终端中发送HTTP请求并获取响应,而libcurl功能更为强大,可以通过编程实现更多复杂的HTTP请求和响应处理操作。
  • curl指令可以在不同的操作系统和终端上运行,而libcurl需要在特定的平台上进行编译和部署。

总之,curl指令是一个简单、方便的工具,可以帮助开发人员快速进行HTTP请求和响应测试。而libcurl是一个功能更为强大的库,适合于在编程时进行HTTP请求和响应处理,但需要进行编译和部署。

API调用

该程序使用的是百度语音识别API
在这里插入图片描述

注册后领取免费额度及创建中文普通话应用(创建前先领取免费额度(180 天免费额度,可调用约 5 万次左右) )

在这里插入图片描述

创建好应用后,可以得到API key和Secret Key(填写到程序中的相应位置)

在这里插入图片描述

调用API相关说明,Demo代码中有多种语言的调用示例可以参考,使用C语言的话也可以直接在本程序上面再次更改:

在这里插入图片描述

API相关c文件中 需要修改的有asrmain.c、token.c和相应的头文件:

修改asrmain.c文件

asrmain.c的fill_config函数中(该函数我已修改,原本无file参数,根据实际情况使用),需要修改的有:音频文件格式,API Key以及Secret Key:

RETURN_CODE fill_config(struct asr_config *config,char *file) {
    // 填写网页上申请的appkey 如 g_api_key="g8eBUMSokVB1BHGmgxxxxxx"
    char api_key[] = "填写网页上申请的API key";
    // 填写网页上申请的APP SECRET 如 $secretKey="94dc99566550d87f8fa8ece112xxxxx"
    char secret_key[] = "填写网页上申请的Secret Key";
    // 需要识别的文件
    char *filename = NULL;
    filename = file;

    // 文件后缀仅支持 pcm/wav/amr 格式,极速版额外支持m4a 格式
    char format[] = "pcm";

    char *url = "http://vop.baidu.com/server_api";  // 可改为https

    //  1537 表示识别普通话,使用输入法模型。其它语种参见文档
    int dev_pid = 1537;

    char *scope = "audio_voice_assistant_get"; // # 有此scope表示有asr能力,没有请在网页里勾选,非常旧的应用可能没有
    …………

结合音频录制的程序使用的话,还需要删除示例中的main函数,run函数中的相关初始化以及API调用函数需要根据实际情况重新调整调用位置。本项目总体按照:获取token(在程序开始时获取一次即可,根据官网可知获取的token有效期为30天,重新获取token则之前获取的token失效)->调用API->得到返回结果->解析结果->对硬件控制。

asrmain.c的run_asr函数中(该函数我已修改,原本无result_voice参数,根据实际情况使用),需要修改的有:禁用SSL证书验证(在文件中查到下面这个函数名即可找到需要修改的位置)和 延长连接超时时间(源代码中设定时间为5s,在开发板上连接时间更长,需要改为10s,可能是由于硬件性能较弱或者网络环境不稳定等原因导致 )。

curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);//禁用SSL证书验证
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10);// 延长连接超时时间

curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0)是一个CURL库的选项设置,用于控制CURL库对SSL证书的验证行为。默认情况下,CURL库会验证SSL证书的有效性,以确保请求的安全性。如果SSL证书验证失败,CURL库将阻止请求的进一步处理并返回一个错误。

将CURLOPT_SSL_VERIFYPEER选项设置为0将禁用SSL证书验证,从而允许不受信任的证书通过。这个设置通常用于调试和测试目的,不建议在生产环境中使用,因为它会降低请求的安全性。如果需要在生产环境中使用不受信任的证书,建议使用自签名证书或受信任的CA签名证书,并通过其他手段验证证书的有效性,而不是禁用SSL证书验证。

修改token.c文件

token.c的speech_get_token函数中:
和上面部分相同,禁用SSL证书验证、延长连接超时时间。

录音

查看Linux应用编程-音频应用编程-语音转文字项目中相应的标题。

文件IO

我们需要将录制的音频文件保存到本地,就需要用到文件IO相关知识,打开音频文件以及向音频文件写数据。

打开音频文件

函数:

函数原型:
FILE *fopen(const char *filename, const char *mode)

参数:
filename -- 字符串,表示要打开的文件名称。
mode -- 字符串,表示文件的访问模式。

作用:
以指定的方式打开文件。

代码:

/*创建一个保存PCM数据的文件*/
if ((pcm_data_file = fopen(argv[1], "wb")) == NULL)
{
    printf("无法创建%s音频文件.\n", argv[1]);
    exit(1);
}
printf("用于录制的音频文件已打开.\n");

参数:
argv[1]:程序执行时传递的参数,例./voice record.cpm,则该参数为"record.cpm"
"wb":只写打开或新建一个二进制文件,只允许写数据。

硬件控制

sysfs文件系统

在 Linux 系统下,一切皆文件!应用层如何操控底层硬件,同样也是通过文件 I/O 的方式来实现。本项目的硬件控制都是通过sysfs文件系统实现对LED和蜂鸣器的控制。

在嵌入式Linux开发中,sysfs文件系统通常被用来访问硬件资源,例如GPIO、I2C、SPI等外设,可以通过sysfs文件系统的接口来控制和读取硬件设备的状态信息。因此,sysfs文件系统对于嵌入式Linux开发非常重要,几乎所有的嵌入式Linux系统都会支持sysfs文件系统。

sysfs 文件系统挂载在/sys目录下,启动开发板后可以到/sys目录查看。/sys下不同的子目录。

在这里插入图片描述

/sys目录下包含了很多子目录,每个子目录都代表一个系统设备或内核模块,其中常见的子目录包括:

  • block:块设备相关的信息,例如硬盘、光驱等。
  • bus:系统总线相关的信息,例如USB、PCI、I2C等。
  • class:设备类型相关的信息,例如输入设备、网络设备等。
  • dev:与设备文件相关的信息,例如设备号、设备名称等。
  • firmware:硬件固件相关的信息,例如BIOS、驱动程序等。
  • fs:文件系统相关的信息,例如文件系统挂载状态等。
  • kernel:内核相关的信息,例如内核版本、内核命令行参数等。
  • module:内核模块相关的信息,例如已加载的内核模块等。
  • power:电源管理相关的信息,例如电量、电源状态等。
  • sys:系统信息相关的信息,例如CPU信息、内存信息等。

这些子目录下包含了许多虚拟文件和目录,通过这些文件和目录可以方便地访问内核数据结构和设备信息,从而实现对设备的控制和监控。

在sysfs文件系统中,一个硬件设备为一个目录,设备的属性则为文件。
在正点原子STM32MP157中,
LED和蜂鸣器对应的设备目录均为/sys/class/leds/。
LED的触发方式控制文件为/sys/class/leds/user-led/trigger。
LED亮度控制文件为/sys/class/leds/user-led/brightness。
蜂鸣器的触发方式控制未见为/sys/class/leds/beep/trigger。
蜂鸣器开关控制文件为/sys/class/leds/beep/brightness。

数据解析和控制

本项目使用strstr函数对识别的结果进行判断,判断识别结果中是否包含"灯"、“蜂鸣器"字符串,有的话再判断结果中包含"开"还是"关”。
如识别的结果为"灯打开"或"开灯",程序将修改向LED灯的触发方式文件写入"none"(无触发),向LED亮度控制文件写入"1",这样就实现了LED灯的点亮

函数:

函数原型:
char *strstr(const char *haystack, const char *needle) 

haystack -- 要被检索的 C 字符串.
needle -- 在 haystack 字符串内要搜索的子字符串。

作用:
查看原字符串中是否存在子字符串,不存在返回NULL

部分代码:

void Voice_Controll(char result[])
{
    /*检测语音和灯的控制有关*/
    if(strstr(result,"灯")!=NULL)
    {
        if(strstr(result,"开")!=NULL && strstr(result,"关")!=NULL)
            return;
        else if(strstr(result,"开")!=NULL)  
            Led_Controll(1);  
        else if(strstr(result,"关")!=NULL)  
            Led_Controll(0);  
    }
    
    /*检测语音和蜂鸣器的控制有关*/
    ......
}

void Led_Controll(int ONOFF)
{
    int fd1,fd2;

    /*打开LED触发文件*/
    fd1 = open(LED_TRIGGER, O_WRONLY);
    if (0 > fd1) {
        perror("open error");
        exit(-1);
    }

    /*打开LED开关文件*/
    fd2 = open(LED_BRIGHTNESS, O_WRONLY);
    if (0 > fd2) {
        perror("open error");
        exit(-1);
    }

    /*根据传递参数控制LED*/
    if(ONOFF == 1)
    {
        write(fd1, "none", 4);  //先将触发模式设置为 none
        write(fd2, "1", 1);     //点亮 LED
        printf("LED已打开!\n");
    }
    else
    {
        write(fd1, "none", 4);  //先将触发模式设置为 none
        write(fd2, "0", 1);     //熄灭 LED
        printf("LED已关闭!\n");
    }

    /*关闭文件*/
    close(fd1);
    close(fd2);
}

多线程

函数:

函数原型:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg)

thread -- 传出参数,保存系统为我们分配好的线程 ID
attr -- 通常传 NULL,表示使用线程默认属性。若想使用具体属性也可以修改该参数。
start_routine -- 函数指针,指向线程主函数,该函数运行结束,则线程结束。
arg -- 线程主函数执行期间所使用的参数。

作用:
创建一个新线程。

函数原型:
int int truncate(const char *path,off_t length);

参数:
path -- 文件路径名。
length --  截断长度,若文件大小>length大小,额外的数据丢失。若文件大小<length大小,那么,这个文件将会被扩展,扩展的部分将补以null,也就是‘\0’。

作用:
截断或扩展文件。

代码:

/*创建子线程检测按键是否按下*/
pthread_t tid;
ret = pthread_create(&tid, NULL, button_tfn, NULL);
if (ret != 0) perror("pthread_create failed");

void *button_tfn(void *arg)
{
	struct input_event in_ev = {0};
	int fd;
	int value = -1;

	/*打开按键事件对应的文件*/
	if (0 > (fd = open("/dev/input/event1", O_RDONLY)))
	{
		perror("open error");
		exit(-1);
	}

	while(1)
	{
		/*循环读取数据*/
		if (sizeof(struct input_event) != read(fd, &in_ev, sizeof(struct input_event)))
		{
			perror("read error");
			exit(-1);
		}
		if (EV_KEY == in_ev.type && in_ev.code == 114)//114为KEY0 
		{ 
			/*按键事件*/
			switch (in_ev.value)
			{
				/*KEY0松开*/
				case 0:
					/**
					 * 1.更新按键状态为松开
					 * 2.延时等待主循环判断,否则可能出现主循环先判断标志位为1而出现PCM设备停止还在继续读数据
					 * 3.停止PCM设备
					*/
					key_flag_now = 0;
					sleep(1);
					snd_pcm_drop(capture_handle);
					break;
				/*KEY0按下*/
				case 1:
					/**
					 * 1.清空文件,使文件从头开始写,等于重新录制音频
					 * 2.同样注意顺序,先使设备恢复进入准备状态,避免出现主循环先检测到标志位为1而读取声卡设备
					 * 3.更新按键状态为按下
					*/
					truncate(pcm_file_name,1);
					snd_pcm_prepare(capture_handle);
					key_flag_now = 1;
					break;
			}
		}
		else if(EV_KEY == in_ev.type && in_ev.code == 115)//115为KEY1
		{
			/*按键事件*/
			switch (in_ev.value)
			{
				/*KEY1按下*/
				case 1:
					/*退出程序*/
					exit_program();
					break;
			}
				
		}
	}
}

主循环

主循环内判断声卡设备状态是否改变(按键状态决定),若当前声卡为运行状态则进行音频采集,若当前声卡为停止状态则调用API进行识别。

while (1)
{
    /*判断按键状态是否更新*/
    if(key_flag_now != key_flag_old)
    {
        /*视当前状态为旧状态*/
        key_flag_old = key_flag_now;

        /*若按键按下*/
        if(key_flag_now == 1)
            printf("开始采集音频数据...\n");
        /*若按键松开*/
        else
        {
            printf("采集结束!\n");

            /*调用API进行识别*/
            run_asr(&config, token,result);
            /*对识别的结果进行处理*/
            Voice_Controll(result);

            printf("请长按KEY0按键开始采集音频数据!单击KEY1退出程序!\n");
        }
    }

    /*若按键按下*/
    if(key_flag_now == 1)
    {
        /*从声卡设备读取一帧音频数据:2048字节*/
        ret = snd_pcm_readi(capture_handle, buffer, buffer_frames);
        if(0 > ret)
        {
            printf("从音频接口读取失败(%s)\n", snd_strerror(ret));
            exit(1);
        }

        /*写数据到文件: 音频的每帧数据样本大小是16位=2个字节*/
        fwrite(buffer, (ret * AUDIO_CHANNEL_SET), frame_byte, pcm_data_file);
    }
}

实现效果及注意事项

实现效果

在这里插入图片描述

如图所示长按KEY0按键开始音频录制,松开即音频录制结束,再调用百度语言API进行识别,并向用户展示识别的结果以及实现对硬件的控制。之后用户可自行选择继续识别或退出程序。

注意事项

该程序在声卡不进行录音时是将声卡设备给停止工作了的,在停止声卡设备前需要加入一小段的延时等待,若不添加延时等待,可能会出现子线程使声卡设备停止的同时主线程在读取声卡设备,从而导致下图中出现的错误:
在这里插入图片描述


源代码(转载请注明出处)

在这里插入图片描述

STM32-MEMS麦克风采集、高级音频处理和音频输出 FP-AUD-SMARTMIC1是一个STM32Cube功能包。该软件包实现了一个完整的应用程序,目标是MEMS麦克风阵列的高级处理,包括数字MEMS麦克风采集、波束成形、源定位和回声消除。处理后的音频被发送到USB主机和连接到相关扩展板的扬声器。该功能包基于STM32Cube软件技术,可轻松在不同的STM32微控制器之间进行移植。 阅读详情

相关推荐

STM32 LD3320语音识别模块SPI驱动 (STM32CUBE MX HAL库)

LD3320语音识别模块驱动: 一、硬件连接 主控芯片:STM32F103VCT6 PB12-----------LD3320_IRQ PB13-----------LD3320_WR PB15-----------LD3320_RST PA4-------------LD3320_CS PA5-------------LD3320_SCK PA6-------------LD3320_MISO PA7-------------LD3320_MOSI 二、使用STM32CUBEMX创建工程 引脚配置: SP

weixin_56565733的博客 8019

基于STM32单片机的语音控制系统

本次语音控制系统的设计使用STM32单片机作为控制中心,通过OLED12864显示屏显示数据,通过语音识别模块进行语音指令识别,通过DS18B20测温,通过42电机模拟转动。

XCHardware的博客 2762

【Linux 驱动开发】STM32MP157 + CS42L51 音频开发实战

本文详细介绍了基于STM32MP157和CS42L51的音频开发实战。主要内容包括: 音频系统架构:阐述音频编解码芯片CS42L51的工作原理和特性,支持4-96kHz采样率、24位转换器,通过I2S总线与处理器通信。 硬件接口设计:详细分析I2S总线时序(BCLK/LRCK/SD信号)和STM32的SAI接口配置要点,提供原理图验证方法。 开发流程:从设备树配置、驱动开发到ALSA工具链使用,实现声卡识别、WAV播放录制、MP3解码功能。 工程实现:提供完整的开发链路,包括内核驱动适配、用户空间工具调试(

猫猫的小茶馆 557

stm32输出音频总结(规划一定要先进,代码一定要漂亮!)

stm32输出音频,有2种方法,第一种比较常规, 使用I2S接口的音频codec芯片, 常用的有wm8978等, 我之前用过这个芯片,调试耗费了很长时间,最后完美的实现了通过wm8978录音与播放功能,并且实现了MP3的压缩与解码功能,全部使用软编解码。 程序的精华是 在HAL库上实现DMA双缓冲播放声音, 原生的HAL库I2S不支持双缓冲 ...

明天乌儿会歌唱 9722

STM32U5与MP157开发板:嵌入式大赛全栈能力实战指南

嵌入式系统开发是连接物理世界与数字世界的核心技术,其核心在于通过微控制器(MCU)和微处理器(MPU)实现对硬件设备的精准控制与智能管理。从原理上看,嵌入式开发涉及底层硬件驱动、实时操作系统、多任务调度以及系统集成等多个层面。其技术价值在于能够构建低功耗、高可靠、响应及时的智能设备,是物联网、智能硬件等领域的基石。典型的应用场景包括工业控制、消费电子、智能家居和边缘计算等。本文聚焦于全国大学生嵌入式大赛,深入解析官方推荐的STM32U5和MP157开发板,探讨如何利用STM32U5的超低功耗特性与MP157

weixin_34269583的博客 316

STM32MP157 DAC裸机开发:从CubeMX配置到波形生成实战

数模转换器(DAC)是连接数字系统与模拟世界的关键接口,其核心原理是将离散的数字编码转换为连续的模拟电压信号。这项技术为嵌入式系统赋予了直接控制外部模拟设备的能力,在音频合成、精密电压基准、波形发生及闭环控制等场景中具有重要价值。本文聚焦于STM32MP157的Cortex-M4内核,深入探讨其内置12位DAC模块的裸机驱动开发。通过STM32CubeIDE与HAL库,详细解析了从工程创建、图形化引脚配置,到核心API(如HAL_DAC_SetValue)的应用,并实践了从输出固定电压到生成三角波形的完整流

weixin_34406086的博客 405

STM32MP157驱动开发——Linux 音频驱动

Linux下的音频驱动开发,主要是使用CS42L51芯片。如果有音频开发需求可以参考。

weixin_45682654的博客 7198

正点原子嵌入式linux驱动开发——Linux 音频驱动

正点原子linux驱动开发的学习笔记,这一篇是linux下的音频驱动

xhj12138的博客 2003

STM32MP157-Linux音频应用编程-语音转文字项目

Linux应用编程之音频编程,使用正点原子STM32MP157开发板实现,使用户可以录制一段音频并进行识别(语音转文字)

Octopus1633的博客 1843

嵌入式屏幕选型:Linux与安卓在启动、稳定、成本上的硬核对比

嵌入式显示系统选型本质是实时性、可靠性与成本的三角权衡。Linux凭借精简启动链路、内核态DRM/KMS驱动和确定性调度,实现毫秒级冷启动(<1.3s)与7×24小时零GC抖动运行,适用于工业HMI、医疗监护、车载终端等对确定性有硬约束的场景;安卓则依托成熟HAL层、Google生态和多媒体中间件,在需深度集成Play Services或高频交互/4K解码的消费类设备中具备不可替代优势。二者差异核心在于架构哲学:Linux追求可预测性与资源可控,安卓侧重生态兼容与功能弹性。本文基于17个量产项目实测数据,量

weixin_34417183的博客 245

嵌入式AI开发能力图谱:从MCU到RV1126的全栈工程实践

嵌入式AI是人工智能与边缘计算融合的关键形态,其本质是在资源受限的硬件上实现模型高效推理。它依托于异构计算架构(如NPU、ISP、GPU协同)、轻量化模型(MobileNetV2、YOLOv3-tiny)和深度定制的系统软件栈(Linux驱动、设备树、RKNN工具链)。技术价值体现在低延迟、低功耗与本地化决策能力,广泛应用于智能安防、工业质检、可穿戴设备等实时性敏感场景。本文以RV1126平台为典型载体,系统解析从MCU裸机部署到SoC级Linux+AI全链路开发的核心能力要素,重点覆盖NPU内存映射、RK

weixin_36474001的博客 99

STM32MP157开发板Linux+Qt项目实战:音乐播放器

项目配套文档及源码,可在下方评论区留言索取~~ 华清远见stm32mp157开发板优势特色部分,包括音乐播放器、智慧家庭、智能工业电表、智能出行助手、智能猫眼、环境监测、智能安防、智能语音识别等10余个项目案例,涉及家居、医疗、农业多种应用方向...

华清远见IT实验室专栏 3562

RK3568、i.MX6ULL与STM32MP157三款SoC构建智能车载系统全解析

在嵌入式系统与物联网领域,SoC(系统级芯片)作为核心硬件平台,其选型直接决定了系统的性能、功耗与成本架构。SoC通过集成CPU、GPU、内存控制器及专用加速单元于单一芯片,实现了高度集成与能效优化,为复杂应用提供了硬件基础。其技术价值在于能够针对特定场景(如智能座舱、边缘计算)进行定制化设计,平衡通用计算与专用处理能力。在汽车电子智能化浪潮中,车载信息娱乐系统、高级驾驶辅助系统(ADAS)及车身域控制器等应用场景对SoC提出了实时性、可靠性与多媒体处理能力的综合要求。本文聚焦于智能车载系统的实现,深入探讨

weixin_31887307的博客 290

一大波嵌入式毕业设计选题推荐(配套源码、文档、开发板)

关注公众号“华清远见在线实验室”(微信号:hqyjlab),回复“mp157项目”,即可领取以上所有项目配套文档及源码。 开发板搭配仿真器、显示屏、摄像头、资源扩展板等丰富的扩展模块,可拓展物联网、人工智能等相关技术学习,还可以拓展丰富的项目实战,非常贴合企业当下开发需求,是一款嵌入式Linux入门进阶必备开发板!可实战音乐播放器、智慧家庭、智能工业电表、智能出行助手、智能猫眼、环境监测、智能安防、智能语音识别等10余个项目案例,涉及家居、医疗、农业多种应用方向,在案例中...

华清远见IT实验室专栏 4655

RK3568、i.MX6ULL与STM32MP157三款SoC构建智能车载系统的选型与开发实践

在嵌入式系统开发领域,片上系统(SoC)的选型是决定项目成败的关键。其核心原理在于根据性能、功耗、外设接口和成本等约束,匹配最合适的处理器架构。这一技术决策直接影响产品的实时性、可靠性与长期可维护性,具有极高的工程价值。尤其在智能车载、工业控制等场景中,SoC需要应对从信息娱乐、网络连接到高实时控制等多重需求。本文聚焦于这一核心挑战,深入探讨了如何针对不同应用场景,在瑞芯微RK3568、恩智浦i.MX6ULL和意法半导体STM32MP157这三款主流SoC之间进行权衡与适配,并分享了基于统一软件架构(如Bu

weixin_28278377的博客 342

基于深度强化学习技术优化无线网络中的资源分配(一)DQN部分代码

这是一个GitHub上的开源项目,链接:https://github.com/alexis-anzaldo/Deep-Reinforcement-Learning-for-resource-allocation-in-wireless-networks该项目旨在通过深度强化学习DQL技术优化无线网络中的资源分配,特别关注小型蜂窝和超密集无线蜂窝网络中的功率控制问题,主要目标是提高DRL模型的学习效率和网络吞吐量。

m0_46292040的博客 1538

MiniCPM-o-4.5-nvidia-FlagOS行业应用:嵌入式设备AI功能原型开发

本文介绍了如何在星图GPU平台上自动化部署MiniCPM-o-4.5-nvidia-FlagOS镜像,以快速构建嵌入式设备AI功能原型。该方案通过预置的轻量级环境,让开发者能在资源受限的硬件(如STM32MP157开发板)上,便捷地验证图像识别、语音交互等智能功能,大幅缩短从概念到原型的开发周期。

weixin_33759613的博客 29

MATLAB 论文复现——基于虚拟储能的电动汽车充放电调度策略及激励评价

文章基于虚拟储能聚合体仿真模型优化电动汽车充放电调度,并采用复合权重评价电动汽车的充电激励。根据电动汽车灵活性和系统稳定性衡量其贡献大小,并通过模糊推理系统模拟用户的充电意愿,实现对电动汽车充电的引导和优化。[1]陈朔,胡昊,方慧敏,等.基于虚拟储能的电动汽车充放电调度策略及激励评价[J/OL].系统仿真学报,1-12[2024-07-24].https://doi.org/10.16182/j.issn1004731x.joss.23-1316.基于虚拟储能的电动汽车充放电调度策略及激励评价。

sjr1478的博客 363

毕业设计竞赛选题推荐 | 嵌入式Linux应用之音乐播放器项目实战(含文档及源码)

音乐播放器项目》是一个集音乐播放、管理于一体的多媒体系统‌。项目实战平台是基于。

华清远见IT实验室专栏 1046

【PCIe硬件】PCIe引脚PRSNT与热插拔

热插拔的基本目的是要让PCIe设备按照规定的顺序、原则,从系统中移除或插入到系统中来,并能正常的工作,且不影响系统的正常运行。事实上,PCIe“热插拔”的关键目的就是为前面面所提到的系统RAS服务的,是提升系统RAS能力的非常重要的手段!注意,这里有两个相关概念,前面我们讲的热插拔,其实是广义的“热插拔”。这里的Hot-Plug,为了方便,我们叫做PCIe热插拔,也就是我们现在及后面将要讨论的内容。

smartvxworks的博客 2807

Coze工作流的代码无法安装第三方模块(依赖)怎么办?(如何解决Coze工作流代码缺少模块(依赖)的问题)

Coze工作流的代码无法安装第三方模块(依赖)怎么办?(如何解决Coze工作流代码缺少模块(依赖)的问题)

XiaoqiangClub的博客 4365

为可穿戴设备打造低功耗Linux控制器:从内核裁剪到电源管理实战

嵌入式Linux系统是连接底层硬件与复杂应用软件的桥梁,其核心在于通过操作系统内核管理硬件资源并提供服务。在资源受限的嵌入式场景中,尤其是对功耗极为敏感的可穿戴设备,通用Linux发行版往往过于臃肿。因此,深度定制与优化成为关键,其技术价值在于能在严格的功耗、体积和成本约束下,实现稳定、流畅且功能丰富的用户体验。这涉及到从硬件选型、内核深度裁剪、驱动编写到系统级电源策略的全链路优化。具体到可穿戴设备领域,应用场景包括智能手环、手表等需要长续航和实时生物传感的设备。通过采用ARM Cortex-M系列或低功耗

weixin_30607029的博客 1172

【思博伦】史上最详细Spirent TestCenter测试仪2544套件使用图文教程精讲!图解超赞超详细!!!

Avalanche测试仪使用指南 摘要:本文介绍了Avalanche测试仪的基本配置和使用方法。该测试仪采用Linux内核系统,通过端口模拟客户端与服务器端,支持HTTP、DNS、FTP等多种协议。文章详细讲解了管理IP配置、端口占用、项目创建、客户端/服务器端的参数设置(包括负载模拟、行为配置、网段设置等),以及测试执行和结果查看的全流程。特别针对HTTP测试,说明了测试前的组网准备和注意事项,包括IP地址规划、License申请等。同时提供了2544套件的时延和吞吐量测试方法,包括参数配置技巧和结果分析

风云说通信 2279
上一篇: STM32MP157-Linux音频应用编程-语音转文字项目
下一篇: STM32MP157-Linux输入设备应用编程-多点触摸屏编程
AゞOctopus๊
AゞOctopus๊ 新星创作者: 嵌入式与硬件开发技术领域 新星创作者: 嵌入式与硬件开发技术领域
博客等级 码龄6年 8293粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AゞOctopus๊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值