cubemx lan8720模块_通过STM32cubeMX将STM32F767+LAN8720+LwIP+FreeRTOS的以太网实现
本文使用了正點原子的阿波羅開發(fā)板,接下來我將粗略的對STM32F767通過STM32cubeMX進(jìn)行以太網(wǎng)協(xié)議配置。
具體步驟
1.首先使能ETH,模式選擇RMII;
2.使能LWIP和FREERTOS;
因為阿波羅的開發(fā)板PHY芯片的ETH_DXT1和ETH_DXT0用的是PG13,PG14引腳,和默認(rèn)的不同,所以這里改一下
3.配置時鐘,在這里我放上我自己的時鐘配置圖,只要不標(biāo)紅就行,我用的是25MHz外部晶振作時鐘源 ;
4.配置ETH,由于阿波羅開發(fā)板的LAN8720芯片的PHYAD0引腳懸空,故PHY Address設(shè)置為0;
5.由于我用的STM32cubeMX的版本是將LAN8742A作為默認(rèn)芯片,所以我們這里不做修改,只用將內(nèi)部參數(shù)改為LAN8720參數(shù)即可;
6.配置LWIP,本人這里不使用DHCP獲取IP地址等信息,并且我使用的是TCP,所以未對UDP使能,設(shè)置如圖;
7.配置FREERTOS,我在這里加了兩個線程備用
8.按下生成按鈕,生成項目,生成時需要選擇編譯軟件為自己用的軟件,本人使用的是V5;
由于阿波羅開發(fā)板的PHY芯片的RESET引腳是依靠PCF8574的P7位控制,所以我們要在項目中引入PCF8574的代碼,以下代碼可以在阿波羅資料盤中找到
打開main.c里的加上#include “pcf8574.h”,并在初始化部分將PCF8574初始化
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f7xx_hal.h"
#include "cmsis_os.h"
#include "lwip.h"
#include "gpio.h"
/* USER CODE BEGIN Includes */
#include "pcf8574.h"
/* USER CODE END Includes */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void MX_FREERTOS_Init(void);
/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
/* USER CODE END PFP */
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
* @brief? The application entry point.
*
* @retval None
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
PCF8574_Init();
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Call init function for freertos objects (in freertos.c) */
MX_FREERTOS_Init();
/* Start scheduler */
osKernelStart();
/* We should never get here as control is now taken by the scheduler */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
打開freertos.c里的加上
#include “gpio.h”
#include “sys.h”
#include “pcf8574.h”
#include “tcp_echoserver.h”,并在主線程將PCF8574初的P7管腳使能
PCF8574_WriteBit(ETH_RESET_IO,0);代碼如下
/* Includes ------------------------------------------------------------------*/
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "gpio.h"
#include "sys.h"
#include "pcf8574.h"
#include "tcp_echoserver.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */
/* USER CODE END Variables */
osThreadId defaultTaskHandle;
osThreadId myTaskLEDHandle;
osThreadId myTaskTCPHandle;
/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */
extern void tcp_echoserver_init(void);
/* USER CODE END FunctionPrototypes */
void StartDefaultTask(void const * argument);
void LEDTask(void const * argument);
void TCPTask(void const * argument);
extern void MX_LWIP_Init(void);
void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */
/**
* @brief? FreeRTOS initialization
* @param? None
* @retval None
*/
void MX_FREERTOS_Init(void) {
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* USER CODE BEGIN RTOS_MUTEX */
/* add mutexes, ... */
/* USER CODE END RTOS_MUTEX */
/* USER CODE BEGIN RTOS_SEMAPHORES */
/* add semaphores, ... */
/* USER CODE END RTOS_SEMAPHORES */
/* USER CODE BEGIN RTOS_TIMERS */
/* start timers, add new ones, ... */
/* USER CODE END RTOS_TIMERS */
/* Create the thread(s) */
/* definition and creation of defaultTask */
osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
/* definition and creation of myTaskLED */
osThreadDef(myTaskLED, LEDTask, osPriorityIdle, 0, 128);
myTaskLEDHandle = osThreadCreate(osThread(myTaskLED), NULL);
/* definition and creation of myTaskTCP */
osThreadDef(myTaskTCP, TCPTask, osPriorityIdle, 0, 1024);
myTaskTCPHandle = osThreadCreate(osThread(myTaskTCP), NULL);
/* USER CODE BEGIN RTOS_THREADS */
/* add threads, ... */
/* USER CODE END RTOS_THREADS */
/* USER CODE BEGIN RTOS_QUEUES */
/* add queues, ... */
/* USER CODE END RTOS_QUEUES */
}
/* USER CODE BEGIN Header_StartDefaultTask */
/**
* @brief? Function implementing the defaultTask thread.
* @param? argument: Not used
* @retval None
*/
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void const * argument)
{
/* init code for LWIP */
MX_LWIP_Init();
/* USER CODE BEGIN StartDefaultTask */
PCF8574_WriteBit(ETH_RESET_IO,0);? ? ? ?//???ˉPHYD???
Tcp_Server_Init();
/* Infinite loop */
for(;;)
{
osDelay(1);
}
/* USER CODE END StartDefaultTask */
}
/* USER CODE BEGIN Header_LEDTask */
/**
* @brief Function implementing the myTaskLED thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_LEDTask */
void LEDTask(void const * argument)
{
/* USER CODE BEGIN LEDTask */
/* Infinite loop */
for(;;)
{
osDelay(1);
}
/* USER CODE END LEDTask */
}
/* USER CODE BEGIN Header_TCPTask */
/**
* @brief Function implementing the myTaskTCP thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_TCPTask */
void TCPTask(void const * argument)
{
/* USER CODE BEGIN TCPTask */
/* Infinite loop */
for(;;)
{
osDelay(1);
}
/* USER CODE END TCPTask */
}
接下來我們的開發(fā)板連上電腦,保證電腦IP地址和開發(fā)板IP地址在同一網(wǎng)段后按Windows+R后輸入cmd回車打開CMD,在界面輸入ping xxx.xxx.xxx.xxx(xxx代表開發(fā)板IP地址),可以得到
這樣開發(fā)板就ping通了,這個時候就可以引入服務(wù)器或是客戶端的代碼,實現(xiàn)對應(yīng)功能。
總結(jié)
以上是生活随笔為你收集整理的cubemx lan8720模块_通过STM32cubeMX将STM32F767+LAN8720+LwIP+FreeRTOS的以太网实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 山楂和决明子泡水喝的功效与作用、禁忌和食
- 下一篇: 砂仁煲汤的功效与作用、禁忌和食用方法
