上位机图像处理和嵌入式模块部署(f407 mcu中的网络开发)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        和大家想的不太一样,只要mcu当中带有了mac ip,那么就意味着mcu本身支持了网络开发。但是如果需要mcu支持完整的tcp/ip,仅仅有mac还是不够的,硬件方面外面需要接一个phy,软件方面需要移植一下lwip。关于lwip的移植,有基于rtos的移植,以及无rtos移植两种方法,其实大家一开始学的时候,可以把重点放在无rtos的移植上面。等到对应的功能需求实在不能满足要求了,再考虑基于rtos的lwip移植方案。

        当然,使用了网络功能之后,一般来说mcu的实时性会有一点损失,但是对外交互性方便了很多。所以,这是个一体两面的问题,看自己如何选择了。实在不行,就两颗mcu,一颗处理对外交互,一颗处理业务也是可以的。

1、基本电路图

        一般mcu内部只是实现了mac层,所以外面还要接一个phy芯片。当然,现在已经有很多内部集成phy的mcu了,比如wch的307系列芯片。所有phy芯片中,lan8720a是用的比较多的一种。芯片的左半部分是和mcu的连接,右半部分是和rj45的连接。这里面,mcu对phy的控制是通过mdio、mdc这两个pin进行的。

2、mcu对phy的控制

        形式上说,mcu对phy的控制,就和mcu对spi norflash的控制是一样。spi只是一个总线标准,要发什么样的命令才能实现norflash的读写,这个就要看norflash的芯片手册才知道。phy也是一样,因此在整个项目中很容易找到这样的函数,

ETH_ReadPHYRegister
ETH_WritePHYRegister

3、函数的处理流程

        所有中间件的移植当中,lwip算是比较复杂的。我们可以从main函数开始,看一下,整个系统是怎么运行的。

        首先,调用了ETH_BSP_Config()函数,这个函数存在于LAN8742.c文件中。很明显,这是对底层驱动的适配。当然ETH_BSP_Config()也会最终调用到ETH_Init()函数,它位于stm32f429_eth.c文件,有兴趣的同学可以跟进去看一下实现过程。

        接着,我们看到流程中出现LwIP_Init()函数,这部分应该是对中间件的初始化。这个函数位于netconf.c文件。当然,中间件和底层驱动之间肯定还有适配接口,这个回头再看。

        最后,就是一个循环处理的过程。因为移植过程中没有使用rtos,所以这里就是一个while(1)的处理形式,

	while(1){/* check if any packet received */if (ETH_CheckFrameReceived()){ /* process received ethernet packet */LwIP_Pkt_Handle();}/* handle periodic timers for LwIP */LwIP_Periodic_Handle(LocalTime);}

        很明显,它的处理流程就是,首先查看驱动有没有报文,有就送上去。没有报文的话,就处理一下定时器。

4、lwip的底层适配

        项目中lwip的底层适配是集中在lwip/ethernetif.c文件。文件中的函数主要有这么几个,

low_level_init
low_level_output
low_level_input
ethernetif_input
ethernetif_init

        其中呢,我们发现ethernetif_init会调用low_level_init,ethernetif_input会调用low_level_input,而low_level_output是在ethernetif_init里面被当成函数指针传递进去。最终呢,ethernetif_init是在LwIP_Init被调用的。所以,真正和硬件搭上关系的,其实就是以low_level开头的三个函数,

low_level_init
low_level_input
low_level_output

        继续分析,low_level_init中有ETH_Start,low_level_input里面有ETH_Get_Received_Frame,low_level_output则调用了ETH_Prepare_Transmit_Descriptors。

5、其他udp、tcp的开发

        无rtos的移植方法,决定udp、tcp都是按照异步运行的模式来处理数据的。也就是说我们编写代码的时候,就要设置好回调函数,报文来了,接收函数来处理;可以发送报文了,发送函数来处理。总之,这也算是一种还算不错的处理方法。

6、测试和验证

        这是一个ping的测试案例。首先我们编写代码的时候,就要把ip修改成和pc一个网段,

/*Static IP ADDRESS: IP_ADDR0.IP_ADDR1.IP_ADDR2.IP_ADDR3 */
#define IP_ADDR0                    192
#define IP_ADDR1                    168
#define IP_ADDR2                      0
#define IP_ADDR3                    122/*NETMASK*/
#define NETMASK_ADDR0               255
#define NETMASK_ADDR1               255
#define NETMASK_ADDR2               255
#define NETMASK_ADDR3                 0/*Gateway Address*/
#define GW_ADDR0                    192
#define GW_ADDR1                    168
#define GW_ADDR2                      0
#define GW_ADDR3                      1

        接着就是把pc设置成192.168.0.*网段的一个ip。编译、烧录之后,如果没有什么问题的话,我们可以在pc上面输入ping 192.168.0.122命令,正常来说,就可以看到这样的返回结果了。

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

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

相关文章

Java面试题:ArrayList底层实现原理、HashMap的实现原理、HashMap的jdk1.7和jdk1.8有什么区别

文章目录 一、List相关面试题1.1 ArrayList源码分析(底层实现)1.2 ArrayList底层的实现原理是什么1.3 ArrayList listnew ArrayList(10)中的list扩容几次1.4 如何实现数组和List之间的转换1.5 ArrayList 和 LinkedList 的区别是什么 二、HashMap相关面试…

如何在 Vue 组件中正确地使用 data 函数?

在 Vue 组件中正确使用 data 函数有以下几点需要注意: 返回一个对象: data 函数必须返回一个对象,这个对象包含了组件实例需要用到的所有数据属性。export default {data() {return {message: Hello, Vue!,count: 0}} }不要使用箭头函数: data 函数不应该使用箭头函数 () >…

《最游记》游戏全套源码(源码+引擎+文档+客户端+服务端+工具)

《最游记》首款西游降魔修仙网游—还原《西游记》小说经典,华丽场景,玄幻体验;七十二变,机甲配备;仙兵神器,灵兽助阵;降妖除魔,最游天下!源码基于 vs 2005,可…

英伟达GPU架构加速狂飙

NVIDIA首席执行官黄仁勋在台湾大学体育馆发表主题演讲,展示了新一代Rubin架构,这是NVIDIA加速推出新架构的最新成果。 在讨论NVIDIA下一代架构时,黄仁勋提到了Blackwell Ultra GPU,并表示它可能会继续升级。然后他透露&#xff0c…

Qt 【Object::connect: No such slot 。。。】解决方法

发生如下所示问题,有三种原因造成: 1.下图中的Q_OBJECT被注释掉或者漏了(该问题不常见) 2.下图中声明slots漏了(新手较常见) 3.发生下面两行中的错误,在下面两行代码中仅仅是一个参数名字的区别…

发布npm自己的插件包

要发布自己的npm插件包,你需要遵循一系列步骤来确保你的包可以正确地被其他人使用。以下是一个基本的指南: 1. 创建一个npm账户 首先,你需要在npm网站上注册一个账户。这可以通过npm的命令行工具或npm网站完成。 2. 初始化你的项目 在你的…

web刷题记录(2)

[鹤城杯 2021]EasyP 就是php的代码审计 从中可以看出来,就是对四个if语句的绕过,然后过滤了一些语句 代码分析: 通过include utils.php;导入了一个叫做"utils.php"的文件,这意味着在该文件中可能定义了一些与本代码相…

模型训练篇 | yolov10来了!手把手教你如何用yolov10训练自己的数据集(含网络结构 + 模型训练 + 模型推理等)

前言:Hello大家好,我是小哥谈。YOLOv9还没捂热乎,YOLOv10就推出来了,太卷了,太快了,坐等YOLOv9000!自今年2月YOLOv9发布之后, YOLO(You Only Look Once)系列的…

力扣2953.统计完全子字符串

力扣2953.统计完全子字符串 先分组循环求出每个组 分别算个数 对于每个组 枚举一遍其中有多少种字母用cnt数组记录每个字母出现次数 check的时候也是暴力枚举cnt中每个字母出现次数 **分组循环:**从i(新一组的起点)开始,当满足条件时,最后退…

CentOS 7基础操作03_Linux命令的分类

1、Linux命令的分类 Linux命令的执行必须依赖于 Shell命令解释器。Shell实际上是在Linux操作系统中运行的一种特殊程序,它位于操作系统内核与用户之间,负责接收用户输入的命令并进行解释.将需要执行的操作传递给系统内核执行,Shell在用户和内…

搜维尔科技: 使用 Xsens 和 HTC Vive进行电影制作案例

搜维尔科技: 使用 Xsens 和 HTC Vive进行电影制作案例 搜维尔科技: 使用 Xsens 和 HTC Vive进行电影制作案例

全域外卖平台是什么?有哪些系统可以推荐?

随着本地生活下半场的开启,以团购外卖为代表的一系列相关业务也迈入了全域时代。在此背景下,全域外卖赛道正式兴起,全域外卖平台也随之备受瞩目。 作为创业的一大新风口,全域外卖囊括了公域和私域内所有的外卖业务,主…

基础篇03——SQL约束

概述 约束示例 完成以下案例&#xff1a; create table user (id int primary key auto_increment comment 主键,name varchar(10) not null unique comment 姓名,age tinyint unsigned check ( age > 0 and age < 120 ) comment 年龄,status char(1) default 1 commen…

嵌入式C语言--Pragma Section与Map文件

嵌入式C语言–Pragma Section与Map文件 嵌入式C语言--Pragma Section与Map文件 嵌入式C语言--Pragma Section与Map文件一. Pragma修饰符二. Map文件1&#xff09;什么是map文件2&#xff09;map文件的构成3&#xff09;常用的段映射地址4&#xff09;map文件生成 三. Section修…

HAL_UART_IRQHandler(UART_HandleTypeDef *huart)分析

//接收没错误&#xff1a;执行UART_Receive_IT(huart) //接收有错误&#xff1a;执行UART_Receive_IT(huart)、HAL_UART_ErrorCallback(huart) void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) {uint32_t isrflags READ_REG(huart->Instance->SR);uint32_t cr1…

java项目部署脚本

一、java项目部署脚本示例 在Java项目中&#xff0c;部署脚本通常依赖于项目的构建工具&#xff08;如Maven或Gradle&#xff09;以及部署环境&#xff08;如Docker、Tomcat、Kubernetes等&#xff09;。以下是一个基于Maven和Shell脚本的Java项目部署示例&#xff0c;假设我们…

8*8LED点阵点亮一个点

#include<reg51.h> typedef unsigned int u16; //对系统默认数据进行重定义 typedef unsigned char u8; //定义74HC595控制管脚 sbit SRCLKP3^6; //移位寄存器时钟输入 sbit RCLKP3^5; //存储寄存器时钟输入 sbit SERP3^4; //串…

SpaceX: 太空火箭自主精准着陆

本文是根据Lars Blackmore在16年的一篇公开论文翻译而来&#xff0c;虽然有些早而且是科普文章&#xff0c;但是可以初见一些SpaceX火箭着陆的细节&#xff0c;后面我会对spaceX landing control 技术主管MIT博士期间研究火箭控制算法的论文进行讲解&#xff0c;敬请期待。 Lar…

Linux系统常用命令

Linux 系统常用命令 1、文件操作2、目录操作 1、文件操作 创建文件&#xff1a; touch 文件名 创建文件并编辑&#xff1a;vim 文件名 查看文件全部内容&#xff1a;cat 文件名 带行号查看文件内容&#xff1a; cat -n file 查看文件内容并监视内容更新&#xff1a; 以翻页形…

【电机】步进电机相关指标

一 静态指标&#xff1a; 相数&#xff1a;线圈的组数&#xff0c;两相步进电机步距角一般为 1.8&#xff0c;三相的步进电机步距角为 1.2&#xff0c;相数越多步距角越小。 步距角&#xff1a;一个脉冲信号所对应的电机转动的角度&#xff0c;这个步距角他不一定是电机实际工…