当前位置: 首页 > news >正文

gd32 i2c 中断 主机从机双向通信例程

Master
I2C0_SCL PB8 AF4
I2C0_SDA PB9 AF4

Slave
I2C1_SCL PB10 AF4
I2C1_SDA PB11 AF4

//主机中断发送
void i2c_master_transmit_it(uint32_t address, uint8_t* buff, uint32_t size);
//主机中断接收
void i2c_master_receive_it(uint32_t address, uint8_t* buff, uint32_t size, uint32_t* size_out);

//从机中断发送
void i2c_slave_transmit_it(uint8_t* buff, uint32_t size);
//从机中断接收
void i2c_slave_receive_it(uint8_t* buff, uint32_t* size_out);

main.c

/*!\file    main.c\brief   running LED\version 2023-03-31, V1.0.0, firmware for GD32H7xx
*/#include "gd32h7xx.h"
#include "systick.h"#include "string.h"
#include "stdio.h"#define I2C_SLAVE_ADDRESS7 0x82/*!\brief      enable the CPU Chache\param[in]  none\param[out] none\retval     none
*/
static void cache_enable(void)
{/* Enable I-Cache */SCB_EnableICache();/* Enable D-Cache */
//    SCB_EnableDCache();
}void led_config()
{rcu_periph_clock_enable(RCU_GPIOJ);gpio_mode_set(GPIOJ, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_8);gpio_output_options_set(GPIOJ, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_8);gpio_mode_set(GPIOJ, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_9);gpio_output_options_set(GPIOJ, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_9);gpio_bit_set(GPIOJ, GPIO_PIN_8);gpio_bit_set(GPIOJ, GPIO_PIN_9);}void usart_config()
{rcu_periph_clock_enable(RCU_GPIOB);rcu_periph_clock_enable(RCU_USART0);gpio_af_set(GPIOB, GPIO_AF_7, GPIO_PIN_6);gpio_af_set(GPIOB, GPIO_AF_7, GPIO_PIN_7);gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_6);gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_6);gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_7);gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_7);usart_deinit(USART0);usart_word_length_set(USART0, USART_WL_8BIT);usart_stop_bit_set(USART0, USART_STB_1BIT);usart_parity_config(USART0, USART_PM_NONE);usart_baudrate_set(USART0, 921600U);usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);usart_receive_config(USART0, USART_RECEIVE_ENABLE);usart_enable(USART0);
}void usart_transmit(char* buff, int size)
{for (int i = 0; i < size; ++i) {usart_data_transmit(USART0, buff[i]);while (RESET == usart_flag_get(USART0, USART_FLAG_TBE)) {}}
}/** Master* I2C0_SCL PB8  AF4* I2C0_SDA PB9  AF4*/
void i2c0_config()
{rcu_periph_clock_enable(RCU_GPIOB);gpio_af_set(GPIOB, GPIO_AF_4, GPIO_PIN_8 | GPIO_PIN_9);gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_8 | GPIO_PIN_9);gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_100_220MHZ, GPIO_PIN_8 | GPIO_PIN_9);rcu_periph_clock_enable(RCU_I2C0);i2c_deinit(I2C0);i2c_timing_config(I2C0, 0x3, 0x9, 0x0);i2c_master_clock_config(I2C0, 0x96, 0xda);i2c_enable(I2C0);nvic_irq_enable(I2C0_EV_IRQn, 2, 0);nvic_irq_enable(I2C0_ER_IRQn, 2, 1);
}uint8_t* master_tx_buff;
uint8_t* master_rx_buff;
uint32_t* master_rx_recv_cnt;void I2C0_EV_IRQHandler()
{if (RESET != i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_STPDET)) {i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_STPDET);} else if (RESET != i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_TI)) {i2c_data_transmit(I2C0, *master_tx_buff++);} else if (RESET != i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_RBNE)) {*master_rx_buff++ = i2c_data_receive(I2C0);*master_rx_recv_cnt += 1;} else if (RESET != i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_TC)) {i2c_stop_on_bus(I2C0);i2c_interrupt_disable(I2C0, I2C_INT_ERR | I2C_INT_STPDET | I2C_INT_TI | I2C_INT_RBNE | I2C_INT_TC);}
}void I2C0_ER_IRQHandler()
{if (i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_BERR)) {i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_BERR);}if (i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_LOSTARB)) {i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_LOSTARB);}if (i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_OUERR)) {i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_OUERR);}if (i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_PECERR)) {i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_PECERR);}if (i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_TIMEOUT)) {i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_TIMEOUT);}if (i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_SMBALT)) {i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_SMBALT);}i2c_interrupt_disable(I2C0, I2C_INT_ERR | I2C_INT_STPDET | I2C_INT_RBNE | I2C_INT_TI | I2C_INT_TC);
}void i2c_master_transmit_it(uint32_t address, uint8_t* buff, uint32_t size)
{master_tx_buff = buff;i2c_master_addressing(I2C0, address, I2C_MASTER_TRANSMIT);i2c_transfer_byte_number_config(I2C0, size);i2c_interrupt_enable(I2C0, I2C_INT_ERR | I2C_INT_STPDET | I2C_INT_TI | I2C_INT_TC);while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)) { } //等待总线空闲I2C_STAT(I2C0) |= I2C_STAT_TBE;i2c_start_on_bus(I2C0);
}void i2c_master_receive_it(uint32_t address, uint8_t* buff, uint32_t size, uint32_t* size_out)
{master_rx_buff = buff;master_rx_recv_cnt = size_out;*master_rx_recv_cnt = 0;i2c_master_addressing(I2C0, address, I2C_MASTER_RECEIVE);i2c_transfer_byte_number_config(I2C0, size);i2c_interrupt_enable(I2C0, I2C_INT_ERR | I2C_INT_STPDET | I2C_INT_RBNE | I2C_INT_TC);while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)) { } //等待总线空闲i2c_start_on_bus(I2C0);
}/** Slave* I2C1_SCL PB10 AF4* I2C1_SDA PB11 AF4*/
void i2c1_config()
{rcu_periph_clock_enable(RCU_GPIOB);gpio_af_set(GPIOB, GPIO_AF_4, GPIO_PIN_10 | GPIO_PIN_11);gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_10 | GPIO_PIN_11);gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_100_220MHZ, GPIO_PIN_10 | GPIO_PIN_11);rcu_periph_clock_enable(RCU_I2C1);i2c_deinit(I2C1);i2c_address_config(I2C1, I2C_SLAVE_ADDRESS7, I2C_ADDFORMAT_7BITS);i2c_enable(I2C1);nvic_irq_enable(I2C1_EV_IRQn, 2, 2);nvic_irq_enable(I2C1_ER_IRQn, 2, 3);
}uint8_t* slave_tx_buff;
uint8_t* slave_rx_buff;
uint32_t* slave_rx_recv_cnt;void I2C1_EV_IRQHandler()
{if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_ADDSEND)) {i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_ADDSEND);I2C_STAT(I2C1) |= I2C_STAT_TBE;} else if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_RBNE)) {*slave_rx_buff++ = i2c_data_receive(I2C1);*slave_rx_recv_cnt += 1;} else if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_TI)) {i2c_data_transmit(I2C1, *slave_tx_buff++);} else if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_STPDET)) {i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_STPDET);i2c_interrupt_disable(I2C1, I2C_INT_ERR | I2C_INT_STPDET | I2C_INT_ADDM | I2C_INT_TI | I2C_INT_RBNE);}
}void I2C1_ER_IRQHandler()
{if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_BERR)) {i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_BERR);}if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_LOSTARB)) {i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_LOSTARB);}if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_OUERR)) {i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_OUERR);}if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_PECERR)) {i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_PECERR);}if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_TIMEOUT)) {i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_TIMEOUT);}if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_SMBALT)) {i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_SMBALT);}i2c_interrupt_disable(I2C1, I2C_INT_ERR | I2C_INT_STPDET | I2C_INT_ADDM | I2C_INT_RBNE | I2C_INT_TI);
}void i2c_slave_transmit_it(uint8_t* buff, uint32_t size)
{slave_tx_buff = buff;i2c_interrupt_enable(I2C1, I2C_INT_ERR | I2C_INT_STPDET | I2C_INT_ADDM | I2C_INT_TI);
}void i2c_slave_receive_it(uint8_t* buff, uint32_t* size_out)
{slave_rx_recv_cnt = size_out;*slave_rx_recv_cnt = 0;slave_rx_buff = buff;i2c_interrupt_enable(I2C1, I2C_INT_ERR | I2C_INT_STPDET | I2C_INT_ADDM | I2C_INT_RBNE);
}/*!\brief      main function\param[in]  none\param[out] none\retval     none
*/
int main(void)
{/* enable the CPU Cache */cache_enable();/* configure systick */systick_config();led_config();usart_config();i2c0_config();i2c1_config();while(1) {//-----------------------------------------------------------------------uint8_t tx1[8] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};uint8_t rx1[8] = {0};uint32_t rx1_recv_bytes = 0;i2c_slave_receive_it(rx1, &rx1_recv_bytes);i2c_master_transmit_it(I2C_SLAVE_ADDRESS7, tx1, 8);delay_1ms(10);//上位机应接收到 "0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88"usart_transmit(rx1, rx1_recv_bytes);//-----------------------------------------------------------------------uint8_t tx2[4] = {0x44, 0x33, 0x22, 0x11};uint8_t rx2[4] = {0};uint32_t rx2_recv_bytes = 0;i2c_slave_receive_it(rx2, &rx2_recv_bytes);i2c_master_transmit_it(I2C_SLAVE_ADDRESS7, tx2, 4);delay_1ms(10);//上位机应接收到 "0x44, 0x33, 0x22, 0x11"usart_transmit(rx2, rx2_recv_bytes);//-----------------------------------------------------------------------uint8_t tx3[4] = {0x12, 0x34, 0x56, 0x78};uint8_t rx3[4] = {0};uint32_t rx3_recv_bytes = 0;i2c_slave_transmit_it(tx3, 4);i2c_master_receive_it(I2C_SLAVE_ADDRESS7, rx3, 4,  &rx3_recv_bytes);delay_1ms(10);//上位机应接收到 "0x12, 0x34, 0x56, 0x78"usart_transmit(rx3, rx3_recv_bytes);//-----------------------------------------------------------------------uint8_t tx4[4] = {0xaa, 0xbb, 0xcc, 0xdd};uint8_t rx4[4] = {0};uint32_t rx4_recv_bytes = 0;i2c_slave_transmit_it(tx4, 4);i2c_master_receive_it(I2C_SLAVE_ADDRESS7, rx4, 4,  &rx4_recv_bytes);delay_1ms(10);//上位机应接收到 "0xaa, 0xbb, 0xcc, 0xdd"usart_transmit(rx4, rx4_recv_bytes);delay_1ms(1000);}
}

相关文章:

gd32 i2c 中断 主机从机双向通信例程

Master I2C0_SCL PB8 AF4 I2C0_SDA PB9 AF4 Slave I2C1_SCL PB10 AF4 I2C1_SDA PB11 AF4 //主机中断发送 void i2c_master_transmit_it(uint32_t address, uint8_t* buff, uint32_t size); //主机中断接收 void i2c_master_receive_it(uint32_t address, uint8_t* buff, uint…...

程序员在AI时代:重塑核心竞争力,共舞智能未来

程序员在AI时代&#xff1a;重塑核心竞争力&#xff0c;共舞智能未来 在这个日新月异的科技时代&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;技术&#xff0c;尤其是以ChatGPT、Midjourney、Claude等为代表的大语言模型&#xff0c;正以前所未有的速度渗透到编程…...

apex发送邮件中显示饼状图和条形图

在 Apex 中发送带有嵌入图表&#xff08;如饼状图和条形图&#xff09;的电子邮件&#xff0c;您可以通过以下步骤实现&#xff1a; 生成图表图像&#xff1a;使用外部库或服务生成图表图像并获取图像的 URL 或 Base64 编码。创建电子邮件模板&#xff1a;在 HTML 邮件模板中嵌…...

【HarmonyOS NEXT星河版开发学习】小型测试案例07-弹性布局小练习

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面&#xff08;暂未发布&#xff09; 前言 在鸿蒙&#xff08;HarmonyOS&#xff09;开发中&#xff0c;Flex布局是一种非常有用的布局方式&#xff0c;它允许开发者创建灵活且响…...

Sparksql array相关函数

前言 Apache Spark SQL 是 Spark 的一个重要模块,用于处理结构化数据。它提供了 DataFrame 和 Dataset API,使得开发者能够使用 SQL 查询语言(称为 Spark SQL)对数据进行高效的操作。在本文中,我们将介绍 Spark SQL 中所有与array相关的函数。 环境 sparksql版本<dep…...

软件测试学习笔记

测试学习 1. 测试流程2. Bug的提出什么是bugbug 的描述bug 级别 3. 测试用例的设计什么是测试用例测试用例应如何设计基于需求的设计方法等价类边界值场景法正交表法判定表法错误猜测法 4. 自动化测试回归测试自动化分类 5. 安装 webdriver-manager 和 selenium第一个web自动化…...

Centos 8系统ext4文件系统类型进行扩容缩容 (LVM)

Centos 8系统ext4文件系统类型进行扩容缩容 &#xff08;LVM&#xff09; 1.磁盘情况&#xff1a;2.缩容home分区1.备份home数据&#xff1a;2.查找使用 /home 的进程&#xff1a;3.终止这些进程&#xff1a;4.卸载 /home 分区5.检查文件系统一致性 (e2fsck)&#xff1a;6.调整…...

常考常考高频率

1.快排&#xff08;双指针&#xff09; 快排&#xff0c;归并排序&#xff0c;堆排序 #快速排序O&#xff08;nlogn&#xff09; def quick_sort(array, left, right):if left < right:mid partition(array, left, right)quick_sort(array, left, mid)quick_sort(array, …...

Linux项目环境的搭建 (Red hat 9.0Linux操作系统)

一、目的&#xff1a; 1.搭建Linux操作系统项目所需的项目环境构件&#xff1b; 2.了解 Linux的组成&#xff0c;学会编译内核。 二、内容&#xff1a; 安装Red hat 9.0Linux操作系统&#xff1b; 三、步骤&#xff1a; 3.1 正确安装Redhat9.0操作系统。 3.2 rpm -Uvh *.…...

Study--Oracle-08-ORACLE数据备份与恢复(一)

一、ORACLE数据保护方案 1、oracle数据保护方案 2、数据库物理保护方案 oracle数据库备份可以备份到本地集群存储,也可以备份到云存储。 3、数据库逻辑数据保护方案 二、ORACLE数据体系 1、ORACLE 数据库的存储结构 2、oracle物理和逻辑存储结构 3、数据库进程 4、数据库日…...

FreeIPA安装

一、环境准备 主机名IP角色master. bhlu. com192.168.22.10服务端node1. bhlu. com192.168.22.11客户端 两台服务器关闭防火墙和 selinux配置好 yum 源 1.1 配置 chronyd 配置好 chronyd&#xff0c;使用 chronyc source -v 可以验证 # 这里写了一个playbook作为示例了 --…...

mysql数据库:SQL语言基础和基本查询

mysql数据库&#xff1a;SQL语言基础和基本查询 SQL语言简介 Structured Query Language, 结构化查询语言非过程性语言为加强SQL的语言能力&#xff0c;各厂商增强了过程性语言的特征如&#xff1a;Oracle的PL/SQL 过程性处理能力&#xff0c;SQL Server、Sybase的T-SQLSQL是用…...

strimzi operator 部署kafka集群(可外部访问)

Strimzi介绍 官方文档:https://strimzi.io/docs/operators/0.42.0/overview#kafka-components_str Strimzi介绍 Strimzi 是一个用于 Apache Kafka 在 Kubernetes 上部署和管理的开源项目。它提供了一组 Kubernetes 自定义资源定义(Custom Resource Definitions,CRDs)、控制…...

【网络安全】探索AI 聊天机器人工作流程实现RCE

未经许可,不得转载。 文章目录 前言正文前言 我发现了一个广泛使用的AI聊天机器人平台中的远程代码执行漏洞。该漏洞存在于聊天机器人的自定义工作流响应代码中,这些工作流允许开发人员通过创建定制的流程来扩展机器人的功能。 正文 在浏览自动化聊天机器人的多个特定功能…...

虚拟DOM、Vue渲染流程

虚拟DOM&#xff08;Virtual DOM&#xff09;是一种在前端开发中广泛使用的技术&#xff0c;它用JavaScript对象来表示真实DOM&#xff08;文档对象模型&#xff09;的结构和状态。虚拟DOM的核心思想是将页面的状态和结构保存在内存中&#xff0c;而不是直接操作真实的DOM。这一…...

centos7 启动python后端服务与停止服务的sh脚本

centos7 启动python后端服务与停止服务 分别在工程目录下新建启动脚本和停止脚本。 1、启动服务脚本 start_srv.sh: python3 start_srv.py运行 nohup ./start_srv.sh & 以守护进程的方式启动这个服务。 2、停止服务脚本 stop_srv.sh: sp_pidps -ef | grep start_srv…...

访问网站显示不安全怎么办?

访问网站时显示“不安全”&#xff0c;针对不同的原因有不同的解决方式&#xff0c;下面是常见的几种原因和对应的解决办法。 1.未启用HTTPS协议 如果网站仅使用HTTP协议&#xff0c;数据传输没加密&#xff0c;因此会被浏览器标记为“不安全”。解决办法是启用HTTPS协议,给…...

Scala与集合框架:高效数据处理的利器

Scala与集合框架&#xff1a;高效数据处理的利器 Scala 是一种现代化的编程语言&#xff0c;融合了面向对象编程和函数式编程的特性。其集合框架为处理数据提供了强大而灵活的工具&#xff0c;使得数据处理变得高效且富有表达力。本文将深入探讨 Scala 的集合框架&#xff0c;…...

基于 JWT 的模拟登录爬取实战

准备工作 1. 了解 JWT 相关知识 2. 安装 requests 库&#xff0c;并了解其基本使用 案例介绍 爬取网站&#xff1a; https://login3.scrape.center/ 用户名和密码是&#xff1a; admin 模拟登录 基于 JWT 的网站通常采用的是前后端分离式&#xff0c; 前后端的数据传输依…...

力扣(2024.08.06)

1. 144&#xff1a;二叉树的前序遍历 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def preorderTravers…...

3步颠覆传统:Hyper-V DDA图形工具让设备直通效率提升10倍

3步颠覆传统&#xff1a;Hyper-V DDA图形工具让设备直通效率提升10倍 【免费下载链接】DDA 实现Hyper-V离散设备分配功能的图形界面工具。A GUI Tool For Hyper-Vs Discrete Device Assignment(DDA). 项目地址: https://gitcode.com/gh_mirrors/dd/DDA 问题发现&#x…...

C++的std--ranges适配器视图元素类型系统与概念检查在模板错误信息

C20引入的std::ranges彻底改变了范围处理范式&#xff0c;其适配器视图与概念检查机制在编译期类型安全方面展现出独特价值。当开发者组合视图管道或设计泛型算法时&#xff0c;元素类型系统的静态验证能精准拦截非法操作&#xff0c;而概念检查生成的模板错误信息则成为调试利…...

Blue-Topaz主题新手入门指南:打造你的个性化Obsidian笔记环境

Blue-Topaz主题新手入门指南&#xff1a;打造你的个性化Obsidian笔记环境 【免费下载链接】Blue-Topaz_Obsidian-css A blue theme for Obsidian. 项目地址: https://gitcode.com/gh_mirrors/bl/Blue-Topaz_Obsidian-css 还在为Obsidian默认界面单调而烦恼&#xff1f;…...

OpenClaw极客玩法:用Qwen2.5-VL-7B控制智能家居图文面板

OpenClaw极客玩法&#xff1a;用Qwen2.5-VL-7B控制智能家居图文面板 1. 为什么需要视觉化智能家居控制 去年装修新房时&#xff0c;我安装了某品牌智能家居系统。它的手机App控制界面设计得很"艺术"——各种圆形滑块、渐变色调光面板&#xff0c;看起来酷炫但用起来…...

手把手教你用立创EDA搞定蓝桥杯十五届省赛真题PCB:从元器件布局到差分对走线详解

立创EDA实战&#xff1a;蓝桥杯PCB设计竞赛全流程拆解 参加蓝桥杯EDA竞赛的同学们常常面临一个核心挑战&#xff1a;如何在有限时间内完成既符合电气特性又具备竞赛美学的PCB设计。作为连续三年担任蓝桥杯EDA组指导的技术顾问&#xff0c;我发现90%的参赛者在差分对处理、电源模…...

Qwen3.5-9B视觉增强:OpenClaw自动处理截图中的文字

Qwen3.5-9B视觉增强&#xff1a;OpenClaw自动处理截图中的文字 1. 为什么需要自动处理截图文字 上周我需要整理一份移动端产品调研报告&#xff0c;手机截屏了二十多个竞品界面。当我把这些截图传到电脑上准备整理时&#xff0c;发现两个致命问题&#xff1a;一是部分截图文字…...

用STM32F103C8T6做个会说话的智能垃圾桶:从超声波感应到语音播报的完整DIY教程

用STM32F103C8T6打造会说话的智能垃圾桶&#xff1a;从硬件搭建到语音交互的全流程解析 在创客圈里&#xff0c;智能家居项目永远是最受欢迎的实践方向之一。而今天我们要做的这个会说话的智能垃圾桶&#xff0c;不仅融合了超声波感应、语音播报和自动开盖这些酷炫功能&#xf…...

SenseVoice实战:搭建智能客服语音质检系统,自动检测咳嗽清嗓等事件

SenseVoice实战&#xff1a;搭建智能客服语音质检系统&#xff0c;自动检测咳嗽清嗓等事件 在客服中心的质量检查工作中&#xff0c;质检人员每天需要监听大量通话录音&#xff0c;手动标记出咳嗽、清嗓等非语音事件。传统人工质检方式不仅效率低下&#xff0c;而且容易因疲劳…...

18-宠物领养系统 mysql+springboot+vue

文档地址 1. 系统简介: 致力于为无家可归的宠物找到一个温暖的家园。作为一个非盈利性的宠物领养平台&#xff0c;目标是通过提供全面的领养信息和专业的宠物照顾知识&#xff0c;促进人们对宠物的了解和关爱。 2. 技术栈: 技术&#xff1a; 基于 B/S 架构 SpringBootMySQL…...

Browsershot终极教程:从零开始掌握Chrome无头浏览器

Browsershot终极教程&#xff1a;从零开始掌握Chrome无头浏览器 【免费下载链接】browsershot Convert HTML to an image, PDF or string 项目地址: https://gitcode.com/gh_mirrors/br/browsershot Browsershot是一款强大的工具&#xff0c;能够轻松实现HTML到图片、PD…...