10#include "stm32h7xx_hal.h"
12#include <flexptp_options.h>
23 fc_exp = round(log2f(freq)) + 1;
26 if (fc_exp < ETHHW_PTP_PPS_1Hz) {
27 fc_exp = ETHHW_PTP_PPS_1Hz;
31 if (fc_exp > ETHHW_PTP_PPS_16384Hz) {
32 fc_exp = ETHHW_PTP_PPS_16384Hz;
35 sFreq = exp2(fc_exp - 1);
41 ETHHW_SetPTPPPSFreq(ETH, fc_exp);
43#elif defined(PPS_PULSETRAIN)
45 uint32_t freq_Hz = (uint32_t)freq;
49 ETHHW_StopPTPPPSPulseTrain(ETH);
56 MSG(
"Warning! PPS frequency is not totally accurate, "
57 "choose a frequency corresponding to a period "
58 "that is an integer divisor of 1E+09!\n");
62 uint32_t high_ns = period_ns / 2;
65 ETHHW_StartPTPPPSPulseTrain(ETH, high_ns, period_ns);
71#error "No decision was made on how the PPS signal is generated! Please define either PPS_SIMPLE or PPL_PULSETRAIN!"
83static int CB_pps(
const CliToken_Type *ppArgs, uint8_t argc) {
85 double freq = atof(ppArgs[0]);
90 MSG(
"PPS frequency: %u Hz\n",
sFreq);
92 MSG(
"PPS output is turned off.\n");
98static void ptphw_register_cli_commands() {
99 CLI_REG_CMD(
"ptp pps {freq} \t\t\tSet or query PPS signal frequency [Hz]", 2, 0, CB_pps);
105 MSG(
"Turning PTP on!");
108 ETHHW_EnablePTPTimeStamping(ETH);
110 vTaskDelay(pdMS_TO_TICKS(10));
113 ETHHW_InitPTPTime(ETH, 0, 0);
116 ETHHW_EnablePTPFineCorr(ETH,
true);
119 ETHHW_SetPTPAddend(ETH, addend);
122 ETHHW_SetPTPSubsecondIncrement(ETH, increment);
127 __HAL_RCC_GPIOG_CLK_ENABLE();
130 GPIO_InitTypeDef GPIO_InitStructure;
131 GPIO_InitStructure.Pin = GPIO_PIN_8;
132 GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
133 GPIO_InitStructure.Alternate = GPIO_AF11_ETH;
134 GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
135 GPIO_InitStructure.Pull = GPIO_NOPULL;
136 HAL_GPIO_Init(GPIOG, &GPIO_InitStructure);
140 ptphw_register_cli_commands();
145 pTime->
sec = ETH->MACSTSR;
146 pTime->
nanosec = ETH->MACSTNR & ETH_MACSTNR_TSSS;
#define CLI_REG_CMD(cmd_hintline, n_cmd, n_min_arg, cb)
void ptphw_set_pps_freq(double freq)
ETH_HandleTypeDef EthHandle
void ptphw_gettime(TimestampU *pTime)
void ptphw_init(uint32_t increment, uint32_t addend)
uint32_t nanosec
nanoseconds
#define NANO_PREFIX
Integer nano prefix.