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

news2024/11/14 11:09:23

目录

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_EN
        write_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_HTTP
     IAP_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.coloradmin.cn/o/1622351.html

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

相关文章

数字科技助力垃圾分类展厅,增强内容交互新体验!

如今,许多行业都开始运用数字技术,探索其在展览展示领域中的应用,其中垃圾分类展厅作为现代城市文明建设的重要一环,也通过这些技术的运用,打造出了更加生动且富有科技感的展示空间,它不仅提升公众对垃圾分…

TCP详解

2.1TCP 由IETF的RFC793定义的传输控制协议(Transmission Control Protocol,TCP)是一种基于字节流的传输层通信协议。在传输数据前需要在发送与接收者之间建立连接,通过相应机制保证其建立连接的可靠性。 TCP协议具备以下特性&am…

信息化工作人员必备常识8——DNS缓存【查看缓存与清理dns缓存】

信息化工作人员必备常识8——DNS缓存【查看缓存与清理dns缓存】 前言信息化人员必备常识回顾(不想看回顾的直接往下滑哦~)pingtelnetnslookup命令ipconfig命令域名DNS DNS缓存主机上解析DNS的优先级 清理DNS缓存查看当前电脑有哪些DNS缓存 前言 信息化相…

【超详细保姆教程】手把手教你如何修改el-tab的默认样式,把el-tab的label变成我们想要的

目录 前言实现效果官方的样式修改后的结果 步骤1、去掉分割线和下划线去掉前去掉后 2、设置插槽,自定义label的内容,加上border等结果 3、为选中的tab修改高亮结果 前言 做前端实习也有一段时间了,昨天晚上在学校上项目工程管理这门课的时候…

Edge浏览器下载文件提示 “无法安全下载” 的解决方法

提示如下: 虽然我们可以通过 "保留" 进行下载,但是每次需要选择,比较麻烦 解决方法: 1、打开注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft 2、创建2个 "项" Edge\InsecureContentAllowedForUrls…

数据链路层(计算机网络,待完善)

0、前言 本文大多数图片都来自于 B站UP主:湖科大教书匠 的教学视频,对高军老师及其团队制作出这么优质的课程表示感谢。文章增加了部分个人理解,内容并不是对视频的静态化翻译。 1、概述 1.1、数据链路层在计算机网络体系中的位置 1.2、对…

手机照片删除了怎么恢复?教你3个招!

我们使用手机的时间在变长,手机里储存的数据也会越来越多,所以一旦手机卡顿,我们往往会选择清理垃圾的方式来释放内存。如果不小心把照片清理了怎么办呢?手机照片删除了怎么恢复呢?别着急,这个问题小编会&a…

泰坦尼克号乘客生存预测 中

背景描述 泰坦尼克号轮船的沉没是历史上最为人熟知的海难事件之一。1912年4月15日,在她的处女航中,泰坦尼克号在与冰山相撞后沉没,在船上的 2224 名乘客和机组人员中,共造成 1502 人死亡。这场耸人听闻的悲剧震惊了国际社会&…

js 连接快手打印组件并实现打印

快手打印组件文档: https://docs.qingque.cn/d/home/eZQA41D2h9LGUFaD26bC07e–?identityIdEmukFTnlEF#sectionh.kgnfm4rjc89m 快手打印组件下载: https://docs.qingque.cn/d/home/eZQBMOMSj4mJ5D7Xplofq-p4Y?identityIdEmukFTnlEF 快手打印数据格式&…

Android 13 Layer数据结构

Layer::State state的定义 State mDrawingState; 一个mDrawingState的变量struct State {Geometry active_legacy;Geometry requested_legacy;int32_t z;ui::LayerStack layerStack;#endifuint32_t flags;uint8_t reserved[2];int32_t sequence; // changes when visible regi…

opencv图片绘制图形-------c++

绘制图形 #include <opencv2/opencv.hpp> #include <opencv2/core.hpp> #include <filesystem>bool opencvTool::drawPolygon(std::string image_p, std::vector<cv::Point> points) {cv::Mat ima cv::imread(image_p.c_str()); // 读取图像&#xf…

QT从入门到实战x篇_22_番外1_Qt事件系统

文章目录 1. Qt事件系统简介1.1 事件的来源和传递1.2 事件循环和事件分发1.2.1 QT消息/事件循环机制1.2.1.1 机制解释1.2.1.2 两个问题 1.2.2 事件分发 2. 事件过滤基础2.1 什么是事件过滤器&#xff08;Event Filter&#xff09;&#xff1f;2.2 如何安装事件过滤器 3. 事件过…

深入探讨回流焊技术:电子制造业的核心工艺

在现代电子制造领域&#xff0c;回流焊技术被广泛认为是实现高效率和高质量电子组件装配的关键工艺之一。本文将针对回流焊的基本原理、设备构成、过程细节以及过程优化进行全面解析&#xff0c;为电子制造业的技术人员提供实用的参考和指导。 1. 回流焊基本原理解析 回流焊主…

【Redis 开发】(长篇学习)掌握Redis的用法,各种客户端下的操作

Redis 前言RedisRedis的安装Redis启动Redis客户端 Redis常见命令Redis的java客户端jedis学习简单的jedis 入门流程Jedis连接池 SpringDataRedisSpringDataRedis快速入门 前言 我们在作者之前的文章: 快速掌握Redis安装与基本语法的基础上进行系统的学习&#xff0c;学习自黑马…

Pytorch 之torch.nn初探 池化--Pooling Layers

任务描述 本关任务&#xff1a;本关提供了一个Variable 类型的变量x&#xff0c;要求按照条件创建一个Conv2d变量conv&#xff0c;一个MaxPool2d变量pool&#xff0c;对x应用卷积和最大池化操作并赋值给变量outpout_pool&#xff0c;并输出outpout_pool 的大小。 相关知识 P…

k8s日常动手实践 ~~ pod访问 pod请求 k8s api ~ 含新版带curl的busybox镜像

前言&#xff1a; 可以使用 Kubernetes API 获取集群信息。使用 Service Account&#xff08;SA&#xff09;进行身份验证&#xff0c;可以以安全的方式访问 Kubernetes API&#xff0c;而无需在 Pod 中使用明文凭据。 以下是一个使用 Service Account 访问 Kubernetes API 获…

XV6源码阅读——进程地址空间

文章目录 前言页表实际情况 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招。打算尝试6.S081&#xff0c;将它的Lab逐一实现&#xff0c;并记录期间心酸历程。 代码下载 官方网站&#xff1a;6.S081官方网站 页表 每个进程都有一个单独的页表&#xff0c;当xv6在进程之…

数据库变更时,OceanBase如何自动生成回滚 SQL

背景 在开发中&#xff0c;数据的变更与维护工作一般较频繁。当我们执行数据库的DML操作时&#xff0c;必须谨慎考虑变更对数据可能产生的后果&#xff0c;以及变更是否能够顺利执行。若出现意外数据丢失、操作失误或语法错误等情况&#xff0c;我们必须迅速将数据库恢复到变更…

2024王鹍申论重难点:材料的概括与处理

2024王鹍申论重难点&#xff1a;材料的概括与处理&#xff0c;是备考公务员申论考试的关键一环。王鹍老师以其深厚的理论功底和丰富的实践经验&#xff0c;深入剖析了申论材料的特点和概括方法&#xff0c;同时传授了有效的材料处理技巧。通过王鹍老师的讲解&#xff0c;考生们…

Winseeing汇信外贸软件行业版,助力面辅料外贸公司实现降本增效

面辅料外贸出口&#xff0c;一直是国民经济发展中的重要组成部分。在当前全球贸易环境动荡不安的背景下&#xff0c;面辅料外贸出口面临着诸多挑战和机遇。亚洲是我面料出口的主要市场&#xff0c;据海关数据统计显示&#xff0c;2024年1-2月我对亚洲国家累计出口面料69.3亿美元…