使用STM32CubeMX创建STM32F407工程

使用STM32CubeMX创建STM32F407工程


创建项目

新建工程,选择对应的stm32f407芯片
使用STM32CubeMX创建STM32F407工程_第1张图片

设置相关引脚pin

MiddleWares:

因为需要使用网络,选中LWIP。

Peripherals:

配置ETH使能,在右侧的引脚配图中相关引脚
配置RCC,使用外部晶振如图所示
使用STM32CubeMX创建STM32F407工程_第2张图片
配置SYS,配置系统时钟中断,使用ARM内部时钟
这里写图片描述
配置USART1,模式为异步,不使用硬件流控
这里写图片描述

在右边设置相关引脚:

使用STM32CubeMX创建STM32F407工程_第3张图片

时钟设置

LSE:外部低频时钟
HSE:外部高频时钟
LSI:内部低频时钟
HSI:内部高频时钟

由于需要配置168MHz系统时钟,只能使用PLL如图所示,(如果Pinout->RCC没有配置外部晶振,此处无法使用 HSE)
使用STM32CubeMX创建STM32F407工程_第4张图片

总线配置

ETH配置

使用的 DP83848CVV phy芯片,其中COL/PHYAD0引脚悬空,phy地址为0x01
使用STM32CubeMX创建STM32F407工程_第5张图片
其他数据根据datasheet进行相关配置
使用STM32CubeMX创建STM32F407工程_第6张图片
###LWIP配置
使能Link回调,后面代码中进行相关配置
使用STM32CubeMX创建STM32F407工程_第7张图片

生成代码

printf函数支持

#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)
{      
  while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
  USART1->DR = (uint8_t) ch;      
  return ch;
}
#endif 

#include "sio.h"
sio_fd_t sio_open(u8_t devnum) { return NULL; }
void sio_send(u8_t c, sio_fd_t fd) {}
u32_t sio_tryread(sio_fd_t fd, u8_t *data, u32_t len) { return 0;}

link反馈支持

#define PHY_MISR                            0x12
#define PHY_LINK_INTERRUPT                  0x2000
#define PHY_LINK_STATUS                     0x0001
void ethernetif_set_link(struct netif *netif)
{
  uint32_t regvalue = 0;

  /* Read PHY_MISR*/
  HAL_ETH_ReadPHYRegister(&heth, PHY_MISR, ®value);

  /* Check whether the link interrupt has occurred or not */
  //if((regvalue & PHY_LINK_INTERRUPT) != (uint16_t)RESET)
  {
    /* Read PHY_SR*/
    //HAL_ETH_ReadPHYRegister(&heth, PHY_SR, ®value);

    /* Check whether the link is up or down*/
    if((regvalue & PHY_LINK_STATUS)!= (uint16_t)RESET)
    {
      netif_set_link_up(netif);
            printf("[ethernetif]:netif_set_link_up\r\n");
    }
    else
    {
      netif_set_link_down(netif);
            printf("[ethernetif]:netif_set_link_down\r\n");
    }
  }
}
void MX_LWIP_Process(void)
{
  ethernetif_input(&gnetif);

  /* Handle timeouts */
  #if LWIP_TIMERS && NO_SYS
    sys_check_timeouts();
  #endif

    ethernetif_set_link(&gnetif);
}

你可能感兴趣的:(Stm32)