使用STM32CubeMX创建STM32F407工程

来源:互联网 发布:java微信开发教程csdn 编辑:程序博客网 时间:2024/06/09 01:23

使用STM32CubeMX创建STM32F407工程


创建项目

新建工程,选择对应的stm32f407芯片
这里写图片描述

设置相关引脚pin

MiddleWares:

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

Peripherals:

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

在右边设置相关引脚:

这里写图片描述

时钟设置

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

由于需要配置168MHz系统时钟,只能使用PLL如图所示,(如果Pinout->RCC没有配置外部晶振,此处无法使用 HSE)
这里写图片描述

总线配置

ETH配置

使用的 DP83848CVV phy芯片,其中COL/PHYAD0引脚悬空,phy地址为0x01
这里写图片描述
其他数据根据datasheet进行相关配置
这里写图片描述
###LWIP配置
使能Link回调,后面代码中进行相关配置
这里写图片描述

生成代码

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                     0x0001void ethernetif_set_link(struct netif *netif){  uint32_t regvalue = 0;  /* Read PHY_MISR*/  HAL_ETH_ReadPHYRegister(&heth, PHY_MISR, &regvalue);  /* 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, &regvalue);    /* 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);}
0 0