esp32开发与应用(和stm32f103用spi通信)

发布时间:2026/7/17 1:00:59

esp32开发与应用(和stm32f103用spi通信)
【 声明版权所有欢迎转载请勿用于商业用途。 联系信箱feixiaoxing 163.com】现在esp32和mcu一起出现的场合很多前者适合网络传输和屏幕显示后者则多出现在工业场景。所以两者一起出现就可以发挥各自的优势。但是两个一起合作也有通信的需求。虽然用ttl可以解决通信的问题但是速率比较低不太方便我们一般还是用spi会感觉比较简单一点。1、mcu做spi hostesp32做spi slave之所以会这样是因为很多时候都是采集数据的要求这个时候用mcu做master方便一点。2、gnd务必对接不管是测试的时候还是部署的时候两个模块的gnd需要互联。3、pin连接目前esp32的pin是5/18/19/23而mcu这边的pin是pa4/pa5/pa6/pa7。两者的连接方式是这样的5连接pa418连接pa519连接pa623连接pa7。4、esp32需要主动发起通信怎么办一般是通过gpio让mcu触发一个中断。5、代码部分这部分代码可以让ai写也可以。首先写mcu的代码#include stm32f10x.h #define SPI_CS_LOW() GPIO_ResetBits(GPIOA, GPIO_Pin_4) #define SPI_CS_HIGH() GPIO_SetBits(GPIOA, GPIO_Pin_4) void SPI1_Master_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE); // SCK(PA5), MOSI(PA7) 复用推挽输出 GPIO_InitStructure.GPIO_Pin GPIO_Pin_5 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); // MISO(PA6) 浮空输入 GPIO_InitStructure.GPIO_Pin GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, GPIO_InitStructure); // NSS(PA4) 用普通GPIO推挽输出软件控制片选 GPIO_InitStructure.GPIO_Pin GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); SPI_CS_HIGH(); // 默认不选中 SPI_InitStructure.SPI_Direction SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode SPI_Mode_Master; SPI_InitStructure.SPI_DataSize SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS SPI_NSS_Soft; // 软件NSS用GPIO4手动拉 SPI_InitStructure.SPI_BaudRatePrescaler SPI_BaudRatePrescaler_64; // 72MHz/641.125MHz先低速验证 SPI_InitStructure.SPI_FirstBit SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial 7; SPI_Init(SPI1, SPI_InitStructure); SPI_Cmd(SPI1, ENABLE); } uint8_t SPI1_TransferByte(uint8_t data) { while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) RESET); SPI_I2S_SendData(SPI1, data); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) RESET); return SPI_I2S_ReceiveData(SPI1); } // 简单延时根据你的系统时钟自行调整或换成systick延时 void delay_us(uint32_t us) { for (uint32_t i 0; i us * 8; i) __NOP(); } void SPI1_TransferBuffer(uint8_t *tx, uint8_t *rx, uint16_t len) { SPI_CS_LOW(); delay_us(10); // 给ESP32 slave一点反应时间非常关键 for (uint16_t i 0; i len; i) { rx[i] SPI1_TransferByte(tx[i]); } SPI_CS_HIGH(); } int main(void) { SPI1_Master_Init(); uint8_t tx_buf[4] {0x11, 0x22, 0x33, 0x44}; uint8_t rx_buf[4] {0}; while (1) { SPI1_TransferBuffer(tx_buf, rx_buf, 4); // rx_buf 里是 ESP32 回传的数据 for (volatile int i 0; i 500000; i); // 简单延时 } }然后是esp32的代码#include driver/spi_slave.h #include esp_log.h #include freertos/FreeRTOS.h #include freertos/task.h #include string.h #define GPIO_MOSI 23 #define GPIO_MISO 19 #define GPIO_SCLK 18 #define GPIO_CS 5 static const char *TAG SPI_SLAVE; void app_main(void) { esp_err_t ret; spi_bus_config_t buscfg { .mosi_io_num GPIO_MOSI, .miso_io_num GPIO_MISO, .sclk_io_num GPIO_SCLK, .quadwp_io_num -1, .quadhd_io_num -1, }; spi_slave_interface_config_t slvcfg { .mode 0, // 对应CPOL0, CPHA0要和STM32一致 .spics_io_num GPIO_CS, .queue_size 3, .flags 0, }; // 初始化SPI从机用DMA ret spi_slave_initialize(SPI2_HOST, buscfg, slvcfg, SPI_DMA_CH_AUTO); ESP_ERROR_CHECK(ret); WORD_ALIGNED_ATTR uint8_t recvbuf[4] {0}; WORD_ALIGNED_ATTR uint8_t sendbuf[4] {0xA1, 0xA2, 0xA3, 0xA4}; // 要回传给STM32的数据 while (1) { spi_slave_transaction_t t {0}; t.length 4 * 8; // 单位bit t.tx_buffer sendbuf; t.rx_buffer recvbuf; // 阻塞等待STM32发起一次传输 ret spi_slave_transmit(SPI2_HOST, t, portMAX_DELAY); if (ret ESP_OK) { ESP_LOGI(TAG, recv: %02X %02X %02X %02X, recvbuf[0], recvbuf[1], recvbuf[2], recvbuf[3]); // 根据收到的数据更新下一次要回传的内容 sendbuf[0]; // 举例简单自增实际按你的协议处理 } } }6、测试测试的时候一般先把esp32准备插好之后再接入mcu。这个时候不出意外就可以在esp32这边看到源源不断的信息打印了。

相关新闻

鸿蒙APP如何复用已有小程序资产,将微信小程序运行在原生鸿蒙系统

鸿蒙APP如何复用已有小程序资产,将微信小程序运行在原生鸿蒙系统

2026/7/17 1:00:59

很多企业启动鸿蒙APP建设时,难点并不只在ArkTS工程本身。已有Android、iOS和微信小程序已经承载了大量业务,服务入口、活动页、商城、设备控制、会员权益、售后工单都跑了多年。如果鸿蒙端全部重新开发一遍,页面、接口、测试用例、运营后台和…

客户拜访后整理沟通录音,2026技术人怎么选合适的语音转文字工具

客户拜访后整理沟通录音,2026技术人怎么选合适的语音转文字工具

2026/7/17 0:50:58

针对销售客服整理客户拜访录音选语音转文字工具的需求,核心要匹配自身的使用频率和后续整理需求。日常单次1小时以内的拜访,大部分工具免费额度都能覆盖;需要自动提取客户需求、生成跟进待办的,优先选带AI总结功能的工具&#xff…

OpenHarmony 图片选择  相册相机工具封装 ImagePickerUtil(API23)

OpenHarmony 图片选择 相册相机工具封装 ImagePickerUtil(API23)

2026/7/17 0:50:58

摘要原生媒体图库、相机拍照接口逻辑繁琐:需要先校验动态权限、区分相册单选 / 多选、相机拍摄、图片压缩、沙盒路径转换、保存到相册、权限拒绝引导弹窗、回调封装。封装统一图片工具,整合相册单选、相册多选、相机拍照、图片压缩、本地保存五大能力&am…

DocsGPT开源平台:基于RAG技术的企业级智能文档助手部署指南

DocsGPT开源平台:基于RAG技术的企业级智能文档助手部署指南

2026/7/17 2:21:03

如果你正在为团队或企业构建智能助手,却苦于文档格式兼容性差、模型选择受限、部署复杂等问题,那么 DocsGPT 可能正是你需要的解决方案。这个开源项目在 GitHub 上已经获得超过 18k 星标,它不仅仅是一个简单的文档问答工具,而是一…

解决Linux开机自动加载kvm_amd模块问题

解决Linux开机自动加载kvm_amd模块问题

2026/7/17 2:21:03

1. 问题背景:为什么每次开机都要手动加载kvm_amd模块?作为一名长期使用KVM虚拟化技术的开发者,我经常遇到这样的困扰:明明已经安装了KVM相关组件,但每次重启后都需要手动执行modprobe kvm_amd才能正常使用虚拟化功能。…

RAG技术进阶:从基础检索到智能推理的42+实战方案

RAG技术进阶:从基础检索到智能推理的42+实战方案

2026/7/17 2:21:03

在尝试构建一个能够回答复杂问题的智能系统时,很多开发者都会遇到一个共同的困境:简单的关键词匹配或语义搜索往往只能找到表面相关的信息,而真正需要深入理解文档内容、进行多步推理的问题,却总是得不到满意的答案。这就是为什么…

DeepSeek MODEL1架构泄露:Engram记忆系统与MoE双稀疏度设计解析

DeepSeek MODEL1架构泄露:Engram记忆系统与MoE双稀疏度设计解析

2026/7/17 2:21:03

1. DeepSeek MODEL1架构泄露事件始末2026年1月21日,DeepSeek的FlashMLA代码库意外泄露了代号为"MODEL1"的技术文档,涉及114个文件中的28处关键引用。这次泄露之所以引发行业震动,是因为其内容与arXiv论文2601.07372描述的Engram记忆…

全志V3s GPIO驱动三套实战方案:传统字符设备、platform总线、设备树适配

全志V3s GPIO驱动三套实战方案:传统字符设备、platform总线、设备树适配

2026/7/17 2:21:03

本文还有配套的精品资源,点击获取 简介:包含全志V3s平台下三种Linux GPIO驱动实现方式的完整可运行代码包:Way1是基于字符设备的传统驱动模型,直接操作寄存器,适合理解底层硬件控制;Way2采用platform总线…

AI黑箱揭秘:可解释性技术与行业实践

AI黑箱揭秘:可解释性技术与行业实践

2026/7/17 2:11:02

1. 为什么我们需要"揭开盖子"看AI?当邻居家的小孩第一次看到自动扫地机器人工作时,他蹲下来试图掀开机器人的盖子,想看看"里面是不是藏了个小人"。这个场景完美诠释了当下大众对人工智能的认知状态——我们都知道AI能做很…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/16 0:35:09

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/16 14:29:31

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/16 14:18:17

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…

Cursor终端插件生态避坑指南:23个实测低效插件黑名单,附3个自研轻量替代方案

Cursor终端插件生态避坑指南:23个实测低效插件黑名单,附3个自研轻量替代方案

2026/7/17 0:00:57

更多请点击: https://intelliparadigm.com 第一章:Cursor终端插件生态避坑指南概览 Cursor 作为基于 VS Code 内核构建的 AI 原生编辑器,其终端插件生态虽活跃,但存在兼容性断层、权限策略突变与调试链路断裂等典型风险。开发者常…

ChatGPT写作提示词效率革命:单条提示词响应质量提升3.8倍的关键变量(附可复用提示词矩阵表)

ChatGPT写作提示词效率革命:单条提示词响应质量提升3.8倍的关键变量(附可复用提示词矩阵表)

2026/7/17 0:00:57

更多请点击: https://codechina.net 第一章:ChatGPT写作提示词效率革命:单条提示词响应质量提升3.8倍的关键变量(附可复用提示词矩阵表) 提示词工程已从经验试错迈入变量驱动的科学阶段。实证研究表明,影响…

DeepSeek V4替换Codex底座模型的实践与优化

DeepSeek V4替换Codex底座模型的实践与优化

2026/7/17 0:00:57

1. 为什么选择用DeepSeek V4替换Codex的底座模型去年我在开发一个智能代码补全工具时,发现Codex的默认底座模型在复杂业务逻辑场景下表现不尽如人意。经过多次测试对比,DeepSeek V4在以下几个关键指标上展现出明显优势:代码补全准确率&#x…