Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
#define LEDn 4
#define LED1_PIN GPIO_Pin_12
#define LED1_GPIO_PORT GPIOD
#define LED1_GPIO_CLK RCC_AHB1Periph_GPIOD
#define LED2_PIN GPIO_Pin_13
#define LED2_GPIO_PORT GPIOD
#define LED2_GPIO_CLK RCC_AHB1Periph_GPIOD
#define LED3_PIN GPIO_Pin_14
#define LED3_GPIO_PORT GPIOD
#define LED3_GPIO_CLK RCC_AHB1Periph_GPIOD
#define LED4_PIN GPIO_Pin_15
#define LED4_GPIO_PORT GPIOD
#define LED4_GPIO_CLK RCC_AHB1Periph_GPIOD
/* Функция калибрует RC-генератор. Наш опорный источник точного времени -
* сигнал SOF, Start Of Frame (один бит SE0), повторяющийся каждую милисекунду
* сразу после состояния USB RESET. Мы сначала делаем двоичный поиск величины
* OSCCAL, и затем оптимизируем эту величину поиском соседних значений.
* Этот алгоритм может также использоваться для калибровки RC-генератора напрямую
* до 12 MHz (не вовлекается ФАПЧ, таким образом эту технику можно использовать
* почти на ВСЕХ AVR), но это слишком вне спецификации величины OSCCAL и необходимой
* точности для тактов на 12 МГц! Используйте RC-генератор, калиброванный на 12 МГц
* только для экспериментов!
*/
/* Имя: osccal.h
* Автор: Christian Starkjohann
* Перевод: microsin.ru
* Дата создания: 2008-04-10
* Табуляция: 4
* Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH
* Лицензия: GNU GPL v2 (см. License.txt) или проприетарная (CommercialLicense.txt)
* Ревизия: $Id: osccal.h 553 2008-04-17 19:00:20Z cs $
*/
/*
Основное описание:
Этот модуль содержит функцию, которая калибрует внутренний RC-генератор AVR,
чтобы CPU работал на частоте F_CPU (F_CPU является макропределением, которое
должно быть задано при компиляции модуля. Лучший выбор - передача этого макро
через командную строку компилятора). Эталон времени - частота фрейма USB
1 кГц, доступная немедленно после состояния USB RESET. Отсчет времени производится
путем подсчета циклов CPU, при этом все прерывания должны быть запрещены, пока работает
калибровочная функция. Для измерений времени низкого уровня вызывается функция
usbMeasureFrameLength(). Эта функция должна быть разрешена в usbconfig.h
путем задания USB_CFG_HAVE_MEASURE_FRAME_LENGTH в 1.
Используемый алгоритм:
calibrateOscillator() сначала делает двоичный поиск в регистре OSCCAL для
наилучшего совпадения с частотой тактового генератора. Затем она делает поиск
следующей соседней (частоты?) для нахождения наименьшей девиации тактовой
частоты. Это гарантирует наилучшее соответствие между соседними величинами,
но для генераторов версии 5 (у которых прерывающаяся взаимосвязь между
OSCCAL и частотой) лучшее соответствие может быть доступно в другом диапазоне
OSCCAL.
Ограничения:
Этот алгоритм калибровки может пробовать величины OSCCAL до 192, даже если
оптимальная величина далеко меньше 192. Таким образом, может быть превышена
допустимая тактовая частота CPU в разработках с низковольтным питанием!
Точность зависит от OSCCAL простив частотной зависимости генератора.
Типичная точность для ATMega168 (вычисленная от OSCCAL против F_RC диаграмма
в даташите) должна быть в диапазоне 0.4%. Только версия 16.5 МГц AVR-USB
(которая использует ФАПЧ в приемнике данных) может допускать такую девиацию!
Все другие частотные модули требуют точности 0.3%.
*/
#ifndef __OSCCAL_H_INCLUDED__
#define __OSCCAL_H_INCLUDED__
void calibrateOscillator(void);
/* Эта функция калибрует генератор RC, чтобы CPU работал на частоте F_CPU.
* Она ДОЛЖНА быть вызвана немедленно после окончания состояния USB RESET!
* Запретите все прерывания во время вызова! Рекомендуется сохранить
* результирующую величину в EEPROM так, чтобы хорошее предполагаемое
* значение было доступно после следующего сброса.
*/
void usbEventResetReady(void);
#endif /* __OSCCAL_H_INCLUDED__ */
Извиняюсь за некропостинг. У ST есть некоторое количество чипов, поддерживающих crystal-less режим, они аппаратно калибруют генератор по SOF-пакету. Из тех, что знаю — это серии STM32F0x2 и STM32F0x8.
Как STM32 USB Device HID устройство может прочитать у PC состояние зелёных светодиодов для USB клавиатуры?
STM32 и USB-HID — это просто