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

2024-08-21 23:20

本文主要是介绍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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1094579

相关文章

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

Linux Mint Xia 22.1重磅发布: 重要更新一览

《LinuxMintXia22.1重磅发布:重要更新一览》Beta版LinuxMint“Xia”22.1发布,新版本基于Ubuntu24.04,内核版本为Linux6.8,这... linux Mint 22.1「Xia」正式发布啦!这次更新带来了诸多优化和改进,进一步巩固了 Mint 在 Linux 桌面

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

Ubuntu 24.04 LTS怎么关闭 Ubuntu Pro 更新提示弹窗?

《Ubuntu24.04LTS怎么关闭UbuntuPro更新提示弹窗?》Ubuntu每次开机都会弹窗提示安全更新,设置里最多只能取消自动下载,自动更新,但无法做到直接让自动更新的弹窗不出现,... 如果你正在使用 Ubuntu 24.04 LTS,可能会注意到——在使用「软件更新器」或运行 APT 命令时,

详解Spring Boot接收参数的19种方式

《详解SpringBoot接收参数的19种方式》SpringBoot提供了多种注解来接收不同类型的参数,本文给大家介绍SpringBoot接收参数的19种方式,感兴趣的朋友跟随小编一起看看吧... 目录SpringBoot接受参数相关@PathVariable注解@RequestHeader注解@Reque

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines