rtthread 以太網 (LAN8720A)


查詢以太網配置過程

  文件路徑: /drivers/board.h

  

 

 

 1.使能rtt以太網驅動
  打開 /drivers/board.h 

  

 

 

 2.初始化RMII接口硬件 

  通過 stm32cubemx工具使能RMII硬件,在一下路徑
  \Core\Src\stm32f7xx_hal_msp.c中將HAL_ETH_MspInit拷貝到 /drivers/board.c中

  並根據硬件添加phy復位函數phy_reset.

  

void HAL_ETH_MspInit(ETH_HandleTypeDef *heth)
{
    GPIO_InitTypeDef GPIO_Initure;

    __HAL_RCC_GPIOA_CLK_ENABLE();            //開啟GPIOA時鍾
    __HAL_RCC_GPIOB_CLK_ENABLE();            //開啟GPIOB時鍾
    __HAL_RCC_GPIOC_CLK_ENABLE();            //開啟GPIOC時鍾
    __HAL_RCC_GPIOG_CLK_ENABLE();            //開啟GPIOG時鍾
    __HAL_RCC_ETH1MAC_CLK_ENABLE();         //使能ETH1 MAC時鍾
    __HAL_RCC_ETH1TX_CLK_ENABLE();          //使能ETH1發送時鍾
    __HAL_RCC_ETH1RX_CLK_ENABLE();          //使能ETH1接收時鍾
    
    GPIO_Initure.Pin=GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7; 
    GPIO_Initure.Mode=GPIO_MODE_AF_PP;          //推挽復用
    GPIO_Initure.Pull=GPIO_NOPULL;              //不帶上下拉
    GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;    //高速
    GPIO_Initure.Alternate=GPIO_AF11_ETH;       //復用為ETH功能
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);         //初始化
    
    //PB11
    GPIO_Initure.Pin=GPIO_PIN_11;               //PB11
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);         //始化
    
    //PC1,4,5
    GPIO_Initure.Pin=GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5; //PC1,4,5
    HAL_GPIO_Init(GPIOC,&GPIO_Initure);         //初始化
    
    //PG13,14
    GPIO_Initure.Pin=GPIO_PIN_13|GPIO_PIN_14;   //PG13,14
    HAL_GPIO_Init(GPIOG,&GPIO_Initure);         //初始化
    
    HAL_NVIC_SetPriority(ETH_IRQn,1,0);         //網絡中斷優先級應該高一點
    HAL_NVIC_EnableIRQ(ETH_IRQn);
}
#define RESET_IO GET_PIN(D, 0)
void phy_reset(void)
{
  rt_pin_mode(RESET_IO, PIN_MODE_OUTPUT);
  rt_pin_write(RESET_IO, PIN_HIGH);
  rt_thread_mdelay(50);
  rt_pin_write(RESET_IO, PIN_LOW);
   rt_thread_mdelay(50);
  rt_pin_write(RESET_IO, PIN_HIGH);
}

3.打開相應的HAL庫

  打開 /drivers/ stm32f7xx_hal_conf.h
  使能 #define HAL_ETH_MODULE_ENABLED

4.添加lwip協議棧

  打開 RT-Thread Settings->選擇lwip

  

 

5.驗證

6.添加網絡接口設備 套接字抽象層

 

 

#include <rtthread.h>
#include <arpa/inet.h>
#include <netdev.h>

#include <sal_socket.h>
#include <sys/socket.h>

#include <stdio.h>
#include <string.h>

#include <rtthread.h>
#include <sys/socket.h>
#include <netdb.h>

/* RT-Thread 官網,支持 TLS 功能 */
//#define SAL_TLS_HOST    "www.rt-thread.org"
//#define SAL_TLS_PORT    443
#define SAL_TLS_HOST    "192.168.1.100"
#define SAL_TLS_PORT    8088
#define SAL_TLS_BUFSZ   1024



static const char *send_data = "GET /download/rt-thread.txt HTTP/1.1\r\n"
    "Host: www.rt-thread.org\r\n"
    "User-Agent: rtthread/4.0.1 rtt\r\n\r\n";

void sal_tls_test(void)
{
    int ret, i;
    char *recv_data;
    struct hostent *host;
    int sock = -1, bytes_received;
    struct sockaddr_in server_addr;

    /* 通過函數入口參數url獲得host地址(如果是域名,會做域名解析) */
    host = gethostbyname(SAL_TLS_HOST);

    recv_data = rt_calloc(1, SAL_TLS_BUFSZ);
    if (recv_data == RT_NULL)
    {
        rt_kprintf("No memory\n");
        return;
    }

    /* 創建一個socket,類型是SOCKET_STREAM,TCP 協議, TLS 類型 */
//    if ((sock = socket(AF_INET, SOCK_STREAM, PROTOCOL_TLS)) < 0)
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        rt_kprintf("Socket error\n");
        goto __exit;
    }

    /* 初始化預連接的服務端地址 */
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(SAL_TLS_PORT);
    server_addr.sin_addr = *((struct in_addr *)host->h_addr);
    rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));

    if (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) < 0)
    {
        rt_kprintf("Connect fail!\n");
        goto __exit;
    }

    /* 發送數據到 socket 連接 */
    ret = send(sock, send_data, strlen(send_data), 0);
    if (ret <= 0)
    {
        rt_kprintf("send error,close the socket.\n");
        goto __exit;
    }

    /* 接收並打印響應的數據,使用加密數據傳輸 */
    bytes_received = recv(sock, recv_data, SAL_TLS_BUFSZ  - 1, 0);
    if (bytes_received <= 0)
    {
        rt_kprintf("received error,close the socket.\n");
        goto __exit;
    }

    rt_kprintf("recv data:\n");
    for (i = 0; i < bytes_received; i++)
    {
        rt_kprintf("%c", recv_data[i]);
    }

__exit:
    if (recv_data)
        rt_free(recv_data);

    if (sock >= 0)
        closesocket(sock);
}

#ifdef FINSH_USING_MSH
#include <finsh.h>
MSH_CMD_EXPORT(sal_tls_test, SAL TLS function test);
#endif /* FINSH_USING_MSH */

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM