基于STM32F4系列的ETH IAP在线升级程序

目录

1、前言

2、以太网的移植(无操作系统)

3、移植FATS 系统

4、移植ETH 驱动及 DP83848驱动

5、Tftp 服务程序

6、注意事项 

​7、代码

资料下载地址:基于STM32F4系列的ETH IAP在线升级程序

1、前言

        此bootloader程序可以通过http或tftp方式更新STm32应用程序,是否进入BOOTLOADER程序可以根据读取板载外接存储器中的字节判断,能够做到做到了现场快速更改程序,省时省力!

2、以太网的移植(无操作系统)

        打开LWIP1.4.1 移植文件,需要移植的src 文件port文件。其中port文件移植ethernetif.c/.h文件;src文件移植①api文件中所有.c文件,②core文件中除ipv6及snmp文件外所有文件,③ include中除ipv6及posix外所有的.h文件。由于此处移植无操作系统,所以在IAP_SERVICE 文件中定义了sys_arch.c,其中只有返回外部时间函数return  get_systick()。注意KEIL5相应的路径页需要包含对应的头文件。

3、移植FATS 系统

        FTFP传输文件是512k block形式传送的,需要移植 FATS 文件系统。此处不多说,有比较多的资料讲这块。

4、移植ETH 驱动及 DP83848驱动

        ETH 驱动是从官网上直接移植的,DP83848驱动通过lan8720修改过来的,区别就是lan8720的硬启动需要一定的时延,而DP83848基本上不需要硬重启的时间。需要注意的是在PHY驱动中,有些系统PHY 驱动中启动了MAC中断,那么在主程序中就可以不轮询ETH_CheckFrameReceived()函数,及ETH_DMA 是否接受到数据。反之,如果不启动MAC中断,则需要轮询ETH_CheckFrameReceived()函数。

5、Tftp 服务程序

        Tftp 协议是在udp协议上升级而来,保证了文件传输的准确性。是在udp传输数据的基础上加上了特殊的包头与报位,并且有特定检验传输数据是否有问题的机制。报文格式如图1所示。

        如图2所示,为tftp的传输数据实现过程。在tftpserver.c/h 函数中有详细的TFTP函数实现。在IAP_tftp_process_write()函数中,起始完udp_recv()函数后,起始FLASH开始写文件。需要注意的是,在函数IAP_wrq_recv_callback()中检验是否写完,当接收返回的数据小于512+2+2KB时,说明传输文件完成,需要置标志位,并锁上STM32内部FLASH。

6、注意事项 

        程序中以系统时钟作为TCP、ARP定时器(SystickCnt计数变量),在stm32f4xx_it.c 中可以看到,lwip以此时钟为基准调用LwIP_Periodic_Handle(SystickCnt)函数。在中断中,把接收到的缓冲区数据给lwip 处理ethernetif_input(&netif)。
        而在netcongf.c 文件中,必须把ARPTimer和TCPTimer的初始值给一个未定义的数值的变量localtime才能传输。

 7、代码

/*** @file    main.c * @author  WB R&D Team - openmcu666  Debuger by Lyu Xin * @version V1.0* @date    2017.03.09* @brief   Main Program body*/#include "stm32f4xx.h"
#include "Gpio.h"
#include "usart.h"
#include "main.h"
#include "stm32f4x7_eth.h"
#include "netconf.h"
#include "eth_bsp.h"
#include "Gpio.h"
#include "tftpserver.h"
#include "httpserver.h"
#include "eeprom.h"//uint8_t  data[40] = "bootloadering...";
uint8_t tftp_flag = 0;      //文件传输完成标识__IO uint32_t SystickCnt = 0;
typedef  void (*pFunction)(void);
pFunction Jump_To_Application;
uint32_t JumpAddress;static void delay(__IO uint32_t nCount)
{__IO uint32_t index = 0; for(index = 80000*nCount; index != 0; index--){}
}uint32_t get_systick(void)
{return SystickCnt;
}//从扇区5开始擦除 ,偏移128KB ,为0x08020000,作为APP起始地址
//可用HTTP或TFTP方式,默认TFTP,如需更改,见main.h文件/*****************************************************************************
**   Main Function  main()
******************************************************************************/
int main(void)
{  uint8_t write_buf = 0;uint8_t read_buf = 0;I2C_EE_Init();
#ifdef BOOTLOADER_EN                         write_buf = 0x66;                I2C_EE_BufferWrite(&write_buf,1,1);                                  //第0块第0字节
#endif#ifdef APP_ENwrite_buf = 0x55;                I2C_EE_BufferWrite(&write_buf,1,1);                                  //第0块第0字节
#endif        I2C_EE_BufferRead(&read_buf,1,1);if( read_buf == 0x55 ){   iap(); }else if(read_buf != 0x55 ){SysTick_Config(SystemCoreClock / 1000);        //systick必须在以太网初始化之前配置eth_init();    LwIP_Init();
#ifdef USE_IAP_HTTPIAP_httpd_init();
#endif#ifdef USE_IAP_TFTP  IAP_tftpd_init();
#endif    while (1) {if (ETH_CheckFrameReceived()){ LwIP_Pkt_Handle();}LwIP_Periodic_Handle(SystickCnt);if(tftp_flag == 1){break;}else{
//                                           UDP_Client_Broadcast(data,40);continue;}}iap(); }
}
void iap(void)
{if (((*(__IO uint32_t*)USER_FLASH_FIRST_PAGE_ADDRESS) & 0x2FFE0000) == 0x20000000){//跳转到用户程序JumpAddress = *(__IO uint32_t*) (USER_FLASH_FIRST_PAGE_ADDRESS + 4);Jump_To_Application = (pFunction) JumpAddress;//初始化用户程序的堆栈指针__set_MSP(*(__IO uint32_t*) USER_FLASH_FIRST_PAGE_ADDRESS);Jump_To_Application();}  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/3050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络爬虫之HTTP原理

** URI和URL URI的全称Uniform Resource Identifier ,即统一资源标志符。URL的全称Uniform Resource Locator 即统一资源定位符。 URL是URI的子集,也就是每一个URL就是URI,但是每一个URI不一定是URL,URI还有一个子类叫URN&#x…

从零开始写 Docker(十二)---实现 mydocker stop 停止容器

本文为从零开始写 Docker 系列第十二篇,实现类似 docker stop 的功能,使得我们能够停止指定容器。 完整代码见:https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实现有一个大致认识: 核心原理&#x…

[韭]第一次参加护网行动要注意什么??

前言 为什么要写这篇文章呢,一是对当下安全环境进行一个分析,二是以过来人的身份留下一点经验。 当下安全环境分析 现在这个时代,大家都已经踏上了信息高速公路,可以自己拿搜索引擎搜一下自己知道的大厂裁员情况,有…

油猴脚本:bing 搜索结果居中

文章目录 效果预览脚本使用步骤安装油猴脚本添加脚本 效果预览 脚本 // UserScript // name bing居中 // namespace http://tampermonkey.net/ // version 2024-04-24 // description try to take over the world! // author You // match http…

rust 卸载重新安装 安装

原因:接触区块链时报错 linking with x86_64-w64-mingw32-gcc failed: exit code: 1 Rust编译需要C环境,如果你没有,Rust也能安装成功,只是无法编译代码 C的编译工具有两个,一个是msvc,也就是visual studi…

CTFshow-PWN-栈溢出(pwn44)

64位的 system(); 但是好像没"/bin/sh" 上面的办法不行了,想想办法 检查: 是 64 位程序 ida 反编译 main 函数: 跟进 ctfshow 函数: 存在栈溢出 offset:0xAh8 在前面经验的基础上,这里我们直…

Python-VBA函数之旅-issubclass函数

目录 一、issubclass函数的常见应用场景: 二、issubclass函数使用注意事项: 三、如何用好issubclass函数? 1、issubclass函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页&#xff…

Linux下载及安装OpenSSL

文章目录 前言一、OpenSSL下载二、OpenSSL安装1.上传下载好的安装包到服务器2.解压3.切换目录4.配置config5.编译6.安装7.备份旧版本OpenSSL7.创建软链接8.添加OpenSSL动态链接库9.更新库缓存10.查看OpenSSL版本验证安装是否成功 前言 一般系统会自带有OpenSSL,我们…

ubuntu 24.04 beta server NAT模式上网设置

在Ubuntu 24.04 Beta上设置网络通常涉及使用命令行工具。以下是设置静态IP地址和动态IP地址的步骤: 动态IP设置: 查找你的网络接口名称: ip a ens37是我NAT模型的一张网卡,此时是没有ip的。 下面介绍如何NAT模式下添加DHCP动态…

【数据结构与算法】:带你手搓顺序表(C/C++篇)

文章目录 一、顺序表1.1 线性表 二、顺序表2.1 概念及结构2.2 实现方法1. 顺序表的初始化2. 顺序表的销毁3. 扩容4. 尾部插入/尾部删除5. 头部插入/头部删除6. 指定位置插入/删除7. 顺序表的查找8. 顺序表元素的索引9. 顺序表元素的修改10. SeqList.c完整代码 一、顺序表 1.1 …

FL Studio21中文版值不值得下载?2024优点和缺点测评介绍

FL Studio21的优点和缺点分析如下: 优点: 功能全面: FL Studio 21提供了从音频录制、编辑到混音和母带处理的全套工具,满足音乐制作的全流程需求。内置多种虚拟乐器和效果器,覆盖了广泛的音色和风格。直观易用&#…

粒子群算法(PSO)matlab代码实现

粒子群算法(PSO)matlab代码实现 %% 清空命令行和工作区 clc clear %% 目标函数:求解函数在[0,50]区间上的最小值 f(x) x.*sin(x).*cos(2*x) - 2.*sin(3*x)3*x.*sin(4*x); %% 初始化算法参数 population50; % 粒子的数量 dimension1; …

frp 实现 http / tcp 内网穿透(穿透 wordpress )

frp 实现 http / tcp 内网穿透(穿透 wordpress ) 1. 背景简介与软件安装2. 服务端配置2.1 配置文件2.2 wordpress 配置文件2.3 frps 自启动 3.客户端配置3.1 配置文件3.2 frpc 自启动 同步发布在个人笔记frp 实现 http / tcp 内网穿透(穿透 w…

详细分析mysqlslap的基本知识 | 压力测试(附Demo)

目录 前言1. 基本知识2. 参数解读2.1 auto-generate-sql2.2 only-print2.3 iterations2.4 并发处理参数 前言 对数据库进行压力测试,对此补充这方面的详细知识点 1. 基本知识 mysqlslap 是 MySQL 自带的用于模拟数据库负载的压力测试工具 可以模拟多个客户端并发…

C++—DAY2

定义一个矩形类Rec,包含私有属性length,width,有以下成员函数: void set length(int l);//设置长度 void set width(int w); //设置宽度 int get length(); //获取长度 int get_width(); //获取宽度 void show(); //输出…

《本能》我们为什么管不住自己 - 三余书屋 3ysw.net

本能:我们为什么管不住自己 大家好,今天我们来解读一本名为《本能》的书。这本书有两位作者,第一位是特里伯纳姆,他是哈佛大学商学院的访问学者,在1997年获得哈佛大学商业经济学博士学位,也是自1997年起一…

无重复最长子串

专栏持续更新50道算法题,都是大厂高频算法题,建议关注, 一起巧‘背’算法! 文章目录 题目解法 滑动窗口总结 题目 解法 滑动窗口 采取滑动窗口的方法降低时间复杂度定义一个 map 数据结构存储 (k, v),其中 key 值为字符,value 值…

Shader for Quest 2: 自定义shader在Unity Editor中可以使用,但是在Quest 2中却不可以

GameObject segment GameObject.Find("DisplayArea_" i); MeshRenderer renderer segment.GetComponent<MeshRenderer>(); Material mat new Material(Shader.Find("Custom/MyShader")); mat.mainTexture option.Image360;上面这份代码&#x…

Qt中常用对话框

Qt中的对话框&#xff08;QDialog&#xff09;是用户交互的重要组件&#xff0c;用于向用户提供特定的信息、请求输入、或进行决策。Qt提供了多种标准对话框以及用于自定义对话框的类。以下将详细介绍几种常用对话框的基本使用、使用技巧以及注意事项&#xff0c;并附带C示例代…

vmp入门(一):android dex vmp还原和安全性论述

看了一下&#xff0c;目前市面上关于dex vmp还原就我兄弟写的这一个&#xff0c;我不得不佩服他巨强的二级制分析能力。关于dex vmp 他的大部分都写了&#xff0c;但是&#xff0c;他搞的实在是太复杂了&#xff0c;他的分析基本都是基于静态的数据流向分析&#xff0c;这种对于…