HAL 库 STM32F4 裸机 LAN8720 实验
1 实验环境
- STM32F407ZGT6
- STM32CubeMX version 6.12.0
2 基本配置
2.1 时钟
2.2 串口
3 网络配置
3.1 原理图
注意: 本次实验的 LAN8720 复位引脚直连了 MCU 的复位引脚,所以我没有手动添加引脚来复位,如果单独配置复位引脚,那么清参考别的教程配置
3.2ETH
3.3LWIP
4. 代码
4.1 报错 Error: L6218E: Undefined symbol sio_open (referred from slipif.o).
把 slipif.c 内容全部删除
4.2 串口
uart.c
/* USER CODE BEGIN 0 */
#include "stdio.h"
/* USER CODE END 0 */
/* USER CODE BEGIN 1 */
// 加入以下代码,支持printf函数,而不用勾选use MicroLIB
// #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#if 1
// #pragma import(__use_no_semihosting)
// 标准库需要的支持函数
//struct __FILE {
// int handle;
//};
FILE __stdout;
// 定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x) { x = x; }
// 重定义fputc函数
int fputc(int ch, FILE *f) {
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0x0001);
return ch;
}
#endif
/* USER CODE END 1 */
main.c
/* USER CODE BEGIN 0 */
#include "stdio.h"
#include "lan8742.h"
uint8_t RecvData[255];
void UartTxCallback(UART_HandleTypeDef *huart1)
{
HAL_UART_Receive_IT(huart1, RecvData, 1);
}
void UartRxCallback(UART_HandleTypeDef *huart1)
{
HAL_UART_Transmit_IT(huart1, RecvData, 1);
}
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
HAL_UART_RegisterCallback(&huart1, HAL_UART_TX_COMPLETE_CB_ID, UartTxCallback);
HAL_UART_RegisterCallback(&huart1, HAL_UART_RX_COMPLETE_CB_ID, UartRxCallback);
HAL_UART_Receive_IT(&huart1, RecvData, 1);
/* USER CODE END 2 */
4.3 网络
main.c
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
MX_LWIP_Process();
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
ethernetif.c 打印寄存器值
/* USER CODE BEGIN 0 */
#include "stdio.h"
/* USER CODE END 0 */
/* USER CODE BEGIN LOW_LEVEL_INIT */
uint32_t addr;
if(ETH_PHY_IO_ReadReg(LAN8742A_PHY_ADDRESS, LAN8742_PHYI1R,&addr) == 0){
printf("LAN8742_PHYI1R: %d\n", addr);
}
if(ETH_PHY_IO_ReadReg(LAN8742A_PHY_ADDRESS, LAN8742_PHYI2R,&addr) == 0){
printf("LAN8742_PHYI2R: %d\n", addr);
}
/* USER CODE END LOW_LEVEL_INIT */