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

STM32f407 网络接收 fpga 的 bin 文件并更新到 fpga series7(3)

STM32f407 网络接收 fpga 的 bin 文件并更新到 fpga series7(3)

简介

实验 3:在搭建好 tcp 服务器,并拟定好协议的前提下,接收每一个 bin 文件的块,配置到 fpga。

原理图

fpga
在这里插入图片描述

fpga1
在这里插入图片描述

stm32
在这里插入图片描述

接线总结

// fpga引脚 stm32引脚
// 用不到D_OUT
#define PROGRAM_B PB0
#define INT_B     PB1
#define CCLK      PC10
#define D01_DIN   PC12
#define DONE      PD3

手册

搜索下载关键词:Xilinx XAPP583 Using a Microprocessor to Configure Xilinx 7 Series FPGAs

引脚

在这里插入图片描述

时序

在这里插入图片描述

伪代码在手册里,自己看

stm32cube 配置

在这里插入图片描述

单片机代码

load_fpga.c

#include "load_fpga.h"#include <stdio.h>
#include "main.h"#define WRITE_PROGRAM_B(x) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, x)
#define WRITE_CCLK(x)      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10, x)
#define WRITE_D01_DIN(x)   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, x)
#define READ_INT_B()       HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1)
#define READ_DONE()        HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_3)/// @brief 交换4字节顺序
/// eg: 0xaabbccdd -> 0xddccbbaas
/// @param data
/// @return
unsigned int swap_uint32(unsigned int data) {unsigned int swapped;swapped = ((data << 24) & 0xFF000000) | ((data << 8) & 0x00FF0000) |((data >> 8) & 0x0000FF00) | ((data >> 24) & 0x000000FF);return swapped;
}/// @brief 产生count个时钟上升沿
/// @param drvdata
/// @param count
void shift_cclk(unsigned int count) {int i;// WRITE_CCLK(0); // 感觉有点多余,影响接收速度了for (i = 0; i < count; ++i) {WRITE_CCLK(1);WRITE_CCLK(0);}
}/// @brief 写入每一位,从高位开始
/// @param data32
void shift_word_out(unsigned int data32) {int i;unsigned int data;for (i = 31; i >= 0; i--) {data = (data32 & 1 << i) ? 1 : 0;WRITE_D01_DIN(data);shift_cclk(1);}
}/// @brief 准备写入
/// 配置准备下入状态
/// @param
/// @return 成功返回0
int program_init(void) {int i = 0;/* Configuration Reset */WRITE_PROGRAM_B(0);HAL_Delay(1);  // 1usWRITE_PROGRAM_B(1);/* Wait for Device Initialization */while (READ_INT_B() == 0) {++i;if (i > 0x00010000) {printf("INIT_B has not gone high\n");return -1;}}return 0;
}/// @brief 写入fpga
/// @param buf
/// @param len
/// @return 成功返回0
int program_data(char *buf, int len) {int i;for (i = 0; i < len; i += 4) {shift_word_out(swap_uint32(*(uint32_t *)(buf + i)));if (READ_INT_B() == 0) {printf("INIT_B error\n");return -1;}}return 0;
}/// @brief 写入完成
/// @param
/// @return 成功返回0
int program_done(void) {/* Check INIT_B */if (READ_INT_B() == 0) {printf("INIT_B error\n");return -1;}/* Wait for DONE to assert */int i = 0;while (READ_DONE() == 0) {shift_cclk(1);  // 不加会导致又概率失败++i;if (i > 0x00010000) {printf("DONE has not gone high\n");return -1;}}/* Compensate for Special Startup Conditions */shift_cclk(8);return 0;
}

tcp_echo.c

#include "tcp_echo.h"
#include "lwip/opt.h"
#include "lwip/tcp.h"
#include "load_fpga.h"
#if LWIP_NETCONN#include "lwip/sys.h"#include "lwip/api.h"#define TCPECHO_THREAD_PRIO (tskIDLE_PRIORITY + 4)#define kbuffer_len  1024#define kheader_size 24#define kdata_len    1000#define kmagic       0xaa5555aachar buffer[kbuffer_len];struct tcp_package_header {uint32_t magic;uint32_t type;uint32_t data_offset;uint32_t data_len;uint32_t order;uint32_t magic1;
};/// @brief TCP服务函数
/// @param arg
static void tcpecho_thread(void *arg) {struct netconn *conn, *newconn;err_t err, accept_err;struct netbuf *buf;void *data;u16_t len;int ret = 0;LWIP_UNUSED_ARG(arg);#if 1/* Create a new connection identifier. */conn = netconn_new(NETCONN_TCP);if (conn != NULL) {/* Bind connection to well known port number 7. */err = netconn_bind(conn, NULL, 7);if (err == ERR_OK) {/* Tell connection to go into listening mode. */netconn_listen(conn);while (1) {/* Grab new connection. */accept_err = netconn_accept(conn, &newconn);/* Process the new connection. */if (accept_err == ERR_OK) {while (netconn_recv(newconn, &buf) == ERR_OK) {netbuf_data(buf, &data, &len);do {// 1 拿到帧头struct tcp_package_header *head;head = (struct tcp_package_header *)data;// 2 判断typeswitch (head->type) {case 0xA: ret = program_init(); break;case 0xB:ret = program_data((char *)data + sizeof(struct tcp_package_header),head->data_len);break;case 0xC: ret = program_done(); break;default: break;}// 3 回发给tcp_clientif (ret < 0) {head->data_offset = 1;} else {head->data_offset = 0;}netconn_write(newconn, head, sizeof(struct tcp_package_header),NETCONN_COPY);} while (netbuf_next(buf) >= 0);netbuf_delete(buf);}/* Close connection and discard connection identifier. */netconn_close(newconn);netconn_delete(newconn);}}} else {netconn_delete(newconn);}}#endif
}// 创建tcp服务函数任务
void tcpecho_init(void) {sys_thread_new("tcpecho_thread", tcpecho_thread, NULL, DEFAULT_THREAD_STACKSIZE,TCPECHO_THREAD_PRIO);
}#endif /* LWIP_NETCONN */

加载前

在这里插入图片描述
加载后
在这里插入图片描述

上位机在这里插入图片描述

相关文章:

STM32f407 网络接收 fpga 的 bin 文件并更新到 fpga series7(3)

STM32f407 网络接收 fpga 的 bin 文件并更新到 fpga series7(3) 简介 实验 3&#xff1a;在搭建好 tcp 服务器&#xff0c;并拟定好协议的前提下&#xff0c;接收每一个 bin 文件的块&#xff0c;配置到 fpga。 原理图 fpga fpga1 stm32 接线总结 // fpga引脚 stm32…...

JavaScript基础知识(七)

数组相关api再续前缘 arr.forEach(function) 对arr数组的每一项执行遍历操作,并且可以通过function来对相关元素进行二次操作 function: 函数,同时接收三个参数 - item: 数组中的每一项 - index: 数组每一项的下标(item的对应下标) - arr: 原数组 arr.map(function) 对数组的…...

20240821让飞凌的OK3588-C的核心板在Linux R4下挂载1TB的exFAT格式的TF卡

fdisk -l df -h df -t df -T mount 20240821让飞凌的OK3588-C的核心板在Linux R4下挂载1TB的exFAT格式的TF卡 2024/8/21 19:47 百度&#xff1a;rk3588 buildroot exFAT mount: mounting /dev/mmcblk1p1 on /mnt failed: Invalid argument Disk /dev/mmcblk1: 955 GB, 10254234…...

Java HashMap练习

JDK1.2添加&#xff0c;线程不安全&#xff0c;性能相对较好 注意&#xff1a;允许使用null作为key或者value 使用数组加链表结构&#xff0c;结合数组和链表的优点 Hash Map的基本使用 package HashMap;import text5.Student;import java.util.Collection; import java.ut…...

前后端分离项目实战-通用管理系统搭建(前端Vue3+ElementPlus,后端Springboot+Mysql+Redis)第三篇:登录功能优化

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

8.20 Redis ACL配置 多个用户连接同一个Redis

**一、首先通过 linux命令 redis-cli 输入用户名和密码连接redis的客户端** **二、查看用户&#xff0c;创建用户&#xff0c;设置密码操作** &#xff08;1&#xff09;**ACL LIST** 命令 可以查看到当前的权限用户 &#xff08;2&#xff09;**ACL SETUSER userName** 此…...

【C语言】static和extern的作用

本文首发于 ❄️慕雪的寒舍 简单介绍C/C中static关键字和extern关键字的作用。 1.简介 在之前的博客中&#xff0c;提到过static的三个作用&#xff0c;但是没有详细说明这三个作用的场景&#xff0c;现在回过头来记录一下。 修饰函数修饰全局变量修饰函数内变量 static还有…...

全新分支版本!微软推出Windows 11 Canary Build 27686版

已经很久没有看到 Windows 11 全新的分支版本了&#xff0c;今天微软发布 Windows 11 Canary 新版本&#xff0c;此次版本号已经转移到 Build 27xxx&#xff0c;首发版本为 Build 27686 版。 此次更新带来了多项改进&#xff0c;包括 Windows Sandbox 沙盒功能切换到 Microsof…...

【Linux】ARM服务器命令行安装虚拟机

在Arm服务器上安装虚拟机操作笔记 一、基础环境准备1、环境准备2、检查KVM支持3、启动并启用libvirtd服务4、创建虚拟网络&#xff08;可选&#xff09;5、使用virt-manager创建虚拟机&#xff08;支持KVM&#xff09;6、管理虚拟机9、监控和日志 二、软虚拟化替代方案1、查看虚…...

Android 10.0 锁屏页面忘记锁屏密码情况下点击5次解锁图标弹出锁屏密码功能实现

1. 前言 在10.0的系统ROM定制化开发中,在一些产品中带锁屏密码的功能中,系统默认是滑动解锁,但是客户会设置锁屏密码,在某些时候会 忘掉锁屏密码,导致需要进入恢复出厂设置然后才能进入系统桌面,这样就导致系统的保存的资料都丢失了,所以需要要求在锁屏密码页面在忘记解…...

Java-CompletableFuture工具类

CompletableFuture 是 Java 8 引入的一个强大的异步编程工具,它提供了对异步计算的高级支 持,包括组合多个任务的能力、处理结果、异常处理等。为了方便地使用 CompletableFuture,你 可以创建一个工具类来封装常用的操作。 CompletableFuture 工具类 下面是一个 Complet…...

C语言:递归

递归简单来说就是函数自己调用自己。 特点&#xff1a;一般代码比较简洁&#xff0c;没有出口。 例子1&#xff1a;用一个函数计算阶乘 #include<stdio.h>//不用递归 int fac(int n) {int val 1;for (int i 1; i <n;i){val * i;}return val; }//用递归 int fac1(…...

自动化测试框架pytest+allure+requests

最近复习了一下关于自动化测试的内容&#xff0c;结合[码尚教育] 相关的思路来对测试框架进行开发。 争取实现零代码来实现自动化测试环境的搭建 AutoTestFrame 介绍 AutoTestFrame是一个基于Python的自动化测试框架&#xff0c;旨在帮助测试人员快速、高效地完成测试任务。…...

Python 笔记 numpy.ndarray切片

NumPy 的 ndarray 类型提供了非常灵活的切片功能&#xff0c;可以方便地访问和操作数组中的元素。切片允许您通过指定索引来选择数组的一部分。下面是一些基本的切片操作及其解释。 一维数组的切片 对于一维数组&#xff0c;切片操作类似于 Python 列表的切片。 示例 impor…...

一、HTML5知识点精讲

一、HTML5介绍 html是用来描述网页的一种语言&#xff08;就是写网页的一种语言&#xff09;。 它和CSS&#xff0c;JS称为网页三要素。 HTML负责把元素简单呈现在网页上&#xff0c;是网页的身体CSS负责给网页元素添加各种样式&#xff0c;是网页的衣服JS负责实现各种动态、…...

【杂乱算法】前缀和与差分

前缀和 文章目录 前缀和一维应用 二维差分一维 二维扩展1、前缀和与哈希表 一维 一个数组prefix中&#xff0c;第i个元素表示nums[0]至nums[i-1]的总和&#xff0c;那么我们就称这个prefix数组是nums数组的前缀和。 prefix [ i ] ∑ j 0 i nums [ j ] \text{prefix}[i] \s…...

Arduino调试ESP32常见问题 exit status 1

问题1&#xff1a;代码上传&#xff08;烧录&#xff09;报Failed uploading: uploading error: exit status 1大概率原因&#xff1a;没有安装对应的驱动&#xff0c;我的ESP32驱动是CH340点击这里下载CH340 下载后打开&#xff0c;若出现乱码不用在意&#xff0c;点击第一个按…...

“决胜面试:高频题目与算法策略一览”

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…...

Node-RED的安装

最近对Node-RED比较感兴趣&#xff0c;因为在上OpenHarmony课程的时候&#xff0c;一直想找一个可以通过MQTT控制设备的低代码客户端解决方案。第一次指导Node-RED是在试用聆思开发板的时候&#xff0c;它的云端就是使用的Node-RED。 在安装Node-RED之前&#xff0c;请确保您的…...

java中的Collections

Java 的集合框架(Collections Framework)提供了一组标准的数据结构接口和类,用于存储和操作数据。Java 集合类位于 java.util 包中,主要包括以下几个核心接口和实现类。 1. 核心接口 1.1. Collection 接口 Collection 是集合框架的根接口,但它本身并不提供任何直接实现…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...