1. 程式人生 > >stm32+lwip(一):使用STM32CubeMX生成項目

stm32+lwip(一):使用STM32CubeMX生成項目

phy .cn delay timers log 驅動開發 ref user 搭建

系列文章:

stm32+lwip():使用STM32CubeMX生成項目

stm32+lwip():UDP測試

stm32+lwip():TCP測試

stm32+lwip():網頁服務器測試

stm32+lwip():以太網幀發送測試

STM32CubeMX是一個圖形化的配置工具,根據用戶配置可以生成相應的代碼,可以幫助開發人員擺脫部分底層開發的煩惱。

一、工程配置

本項目使用stm32407開發板,phy芯片為LAN8720A,硬件原理圖如下:

技術分享圖片

根據原理圖,STM32CubeMX配置如下:

技術分享圖片

1:選擇外部晶振

技術分享圖片

2:選擇燒寫方式和時基

技術分享圖片

3:選擇調試串口

技術分享圖片

4:選擇PHY接口

技術分享圖片

5:選擇LWIP

技術分享圖片

6:配置時鐘

技術分享圖片

7:調試串口配置

技術分享圖片

8:以太網配置

技術分享圖片

PHY地址根據PHYAD0管腳的配置決定:

技術分享圖片

技術分享圖片

技術分享圖片

PHY芯片設置,需根據LAN8720A的芯片手冊來配置:

技術分享圖片

9:LWIP配置

為了方便調試,使用靜態IP,同時使能UDPTCP模塊

技術分享圖片

10:生成工程

將工程使用的堆棧調大點

技術分享圖片

每個外設單獨形成文件

技術分享圖片

二、調試串口輸出

在生成的uart.c文件中增加以下代碼:

 1 /******************************************************************************
 2  * 描述  : 重定向c庫函數printf到串口
3 * 參數 : 無 4 * 返回 : HAL_OK = 0x00U 5 HAL_ERROR = 0x01U 6 HAL_BUSY = 0x02U 7 HAL_TIMEOUT = 0x03U 8 ******************************************************************************/ 9 int fputc(int ch, FILE *f) 10 { 11 return HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1
, 0xFFFF); 12 }

然後就可以使用printf函數將調試信息通過串口打印出來。

三、PHY芯片復位

在以太網初始化後,增加PHY芯片復位代碼

技術分享圖片

1 HAL_GPIO_WritePin(ETH_RESET_GPIO_Port, ETH_RESET_Pin, GPIO_PIN_RESET);
2 HAL_Delay(50);
3 HAL_GPIO_WritePin(ETH_RESET_GPIO_Port, ETH_RESET_Pin, GPIO_PIN_SET); 

四、創建app文件

 1 /**
 2   *****************************************************************************
 3   * @file    app.c
 4   * @author  Zorb
 5   * @version V1.0.0
 6   * @date    2018-09-04
 7   * @brief   應用的實現
 8   *****************************************************************************
 9   * @history
10   *
11   * 1. Date:2018-09-04
12   *    Author:Zorb
13   *    Modification:建立文件
14   *
15   *****************************************************************************
16   */
17 
18 #include "app.h"
19 
20 /******************************************************************************
21  * 描述  : 應用的初始化
22  * 參數  : 無
23  * 返回  : 無
24 ******************************************************************************/
25 void App_init(void)
26 {
27     printf("hello zorb\r\n");
28 }
29 
30 /******************************************************************************
31  * 描述  : 應用程序
32  * 參數  : 無
33  * 返回  : 無
34 ******************************************************************************/
35 void App_process(void)
36 {
37 
38 }
39 
40 /******************************** END OF FILE ********************************/

main.c中增加以下代碼

技術分享圖片

MX_LWIP_Process()的功能說明:

/**
 * ----------------------------------------------------------------------
 * Function given to help user to continue LwIP Initialization
 * Up to user to complete or change this function ...
 * Up to user to call this function in main.c in while (1) of main(void) 
 *-----------------------------------------------------------------------
 * Read a received packet from the Ethernet buffers 
 * Send it to the lwIP stack for handling
 * Handle timeouts if LWIP_TIMERS is set and without RTOS
 * Handle the llink status if LWIP_NETIF_LINK_CALLBACK is set and without RTOS 
 */

添加好app文件後,後續app初始化代碼寫在App_init()裏邊,app應用代碼寫在App_process()

需要註意的是,本工程沒有使用任務系統,因此App_process()裏邊代碼不能阻塞。

五、ping測試

經過上面的工作,基於stm32lwip工程已經搭建完成,在電腦上面ping一下:

技術分享圖片

現在已經ping通了,撒花。

六、最後

STM32CubeMX真的很方便,簡簡單單配置一下,就可以生成我們想要的工程。減少了開發者對底層驅動開發的時間,讓開發者更好地將時間投入到應用開發。

github:https://github.com/54zorb/stm32-lwip

版權所有,轉載請打賞喲

如果你喜歡我的文章,可以通過微信掃一掃給我打賞喲

技術分享圖片

stm32+lwip(一):使用STM32CubeMX生成項目