当前位置: 首页 > 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 */

加载前

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 智慧社区新视界:EasyCVR视频汇聚平台下的数字化治理实践
  • 【Solidity】合约交互基础
  • google浏览器chrome用户数据(拓展程序,书签等)丢失问题
  • 多线程(4)——单例模式、阻塞队列、线程池、定时器
  • ATGM332D-F8N低功耗、小尺寸单北斗多频定位导航模块规格书
  • 金九银十秋招大模型岗位攻略来了,已收offer,非常详细收藏我这一篇就够了
  • 你是如何克服编程学习中的挫折感的?
  • 2024下半年软考全国报名时间汇总,附报名费用!
  • 巡检机器人有哪些功能和应用场景
  • ATECLOUD算法维护模块全新上线
  • raft、pow、pos算法(一)
  • 4大免费的AI修复工具,让你的老照片焕然一新
  • 机器学习笔记三-检测异常值
  • wincc报警如何通过短信发送给手机
  • TypeScript学习笔记2---ts的函数定义详解
  • ----------
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 11111111
  • 4. 路由到控制器 - Laravel从零开始教程
  • Android框架之Volley
  • Golang-长连接-状态推送
  • Joomla 2.x, 3.x useful code cheatsheet
  • js操作时间(持续更新)
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • mysql中InnoDB引擎中页的概念
  • nodejs调试方法
  • SOFAMosn配置模型
  • Terraform入门 - 1. 安装Terraform
  • uva 10370 Above Average
  • Zsh 开发指南(第十四篇 文件读写)
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 山寨一个 Promise
  • 使用 @font-face
  • 我这样减少了26.5M Java内存!
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 带你开发类似Pokemon Go的AR游戏
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • # 达梦数据库知识点
  • # 飞书APP集成平台-数字化落地
  • #Linux(帮助手册)
  • $$$$GB2312-80区位编码表$$$$
  • (3)llvm ir转换过程
  • (Java入门)抽象类,接口,内部类
  • (k8s)Kubernetes本地存储接入
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (八)Spring源码解析:Spring MVC
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (强烈推荐)移动端音视频从零到上手(下)
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • (四)库存超卖案例实战——优化redis分布式锁
  • (学习总结16)C++模版2