STM32F7xx Keil5 RTX RL-TCPnet DP83822移植

使用之前RTX工程模板

RTE中RL-TCPnet配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
暂时全部默认配置,DHCP已打开
在这里插入图片描述
修改RTE_Device.h ETH配置

在这里插入图片描述
修改DP83822驱动

在这里插入图片描述
去掉文件只读属性,之后需要修改,添加到工程

在这里插入图片描述
修改DP83822 ID

在这里插入图片描述
RTE创建tcp server例程,参考该例程,进行修改
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
修改后的TCP_Socket_server.c

/*------------------------------------------------------------------------------
 * MDK Middleware - Component ::Network:Service
 * Copyright (c) 2004-2019 Arm Limited (or its affiliates). All rights reserved.
 *------------------------------------------------------------------------------
 * Name:    TCP_Socket_Server.c
 * Purpose: TCP Socket Server Code Template
 * Rev.:    V7.0.0
 *----------------------------------------------------------------------------*/
//! [code_TCP_Socket_Server]
#include "rl_net.h"
#include "cmsis_os2.h"
#include "stm32f7xx_hal.h"

#define PORT_NUM 2000
int32_t tcp_sock;

// Notify the user application about TCP socket events.
uint32_t tcp_cb_server (int32_t socket, netTCP_Event event,
                        const NET_ADDR *addr, const uint8_t *buf, uint32_t len) {
 
  switch (event) {
    case netTCP_EventConnect:
      // Connect request received
      /* Example
      if (addr->addr_type == NET_ADDR_IP4) {
        // IPv4 client
        if (addr->addr[0] == 192  &&
            addr->addr[1] == 168  &&
            addr->addr[2] == 0    &&
            addr->addr[3] == 1) {
          // Accept connection from client at 192.168.0.1
          return (1);
        }
      }
      else {
        // IPv6 client
        const uint8_t ip6_addr[NET_ADDR_IP6_LEN] = { 
                         0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                         0x1c, 0x30, 0x6c, 0xff, 0xfe, 0xa2, 0x45, 0x5e };
        if (memcmp (addr->addr, ip6_addr, NET_ADDR_IP6_LEN) == 0) {
          // Accept connection from client at [fe80::1c30:6cff:fea2:455e]
          return (1);
        }
      }
      // Deny connection.
      return (0);
      */
      return (1);
 
    case netTCP_EventEstablished:
      // Connection established
      break;
 
    case netTCP_EventClosed:
      // Connection was properly closed
      break;
 
    case netTCP_EventAborted:
      // Connection is for some reason aborted
      break;
 
    case netTCP_EventACK:
      // Previously sent data acknowledged
      break;
 
    case netTCP_EventData:
      // Data received
      /* Example
      if ((buf[0] == 0x01) && (len == 2)) {
        // Switch LEDs on and off
        // LED_out (buf[1]);
      }
      */
      break;
  }
  return (0);
}
 
// Allocate and initialize the socket.
__NO_RETURN static void tcp_server_task (void *argument)
{
  netStatus ret;
  netTCP_State net_state;
  int32_t iCount;
  uint8_t *sendbuf;
  uint32_t maxlen;
  
  netInitialize();

  tcp_sock = netTCP_GetSocket (tcp_cb_server);
  
  if (tcp_sock > 0)
  {
    ret = netTCP_Listen (tcp_sock, PORT_NUM);
    netTCP_SetOption (tcp_sock, netTCP_OptionKeepAlive, 1);
  }
  
  osDelay(10000);
  
  for (;;)
  {
    net_state = netTCP_GetState(tcp_sock);
    if(net_state == netTCP_StateESTABLISHED)
    {
      iCount = 8;
      do
      {
        if(netTCP_SendReady(tcp_sock) == true)
        {
          maxlen  = netTCP_GetMaxSegmentSize (tcp_sock);
          
          iCount -= maxlen;
          if(iCount < 0)
            maxlen = iCount + maxlen;
          
          sendbuf = netTCP_GetBuffer (maxlen);
          sendbuf[0] = '1';
          sendbuf[1] = '2';
          sendbuf[2] = '3';
          sendbuf[3] = '4';
          sendbuf[4] = '5';
          sendbuf[5] = '6';
          sendbuf[6] = '7';
          sendbuf[7] = '8';
          netTCP_Send (tcp_sock, sendbuf, maxlen);
        }
      } while (iCount > 0);
    }
    
    osDelay(1000);
  }
}

const osThreadAttr_t tcp_server_task_Attr = 
{
  .name = "tcp_server_task",
  .attr_bits = osThreadDetached, 
  .priority = osPriorityNormal2,
  .stack_size = 2048,
};

void tcp_server_task_init(void)
{
  GPIO_InitTypeDef  GPIO_InitStruct = {0};
  // ERST PG9
  __HAL_RCC_GPIOG_CLK_ENABLE();
  // ETH_XTAL_CLK PA8, MCO1, 25MHz
  HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1);

  GPIO_InitStruct.Pin = GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
  HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);

  // reset PHY
  HAL_GPIO_WritePin(GPIOG, GPIO_PIN_9, GPIO_PIN_RESET);
  osDelay(10);
  HAL_GPIO_WritePin(GPIOG, GPIO_PIN_9, GPIO_PIN_SET);
  osDelay(200);
  
  osThreadNew(tcp_server_task, NULL, &tcp_server_task_Attr);
}
//! [code_TCP_Socket_Server]

测试

ping

在这里插入图片描述

Tcp client

在这里插入图片描述

问题

可以PING通,但client无法连接,后来发现是netInitialize以及server相关的测试代码需要放在同一个task里

参考

【STM32F407】第11章 RL-TCPnet V7.X之TCP服务器
https://blog.csdn.net/Simon223/article/details/108494688

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Version: 2.12.0 (2019-07-17) Keil.STM32F7xx_DFP.2.12.0.pack Download Updated Pack to include subset of STM32Cube_FW_F7 Firmware Package version V1.15.0 using HAL Drivers V1.2.7 Added support for Low Level (LL) drivers. Corrected RTE_Device.h file (I2C3_SDA) Corrected condition for selecting HAL RCC MX_Device_h.ftl: Updated parsing of USART virtual mode Updated generation of macros: Added handling for '(' and ')' symbols Corrected launching STM32CubeMX via "play" button for existing projects overwrites with a new STM32CubeMX project file instead of loading existing. Updated Board Examples: graphics examples use Segger emWin version 5.50.0. examples enable Event Recorder in debug targets Updated LCDConf.c (ready for GUI_USE_ARGD = 1) CMSIS-Driver: CAN: Corrected SetBitrate function to leave Silent and Loopback mode as they were. Corrected SetMode function to clear Silent and Loopback mode when NORMAL mode is activated. Corrected MessageSend function to only access required data for sending. EMAC: Corrected __MEMORY_AT(x) define to be compliant with Arm Compiler 6. Corrected: ETH DMA initialization moved to enable of MAC transmitter or receiver solving netInitialize/netUnnitialize/netInitialize sequence. I2C: Corrected transfers for data sizes greater than 255 (Complete Reload handling). Corrected I2C_SlaveReceive functionality. Corrected code alignment. MCI: Added data cache handling. USART: Added check for valid pointer to USART_PIN prior to use. Corrected POWER_OFF sequence. DMA is DeInitialized after it is aborted. USB Device: Updated USBD_EndpointConfigure function to check that maximum packet size requested fits into configured FIFO (compile time configured). I/O output speed is configurable SPI: Updated SPI_TRANSFER_INFO structure - tx_buf type changed from uint8_t * to const uint8_t *. Added check for valid pointer to SPI_PIN prior to use.
### 回答1: Keil.STM32F7xx_DFP是一款针对STMicroelectronics的STM32F7系列微控制器的Device Family Pack (设备系列包)。它是一款由Keil公司开发的软件开发工具包,用于嵌入式系统开发者开发STM32F7系列芯片的应用程序。 该软件包包括为所有STM32F7系列芯片提供的外设驱动程序和中间件库,以及板级支持包 (BSP),它可以使用Keil MDK (Microcontroller Development Kit)进行集成开发环境 (IDE)开发。通过Keil.STM32F7xx_DFP,开发者可以快速高效地开发出各种应用,如消费电子、物联网、汽车电子、医疗电子、工业自动化等领域的产品。 Keil.STM32F7xx_DFP具有易于使用的特点,为嵌入式系统开发者提供了非常友好的用户界面。该软件包不仅支持Keil MDK,还支持其他多种开发工具,如IAR Embedded Workbench、Green Hills软件工具和Eclipse。 Keil.STM32F7xx_DFP帮助开发者充分利用STM32F7系列芯片的强大性能,包括其高速运行速度和现代化的外设设计。通过该软件包提供的驱动程序和库,开发者可以更快、更方便地完成代码的编写,从而提高开发效率和产品质量。同时,Keil公司也提供了丰富的技术支持和培训服务,以帮助开发者解决实际应用中遇到的各种问题。 ### 回答2: keil.stm32f7xx_dfp是一款专为STM32F7系列微控制器设计的Keil软件开发包。Keil是一家提供基于ARM处理器的单片机软件开发工具的公司,其工具包包括编译器、调试器、仿真器等。STM32F7系列微控制器是ST公司推出的一款高性能、低功耗、易于集成的微控制器群,其应用广泛,主要适用于智能家居、智能穿戴、工业自动化等领域。 keil.stm32f7xx_dfp提供了一系列针对STM32F7系列微控制器的软件驱动包,包含了系统时钟、GPIO、DMA、外设、中断等驱动程序。这些驱动程序可以帮助开发者快速、稳定地实现STM32F7系列微控制器的应用程序开发。keil.stm32f7xx_dfp还提供了一些示例程序,帮助开发者演示如何使用驱动包,加速学习。另外,keil.stm32f7xx_dfp还配合Keil MDK(Keil开发环境)进行使用,用户可以在Keil MDK中直接调用工具包中的驱动程序,快速构建和测试应用程序。 总之,keil.stm32f7xx_dfp是一款帮助开发者快速、高效地使用STM32F7系列微控制器的软件开发包,其提供的驱动程序和示例程序有助于初学者快速掌握和使用STM32F7系列微控制器,同时也提高了开发效率和软件质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值