static uint32_t lastm = 0; extern "C" void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {}; /** Configure the main internal regulator output voltage */ HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1); /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV3; RCC_OscInitStruct.PLL.PLLN = 25; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK) { Error_Handler(); } HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_1); // Вывод системной частоты на MCO, деленной на 4. выв (PA8) } void setup() { Serial.begin(115200); __HAL_RCC_TIM2_CLK_ENABLE(); // Включение тактирования таймера TIM2 //---Включение тактирования--------------------------------------------------------------------------// __HAL_RCC_GPIOA_CLK_ENABLE(); // Включение тактирования порта A (GPIOA) GPIO_InitTypeDef GPIO_InitStruct; // Создание структуры для хранения параметров настройки GPIO //---Настройка PA8 (MCO) как выход-------------------------------------------------------------------// GPIO_InitStruct.Pin = GPIO_PIN_8; // Выбор пина PA8 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // Настройка режима пина как "Альтернативная функция" GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; // Установка скорости пина на скорость 100 мГц GPIO_InitStruct.Alternate = GPIO_AF0_MCO; // Выбор альтернативной функции AF0 для MCO HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // Применение настроек к порту GPIOA //---Инициализация таймера TIM2----------------------------------------------------------------------// TIM2->CR1 = 0; // Остановка таймера TIM2->CCMR1 = 0x00000000; // Сброс настроек каналов TIM2->CCER = 0x00000000; // Сброс управления выходами TIM2->PSC = 99; // Установка предделителя = 1 (PSC = 0) TIM2->ARR = 0xFFFFFFFF; // Максимальное значение счетчика TIM2->EGR |= TIM_EGR_UG; // Обновление регистров TIM2->CR1 |= TIM_CR1_CEN; } void loop() { while (1) { uint32_t curm = micros(); uint32_t curt = TIM2->CNT; uint32_t delta = curm - lastm; if (delta >= 1000000) { TIM2->EGR |= TIM_EGR_UG; Serial.printf("Micros = %u, TIM2 = %u -> diff = %i\n", delta, curt, delta-curt); Serial.flush(); lastm = curm; } } }