当前位置: 首页 > news >正文

STM32F407实现1588v2(ptpd)

硬件:

STM32F407ZGT6开发板

软件:

VSCode

arm-none-eabi-gcc

openOCD

st-link

在github搜到一个在NUCLEO-F429ZI开发板上移植ptpd的example,因为和F407差别很小,所以就打算用这个demo移植到手头的开发板上。因为目前只需要slave,所以只调试了slave。据介绍,master好像原作者没有充分测试过。

源项目链接:

https://github.com/mpthompson/stm32_ptpd

1.修改ETH引脚

projects/nucleo_ptpd_slave/src/hal_system.c中 HAL_ETH_MspInit 函数里有ETH引脚初始化:

 根据自己手头板子调整引脚初始化,其实可以先用STM32CubeMX生成一个测试工程,测试一下板子硬件是好的再移植是最正确的流程。关于ETH硬件测试工程可以参考我之前的博文:

(GCC)从零开始的ETH开发--STM32F407ZGTX_我我我只会printf的博客-CSDN博客

这里记得在初始化完成后,使用复位引脚复位PHY。还有原工程是F429,现在改成F407需要修改头文件hal_system.h中:

还有时钟类型需要根据实际修改,一般都是外部晶振:

 

2.修改makefile

F429和F407启动文件不同,所以需要修改slave工程包含的makefile:

 其次删除newlib_stubs.c文件,否则编译后的固件没办法使用。

还有修改宏定义:

还有注意修改ld脚本文件,这里我使用的是自己新建的ld文件:

其他修改可有可无,根据自己情况修改。makefile文件如下:

# Makefile for PTPD slave for NUCLEO-F429ZI.# Project name
NAME = nucleo_ptpd_slave
CPU = -mcpu=cortex-m4
# fpu
FPU = -mfpu=fpv5-d16# float-abi
FLOAT-ABI = -mfloat-abi=hard# mcu
MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)
# Outputs
BINMAP = $(NAME).map
BINELF = $(NAME).elf
BINHEX = $(NAME).hex
BINBIN = $(NAME).bin
BINCRC = $(NAME).crc
BINMAP = $(NAME).map# GNU ARM Embedded Toolchain
PREFIX = arm-none-eabi-
ifdef GCC_PATH
CC = $(GCC_PATH)/$(PREFIX)gcc
CXX = $(GCC_PATH)/$(PREFIX)g++
LD = $(GCC_PATH)/$(PREFIX)ld
AR = $(GCC_PATH)/$(PREFIX)ar
AS = $(GCC_PATH)/$(PREFIX)as
NM = $(GCC_PATH)/$(PREFIX)nm
SIZE = $(GCC_PATH)/$(PREFIX)size
A2L = $(GCC_PATH)/$(PREFIX)addr2line
OBJCOPY = $(GCC_PATH)/$(PREFIX)objcopy
OBJDUMP = $(GCC_PATH)/$(PREFIX)objdump
else
CC = $(PREFIX)gcc
CXX = $(PREFIX)g++
LD = $(PREFIX)ld
AR = $(PREFIX)ar
AS = $(PREFIX)as
NM = $(PREFIX)nm
SIZE = $(PREFIX)size
A2L = $(PREFIX)addr2line
OBJCOPY = $(PREFIX)objcopy
OBJDUMP = $(PREFIX)objdump
endif# Startup
# SRCS = ../shared_stm32/startup/gcc/startup_stm32f429xx.s
SRCS = ../shared_stm32/startup/gcc/startup_stm32f407xx.s# Application
SRCS += ./src/main.c
SRCS += ./src/hal_system.c# Application Shared
SRCS += ../shared/event.c
SRCS += ../shared/outputf.c
SRCS += ../shared/peek.c
SRCS += ../shared/reboot.c
SRCS += ../shared/shell.c
SRCS += ../shared/syslog.c
SRCS += ../shared/telnet.c
SRCS += ../shared/uptime.c# Application Shared Nucleo
SRCS += ../shared_nucleo/buttons.c
SRCS += ../shared_nucleo/leds.c# Application Shared STM32
SRCS += ../shared_stm32/blink.c
SRCS += ../shared_stm32/clocks.c
SRCS += ../shared_stm32/console.c
SRCS += ../shared_stm32/delay.c
SRCS += ../shared_stm32/ethptp.c
SRCS += ../shared_stm32/extint.c
SRCS += ../shared_stm32/hardtime.c
SRCS += ../shared_stm32/network.c
SRCS += ../shared_stm32/ntime.c
SRCS += ../shared_stm32/random.c
SRCS += ../shared_stm32/systime.c
SRCS += ../shared_stm32/system_stm32f4xx.c
SRCS += ../shared_stm32/tick.c
SRCS += ../shared_stm32/watchdog.c# Utilities
# SRCS += ../shared/newlib_stubs.c# Drivers
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_adc.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_crc.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_dac.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_dma.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_dma2d.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_exti.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fsmc.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_gpio.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_i2c.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_lptim.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_pwr.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_rcc.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_rng.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_rtc.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_sdmmc.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_spi.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_tim.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usart.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.c
SRCS += ../../libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_utils.c# NT Shell
SRCS += ../../libraries/ntshell-v0.3.1/lib/core/ntlibc.c
SRCS += ../../libraries/ntshell-v0.3.1/lib/util/ntopt.c
SRCS += ../../libraries/ntshell-v0.3.1/lib/core/ntshell.c
SRCS += ../../libraries/ntshell-v0.3.1/lib/util/ntstdio.c
SRCS += ../../libraries/ntshell-v0.3.1/lib/core/text_editor.c
SRCS += ../../libraries/ntshell-v0.3.1/lib/core/text_history.c
SRCS += ../../libraries/ntshell-v0.3.1/lib/core/vtrecv.c
SRCS += ../../libraries/ntshell-v0.3.1/lib/core/vtsend.c# PTPD
SRCS += ../shared/ptpd/src/ptpd_arith.c
SRCS += ../shared/ptpd/src/ptpd_bmc.c
SRCS += ../shared/ptpd/src/ptpd_main.c
SRCS += ../shared/ptpd/src/ptpd_msg.c
SRCS += ../shared/ptpd/src/ptpd_net.c
SRCS += ../shared/ptpd/src/ptpd_protocol.c
SRCS += ../shared/ptpd/src/ptpd_servo.c
SRCS += ../shared/ptpd/src/ptpd_time.c
SRCS += ../shared/ptpd/src/ptpd_timer.c# LWIP API
SRCS += ../../libraries/LWIP-2.1.2/src/api/api_lib.c
SRCS += ../../libraries/LWIP-2.1.2/src/api/api_msg.c
SRCS += ../../libraries/LWIP-2.1.2/src/api/err.c
SRCS += ../../libraries/LWIP-2.1.2/src/api/netbuf.c
SRCS += ../../libraries/LWIP-2.1.2/src/api/netdb.c
SRCS += ../../libraries/LWIP-2.1.2/src/api/netifapi.c
SRCS += ../../libraries/LWIP-2.1.2/src/api/sockets.c
SRCS += ../../libraries/LWIP-2.1.2/src/api/tcpip.c# LWIP Core
SRCS += ../../libraries/LWIP-2.1.2/src/core/altcp.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/altcp_alloc.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/altcp_tcp.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/def.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/dns.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/inet_chksum.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/init.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/ip.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/mem.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/memp.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/netif.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/pbuf.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/raw.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/stats.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/sys.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/tcp.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/tcp_in.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/tcp_out.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/timeouts.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/udp.c# LWIP Core IPv4
SRCS += ../../libraries/LWIP-2.1.2/src/core/ipv4/autoip.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/ipv4/dhcp.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/ipv4/etharp.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/ipv4/icmp.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/ipv4/igmp.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/ipv4/ip4.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/ipv4/ip4_addr.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/ipv4/ip4_frag.c# LWIP Core IPv6
SRCS += ../../libraries/LWIP-2.1.2/src/core/ipv6/dhcp6.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/ipv6/ethip6.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/ipv6/icmp6.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/ipv6/inet6.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/ipv6/ip6.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/ipv6/ip6_addr.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/ipv6/ip6_frag.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/ipv6/mld6.c
SRCS += ../../libraries/LWIP-2.1.2/src/core/ipv6/nd6.c# LWIP Netif
SRCS += ../../libraries/LWIP-2.1.2/src/netif/ethernet.c
SRCS += ../../libraries/LWIP-2.1.2/src/netif/lowpan6.c# LWIP Port
SRCS += ../shared_stm32/lwip_port/ethernetif.c
SRCS += ../shared_stm32/lwip_port/sys_arch.c# LWIP Apps
SRCS += ../../libraries/LWIP-2.1.2/src/apps/mdns/mdns.c# RTOS Config
SRCS += ./src/RTX_Config.c# RTOS Kernel
SRCS += ../../libraries/CMSIS/5.4.0/CMSIS/RTOS2/RTX/Source/rtx_delay.c
SRCS += ../../libraries/CMSIS/5.4.0/CMSIS/RTOS2/RTX/Source/rtx_evflags.c
SRCS += ../../libraries/CMSIS/5.4.0/CMSIS/RTOS2/RTX/Source/rtx_evr.c
SRCS += ../../libraries/CMSIS/5.4.0/CMSIS/RTOS2/RTX/Source/rtx_kernel.c
SRCS += ../../libraries/CMSIS/5.4.0/CMSIS/RTOS2/RTX/Source/rtx_lib.c
SRCS += ../../libraries/CMSIS/5.4.0/CMSIS/RTOS2/RTX/Source/rtx_memory.c
SRCS += ../../libraries/CMSIS/5.4.0/CMSIS/RTOS2/RTX/Source/rtx_mempool.c
SRCS += ../../libraries/CMSIS/5.4.0/CMSIS/RTOS2/RTX/Source/rtx_msgqueue.c
SRCS += ../../libraries/CMSIS/5.4.0/CMSIS/RTOS2/RTX/Source/rtx_mutex.c
SRCS += ../../libraries/CMSIS/5.4.0/CMSIS/RTOS2/RTX/Source/rtx_semaphore.c
SRCS += ../../libraries/CMSIS/5.4.0/CMSIS/RTOS2/RTX/Source/rtx_system.c
SRCS += ../../libraries/CMSIS/5.4.0/CMSIS/RTOS2/RTX/Source/rtx_thread.c
SRCS += ../../libraries/CMSIS/5.4.0/CMSIS/RTOS2/RTX/Source/rtx_timer.c
SRCS += ../../libraries/CMSIS/5.4.0/CMSIS/RTOS2/Source/os_systick.c# RTOS IRQ
SRCS += ../../libraries/CMSIS/5.4.0/CMSIS/RTOS2/RTX/Source/GCC/irq_cm4f.S# List of directories that contain source code
SRC_PATHS = $(sort $(dir $(SRCS)))# Specify the output path
OUTPATH = build# Create the object list from the sources
OBJS = $(subst .s,.o,$(subst .S,.o,$(subst .c,.o,$(subst .cpp,.o,$(addprefix $(OUTPATH)/, $(notdir $(SRCS)))))))#$(info SRCS=$(SRCS))
#$(info OBJS=$(OBJS))
#$(info SRC_PATHS=$(SRC_PATHS))# Where to find source files.
vpath %.cpp $(SRC_PATHS)
vpath %.c $(SRC_PATHS)
vpath %.s $(SRC_PATHS)
vpath %.S $(SRC_PATHS)# Includes
INCLUDES = -I.
INCLUDES += -I./src
INCLUDES += -I../shared
INCLUDES += -I../shared/ptpd/src
INCLUDES += -I../shared_stm32
INCLUDES += -I../shared_stm32/lwip_port
INCLUDES += -I../shared_nucleo
INCLUDES += -I../../libraries/CMSIS/5.4.0/CMSIS/Core/Include
INCLUDES += -I../../libraries/CMSIS/5.4.0/CMSIS/RTOS2/Include
INCLUDES += -I../../libraries/CMSIS/5.4.0/CMSIS/RTOS2/RTX/Include
INCLUDES += -I../../libraries/CMSIS/5.4.0/CMSIS/RTOS2/RTX/Source
INCLUDES += -I../../libraries/CMSIS/5.4.0_ST/Device/ST/STM32F4xx/Include
INCLUDES += -I../../libraries/STM32F4xx_HAL_Driver/Inc
INCLUDES += -I../../libraries/LWIP-2.1.2/src
INCLUDES += -I../../libraries/LWIP-2.1.2/src/include
INCLUDES += -I../../libraries/ntshell-v0.3.1/lib/core
INCLUDES += -I../../libraries/ntshell-v0.3.1/lib/utilOPTFLAGS = -O0MCFLAGS = -mcpu=cortex-m4
MCFLAGS += -mthumb
MCFLAGS += -mlittle-endian
MCFLAGS += -mfpu=fpv4-sp-d16
MCFLAGS += -mfloat-abi=hard
#MCFLAGS += -mapcs-frame
MCFLAGS += -MD
MCFLAGS += -Wall#FFLAGS = -fno-common
FFLAGS += -ffunction-sections
FFLAGS += -fdata-sections
#FFLAGS += -ffreestanding
#FFLAGS += -fno-builtin#WFLAGS = -Wno-strict-aliasingDEFINES = -DSTM32F407xx
DEFINES += -DNDEBUG
# DEFINES += -DUSE_STM32F4XX_NUCLEO_144
DEFINES += -DUSE_STM32F4_DISCOVERY
DEFINES += -DUSE_HAL_DRIVER
DEFINES += -DUSE_FULL_LL_DRIVER
DEFINES += -D__CMSIS_RTOS
DEFINES += -DVECT_TAB_OFFSET=0x0
DEFINES += -DEVR_RTX_DISABLELIBS = -lc -lm -lnosys
LIBDIR = 
# CFLAGS
CFLAGS = -c -g -gdwarf-2 $(OPTFLAGS) $(MCFLAGS) $(FFLAGS) $(WFLAGS) $(DEFINES) $(INCLUDES)
CXXFLAGS = -c $(OPTFLAGS) $(MCFLAGS) $(FFLAGS) $(WFLAGS) $(DEFINES) $(INCLUDES) -std=c++11# LINKER FLAGS
LDSCRIPT = nucleo_stm32f407.ld
LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(OUTPATH)/$(BINMAP),--cref -Wl,--gc-sections
###
# Build Rules
.PHONY: all release debug cleanall: $(OUTPATH) releasedebug: CFLAGS += -DDEBUG -g -g3 -gdwarf-2 -gdwarf-3
debug: CXXFLAGS += -DDEBUG -g -g3 -gdwarf-2 -gdwarf-3
debug: LDFLAGS += -g -g3 -gdwarf-2 -gdwarf-3
debug: release# release: $(OUTPATH)/$(BINHEX) $(OUTPATH)/$(BINBIN) $(OUTPATH)/$(BINCRC)release: $(OUTPATH)/$(BINHEX) $(OUTPATH)/$(BINBIN)# $(OUTPATH):
# 	mkdir -p $(OUTPATH)$(OUTPATH):mkdir $(OUTPATH)$(OUTPATH)/$(BINHEX): $(OUTPATH)/$(BINELF)$(OBJCOPY) -O ihex $< $@$(OUTPATH)/$(BINBIN): $(OUTPATH)/$(BINELF)$(OBJCOPY) -O binary $< $@#$(OUTPATH)/$(BINCRC): $(OUTPATH)/$(BINBIN)
#	cksum < $< > $@##
# C linking is used. If C++ linker is required, change:
#   $(CC) $(OBJS) $(LDFLAGS) -o $@
# to:
#   $(CXX) $(OBJS) $(LDFLAGS) -o $@
#
$(OUTPATH)/$(BINELF): $(OBJS)$(CC) $(OBJS) $(LDFLAGS) -o $@$(SIZE) $(OUTPATH)/$(BINELF)$(OUTPATH)/%.o : %.cpp$(CXX) $(CXXFLAGS) $< -o $@$(OUTPATH)/%.o : %.c$(CC) $(CFLAGS) $< -o $@$(OUTPATH)/%.o : %.s$(CC) $(CFLAGS) $< -o $@$(OUTPATH)/%.o : %.S$(CC) $(CFLAGS) $< -o $@clean:rm ./$(OUTPATH)
flash: $(OUTPATH)/$(BINHEX) st-flash --reset --format ihex write $(OUTPATH)/$(BINHEX)

ld文件:

ENTRY(Reset_Handler)/* Highest address of the user mode stack */
_estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 192K RAM on AHB bus*//* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0x200;      /* required amount of heap  */
_Min_Stack_Size = 0x800; /* required amount of stack *//* Specify the memory areas */
MEMORY
{FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 1024KRAM (rwx)       : ORIGIN = 0x20000000, LENGTH = 128KCCM (rwx)       : ORIGIN = 0x10000000, LENGTH = 64K
}SECTIONS
{.isr_vector :{. = ALIGN(4);_sflash = .;        /* create a global symbol at flash start */KEEP(*(.isr_vector)). = ALIGN(4);} >FLASH.text :{. = ALIGN(4);*(.text)           /* .text sections (code) */*(.text*)          /* .text* sections (code) */*(.rodata)         /* .rodata sections (constants, strings, etc.) */*(.rodata*)        /* .rodata* sections (constants, strings, etc.) */*(.glue_7)         /* glue arm to thumb code */*(.glue_7t)        /* glue thumb to arm code */*(.eh_frame)KEEP (*(.init))KEEP (*(.fini)). = ALIGN(4);_etext = .;        /* define a global symbols at end of code */_exit = .;} >FLASH.ARM.extab   : {. = ALIGN(4);*(.ARM.extab* .gnu.linkonce.armextab.*). = ALIGN(4);} >FLASH.ARM : {. = ALIGN(4);__exidx_start = .;*(.ARM.exidx*)__exidx_end = .;. = ALIGN(4);} >FLASH.preinit_array     :{PROVIDE_HIDDEN (__preinit_array_start = .);KEEP (*(.preinit_array*))PROVIDE_HIDDEN (__preinit_array_end = .);} >FLASH.init_array :{PROVIDE_HIDDEN (__init_array_start = .);KEEP (*(SORT(.init_array.*)))KEEP (*(.init_array*))PROVIDE_HIDDEN (__init_array_end = .);} >FLASH.fini_array :{PROVIDE_HIDDEN (__fini_array_start = .);KEEP (*(.fini_array*))KEEP (*(SORT(.fini_array.*)))PROVIDE_HIDDEN (__fini_array_end = .);} >FLASH/* used by the startup to initialize data */_sidata = .;/* Initialized data sections goes into RAM, load LMA copy after code */.data : AT ( _sidata ){. = ALIGN(4);_sdata = .;        /* create a global symbol at data start */*(.data)           /* .data sections */*(.data*)          /* .data* sections */. = ALIGN(4);_edata = .;        /* define a global symbol at data end */} >RAM/* Uninitialized data section */. = ALIGN(4);.bss :{/* This is used by the startup in order to initialize the .bss secion */_sbss = .;         /* define a global symbol at bss start */__bss_start__ = _sbss;*(.bss)*(.bss*)*(COMMON). = ALIGN(4);_ebss = .;         /* define a global symbol at bss end */__bss_end__ = _ebss;} >RAM/* User_heap_stack section, used to check that there is enough RAM left */._user_heap_stack :{. = ALIGN(8);PROVIDE ( end = . );PROVIDE ( _end = . );. = . + _Min_Heap_Size;. = . + _Min_Stack_Size;. = ALIGN(8);} >RAM/* Remove information from the compiler libraries *//DISCARD/ :{libc.a ( * )libm.a ( * )libgcc.a ( * )}.ARM.attributes 0 : { *(.ARM.attributes) }
}

注意我使用的gcc版本是:

gcc version 10.3.1 20210621 (release) (GNU Arm Embedded Toolchain 10.3-2021.08)

如果你是用同样的版本,可以直接使用上述makefile,否则可能出现编译失败错误。

3.修改串口

串口配置在console.c文件中,因为我使用的串口和 USE_STM32F4_DISCOVERY 这个开发板串口相同,所以我在上文宏定义的地方直接使用了USE_STM32F4_DISCOVERY宏定义,如果你也按上文使用了USE_STM32F4_DISCOVERY宏定义,但是串口又不相同,请修改:

以及中断名称:

GCC下重定向printf请添加:

int _write (int fd, char *pBuffer, int size)
{for (int i = 0; i < size; i++){if(pBuffer[i] == '\n')console_putc('\r');console_putc((int)pBuffer[i]);}return size;
}

4.修改报文

注意,此处修改只是我为了和电脑运行的ptp4l之间进行测试,如果不修改报文,ptp4l会认为报文异常。

还有slave和master之间稳定的限幅可以设置的大一点:

5.代码编译

至此所有修改完成,在slave工程目录下make即可:

6.代码运行

ubuntu下使用

sudo ptp4l -E -4 -S -i ens40 -m 

-i后跟网卡名称 

 

 

 

 

 

 

 

相关文章:

STM32F407实现1588v2(ptpd)

硬件&#xff1a; STM32F407ZGT6开发板 软件&#xff1a; VSCode arm-none-eabi-gcc openOCD st-link 在github搜到一个在NUCLEO-F429ZI开发板上移植ptpd的example&#xff0c;因为和F407差别很小&#xff0c;所以就打算用这个demo移植到手头的开发板上。因为目前只需要…...

架构师如何找到自己的商业模式

作为一个架构师&#xff0c;必须要在有限的资源下最大化架构活动所带来的商业价值。对于任何一个架构活动而言&#xff0c;架构师的可用资源&#xff0c;包括商业成本、研发成本、时间成本、迁移成本等等&#xff0c;都是非常有限的。但架构活动就是要在这些限制条件之下&#…...

SQLServer2022安装(Windows),已验证

一、SQLServer2022下载 1、官网下载地址 SQL Server 下载 | Microsoft 2、下载安装包 2.1、选择Developer版本&#xff0c;立即下载。 2.2、打开下载文件夹&#xff0c;双击运行SQL2022-SSEI-Dev.exe 尝试运行SQL2022-SSEI-Dev.exe&#xff0c;会收到以下信息&#xff1a;“…...

facenet, dlib人脸识别,人体检测,云数据库mysql,QQ邮箱,手机验证码,语音播报

目录 部分代码展示&#xff1a; 录入部分 识别部分​编辑 活体检测部分​编辑 同步到云数据库MySQL 其他操作 部分图片展示&#xff1a; 完整代码加ui链接&#xff1a; 涉及到的一些知识点的文章 部分代码展示&#xff1a; 录入部分 识别部分 活体检测部分 同步到云数…...

Spring Boot 面试题——定时任务

目录 1.什么是 cron 表达式&#xff1f;如何使用&#xff1f;2.Scheduled 注解有什么作用&#xff1f;3.介绍一下 spring-boot-starter-quartz。4.在 Spring Boot 中如何实现定时任务&#xff1f;4.1.使用 Schedule 注解4.2.Quartz 框架 1.什么是 cron 表达式&#xff1f;如何使…...

总建面64万平,配3所幼儿园+54班九年制学校,坪山江岭竹元规划

近日&#xff0c;坪山区城市更新和土地整备局发布&#xff0c;关于《坪山区马峦街道江岭竹元片区城市更新单元规划》已通过深圳市城市规划委员会法定图则委员会审批。现予以公告。 项目位于坪山区马峦街道&#xff0c;南邻南坪快速路&#xff0c;北邻比亚迪路&#xff0c;东西两…...

python3 爬虫相关学习7:使用 BeautifulSoup下载网页图片到本地文件夹

目录 1 一个爬图片pic的代码的例子 1.1 学习的原文章 1.2 原始代码的问题总结 问题1 问题2 问题3 其他问题 1.3 原始代码 2 直接在cmd里 python运行报错 和 处理 2.1 运行报错 2.2 报错原因&#xff1a; 没有提前安装这个bs4 模块 2.3 如何提前知道我的python环境…...

windows平台python脚本执行环境搭建笔记

1.python脚本环境下载 这里是原始发布源&#xff1a; https://www.python.org/downloads/release/python-3114/https://www.python.org/downloads/release/python-3114/安装时记得添加进系统path&#xff0c;这样你可以随时调用python环境。 2.扩展模块的安装 step1.找到py…...

MyBatis的动态SQL之OGNL(Object-Graph Navigation Language)表达式以及各种标签的用法

MyBatis的动态SQL 1、if标签的用法2、choose标签的用法3、where标签4、set标签5、trim的用法6、foreach标签7、bind标签 使用过JDBC或者是其他的ORM框架的开发者都知道&#xff0c;在很多操作中都需要去根据具体的条件进行SQL语句的拼接&#xff0c;并且在有些时候一些标点符号…...

基于Java+Springboot+Vue的二次元商城网站设计与实现

博主介绍&#xff1a;✌擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案…...

MyBatis操作数据库实现

说明&#xff1a;MyBatis是作用于三层架构开发&#xff0c;数据访问层&#xff08;Data Access Object&#xff09;的框架&#xff0c;用于访问数据库&#xff0c;对数据进行操作。 一、环境搭建 首先&#xff0c;创建一个SpringBoot模块&#xff0c;然后把MyBatis的环境搭建…...

Git GitLab 使用及规范

Git 基本操作 Git安装配置及基本使用 从官网下载安装包&#xff0c;手动完成安装。打开Git Bash命令行工具&#xff0c;执行命令ssh-keygen -t rsa -C Email-Addresss生成一个密钥对。登录到GitLab&#xff0c;点击右上角你的用户头像&#xff0c;点击Edit Profile settings&…...

【SpringCloud——Sentinel】

一、什么是雪崩&#xff1f; 微服务调用链路中的某个服务发生故障&#xff0c;引起整个链路中的所有微服务都不可用&#xff0c;这就是雪崩。 二、解决雪崩问题的常见措施 1、超时处理 设定超时时间&#xff0c;请求超过一定时间没有响应就返回错误信息&#xff0c;不会无休…...

面试专题:计算机网络常见面试点总结

socket、tcp、udp、http 的认识及区别 socket、tcp、udp、http 的认识及区别​ 一、先来一个讲TCP、UDP和HTTP关系的 1、TCP/IP是个协议组&#xff0c;可分为三个层次&#xff1a;网络层、传输层和应用层。 在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。 在传…...

PageHelper失效问题

问题出现记录&#xff1a; 修改代码后&#xff0c;出现分页失效问题&#xff0c;原本的代码再设置了 PageHelper.startPage(pageNum, pageSize);后只有一个mysql查询&#xff0c;我在原本的业务查询前&#xff0c;新增了其他的Mysql查询&#xff0c;导致原需要分页的查询失效 …...

Linux常用命令——grep命令

在线Linux命令查询工具 grep 强大的文本搜索工具 补充说明 grep&#xff08;global search regular expression(RE) and print out the line&#xff0c;全面搜索正则表达式并把行打印出来&#xff09;是一种强大的文本搜索工具&#xff0c;它能使用正则表达式搜索文本&…...

学校热水供应系统方案

学校热水供应系统是现代化校园建设的重要组成部分。一套高效、可靠、安全、环保的热水供应系统&#xff0c;不仅能够满足学生、教职工的日常生活需求&#xff0c;也能提高学校形象和竞争力。 在设计学校热水供应系统方案时&#xff0c;需要考虑以下几个方面&#xff1a; 一、热…...

chatgpt赋能python:Python怎么写绝对值

Python怎么写绝对值 在Python编程语言中&#xff0c;有很多常用函数。其中包括求绝对值的函数。在这篇文章中&#xff0c;我们将介绍如何在Python中使用绝对值函数&#xff0c;并提供一些示例。 什么是绝对值函数&#xff1f; 绝对值函数是一个数学中常用的函数&#xff0c;…...

研发工程师玩转Kubernetes——Node亲和性requiredDuringSchedulingIgnoredDuringExecution几种边界实验

在《研发工程师玩转Kubernetes——使用Node特性定向调度Pod》中&#xff0c;我们提到requiredDuringSchedulingIgnoredDuringExecution只有在规则被满足的时候才能执行调度。本节我们将测试几种边界情况&#xff0c;看看Kubernetes的行为。 没有满足的条件 假设我们测试的Nod…...

OpenCV中的图像处理3.9(六)轮廓线特征与属性

目录 3.9 OpenCV中的轮廓线3.9.1 轮廓线&#xff1a;入门目标什么是轮廓线&#xff1f;如何绘制轮廓线&#xff1f;轮廓线逼近法 3.9.2 轮廓线的特征1. 矩2. 轮廓线面积3. 轮廓线周长4. 轮廓逼近5. 凸面体6. 检查凸性7. 边界矩形8. 最小包围圈9. 拟合椭圆10. 拟合直线 3.9.3 轮…...

burpsuite+xray实现联动测试(手动分析和自动化测试同时进行)

目的&#xff1a;安全测试过程中手动分析测试与xray自动化扫描测试结合&#xff0c;这样可以从多层保障安全测试的分析&#xff0c;针对平台业务接口量大的安全测试是十分有用的&#xff0c;可以实现双向测试同时开始。 xray简介 xray 是一款功能强大的安全评估工具&#xff…...

2023年专业连锁行业研究报告

第一章 行业概况 专业连锁行业是指以连锁经营模式运营的公司&#xff0c;其主要业务涵盖零售、餐饮、酒店、医疗、教育等领域。这些公司通过规模化、标准化的经营模式和供应链管理&#xff0c;提供专业化、高质量的产品和服务。专业连锁行业在全球范围内蓬勃发展&#xff0c;并…...

Mysql数据库(六):基本的SELECT语句

基本的SELECT语句 前言一、SELECT...二、SELECT ... FROM三、列的别名四、去除重复行五、空值参与运算六、着重号七、查询常数八、显示表结构九、过滤数据 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识&#xff0c;有兴趣的小伙伴可以关注博主&#…...

在CentOS7环境中,实现使用openresty配置文件,达到jwt指定用户userid不能访问的效果

#在CentOS7环境中&#xff0c;实现使用openresty配置文件&#xff0c;达到jwt指定用户userid不能访问的效果。 首先&#xff0c;你需要安装 OpenResty 和 JWT 组件&#xff1a; 安装 OpenResty 参考 OpenResty 的官方安装文档&#xff0c;在终端执行如下命令&#xff1a; $…...

SpringBoot 源码分析初始化应用上下文(1)-createApplicationContext

前言&#xff1a;springBoot的版本是 2.2.4.RELEASE 一、入口 /*** Run the Spring application, creating and refreshing a new* {link ApplicationContext}.* param args the application arguments (usually passed from a Java main method)* return a running {link A…...

STM32队列

目录 什么是队列&#xff1f; 队列特点 1. 数据入队出队方式 2. 数据传递方式 3. 多任务访问 4. 出队、入队阻塞 队列相关 API 函数 1. 创建队列 参数&#xff1a; 2. 写队列 参数&#xff1a; 返回值&#xff1a; 3. 读队列 参数&#xff1a; 返回值&#xf…...

探索Beyond Compare:让文件比较和管理变得简单高效

在这个信息爆炸时代&#xff0c;我们的日常生活和工作中需要处理大量的数据和文档。在这个过程中&#xff0c;有时候我们会面临找出不同文件之间的差异、合并重复内容等需求。那么&#xff0c;有没有一款软件可以帮助我们轻松地完成这些任务呢&#xff1f;答案当然是肯定的&…...

动态网站Servelt基础

文章目录 一、Servlet基础&#xff08;一&#xff09;Servlet概述1、Servlet是什么2、Servlet容器3、Servlet应用程序的体系结构 &#xff08;二&#xff09;Servlet的特点1、功能强大2、可移植3、性能高效4、安全性高5、可扩展 &#xff08;三&#xff09;Servlet接口1、Servl…...

Docker 网络

Docker 网络实现原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c;Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c;同时Docker网桥是每个容器的默认网关。因为在同一宿主机…...

Tomcat的优化

Tomcat的优化 一、Tomcat 优化Tomcat 配置文件参数优化 二、系统内核优化三、Tomcat 配置 JVM 参数&#xff1a;参数含义 一、Tomcat 优化 Tomcat默认安装下的缺省配置并不适合生产环境&#xff0c;它可能会频繁出现假死现象需要重启&#xff0c;只有通过不断压测优化才能让它…...

win7 wordpress/企业网站排名优化

一&#xff1a;函数 函数与过程的最大不同就是&#xff0c;函数有返回值。适用于需要返回结果的场景。 二&#xff1a;创建函数 CREATE [OR REPLACE] FUNCTION function_name [(parameter_name [IN | OUT | IN OUT] type [, ...])] RETURN return_datatype {IS | AS} 变量声…...

有限公司网站建设 互成网络地址 四川/友链查询站长工具

有时候为了项目需求需要对CPU性能做一个压力测试&#xff0c;这里提供一种方法。通过对圆周率位数进行计算进而确定CPU性能&#xff0c;根据定义预计执行时间&#xff0c;具体操作如下:time echo "scale1000; 4*a(1)" | bc -l -q通过该命令运行&#xff0c;如果3、4分…...

做B2C独立网站的话需要做海外仓吗/十大免费软文推广平台

电脑用久了&#xff0c;C盘难免会积累很多无用的文件&#xff0c;致使C盘飘红。老毛桃相信遇到这问题的用户数不胜数&#xff0c;但他们几乎浑身解数也是拿它没办法的。针对这个问题&#xff0c;我们有什么办法呢&#xff1f;那么今天“如何科学清理C盘防止飘红&#xff1f;”就…...

网站建设 教程/百度关键词怎么优化

Arduino开发环境搭建 获取Arduino IDE开发工具 下载地址 &#xff1a;http://arduino.cc/en/Main/Software 可以下载release 版、Beta版和前期版本 Arduino的开发性&#xff0c;支持源码下载 支持的平台有 Windows、MAC OS X、Linux Windows 平台上面 Arduino IDE下载后为zip包…...

广告网站建设网站排名优化/品牌营销是什么

在网页布局的学习中&#xff0c;我们经常会遇到弹性&#xff08;Flex&#xff09;布局&#xff0c;那么弹性&#xff08;Flex&#xff09;布局究竟是什么样子的呢&#xff1f;相信你学完了本篇文章就会明白Flex&#xff08;弹性&#xff09;布局的真正的意思了。 什么是Flexbo…...

建设部房地产网站/市场推广方案和思路

一、map函数 1、作用&#xff1a;它接收一个函数 f 和一个 list&#xff0c;并通过把函数 f 依次作用在 list 的每个元素上&#xff0c;得到一个新的 list 并返回。 2、实例 def f(x):return x*x a list( map (f, [1, 2, 3, 4, 5, 6, 7, 8, 9])) print (a)#[1, 4, 9, 16, 25, …...