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

开箱测评-STM32H5内部TCP/IP UDP 通讯测试(1)

[复制链接]
guoyuli 发布时间:2023-9-11 12:46
我的项目在以前的应用主要是 FreeRTOS+lwIP 的组合,这个组合能用但不好用,其中问题也较多。例如,断线重连问题,从检测到重连的时间较长,往往中断50秒或更久,希望找到一个靠谱的 TCP/IP 协议栈。STM32H563ZI 板卡有 ThreadX 和 NETX 的组合支持,我们一起来测试一下。
首先从已有例程开始,选择 Nx_SNTP_Client,该例程是 NTP 服务器对时的应用。这个应用非常实用,在与实时时钟的相关应用中,多数都需要校时任务。首先打开 Nx_SNTP_Client.ioc 文件。
640 (1).jpg
可以看到应用支持,ThreadX 和 NETX 的应用,应用层支持 DNS 和 SNTP 应用,相比以前使用过lwIP的DNS,步骤简洁很多。底层支持 DHCP、ICMP、TCP,比 lwIP 的 DHCP 稳定快捷,lwIP 的 DHCP 应用有时会出现长时间无法获得IP、需不停检测和重试的情况。硬件接口设置就很简单了接口选 RMII,PHY 设置 LAN8742,MAC 地址 00:80:E1:00:00:00 (这是测试地址,应用中最好修改一下)硬件开启全局中断。还有串口设置,还有 printf 设置,注意编译时选择 microLIB 库,要不无法收到串口信息。下面来分析应用,Main.C 基本上不需要动,主要是硬件程序化和 MX_ThreadX_Init() 函数。
  1. ' v2 u* M5 Q, }9 w; v9 g
  2. /**
    1 S& F1 R) m) w4 g. w  {$ g
  3.   * @brief The application entry point." ^5 j: s9 L& G) L! Z
  4.   * @retval int% [: L$ P! d# q- c) J
  5.   */
    , j* I5 R* R) w* S% C
  6. int main(void). C* B. [1 s5 [( c
  7. {
    2 c5 o2 l) m. A# n' Z
  8.   /* USER CODE BEGIN 1 */
      @; Q8 l' Q& Z6 R# m# p
  9.   /* USER CODE END 1 */2 [. Q5 ^, m& ~/ R, a: x, I8 C
  10.   /* MCU Configuration--------------------------------------------------------*/2 M( t* S- a% g/ N: r2 }- w
  11.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      q" z" _( g8 P# c2 j# f
  12.   HAL_Init();
    # s. J% Z/ A, q
  13.   /* USER CODE BEGIN Init */
    - n+ C# ^+ O4 z3 J$ i' ]' F3 u
  14.   /* USER CODE END Init */
    : A0 D5 J) M, n7 }3 m9 @4 X' r
  15.   /* Configure the system clock */
    2 U$ i% f# C" ]5 i# ?
  16.   SystemClock_Config();
    4 B( F- F4 R  F. C- o
  17.   /* USER CODE BEGIN SysInit *// ]; N, A) u) N8 }  b; U* w6 B
  18.   /* USER CODE END SysInit */
    $ k+ R2 {* u' l* M2 V# h& e; K; g! ?% a
  19.   /* Initialize all configured peripherals */
    # W0 I: u3 H3 U# ]
  20.   MX_GPIO_Init();
    . u1 y/ E+ Q& k$ u" U
  21.   MX_ICACHE_Init();
    / c- ]5 T# G6 l, n
  22.   MX_ETH_Init();
    / m( p; A7 t" P+ Y3 B& d
  23.   MX_USART3_UART_Init();
    7 g* r1 g  q3 J2 x) a' Q0 s
  24.   MX_RTC_Init();
    8 C! ^8 ]. P8 ~  R* ?6 R& o, _
  25.   /* USER CODE BEGIN 2 */
    3 Q3 |' J: D% s$ b" }# H% }2 @6 L
  26.   /* USER CODE END 2 */
    . U- o. Q* V/ k
  27.   MX_ThreadX_Init();
    ! R7 n3 t% V% h' w; w1 U( s- G
  28.   /* We should never get here as control is now taken by the scheduler */
    + U; M9 K+ ]& R8 y- D
  29.   /* Infinite loop */; n/ O$ f8 p4 p/ \2 @9 A6 `' \
  30.   /* USER CODE BEGIN WHILE *// u; h" L$ i" r" n4 M2 }
  31.   while (1)# Q* \2 L4 x' G. \7 [  i
  32.   {
    * m1 m: n  |* a4 {! @
  33.     /* USER CODE END WHILE */
    - ~8 r+ s6 y3 y1 W* r
  34.     /* USER CODE BEGIN 3 */
    1 F  Q/ @/ o; }5 o+ z6 |
  35.   }
      \: V: Q' C3 k0 |0 _  G9 f
  36.   /* USER CODE END 3 */8 {8 |  y' N, r' m  z
  37. }
复制代码
可以看到程序非常简洁,微软的建议是将硬件的初始化尽可能的放在 main.C 中进行,这里放入 printf 的设置。不要放入太多的逻辑代码,应用的初始化尽可能在 tx_application_define 函数中进行。这里的初始化过程被封装到 status = MX_NetXDuo_Init(memory_ptr) 中了,在这个 MX_NetXDuo_Init 函数中在进行线程的初始化。主要有三个线程和一个回调函数。

  1. / |3 n; V9 z! y" P% v
  2. /* Private function prototypes -----------------------------------------------*/. C4 d$ p$ n2 m& H5 M
  3. static VOID App_Main_Thread_Entry (ULONG thread_input);! g1 R" B6 i% i3 u, ?
  4. static VOID ip_address_change_notify_callback(NX_IP *ip_instance, VOID *ptr);5 T2 z2 ]! P6 E2 |, y. q( e
  5. /* USER CODE BEGIN PFP */( Q% P, B6 b6 B1 v6 f, P
  6. static VOID App_SNTP_Thread_Entry(ULONG thread_input);
    9 J7 a# {5 U4 y
  7. static VOID App_Link_Thread_Entry(ULONG thread_input);
复制代码
来源:EEWORLD论坛网友 bigbat 版权归原作者所有
7 i) r0 f: P- V) y; H' h' p

- M( J5 @' X& a/ A8 _( k) c' L+ ]
收藏 评论0 发布时间:2023-9-11 12:46

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版