최신 버전의 STM32CubeIDE를 이용하여 [STM32-176 EV] 보드(STM32F7관 핀투핀 호환)의 내장 이더넷 전송률 테스틀 해보았다.
우선 STM32CubeIDE를 최신으로 업데이트 하고 프로젝트를 생성한다.
ETH를 RMII 모드로 설정하고 나머지 필요한 페리를 추가 해 준다.
인터럽트 설정
LwIP 소프트웨어 스택 설정
이더넷 PHY 설정
LAN8742, DP83848 두가지 PHY가 지원된다. 기존에 없었는데 추가된것 같다.
마지막으로 클럭 설정을 218Mhz로 해 주면 된다.
코드 생성후 디버깅을 위해 UART에서 printf가 동작 할수 있도록 코드 추가 하고 IP정보를 출력할수 있는 함수를 만들면 된다.
#define hUART huart1
extern struct netif gnetif;
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
int _write( int32_t file , uint8_t *ptr , int32_t len )
{
/* Implement your write code here, this is used by puts and printf for example */
for ( int16_t i = 0 ; i < len ; ++i )
{
HAL_UART_Transmit( &hUART, ptr++, 1, 100);
}
return len;
}
print_ip(char *msg, ip_addr_t *ip)
{
printf(msg);
printf("%d.%d.%d.%d\n\r", ip4_addr1(ip), ip4_addr2(ip), ip4_addr3(ip), ip4_addr4(ip));
}
print_ip_settings(ip_addr_t *ip, ip_addr_t *mask, ip_addr_t *gw)
{
print_ip("Board IP: ", ip);
print_ip("Netmask : ", mask);
print_ip("Gateway : ", gw);
}
자동 생성 코드에서 DHCP로 IP를 할당 받아 오는지 확인해 보면.. 정상적으로 IP가 출력되는 것을 확인 할 수 있다.
int main(void)
{
/* USER CODE BEGIN 1 */
unsigned char test_buf[1024];
int cnt = 0;
struct netif *netif;
netif = &server_netif;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* MPU Configuration--------------------------------------------------------*/
MPU_Config();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_LWIP_Init();
/* USER CODE BEGIN 2 */
printf("SysClk (System Clock) = %lu Hz..\r\n", HAL_RCC_GetSysClockFreq());
Led1Off();
while((gnetif.ip_addr.addr) == 0)
{
MX_LWIP_Process();
}
print_ip_settings(&gnetif.ip_addr.addr, &gnetif.netmask.addr, &gnetif.gw.addr);
iperf_init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
MX_LWIP_Process();
}
}
iperf 프로그램으로 STM32F7에서 내장 이더넷으로 TCP 전송률을 측정해 보면 50Mbps 정도로 측정이 된다.
기존에 STM32CodeMx를 이용한 라이브러리에서 테스트한 결과와 비교하면 속도가 좀 느린것 같다.
I캐시, D캐시를 사용해 좀더 속도를 올려 보자.
/* Enable I-Cache---------------------------------------------------------*/
SCB_EnableICache();
/* Enable D-Cache---------------------------------------------------------*/
SCB_EnableDCache();
58Mbps로 좀더 속도가 빨라지는것 같다.
반응형