你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32F7】开发篇 - 详解STM32F7 TCPServer工程【申精】 精华  

[复制链接]
tjCFeng 发布时间:2015-10-21 13:55
本帖最后由 tjcfeng 于 2015-10-21 15:12 编辑
  D' {& C6 J/ V6 s) g% V5 M) E
1 U* a- c' _9 S" E/ [6 R: p" {" k    STM32F7-Discovery资源丰富、外设众多,除了最显眼的那个触摸屏外,估计关注比较多的就是网络的功能了。网上有一些例程都是HTTP、FTP、Telnet的,却没有最基本的TCP的例子(也许我没找到),所以用了一上午的时间来尝试一下TCP的用法。TCPIP协议栈很复杂,我不会浪费时间去深究这些东西,因为毕竟做的是应用层的程序,经过MDK的封装,已经完全可以抛开具体的协议部分,只调用接口即可完成通讯。
, I* x1 V) R0 r& H# N) ?! U: \
    又提到了MDK的中间件的封装,有了这个东西减少了我们很多很多工作,只需要鼠标指指点点就可以完成众多的配置选项,所以我没有理由去拒绝使用它,除非你反感MDK,那当我没说。
1 X2 u, b1 E5 r/ A
    闲话少叙进入正题,首先建立一个STM32F7的工程。建立的过程不再重复,如果真的不会,请参考《 【STM32F7】STM32F7开发篇-超详细操作步骤》进行操作。
, k* Y/ L, ~- N; {$ h  q    下面开始勾选各种支持库,也是MDK最大的特色。本来不想再抓图了,无奈靠文字描述估计写这个帖子会累死,所以还是凑合看图吧。
$ T, I4 J+ C/ b& f( N
    打开配置界面,F7的配置项比以往的多了很多很多,不过很清晰,一个一个来看。

* z4 J2 s5 K5 \8 f7 I) `' D
***********************************************************************************************
+ k( J4 [, z! `8 c0 [. s& W5 h( X( f7 S: T    板级支持(Board Support),专门针对某种板子提供的驱动。为了可以在任意的STM32F7开发板上使用,这项选不选随意。
9 U; U. t0 i! R/ }$ f  |* R
1.png
    1.CMSIS部分,操作系统相关,有了系统好办事,而且包括了网络硬件的驱动,所以此项必选。& G0 `0 v; \4 Q6 P' N
    CORE是核心部分,不能少
$ T2 F3 A' y: c1 Q+ X    Keil RTX是操作系统,可以开线程6 g- C* I" M1 m  ^4 C8 _+ F
    Ethernet MAC是MAC驱动" D4 n. f0 I3 z6 N1 w
    LAN8742A是STM32F7-Discovery的物理收发器驱动
; F' Z6 @, J+ d, U/ X% W+ s& K6 l& ^, F2 R% L/ c. c
2.png
    2.STM32F7的硬件层驱动部分,可以选择Classic,也可以用STM32CubeMX。如果选了STM32CubeMX,就要使用这个软件来生成配置代码再放到MDK里。Classic足够了,是MDK自带的。
  d: i4 x5 g. @; U    其中Startup必选,这个是启动文件  R3 E) a0 [3 ?9 J$ I9 p9 w
    其他的,如Common、Cortex都需要选上。这个图不全,下面还有PWR、RCC都需要选上。当然多选了没有关系,少选的话这个配置窗体会实时显示依赖关系,依赖项没有选上会用橘黄色标识,提示应该选择。

4 F. U: b8 `4 Z) x 3.png " |& a( {! m* X' r3 D8 X' Y" u
    3.最后一部分,网络库的支持。这里就是封装好的网络相关的中间件了,省去了写代码、调试的工作。
3 O  a% \" H8 U    CORE必选,ETH别忘了至少加一个网络接口,TCP、UDP也要选上。即使不用UDP,不选的话编译时会报错。2 l) N& G5 [: L. B1 e. s
    在Service中,提供了HTTP、FTP、Telnet等支持包,这里没有用上,所以没选。如果开发相关程序,可以自行选择。6 A. F8 K5 B9 {" y+ ?. w

; X7 |6 Q" E2 W# D$ y/ |# |+ G% b5 b
************************************************************************************************( X& t1 Y+ i& B9 m# u+ N3 M
    中间件选择完了,会在工程中添加许多对应的文件。展开工程树,所有带有黄钥匙的文件都是不需要更改的,所以略过不看,只看各种配置文件。
- s8 e( p/ ~& e1 \ 4.png
% ]9 ^' T$ Z' N3 Z
    1.RTX_Conf_CM.c,操作系统相关的配置。双击该文件后代码在右边显示,但是直接看代码可没那么好看,所以用MDK提供的功能:Configuration Wizard配置精灵就方便多了。# k# S5 I( K; S$ K+ l1 n6 v# _- X
    这里面改动的不多,主要是“RTOS Kernel Timer input clock frequency”,STM32F7是216MHz,改成216000000,216后面6个0,别写错了。% H6 f2 e4 w( F- V; a/ [9 P* \
    另外“Defualt Thread stack size”和“Main Thread stack size”要改大一些,400和800。普通小程序无所谓用默认的就行了,但是一旦用了某些协议栈或图形界面之类的,默认的就不够了,如果不改会在运行时进入osError,然后就完蛋了。
4 u3 L2 |/ A, |. Q
5.png
    2.RTE_Device.h,这是STM32F7需要使用的外设的使能和引脚配置。这个工程只操作网络,所以其他的都没有勾选。
: }4 L4 W+ k  T1 K    选择之前应该看看数据手册,不要选错了,或者从STM32CubeMX里看也可以,不需要深究,选对即可。

" |7 o) t5 I" l- L& R: [
- i0 ~0 M  n; k& T( r 6.png . `* I1 }8 q, z% H( c* k$ A# Z  d
    3.Net_Config_ETH_0.h,这个就是刚才添加的那个ETH接口了。这个配置就简单多了,都是常用的,也就是地址、网关、DNS什么的,最下面的“Dynmic Host Configuration”是控制自动获取网络还是使用配置项的,随意吧。至于“MAC Address”,有默认值了,但是为了便于在众多的连接中区分,所以我改成了0x1234567890,一会儿就能看到。

9 A9 ^* f( R0 x1 g$ R  F" F& |$ i9 D2 u( ^- |& t, b
7.png * A0 V5 k) g" e2 x+ t
    4.Net_Config.c,最后一个了,也是最简单的一个。“Local Host Name”就是用于显示的主机名。更改后编译烧写到板子中,已经可以正常联网了,因为ARP的功能包括在里面了,跟路由通讯是正常的。打开路由的界面,板子的名字、IP、MAC显示出来,连接正确。
0 X9 u8 U+ w1 X! J. p9 V
, I: h) ~% Z; M- f4 {8 l
0 U; K. M- I; K* |, e5 f************************************************************************************************4 X: f  Q9 L1 f5 b+ D
    所有的配置项完成,接下来该写程序了。大部分功能已经完成,代码量相对少了很多,节省了不少时间。1 X0 O. F/ M; x& K  T2 X
3 L% z2 d3 o* I9 H5 T9 f5 V; w/ r/ E

, A. \& P' e: q. p 8.png 5 Z4 z- p, N$ p% L" j$ U
    系统时钟配置,可以使用各种工具自动生成代码拷过来,自己写的话就麻烦多了,我才不会去写。

, N* z6 C. B  n% V( `9 F
9.png
    MPU设置和Cache设置。MPU也就是内存保护单元,设置起始地址、长度、读写权限以及缓存等,然后再打开I-Cache、D-Cache,用于提高性能。, B+ y/ e4 r! C
4 `1 }% q* m3 G+ U$ y) s# s
10.png
    程序入口点,这里我开了个主线程,没什么用,习惯罢了。while里要调用net_main函数,用于处理网络的各种事件,具体的执行内容可以参考手册。MDK提供的中间件没有开放源码,所以怎样实现的是看不到的,不过可以看看lwip的源码,大同小异。

; |+ @1 q, K8 L1 w6 ]4 o# x/ p6 b+ v' ~: D, Y3 O
11.png
+ K& }( `. Q* t4 ]3 x
    真正自己的代码来了,就这么一点点,还包括了接口函数在内。2 P0 S  ]9 Q' u6 q
    首先执行的是net_initialize,初始化函数,只要执行一次就行了,这个必须在所有操作前调用一次。6 Y, r4 l: q$ P
    然后就是Listen了,首先get一个socket,其实就是绑定过程,然后再按照指定的端口监听。监听过程中的事件都在回调函数里处理。7 {! v5 g  @) ^$ h
    回调函数,处理Client的连接、断开、数据传输等事件,一个switch解决。7 J; d0 l8 M4 u, a# H
    发送数据,我又创建了一个线程,不过单纯是为了代码好写,可以精确定时、而且方便启动停止,代码量最少,否则还要再去配置SysTick,太麻烦了。
# t. P6 }. |5 K0 K8 w4 Q& @% y( a    4 M4 d  ?$ A5 F( V! ?9 C7 o' j
    整个代码的作用就是监听端口,当有Client连接进来后,每秒发送一次字符串“abcdern”,没了。

* M! Q6 q; @$ s8 m
12.png
    看效果,功能实现。没有加上各种容错机制,毕竟只是为了实现功能,不是做产品。
  W. R- t. I8 f, d7 `9 `) l" X2 g# M# Y" Y6 F$ N
    全文完。发现写帖子的时间和写代码的时间差不多,一天就过去了,我晕。5 C' b5 X/ j% U- `
    最后附上工程文件: STM32F7_TCP.rar (54.26 KB, 下载次数: 237)
赞 收藏 20 评论103 发布时间:2015-10-21 13:55

举报

103个回答
hlbht2000 回答时间:2016-6-23 13:18:14
好                                                               
liunine 回答时间:2015-10-28 16:34:43
tjcfeng 发表于 2015-10-21 16:59
# B' N0 s& U6 u& @3 r8 C5 |- Y这里是为了演示快速开发,不需要深究TCPIP协议栈。
" P6 m: a, `+ c: m- B# t
测试了一下,发送没问题,接受只要超过一定的大小就over了,这个东西怎么告诉系统数据已经接受掉了呢?
tjCFeng 回答时间:2015-10-29 09:52:43
liunine 发表于 2015-10-28 16:34
/ @- X1 _$ g3 X. o2 O测试了一下,发送没问题,接受只要超过一定的大小就over了,这个东西怎么告诉系统数据已经接受掉了呢? ...

/ e& p) _2 c' v( P3 p) C接收一包数据过大还是总数据过大?
tjCFeng 回答时间:2015-10-21 13:57:42
本帖最后由 tjcfeng 于 2015-10-21 13:58 编辑   w* }! [9 i+ T, k
$ }- }0 `+ t/ [9 L' H
好吧,来篇具体的吧,后面有工程的附件下载后编译直接烧到板子上可看到效果,省得有人以为都是没验证的东西。
沐紫 回答时间:2015-10-21 14:11:03
谢谢楼主,大力支持
tjCFeng 回答时间:2015-10-21 14:12:36
沐紫 发表于 2015-10-21 14:11
- Y. D6 @# J1 a! U/ v谢谢楼主,大力支持

3 w, D+ [. P1 w4 d* y感谢感谢
foxglove 回答时间:2015-10-21 14:17:06
STM32F7 TCPServer
moyanming2013 回答时间:2015-10-21 14:50:18
学习。。。
yanlinwei 回答时间:2015-10-21 15:53:23
netlhx 回答时间:2015-10-21 16:36:37
好贴必顶
fyaocn 回答时间:2015-10-21 16:54:50
TCP本身就要精通才好
tjCFeng 回答时间:2015-10-21 16:59:42
本帖最后由 tjcfeng 于 2015-10-21 17:01 编辑
) p) i* R' h6 G: B1 ?
fyaocn 发表于 2015-10-21 16:54
7 k3 D2 i3 k" m8 N3 JTCP本身就要精通才好

/ \: d/ f: _& ~4 s. u这里是为了演示快速开发,不需要深究TCPIP协议栈。
hello! 回答时间:2015-10-21 17:48:22
anger0925 回答时间:2015-10-21 18:01:10
               
wyxy163@126.com 回答时间:2015-10-21 20:26:23
提示: 作者被禁止或删除 内容自动屏蔽
tjCFeng 回答时间:2015-10-21 20:57:33
数码小叶 发表于 2015-10-21 20:26
) B& b3 v2 E* W/ z/ J9 x帮顶
9 R9 R. `6 Z0 ]/ i! O
谢谢
lkl0305 回答时间:2015-10-21 23:14:35
很详细,多谢分享

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版