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

2024-06-05 05:44

本文主要是介绍上位机图像处理和嵌入式模块部署(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命令,正常来说,就可以看到这样的返回结果了。

这篇关于上位机图像处理和嵌入式模块部署(f407 mcu中的网络开发)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

UnrealScriptIDE调试环境部署

先安装vs2010   再安装VSIsoShell.exe, 下载地址 https://pan.baidu.com/s/10kPNUuDGTbWXbz7Nos-1WA       fd3t   最后安装unside,下载地址 https://archive.codeplex.com/?p=uside  安装中间有一步选择Binary文件夹要选对路径。   安装好以后,启动 UDKDe

【Altium】查找PCB上未连接的网络

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标: PCB设计后期检查中找出没有连接的网络 应用场景:PCB设计后期,需要检查是否所有网络都已连接布线。虽然未连接的网络会有飞线显示,但是由于布线后期整板布线密度较高,虚连,断连的网络用肉眼难以轻易发现。用DRC检查也可以找出未连接的网络,如果PCB中DRC问题较多,查找起来就不是很方便。使用PCB Filter面板来达成目的相比DRC

通信系统网络架构_2.广域网网络架构

1.概述          通俗来讲,广域网是将分布于相比局域网络更广区域的计算机设备联接起来的网络。广域网由通信子网于资源子网组成。通信子网可以利用公用分组交换网、卫星通信网和无线分组交换网构建,将分布在不同地区的局域网或计算机系统互连起来,实现资源子网的共享。 2.网络组成          广域网属于多级网络,通常由骨干网、分布网、接入网组成。在网络规模较小时,可仅由骨干网和接入网组成

Eclipse+ADT与Android Studio开发的区别

下文的EA指Eclipse+ADT,AS就是指Android Studio。 就编写界面布局来说AS可以边开发边预览(所见即所得,以及多个屏幕预览),这个优势比较大。AS运行时占的内存比EA的要小。AS创建项目时要创建gradle项目框架,so,创建项目时AS比较慢。android studio基于gradle构建项目,你无法同时集中管理和维护多个项目的源码,而eclipse ADT可以同时打开

Toolbar+DrawerLayout使用详情结合网络各大神

最近也想搞下toolbar+drawerlayout的使用。结合网络上各大神的杰作,我把大部分的内容效果都完成了遍。现在记录下各个功能效果的实现以及一些细节注意点。 这图弹出两个菜单内容都是仿QQ界面的选项。左边一个是drawerlayout的弹窗。右边是toolbar的popup弹窗。 开始实现步骤详情: 1.创建toolbar布局跟drawerlayout布局 <?xml vers

iptables(7)扩展模块state

简介         前面文章我们已经介绍了一些扩展模块,如iprange、string、time、connlimit、limit,还有扩展匹配条件如--tcp-flags、icmp。这篇文章我们介绍state扩展模块  state          在 iptables 的上下文中,--state 选项并不是直接关联于一个扩展模块,而是与 iptables 的 state 匹配机制相关,特

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa

python 在pycharm下能导入外面的模块,到terminal下就不能导入

项目结构如下,在ic2ctw.py 中导入util,在pycharm下不报错,但是到terminal下运行报错  File "deal_data/ic2ctw.py", line 3, in <module>     import util 解决方案: 暂时方案:在终端下:export PYTHONPATH=/Users/fujingling/PycharmProjects/PSENe

[FPGA][基础模块]跨时钟域传播脉冲信号

clk_a 周期为10ns clk_b 周期为34ns 代码: module pulse(input clk_a,input clk_b,input signal_a,output reg signal_b);reg [4:0] signal_a_widen_maker = 0;reg signal_a_widen;always @(posedge clk_a)if(signal_a)

WDF驱动开发-WDF总线枚举(一)

支持在总线驱动程序中进行 PnP 和电源管理 某些设备永久插入系统,而其他设备可以在系统运行时插入和拔出电源。 总线驱动 必须识别并报告连接到其总线的设备,并且他们必须发现并报告系统中设备的到达和离开情况。 总线驱动程序标识和报告的设备称为总线的 子设备。 标识和报告子设备的过程称为 总线枚举。 在总线枚举期间,总线驱动程序会为其子 设备创建设备对象 。  总线驱动程序本质上是同时处理总线枚