Загрузил Pawel S.

Освоение STM32 самостоятельно #2: Практическое руководство по программированию

Николай Русин
Освоение STM32
самостоятельно #2
Издательские решения
По лv.щензии Ridero
2025
УДК 004
ББК 32.973
Р88
Шрифты предоставлены компанией «ПараТайп»
Русин Николай
Р88
Освоение STM32 самостоятельно #2 / Николай Русин. Издательские решения, 2025. -
(6. м.] :
546 с.
ISBN 978-5-0065-9034-2
УДКОО4
ББК 32.973
@ В соответствии с ФЗ от
ISBN 978-5-0065-9034-2
29.12.2010
№436-ФЗ
© Николай Русин, 2025
ОГЛАВЛЕНИЕ
ВВЕДЕНИЕ
.................................................
9
.................................. . 11
12
Список сокращений ....................................... .
Использование отладочной платы NR Devetopment Btue Кit .. 13
Характеристики ......................................... .
13
16
ГЛАВА 1. Руководство использования ARM KEIL IDE ...... .
Соглашения по экосистеме принятые в книге . . . . . . . . . . . .
16
21
Включение скрытых меню режима отладки . . . . . . . . . . . . . .
Выбор и правильная настройка ST-Link программатора
в KEIL IDE .. .. .. .. . .. .. .. .. .. .. .. .. .. . . .. .. .. .. .. .. .. .. .. .
23
Подключение библиотек или файлов в проект на Keit IDE.. 30
Глава 2. Библиотека CMSIS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
33
Различные макросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Макрос SET_BIT подробнее . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36
Макрос CLEAR_BIT подробнее .. . . .. .. .. .. .. . . . .. . .. .. . ..
38
Макрос READ_BIT подробнее .. .. .. .. . .. .. . .. .. . .. .. .. .. .
41
Макрос MODIFY_REG подробнее . . . . . . . . . . . . . . . . . . . . . . . . .
43
Почему написаны книги
Частый вопрос: Каким способом правильно присваивать
значение бита регистра: "=" или "1="?
....................
.....
Выводы АЦП (Pins) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Управление включением и выключением АЦП . . . . . . . . . .
Выбор канала АЦП .. .. .. .. . .. .. .. . .. .. .. . .. .. . .. .. .. . .. ..
Внутренние каналы АЦП: Датчик температуры МК . . . . . .
Режим однократного преобразования . . . . . . . . . . . . . . . . . . .
Режим непрерывного преобразования . . . . . . . . . . . . . . . . . .
Временная диаграмма работы АЦП: . . . . . . . . . . . . . . . . . . . . .
Аналоговый сторожевой таймер . . . . . . . . . . . . . . . . . . . . . . . . .
Режим сканирования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Управление инжектируемым каналом . . . . . . . . . . . . . . . . . . .
Прерывистый режим (Discontinuous mode) . . . . . . . . . . . . . .
Калибровка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Выравнивание данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ГЛАВА 3. Аналогово-цифровой преобразователь: ADC
45
47
50
50
51
52
52
53
54
54
55
56
58
59
60
Программируемое время выборки от канала к каналу . . .
Преобразование по внешнему триггеру
.................
Запрос DMA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Режим двойного АЦП . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Датчик температуры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Прерывания АЦП . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Регистры АЦП . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Карта регистров АЦП . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ПРИМЕРЫ РАБОТЫ с АЦП . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Проект по оцифровки датчика температуры LM35DZ
платы ВШЕ KIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Проект по оцифровки 4-х потенциометров или любых 4х аналоговых сигналов одновременно . . . . . . . . . . . . . . . . . . .
Рекомендации по видеоматериалам . . . . . . . . . . . . . . . . . . . . .
ГЛАВА 4. Система питания и энергосбережение: PWR . . . . . .
Домен резервного питания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Супервизор источника питания . . . . . . . . . . . . . . . . . . . . . . . . . .
Программируемый детектор напряжения (PVD) . . . . . . . . . .
Режимы с низким энергопотреблением . . . . . . . . . . . . . . . . . .
Замедление работы системных часов . . . . . . . . . . . . . . . . . . . .
Периферийные тактовые генераторы . . . . . . . . . . . . . . . . . . . .
Режим сна . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Выход из спящего режима . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Режим остановки (Stop mode) . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Режим ожидания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Регистры управления питанием . . . . . . . . . . . . . . . . . . . . . . . . . .
Карта регистров PWR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ГЛАВА 5. Интерфейс передачи данных 12С . . . . . . . . . . . . . . . . .
12С ведомый режим . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12С режим ведущего устройства . . . . . . . . . . . . . . . . . . . . . . . . .
Управление линиями SDNSCL . . . . . . . . . . . . . . . . . . . . . . . . . . .
Запросы DMA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12С прерывания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12С режим отладки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Регистры управления 12С . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
61
62
63
64
66
68
69
87
88
88
95
101
102
103
105
106
107
108
108
109
109
111
113
116
120
121
125
129
141
142
146
147
147
Карта регистров 12(
. . . .. .. .. . .. .. .. . .. .. .. .. . .. . .. . .. .. .
.................................
Проект по выводу информации на дисплей L(D1602
через интерфейс 12( . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ГЛАВА 6. Интерфейс передачи данных: SPI . . . . . . . . . . . . . . . .
Основные характеристики SPI . . . . . . . . . . . . . . . . . . . . . . . . . . .
Управление выводом Slave seLect (NSS) . . . . . . . . . . . . . . . . . .
Конфигурирование SPI в режиме ведомого устройства . .
Конфигурирование SPI в режиме ведущего устройства . .
Конфигурирование SPI для полудуплексной связи . . . . . . .
Процедуры передачи и приема данных . . . . . . . . . . . . . . . . . .
Последовательность запуска в режиме ведомого . . . . . . . .
Расчет CRC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Связь по SPI с использованием DMA (прямая адресация
памяти) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Флаги ошибок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Прерывания SPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Регистры SPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Карта регистров SPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ПРИМЕРЫ РАБОТЫ с SPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ПРИМЕРЫ РАБОТЫ с I2С
165
166
166
178
178
182
185
186
188
189
191
198
204
206
208
208
217
218
Проект по выводу информации на дисплей SТ7789V3
через интерфейс SPI
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Проект управлению RGB WS2812B светодиодами через
интерфейс SPI
...........................................
..................
Функциональное описание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Режимы работы счетчика . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Режим пониженного счета . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Режим выравнивания по центру (счет вверх/вниз) . . . . . . .
Выбор часов (CLock seLection) . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Режим захвата входного сигнала . . . . . . . . . . . . . . . . . . . . . . . .
Режим ШИМ-входа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Режим сравнения выходов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Режим ШИМ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Одноимпульсный режим . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ГЛАВА 7. Таймер общего назначения: TIM
230
245
247
249
253
257
262
269
271
273
275
279
Режим интерфейса энкодера
............................
...........................
Ведомый режим: Режим триггера . . . . . . . . . . . . . . . . . . . . . . . .
Ведомый режим: Режим внешней синхронизации 2 +
режим триггера . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Синхронизация по таймеру . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ведомый режим: Режим Gated
283
288
289
290
292
Использование одного таймера для запуска другого
таймера
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Синхронный запуск 2 таймеров в ответ на внешний
триггер . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Регистры TIMx
...........................................
Карта регистров TIMx . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ПРИМЕРЫ РАБОТЫ с ТIМх . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Проект по запуску PWM на таймерах TIM2 и TIM3 для
запуска и регулирования подсветки платы ВШЕ PILL,
а также регулирования яркости дисплея ST7789V3 . . . . . .
Проект по применению и TIM2 для работы
прецезионного датчик температуры NSТ1001 . . . . . . . . . . .
Проект по применению ОМА и TIM2 для работы PWM
на WS2812B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Проект по применению TIM2 для работы
с семисегментным индикатором . . . . . . . . . . . . . . . . . . . . . . . . .
ГЛАВА 8.1 Интерфейс устройства универсальной
последовательной шины USB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Функциональное описание USB . . . . . . . . . . . . . . . . . . . . . . . . .
Описание блоков USB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Система и сброс при включении питания . . . . . . . . . . . . . . . .
Регистры USB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Регистры, специфичные для конечных точек . . . . . . . . . . . .
Таблица дескрипторов буферов . . . . . . . . . . . . . . . . . . . . . . . . .
Адрес буфера передачи п (USB_ADDRn_ТХ) . . . . . . . . . . . . . .
Счетчик байтов передачи n (USB_COUNTn_ТX) . . . . . . . . . . .
Адрес буфера приема (USB_ADDRn_RX) . . . . . . . . . . . . . . . . . .
Счетчик байтов приема n (USB_COUNTn_RX) . . . . . . . . . . . . .
Карта регистров USB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
298
300
332
334
335
345
353
363
372
373
375
378
398
410
417
418
419
420
421
423
ПРИМЕР РАБОТЫ с USB-CDC . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
425
Проект по выводу информации через UART
интерфейса USB
.........................................
...........
Основные возможности OTG_FS . . . . . . . . . . . . . . . . . . . . . . . . .
Общие характеристики . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Функции режима хоста . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Возможности периферийного режима . . . . . . . . . . . . . . . . . . .
Функциональное описание OTG_FS . . . . . . . . . . . . . . . . . . . . . .
Полноскоростное ядро OTG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Полноскоростной OTG РНУ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Обнаружение линии идентификации . . . . . . . . . . . . . . . . . . . .
Устройство двойной роли HNP . . . . . . . . . . . . . . . . . . . . . . . . . . .
Устройство двойной роли SRP . . . . . . . . . . . . . . . . . . . . . . . . . . .
Периферийное устройство USB . . . . . . . . . . . . . . . . . . . . . . . . . .
Периферийное устройство с поддержкой SRP . . . . . . . . . . .
Периферийные состояния . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Периферические конечные точки . . . . . . . . . . . . . . . . . . . . . . . .
Управление конечными точками . . . . . . . . . . . . . . . . . . . . . . . . .
Передача конечных точек . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Состояние конечной точки/прерывание . . . . . . . . . . . . . . . . .
USB-xocт . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Хаете поддержкой SRP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. .
Состояния USB-xocтa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Обнаружение хостом периферийного соединения . . . . . . .
ГЛАВА 8.2 Полноскоростной USB-nopт (OTG_FS)
425
427
427
427
429
429
430
431
431
433
434
434
435
436
437
438
440
441
441
443
444
444
445
Обнаружение хостом отключения периферийного
устройства
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
447
Ведущие каналы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
Планировщик хоста . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
Динамическое обновление регистра OTG_FS_HFIR . . . . . . . 456
FIFO данных USB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
Архитектура периферийного FIFO . . . . . . . . . . . . . . . . . . . . . . . 457
Периферийный Rx FIFO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
Периферийные Тх FIFO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
Приостановка работы хоста . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Распределение оперативной памяти FIFO
...............
.............................................
Производительность системы USB . . . . . . . . . . . . . . . . . . . . . . .
Прерывания OTG_FS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Регистры управления и состояния OTG_FS . . . . . . . . . . . . . . .
ГЛАВА 9. Интерфейс передачи данных: CAN . . . . . . . . . . . . . . .
Введение bxCAN . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. . .. ..
Основные характеристики bxCAN . . . . . . . . . . . . . . . . . . . . . . . .
Три почтовых ящика для передачи данных . . . . . . . . . . . . . .
Общее описание bxCAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Режимы работы bxCAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Режим инициализации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Нормальный режим . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Спящий режим (низкое энергопотребление) . . . . . . . . . . . . .
Режим тестирования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Бесшумный режим . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Обратный ход в сочетании с бесшумным режимом . . . . . .
Режим отладки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Функциональное описание bxCAN . . . . . . . . . . . . . . . . . . . . . . .
Приоритет передачи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Режим связи по времени . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Управление ошибками . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Регистры CAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Регистры почтового ящика CAN . . . . . . . . . . . . . . . . . . . . . . . . . .
Регистры фильтров CAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
БОНУСЫ ...................................................
Режим хоста
461
462
463
464
466
467
467
467
467
468
471
472
473
473
475
475
476
477
477
478
480
490
496
512
520
530
Проект по увеличению числа подключеннык кнопок
с применением сдвигового регистра 74HC165D
. . . . . . . . . 530
Проект по увеличению числа подключеннык
светодиодов с применением 74HC595D
. . . . . . . . . . . . . . . . . 538
Список литературы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544
Заключение. Получение доступа к комьюнити изучения
STM32 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545
ВВЕДЕНИЕ
После длительных поисков в интернет-магазинах и крупных
книжных торговых сетях России, понял, что, на русском языке
нет изданных книг по
программированию
микроконтроллеров
5ТМ32. И ЭТО в XXI веке!
И в виду этого, я дал обещание коллегам и подписчикам, что
моя книга выйдет в свет на русском языке сначала, для того что­
бы начать и систематизировать изучение микроконтроллеров,
а потом, если будет запрос англоязычного сообщества и на ан­
глийском языке.
И вышла в свет первая книга сразу став бестселлером. Сооб­
щество рунета запросило продолжение изучения микроконтрол­
леров 5ТМ32 с применением большего числа периферии, моду­
лей к нему и появилась необходимость продолжить развитие
книги. Поэтому Вы держите вторую книгу, продолжение, с новы­
ми темами и в гораздо большем обьёме, темы которые не рас­
сматривались в первой книге, в виду их сложности для старта
изучения
микроконтроллеров.
Данные
темы
написаны
уже
на следующей ступеньке сложности. Они требуют хорошего по­
нимания материала первой книги, а лучше, и настоятельно я это
рекомендую, наличие первой книги под рукой, теперь в каче­
стве справочного пособия. Во второй книге будет присутство­
вать контент первой книги без детального рассмотрения и раз­
бора, чтобы не делать продолжение книги в слишком большем
объеме и не повторяться.
Также я выражаю огромную благодарность коллективу сооб­
щества в Телеграм
-
канале книги, т.к. благодаря им она полу­
чилась более совершенная и содержит материал в более раз­
вернутом виде:
Сергей Алтынбаев,
Константин Косарев,
9
Евгений Лагун,
Александр Кузниченков,
Дмитрий Кудрявцев,
Александр Середа и другие которых не написал.
А также большое спасибо кто финансово поддерживал развитие книги, а именно:
Андрей Кувшинов,
Дмитрий Кудрявцев,
@Alex Soft,
Александр Назаров,
Андрей Тимохин,
Михаил Оверчук и многие другие.
В книге много перевода с английского языка и если кто-то
обратит внимание на более лучшую формулировку или перевод
выражений,
прошу
высылать
на
мою
электронную
почту:
nr.eLectronics@maiL.ru. А также описки и опечатки прошу высы­
лать. После моего прочтения и проверки ваших предложений,
можете пополнить данный почетный список!
В текущем издании, иногда, можно заметить не всегда вы­
равненный текст кода по правилам оформления кода языка «С».
К сожалению, издательство заточено только под художествен­
ный текст и форматок, шаблонов под код просто
нию нет.
10
к сожале­
ПОЧЕМУ НАПИСАНЫ КНИГИ
Я стал популяризовать программирование на STM32 на сво­
ем личном УоuТuЬе-канале еще в далеком 2019 году по адресу
в интернете:
https:llwww.youtube.com/@NRelectronics. Затронул
в видео-контенте канала основополагающие темы, их архитек­
туру, семейства, наборы команд, применения, многообразие ис­
пользуемой периферии и конечно её использование на практи­
ке и стал помогать людям в изучении тем видео роликах. С тех
пор я
получил множество комментариев
и запросов на самые
различные темы. И самую важную просьбу, сформировать этот
контент в некотором текстовом
виде. Благодаря
взаимодей­
ствию с моими подписчиками на УоuТuЬе-канале, а чуть позже
и Телеграм-канале книги стало понятно, что, не так просто по­
дробно охватить сложные темы на возможном личном веб-сай­
те. Канал или блог -
это отличные места, где можно освещать
довольно специфичные и ограниченные по объему темы. Одна­
ко,
если
нам
нужно детально объяснить
и
что-то
показать,
не просматривать часы видеороликов, книга по-прежнему явля­
ется верным и удобным источником ответов. Она вынуждает нас
систематизировать свои знания и дает нужное пространство для
расширения
изучаемого
вопроса
по
мере
нарастания
сложно­
сти. Видимо, я один из тех людей, которые до сих пор считают,
что чтение больших объемов текста на мониторе -
сложная за­
дачка, а книга лучший источник полезной информации.
11
СПИСОК СОКРАЩЕНИЙ
ADC Analog-to-digital converter - Аналого-цифрового преобра-зователь
API Application Programming lnterface
ARM Advanced RISC Machine
ЕХТI Extended lnterrupts and Events Controller
Event Flag Флаг события
GPIO General-Purpose lnput/Output
GPTIMER General Purpose Timer
HAL Hardware Abstraction Layer
12С lnter-lntegrated Circuit
IDE lntegrated Development Environment
NVIC Nested Vectored lnterrupt Controller
PIN Пин Вывод
PWR Питание
PWM ШИМ - Широтно-импульсная модуляция
RCC Reset and Clock Control - Система тактирования
RM Reference manual - Справочное руководство
SPI Standard Peripheral lnterface
UART Universal Asynchronous Receiver-Transmitter
МК Микроконтроллер
ИМС Интегральная микросхема
12
ИСПОЛЬЗОВАНИЕОТЛДДОЧНОЙ
ПЛАТЫ
NR DEVELOPMENT
BLUE КIТ
ХАРАКТЕРИСТИКИ
В книге используется достаточно большая, и в то же время
удо-бная отладочная плата. Она
разработана специально для
этой книги, а возможно и для последующей, т.к. по сути, это рас­
ширяемая плата. Об этом подробнее далее. Данная плата и на­
бор
Kit в целом необходимы для работы с книгой, чтобы рас­
крыть работу периферии МК более наглядно, опробовать весь
код книги и не собирать все узлы проводами, бредбордами, в
которых постоянно всё отваливается и дребезжит.
В данной плате реализована возможность подключения лю­
бой периферии, к известной нам по первой книги отладочной
плате BluePill+. Это реализовано через комплектные провода
dupont набора и ряды линеек контактов платы набора, располо­
женных около неё, так и через перемычки, к которым подходят
трассы на печатной плате от целевой установленной периферии
к BluePill+. Перемычки подобраны такие, что к ним легко подсо­
единяются клеммы от логических анализаторов. При таких свой­
ствах платы процесс изучения происходит комфортнее, без дре­
безга и с гораздо меньшим количество проводов. Набор
(Blue
Kit) комплектуется программатором STLink-V2.1, который хоро­
шо себя зарекомендовал по работе в прошлой книге и в моих
персональных проектах.
Плата Blue Kit имеет у себя на борту разъем для подключе­
ния других отладочных плат -
PMOD, который используется для
работы со стандартизированной периферией, как в отладочных
платах от ST, так и платах работы с FPGA.
13
В плате заложен интересный потенциал, а именно: можно
использовать аппаратные блоки совместно, соединять в одном
проекте, т.е. работать не только с одним типом периферии пла­
ты, а выстраивать значительно более сложные проекты, несмот­
ря на то, что, у МК STM32F103C малое количество выводов.
В составе набора
NR Developmeпt Blue Кit сейчас присут­
ствует:
-
плата
Blue Kit со схемой электрической в электронном
виде по запросу;
-
платка
BluePiLL+
на
оригинальном
микроконтроллере
от ST, а именно STM32F103CB с 128КБ флешь-памяти на борту;
-
программатор/отладчик на оригинальном микроконтрол­
лере от ST, а именно STM32F103CB со встроенным преобразо­
вателем интерфейсов USB-UART;
- набор обжатых проводов dupont 20шт;
- энкодер с предустановленной ручкой для удобства;
- датчик температуры: D518B20 или LM35DZ;
- жгут для подключения программатора к плате, без возможности неправильного подключения, т.к. он обжатый;
-
кабель USB Туре-С -
USB Туре-А;
пластиковый кейс для хранения и переноски всего выше-
перечисленного.
Приобрести данный набор можно пока только в фирменном
магазине NR. electronics, который постоянно наполняется новы­
ми полезными лотами для изучения программирования STM32:
https ://nrstore. tb.ru/
Посмотреть видео обзор платы: «NR DeveLopment BLue Кit новая отладочная плата для «Освоение STM32 самостоятельно
#2», на канале изучения программирования и работы с STM32:
https:/Лvww.youtube.com/@NRelectronics
Можно посмотреть и на отечественных платформах Rutube,
VK Видео.
14
Внешний вид отладочной платы BLue Kit для работы с книгой.
15
ГЛАВА 1. РУКОВОДСТВО
ИСПОЛЬЗОВАНИЯ ARM KEIL IDE
СОГЛАШЕНИЯ ПО ЭКОСИСТЕМЕ ПРИНЯТЫЕ
В КНИГЕ
комфортной
Для
или
правильной
работы
примерами
с
из книги необходимо условиться о общих параметрах настройки
системы, а именно настройках Keil IDE. Это необходимо для то­
го, чтобы у читателя получалось компилировать код как в приве­
денных примерах книги .
Х
About µVisюn
~
µVision V5.35.0.0
Copyright (С ) 2021 ARM Ltd andARM Germany GmbH. AII rights reserved.
- - - ·- - - -MDK-ARM
Plus Verslon: 5.35.0.2
~oolchain:
1 oo lchain Path:
C:\Кeil_vSIARIAIARMCC\Вin
С Compiler:
Armcc.exe
Рисунок 1.1 -
-
-
-
V5.06 update 7 {build 960)
Используемое ПО ARM Keil IDE
Написание кода происходит в профессиональной среде про­
граммирования Keil IDE версии 5.35 с предустановленным ком­
пилятором версии VS.06, показанном на рисунке 1.1. Это усло­
вие первое
и самое важное для написания и
компилирования
вашего кода .
Компилятор должен выбираться обязательно в настройках
проекта согласно рисунку:
16
Х
W. Opt,ons lor rarget 'Тarget 1'
СоdеG«....ьоп
ARMCoщ,iet:
SfМic:n:>ele<:ln, STM32F10XB
Х!а/ (МНz): j -u>del....i,
j rюne
Ope«,t,ng system:
г Use Cn,ss-1,!odJe OifujlЖion
.:J
System ',\ewe, Fie:
Г U.. МlaoUB
jsтю2F1оз.х ,v<1
J
г u.e CuotOII\ Fie
Г ReadЛVlie Мemory
Re.ю!Only Мemory ......, - - - - -
1defd
.:J
1
olf-d,ip ~-51_1111_
_~-s;_,e_ 51111\ц,
1defd. olf-c/;p
Area, - - - - ----:
Slart
Sze
Nolnl
Г
ROM1 :
('
Г
RАМ1 :
г
Г
RОМ2:
Г
RAМZ: ~ - -
г
г
RОМЗ:
r
r
Г
RАМЭ·
г
on-c/;p
р
IROM1 :
г
IROM2:
jn.soooooo
r,
('
jo.10000
1р
Г
on-щ,~--~--
!RАМ 1: ja.20000000
jn.sooo
IRAМ2:
г
г
L
ОК
Рисунок 1.2 -
11
Cw1Cel
11 De!d.s
Выбор версии компилятора
Таким образом выбран необходимый нам компилятор вер­
сии VS. Для тех кто хочет воспользоваться компилятором версии
Vб.хх
-
это также возможно, но необходимо воспользоваться
документом: Migrate ARM Compiler 5 to ARM Compiler 6 AN298,
March 2017, V 1.0 (1] в котором подробно приведены инструк­
ции по переносу исходного кода вашего приложения из версии
5 в версию 6, т.е. проводить самостоятельные настройки к вер­
сии Vб.хх.
17
Х
'f. Options for Target Target 1'
[
~=ОЗ.В, SТМЗ2F10~
- --i.k1d<fne:
~ / Code GonerOlion - -
Г Stna ANSI С
г Е'хюАОФУ Code
3
Warmvs: !AI Worrw,gs
..:.J
t,,
г €run Cmlinef lJiw~ "
г
Г ()ptmze for rme
Г PI.., Oi«is Sig,ed
Г NohJ.onoblet
Г Splt lDIJd and Slore ~
г ~od-Oriy р- ndependeri
Гv С99 t.\ode
Гv One Elf Sedion per FU1dion
Г ~od-Wrle Poolion lndependonl
Г GNU exten<ions
0ptm1,--.: j1.eve1o(<JO)
□
lnriode
P,ths
"""
Corwls
C,rщ,ler 1-<:99 <: ""1Х1 Cortex-MЗ i1 -00__.""1t<fWOII< --tplt_sea,on,
согсrо1
~./!ПЕ/Оеw:е1SТМЗ2F1ОЗС8
,tmg
ок
Рисунок 1.3 -
Concel
Delds
Настройки выбранного компилятора VS
На рисунке 1.3 установлен необходимый уровень оптимиза­
ции
- 00, при котором компилятор не «выбрасывает» оптими­
зируемый код по его собственному мнению. Также выбор «С99
Mode» необходим для использования как более новой версии
языка Си так и тех новых свойств языка ставшие по сути обяза­
тельными. В поле
«Define» для работы с библиотекой CMSIS
необходимо уточнить наш МК и его семейства соответствующей
записью приведенной на рисунке 1.3.
В области «Define» необходимо написать используемый на­
ми микроконтроллер STM32F103x8, а для правильного его объ­
явления в библиотеки CMSIS, если код под разные МК, исполь­
зовать директивы #if, #ifdef и #ifndef.
Для справки:
Optimization (Оптимизация):
Настройка оптимизации компилятора для генерации кода.
18
Устанавливает параметр командной строки -Onum :
DefauLt: Использует настройку по умолчанию или настройки
верхнего уровня для таргета или группы.
LeveL О (-00): Выключает все оптимизации, делает некото­
рые простые изменения кода.
LeveL 1 (-01): Выключает оптимизации которые ухудшат по­
ни-мание в окне отладки.
LeveL 2 (-02): Высокая оптимизация кода (уровень по умол­
чанию). Понимание в окне отладки может быть менее удовле­
творительным, так как отображение объектного кода в исходный
код не всегда понятно.
LeveL3 (-03):
оптимизация
Максимальная
кода.
Обратите
3 уровень в комбинации с флагом Optimize for
Time может генерировать чуть больше код чем 2 уровень, это
вни-мание, что
связано с тем что уровень может раскрывать циклы в линей­
ный код.
Optimize for Тiте (Оптимизация времени выполнения)
Сокращает время выполнения кода за счет большего разме­
ра кода. Флаг для командной строки -Otime. Если флаг не вклю­
чен, компилятор предполагает параметр -Ospace.
С99 Mode (С99 режим)
Компилятор компилирует С код, как определено в стандарте
1999 С и добавлений :
- ISO/IEC 9899:1999. The 1999 lnternational Standard for С.
- ISO/IEC 9899:1999/Сог 2:2004. Technical Corrigendum 2.
Параметр для командной строки - с99.
Опе ELF Section per Function (Один раздел ELF на функцию)
Создает один раздел
ELF для каждой функции в исходном
файле. Выходные секции названы с тем же именем, что и функ­
ция, которая генерирует секцию. Позволяет оптимизировать код
или найти каждую функцию по отдельным адресам памяти. Па­
раметр для командной строки -
split_sections.
19
Х
W. Options for Target 'Тarget 1'
Nм1е ~ Exea.toble· ltest_CMSIS_КEIL_FBS
Select folder for Clt,j«:ts ...
r, Create Exewoble..\C!Ьtedt'le,t_CMSIS_КEIL_PBS
Г Create Вatc:h Re
г,; DeЬug lrfoonation
W Create НЕХ Fie
1
Р' Вrowse rlonnaoon
r Create Unry: .\Ot,jeas\/os1_CMSIS_КEIL_PB5.IЬ
ок
Concei
Рисунок 1.4 -
I
De/ds
1
Не\>
Настройки режима отладки
1.4 необходимы для работы режима
Debug lnformation.
Настройки из рисунка
отладки -
Debug lnformation -
выбор этого пункта позволяет нам после
выполнения полной компиляции проекта командой
-
Rebuild
шагать по коду в файле main. с, отключения пункта приводить
к возможности отладки , т. е . ходить по командам , только по ас­
семблерным командам окна DisassemЫy.
Create НЕХ fi/e -
говорит само за себя , создание файла про­
шивки после компиляции в формате с расширением . hex.
Browse lnfromation -
выбор данного пункта определяет со­
здание нескольких файлов с расширением :.сгf после выполне­
ния полной компиляции проекта
циях эти фалы необходимы.
20
- Rebuild. В некоторой ситуа­
ВКЛЮЧЕНИЕ СКРЫТЫХ МЕНЮ РЕЖИМА
ОТЛАДКИ
Следующее окно не менее важное чем остальные и его так­
же разберем:
Х
'1: Options fo r Target 'Тarget 1'
~1~1~1~1~1~-1-1~Det,u,;lu-1
r Ute S;ru.,to,
S<l!ngs
..1~""1!1<!i<m
Sett.ngs !
•
_ _ _ _ _.:J-,
I r. Use· j,-sT_-tr.k_Det,ugge,
Г lЫ 5ре,ю to Real•Thle
Р' t.o,,d ~ .t St..tц,
Р' t.o,,d ~ .i St..tц,
Р' Ru, to ,мnQ
Р' Ru, to rмinO
- A l e:
- Restore Det,u,; Seuion Sett,,gs - - - - ~
р lnoki>on•
г Re,to,e De!,,,g Seuion Sett,,gs
р тоо1т
Р Wolch Wndows & Penormance Pn,;p.e,
Р' м.тау ~splay
Р Sy,tem -
Parameter.
_ _ _ _ _ __
ISARМCMЗ . DLL ~1-R-E-MAP
CPU Dll
1м1оg DLL:
Parametet:
_ _ _ _ _ __
jocм .DLL\~i>С_М_з
Г W,m l Ol.td.ted E'xecuable is lo.,ded
Р' Вreoki>on•
Р Tool>o><
Р' Wotch Wndows
Р Troc,poi'ts
Р" Мemory Dsplay
Р' System -
D!iver DLL:
Parameter:
ISARМCMЗ .DLL ~ - - - - - - - [lolog DLL:
1тсм
Dll
Parameter.
~,1)(:-М_З
_ _ _ _ _ __
Г W,m i Ol.td.ted Exocuable is lo.,ded
м.._ Ccщ,one,t Voewer De,cфlion Ales ...
ок
c.ncei
I
Delds
Рисунок 1.5 - Окно настроек режима отладки по умолчанию
Я предлагаю использовать дополнительные приятные бону­
KEIL IDE, зачем ведь себе отказывать? При
установки определенных настроек в окно рисунка 1.5 появятся
дополнительные окна меню IDE в режиме отладки кода и они
сы от программы
нам сильно помогут в процессе написания и отладки. Вносим со­
ответствующие настройки в это окно согласно следующему ри­
сунку:
21
Х
'w. Opt,ons fo, Target 'Target 1'
-1~1~1~1~1~м1~1~Del>ug1~1
·
_ _ _ _ _..:J--,
Se\tngs I r- Ute· lr-sT-,1.rik-o.ь._.
w!hrtl1ncti9Q•
,.. u.e Siтuato,
Settngs
1
Г l.inlt Speed to R,,11i-Т11110
Р Load ~ at Sla,щ,
Р' Ru, to IМinO
Р' l.olld ~ .t Sla,щ,
- Retlon, DeЬug s,...,,, Se!tлgs
R,,,lon, DeЬug Seuion Settngs -
Г,, Watch Whclow, & P..tamance kwfzer
Wl/.ch Wndows
Г,, Sy,lem ¼ower
Г,, Мето,у ()jspllly
Г,, Мemory l)spl,,y
Р' ТооЬок
Г,, &e.kpons
Г,, ТооЬох
r;; ~ •
CPU DLL
Р' Ru, to rмinO
ntiai,.tien Fie:
ntialitalien Fle:
DnverDЦ:
р,.....,.....,
Р' Тroc,ports
Г,, Sy,iem ¼,we,
р.,...,...,.,
!SARМCМЗ. DLL , - - - - - - - - -
jSARМCMЗ.DЦ , - - - - - - - - -
l)oloQ DlL
Р,_...,,.ог.
l)olog OLL:
!TARMSTM DLL ,..,,р-SТМ-З2-F1_0Х:_8- - - - -
р,_...,,..,,
!DARMSTMDЦ lr-,p-SТМ--З2-F1-0X:--8- - - - Г
w.... f ...dated ех.w.ые IS loll<ЖI
ок
Г
с.,,,се
w"'" f oudd.ed Execui!ble ь 1о11<Ж1
D,/ds
Рисунок 1.6 - Окно настроек режима отладки с применением
дополнительных настроек
Достаточно мало информации об увеличении функционала
Keil IDE в интернете. Эти окна в процессе отладки можно и нуж­
но вызывать из следующего места верхнего меню программы:
22
о,ьuо
Power, Rrset •nd Clock Control
АРВ Вrldoes
О хЕ ООО
IТ();
ОМА
О х 0В00036 4
ВКР
-l __
PlNB 2 INIT
Gen,ral Purpose VO
GPIOA
324 PINA О
Exttrnal lnterrupts
GPIOB
1t();
\'Vatchdoo
GPIOC
284 Interruot ЕХТI
R••I-Time Clotk
GPIOD
Timers
AFIO
INIТ
РАО
in
• о startup_stm32110X.md.s
.,---------------
USARTs
SPI
12С lnterfac,s
:_c_onv_•rt_••-•-----~
:)"i
Рисунок 1.7 -
1
.t'1.NA U
lNJ.1 tJ;
Окно вызова дополнительных скрытых меню ра­
боты со всей периферии микроконтроллера STM32F103
Если мы не введем настройки окна рисунка 1.6 то не полу­
чим показанный список окна
Peripherals продемонстрирован­
ный на рисунке 1.7.
ВЫБОР И ПРАВИЛЬНАЯ НАСТРОЙКА ST-LINK
ПРОГРАММАТОРА В KEIL IDE
Окна выбор программатора мы успели посмотреть, это рису­
1.5 или 1.6. По умолчанию выбран родной программатор
для Keil IDE - это один из вариантов U-Link, поэтому кликаем
нок
на данное окно и обязательно выбирает наш рабочий програм­
матор первой книги и также для данной: ST-Link Debugger:
23
~ Optюns ror Target 'Тarget 1'
< Use :inualor
Х
WФ ,u:,ctюm
5el!;,gs
Г lmt Speed to Real-rrne
-
г.; Futto rмn()
Р 1лоd ~ ot 51..._,
I r. !,!>е: i
ST-lrok DeЬugger
ULINK Pr<> Cortex DoЬugger
UUNКpi.Js 0eЬugge,
•1
_j
р 1лоd ;~~~Jrт~
1 .....,_ • МodehCorte<-14
rйlaZlllion Fle:
..
г Restore OeЬug Seuoon So!tl1QS
р в.,,~
р
Tool>ot
17 Wotd> Wndo,--. & Ре,!оомnсе kt,qzer
Р- Меmо,у Display
CPU Dll:
f;i Меmо,у Display
J;; System Voewer
_ _er._._ _ _ _ _ _ _ 1 Dnvor DLL
,.Pпrne1
i;;; Sy,tem "1ewe,
_ _er._._ _ _ _ _ __
~Pпrnet
jSARМCMЗ.DLL
jSARМCMЗ DLL
[ialog DLL:
Pпrneter.
loARмsтм. DLL l11sтмш1озсв
DiaioQ DLL
P........ier
lтARмsтм.DLL .-l11..,.,sтм=ш=1озсв=-----
Г Wom f oudoted Ехеш.Ы. io loaded
Г
w""' f шdoted &еапЫе" looded
м..._ Coo,pc,nen \,\ewer Desatr,o,on Fles ...
ок
c.ncd
Defoul.s
Рисунок 1.8 - Выбор рабочего программатора ST-Link
Далее кликаем на кнопку Settngs и попадаем в следующее
окно :
24
I
DeЬug Т,асе I Am Downood I Ped< 1
SТ-UNКN2-1
lk,I· rsm"
DeЬug
swo..ice
-IDCODE_
----------
..:J
Г Shote.Ы.ST~
1
S\VDIO
()о18АО1477
De.ice №me
ARMC.O,.Ssf; S\V-OP
----
06WFW..::
~,
~
~----- 1
V.-.: НW. ~ FW. jV2J43М28
Г-
_J~_J
P-Oioc:k...-0!1olart
№Г
TOlv,ICom Pon . В..:J
- Clock
-
-
--~
Req.l 1.800 мн, Solкted. l 1.800 МН:
DeЬug
c.ct,,Ot,lio,1s
u,med&Ae,etCJot;on,
u,med:1 -
17 Re,et,l\«u,med
..:1 я...t: j"'-lodeted
э
Г Stop,1\.. -
IГv Сас1,е
Do>d>edCJot;on,
Codo
. Гv c.ct,, Меmо,у
г г v.dy Code Do>d>ed
Г [)owrjoodtoAи,
ок
Рисунок 1.9 -
I о- 1
Окно с определенным системой программато­
ром
Примерно такое должно быть у наших дорогих читателей.
Что здесь особенно важно?
Должен быть прочитан программатор:
-
в окне «Debug Adapter», это значит что он правильно под­
ключен к компьютеру и используется кабель USB вместе с лини­
ями данных. Окно «Version: HW:" версия не ниже: V2-1. Поэтому
я настоятельно рекомендую использовать проверенный микро­
контроллер или использовать плату из магазина NR. eLectronics
Store,
сделанного
специально
для
вас ,
дорогие
читатели,
на Ozon по адресу:
https://www.ozon.ru/product/programmator-otLadchik-stLinkv2-1-so-vstroennym-usb-uart-preobrazovateLem-1849411509/
-
в окне «Port: SW»
-
это выбор режима программирова­
ния SWD;
25
-
значение нашего
окно «SWDIO»: значение Ох1ВАО1477 -
микро-контроллера STM32F103C8 (В) Тб;
Х
Cortex•M Target Drhter Setup
I
DeЬug Тг.юе я.,;;, Downo.d \ Pad< \
Сае Oock: J
8.000000 МНz
г ~
Тroce Ooc:k: J
8 000000 МНz
--·
г Uoe Сае Оос1<
-- --Js.n.i w.-.. Ouou u•RИIRZ _:]
TrocePort
SWOClock P,,:,coi<r.
SVIOClock: j
l4
- l
ft"_:]
р
Тrace Evertt
2000000 !•Н,
г
Г Е "
- РС~
г
Penod. J <D-.J>
г
г с
Е
Г
Pn,sc,i«: 11024•;5 _:]
,_
г
J
L.
ITMStonJusPorts
1
&,,Ые: JO.FFFFFFFF
~
31
Port
Pa,t
16 15
Port
2~ 23
8 7
Рм
О
P-F'PWJ,.,l.,,.Jvlv р-р:~ ~-.,J "ф,Jvl -'Гv'P' J,; fvfvl..,, lv lv wГ-7
- Jll<OOOOOOOЗ
Рм 31 , 24 Р
Рм 23 .. 16 Г
Pa,t 15.. 8 Г
Рм 7.. 0 Г
-------
Мvanoedse!t"!P
Г v,ore pocke!s wtt, по SYNC
Г OverмteCYCCNT
ок
Рисунок 1.10 -
о- ' - ---'
Настройки окна закладки Trace
Настройки необходимо оставить такими как на рисунке 1.10,
STM32 самостоятельно
#1» в разделе 9 подробно описано настройка данного окна для
т.е. по умолчанию. В книге «Освоение
работы через интерфейс SWO.
26
Х
Согt~х-М Target Oriver Setup
r,; V.,;ty
l
De,ic, Sin,
о...:. т
~ - ~=-- ~ - - - Downloodli.nc!Jon
LOAD
.f ~
{• lfi,i,e
r
ы@ r,; " -
&ase s.ctcn
•Dor<>t&...
Г,,R,,et,ndRu,
De
1211k
Stort:
lo.20000000
Size: !0.00001000
~--------
f'ю\JIIIYl'ro\J .,tjgo,iln
STM32f10. Мed-dentty Аа,1,
RAМlo,ligo,it-,n -----
On-chlp Ao,h
51..t:
08000000Н • 0S01 FFFFH
Size.
ок
Рисунок 1.11 -
J
ОтменА
! ro ,. "'"'' j
Настройки режимов программирования МК
Показанное окно рисунка
1.11 демонстрирует возможность
стирания как всего МК так и стирание его по секторам. Выбор
диапазона работы RAM и адресного пространства FLASH памяти.
Также путем выбора необходимой «галочк» возможно измене­
ние и порядок работы программирования МК путем выбора ре­
жимов:
- Program - программирование МК;
- Verify - проверка флеш-памяти после прохода в режиме
про-граммирования (Program);
- Reset and Run - сброс и запуск МК после программиро­
вания и верификации МК.
Также в этом окне через кнопку «Add» возможно настройки
добавления программирования внешней микросхемы FLASH па­
мяти, но это выходит за рамки данной книги.
27
Х
CortPX М Target Dпver Setup
I
DeЬug Troc:e \ Rosh Oo-.r/ood P«:k
De!,ug~
P«:k: КеiSТМЗ2F1ц_DFР.2.4-О
Г&,.,1,1е
Г
. ,.-
lн -ОС,,°""" STМЗ2c,мocro.,.,,...,·.CMSIS_PB2_wioo_EX-Тt .CMSIS_P1!2_Ыtc
1~ , ; : Т~_1_SТМЗ2F10Х8_100~
ок
Рисунок 1.12 - Окно закладки Pack
В данном окне закладки
Pack, рисунка 1.12, возможно это
покажется странным, но необходимо снять выбор настройки
ЕпаЫе - это необходимо для корректной работы режима «Reset
and Run» рисунка 1.11.
28
Х
W, Options for Target ·тarget 1'
Corf,g<R Aash м.nu Command - [
J;; Use ОеЬ1,g Dnver
r. U... Toiv,t D!!vt,fo, Aash ~
-Use 0еЬ.,g D!!vt,-
Гv Цх!«о To,get Ье/с,е CJeЬuwng
s.ttngs
~---------====---- .:J~
lnt Fie
r U..БctemalToolfo,Rd,~
~
Commмd
~
1
:
г
IJ11!r>d~г,- ~
'
1 Coriig<Je knOQe Fle PmcesoinQ (FCARM):
Add ~ Fle to Grщ, :
Occpct Fle:
.:.J 1
1Sou-ce Group 1
г - · l..is"9
mo\jO Res Root Fald«:
ок
c.ncel
Defds
1
1
J
н.-,
Рисунок 1.13 - Окно закладки Utilities
В представленном окне закладки
Utilities, вам необходимо
выставить настройки в соответствии с рисунком 1.13. Дальней­
шие изменения и работа этого окна более детально будет пока­
зана в этой и следующей 3-части книги.
Для справки :
Не рассмотренные закладки окна
Option for Target, а точ­
нее настройки в них необходимо пока оставить по умолчанию
и не изменять их если нет четкого понимания за что они отве­
чают.
29
ПОДКЛЮЧЕНИЕ БИБЛИОТЕК ИЛИ ФАЙЛОВ
В ПРОЕКТ НА KEIL IDE
Внутри необходимого нам проекта создаем папку с любым
именем
куда
копируем
требуемые файлы для
подключения
к проекту, например, как приведено на рисунке:
Имя
Drivers
lnc
MDK-ARM
с
OneWire
Src
Рисунок 1.14 -
Папка с подключаемой библиотекой
Указываем путь к ней для привязки в проекте как на рисун­
ке ниже :
~ Options for T,,rg~t F1030S18B20USARТ'
tJ х 1- l • l
Рисунок 1.15 -
Указываем путь к папке в соответствую­
щем окне
30
В теле основного файла main. с подключаем файл библиоте­
ке. h, при такой записи подключиться и файл библиотеки с рас­
ширением . с, как приведено на следующем рисунке:
U ln4in.c
40
include "Onewire. h"
Рисунок 1.16 - Продолжение подключения библиотеки OneWire
Затем нажимаем правую кнопку мыши по папке Application/
User и добавляем (команда в открывшемся меню Add Existing
Files ... ) файл библиотеки с расширением . с в проект как на ри­
сунке ниже:
&)
Application/ User
&) .J main.c
Application/ MDK-A
в
Drivers/SТМ32F1xx_
в
(±]
Палка :
OneWre
Имя
"
l1;j CMakeliru.txt
OneWire.c
OneWire
.J stm32f1xx_hal.c
Рисунок 1.17 - Продолжение подключения библиотеки OneWire
Конечный результат подключения должен быть таким, смот­
рите ниже:
31
в
main.c
OneWire.c
Рисунок 1.18 - Конечный результат подключения библиотеки
После этого проект можно компилировать и ошибок под­
ключения библиотеки не будет, если все выполнено согласно
предыдущим рисункам 1.14-1.17.
32
ГЛАВА 2. БИБЛИОТЕКА CMSIS
CMSIS (Cortex Microcontrotter Software lnterface Standard) это стандарт, разработанный ARM для унификации программно­
го интерфейса для микроконтроллеров на базе ядер Cortex-M.
Для
STM32F1, который использует ядро Согtех-М3, CMSIS
предоставляет набор макросов, функций и структур данных для
работы с периферией и ядром микроконтроллера.
Вот основные макросы и функции, которые предоставляет
CMSIS для STM32F1.
РАЗЛИЧНЫЕ МАКРОСЫ
1. Макросы для работы с регистрами:
CMSIS предоставляет макросы для доступа к регистрам пе­
риферии. Например:
- _Ю -
для определения votatite-nepeмeнныx (чтение/за­
пись).
- _1 -
для определения votatite-nepeмeнныx только для
чтения.
- _О -
для определения votatite-nepeмeнныx только для
записи.
Пример:
_Ю uint32_t tmpreg;
_ю uint32_t SysTick_CNT = О;
_Ю uint8_t tim2_count = О;
33
2. Макросы для работы с прерываниями:
CMSIS предоставляет макросы для управления прерываниями:
- _enaьte_irq О - разрешение всех прерываний.
- _disaьte_irq О - запрет всех прерываний.
- _WFI О - переход в режим ожидания (Wait For lnterrupt).
- _WFE О - переход в режим ожидания события (Wait For
Event).
3. Макросы для работы с ядром:
-
_NVIC_EnaьtelRQ (IRQn)
-
разрешение конкретного nре­
-
запрет конкретного прерыва­
ры-вания.
-
_NVIC_DisaьtelRQ (IRQn)
ния.
- _NVIC_SetPriority (IRQn, priority) - установка приоритета
пре-рывания.
значения
получение
- _get_PRIMASK 0
PRIMASK.
_set_PRIMASK (value) - установка значения
PRIMASK.
регистра
регистра
и другие.
4. Макросы для работы с системным таймером (SysTick):
- SysTick_Config (uint32_t ticks) - настройка SysТick для ге­
нера-ции прерываний с заданным интервалом.
- SysTick-> CTRL - регистр управления SysTick.
- SysTick-> LOAD - регистр загрузки значения для таймера.
- SysTick-> VAL -
регистр текущего значения таймера.
5. Макросы для работы с периферией:
34
CMSIS предоставляет структуры для доступа к регистрам периферии. Например:
- GPIO_TypeDef - структура для работы с GPIO.
- USART_TypeDef - структура для работы с USART.
- Т1 М_TypeDef - структура для работы с таймерами.
6. Макросы для работы с флагами и битами:
- SET_BIT (REG, BIT) - установка бита в регистре.
- CLEAR_BIT (REG, BIT) - сброс бита в регистре.
- READ_BIT (REG, BIT) - чтение бита в регистре.
изменение
- MODIFY_REG (REG, CLEARMASK, SETMASK)
битов в регистре.
Пример:
SEТ_BIT (GPIOA-> CRL, GPIO_CRL_MODES_0); // Установка би­
та MODES [О] в регистре CRL порта GPIOA
Более подробно работу этих макросов рассмотрим далее
в этой главе.
7. Макросы для работы с CMSIS-Driver:
CMSIS-Driver, то доступны макросы для
работы с драйверами периферии, такими как SPI, 12(, USART
Если используется
и т. д. Отдельная большая тема для разбора.
8. Макросы для работы с отладкой:
- _ВКРТ (value) - установка точки останова (breakpoint).
- _NOP О - выполнение пустой операции (No Operation).
9. Макросы для работы с памятью:
- _STATIC_INLINE -
определение статической iпlinе-функ­
ции.
35
- _ALIGNED (n) -
выравнивание данных по границе n.
10. Макросы для работы с CMSIS-RTOS:
Если используется
CMSIS-RTOS, то доступны макросы для
работы с задачами, семафорами, очередями и т.д.
Пример использования CMSIS для STM32F1:
#include «stm32f1xx. h» // Основной заголовочный файл для
STM32F1
int main (void)
{
// Включение тактирования порта GPIOA
RCC-> APB2ENR 1= RCC_APB2ENR_IOPAEN;
// Настройка вывода PAS как выход push-pull
GPIOA-> CRL &= -GPIO_CRL_CNFS; // Очистка битов CNFS
GPIOA-> CRL 1= GPIO_CRL_MODES_0; // Установка битов
MODES [1:0] = 01 (10 MHz)
while (1) {
GPIOA-> ODR л= GPIO_ODR_ODRS; // Переключение состоя­
ния PAS
for (volatile int i = О; i <100000; i++); // Задержка}
}
МАКРОС SЕТ_BIT ПОДРОБНЕЕ
SET_BIT в библиотеке CMSIS для микроконтролле­
STM32 используется для установки конкретного бита (или
нескольких битов) в регистре в значение 1, не затрагивая
Макрос
ров
остальные биты. Это полезно, когда нужно активировать оnреде­
лённые функции или флаги, не изменяя состояние других битов
в регистре.
36
Описание макроса:
Макрос SET_BIT определён следующим образом:
#define SЕТ_BIT (REG, BIT) ((REG) 1= (BIT))
Разбор макроса побитно:
1. (REG):
- Указывает на регистр, в котором нужно установить бит.
2. (BIT):
- Маска, указывающая, какой бит (или биты) нужно устано­
вить. Например, если BIT = Ох04, это означает, что нужно устано­
вить третий бит (бит 2, если считать с нуля 1=.
**1=**:
-
Оператор побитового ИЛИ с присваиванием. Он устанав­
ливает биты, указанные в маске
BIT, в регистре REG, оставляя
остальные биты без изменений.
Пример использования:
Предположим, у нас есть регистр GPIOA->ODR (регистр дан­
ных вывода порта А), и мы хотим установить бит 5:
SEТ_BIT (GPIOA-> ODR, GPIO_ODR_ODRS);
- GPIO_ODR_ODR5 -
маска для установки бита 5. Например,
если GPIO_ODR_ODR5 = Ох20 (бит 5 установлен в 1).
Побитная работа:
1. Текущее значение регистра GPIOA->ODR считывается.
2. К текущему значению применяется побитовая операция
ИЛИ (1) с маской GPIO_ODR_ODR5.
- Если бит 5 был О, он станет 1.
- Если бит 5 уже был 1, он останется 1.
3. Результат записывается обратно в регистр GPIOA->ODR.
37
Пример с числами:
Предположим, текущее значение регистра GPIOA->ODR рав­
но Ох12 (в двоичном виде: 0001 0010), и мы хотим установить
бит 5 (Ох20, двоичное: 0010 0000):
1. Текущее значение: 0001 0010 (Ох12).
2. Применяем операцию ИЛИ с маской 0010 0000 (Ох20):
1
0001 0010 (Ох12)
0010 0000 (Ох20)
0011 0010 (Ох32)
3. Результат: 0011 0010 (Ох32) записывается обратно в ре­
гистр.
Итог:
Макрос SET_BIT позволяет легко и безопасно устанавливать
определённые биты в регистре, не изменяя состояние других
битов. Это особенно полезно при работе с периферией микро­
контроллера, где часто требуется управлять отдельными битами
в регистрах.
МАКРОС CLEAR_BIT ПОДРОБНЕЕ
Макрос
CLEAR_BIT в библиотеке CMSIS используется для
сброса (очистки) конкретного бита в регистре микроконтролле­
ра STM32. Это удобный способ управления отдельными битами
в регистрах, таких как GPIO, таймеры, USART и других перифе­
рийных устройствах.
Что такое CLEAR_BIT?
Макрос CLEAR_BIT определён в CMSIS и имеет следующий
38
синтаксис:
#define CLEAR_BIT (REG, BIT) ((REG) &= - (BIT))
Параметры:
- REG - адрес регистра, в котором нужно сбросить бит.
- BIT - маска бита (или битов), которые нужно сбросить.
Как работает:
- ·- (ВIТ) • -
инвертирует маску бита. Например, если BIT =
Ох04 (бит 2), то - (BIT) = 0xFB (все биты, кроме бита 2, установ­
лены в '1 ').
- (REG) &= - (BIT) -
выполняет
побитовую
операцию
И между текущим значением регистра и инвертированной мас­
кой. Это сбрасывает указанный бит (биты) в регистре.
Пример использования CLEAR_BIT:
1. Сброс бита в регистре GPIO
Предположим, нужно сбросить бит 5 (например, GPIO_Pin_S)
в регистре данных вывода (ODR) порта GPIOA:
CLEAR_BIT (GPIOA-> ODR, GPIO_Pin_S);
Что происходит:
- GPIOA-> ODR - это регистр данных вывода (Output Data
Register) для порта GPIOA.
- GPIO_Pin_S - это маска для бита 5 (например, Ох0020).
- После выполнения макроса бит 5 в регистре ODR будет
сброшен в ·о·.
2. Сброс бита в регистре управления (CR) USART:
Если нужно сбросить бит включения USART (например, бит
'USART_CRl_UE' в регистре 'CR1 '):
39
CLEAR_BIT (USARТ1-> CR1, USART_CR1_UE);
Что происходит:
- USARТ1-> CRl - это регистр управления 1 (Control
Register 1) для USARТ1.
- USART_CRl_UE - это маска для бита включения USART.
- После выполнения макроса USART будет выключен.
3. Сброс нескольких битов
Можно сбросить несколько битов одновременно, объединив
их маски с помощью побитового ИЛИ:
CLEAR_BIT (GPIOA-> ODR, GPIO_Pin_S I GPIO_Pin_6);
Что происходит:
-
Сбрасываются биты 5 и б в регистре ODR порта GPIOA.
Где используется CLEAR_BIT?
Макрос 'CLEAR_BIТ' широко используется в программировании STM32 для:
1. Управления GPIO:
- Сброс битов в регистрах 'ODR', 'CRL', 'CRH' и других.
- Пример: выключение светодиода, подключённого к определённому выводу.
2. Настройки периферии:
- Сброс битов в регистрах управления таймерами, USART,
SPI, 12С и другими периферийными устройствами.
- Пример: выключение таймера или сброс флагов прерыва­
ний.
3. Работа с флагами:
40
- Сброс флагов статуса в регистрах, таких как 'SR' (Status
Register) для USART или таймеров.
Пример программы с использованием 'CLEAR_BIT'
// Сброс бита PAS (выключение светодиода)
CLEAR_BIT (GPIOA-> ODR, GPIO_Pin_S);
Преимущества CLEAR_BIT:
1. Удобство: Упрощает код, делая его более читаемым.
2. Безопасность: Гарантирует, что сбрасываются только ука­
занные биты, не затрагивая остальные.
3. Эффективность: Использует побитовые операции, которые
выполняются быстро.
Итог:
Макрос 'CLEAR_BIT' - это мощный инструмент для управле­
ния регистрами в STM32. Он позволяет сбрасывать отдельные
биты
с
или
группы
битов, что
особенно
полезно при
работе
GPIO, таймерами, USART и другими периферийными устрой­
ствами.
МАКРОС READ_BIT ПОДРОБНЕЕ
Макрос READ_BIT в библиотеке CMSIS для микроконтролле­
ров STM32 используется для чтения значения конкретного бита
(или нескольких битов) в регистре. Он возвращает значение би­
та (или битов), указанного в маске, не изменяя при этом сам ре­
гистр.
Описание макроса:
Макрос READ_BIT определён следующим образом:
#define READ_BIT (REG, BIT) ((REG) & (BIT))
Разбор макроса побитно:
41
1. (REG):
- Указывает на регистр, из которого нужно прочитать бит
(или биты).
2. (BIT):
- Маска, указывающая, какой бит (или биты) нужно прочи­
тать. Например, если BIT = Ох04, это означает, что нужно прочи­
тать третий бит (бит 2, если считать с нуля 3).
** &**:
- Оператор побитового И. Он используется для извлечения
зна-чения бита (или битов), указанного в маске BIT.
Пример использования:
Предположим, у нас есть регистр GPIOA->IDR (регистр вход­
ных данных порта А), и мы хотим прочитать бит 5:
uint32_t Ьit_vaLue = READ_BIT (GPIOA-> IDR, GPIO_IDR_IDRS);
- GPIO_l~R_IDR5 - маска для чтения бита 5. Например, если
GPIO_IDR_IDR5 = Ох20 (бит 5 установлен в 1).
Побитная работа:
1. Текущее значение регистра GPIOA->IDR считывается.
2. К текущему значению применяется побитовая операция И
(&) с маской GPIO_IDR_IDR5.
- Если бит 5 был 1, результат будет Ох20 (значение маски).
- Если бит 5 был О, результат будет ОхОО.
3. Возвращается результат операции.
Пример с числами:
GPIOA->IDR рав­
0010), и мы хотим прочитать
Предположим, текущее значение регистра
но Ох32 (в двоичном виде: 0011
бит 5 (Ох20, двоичное: 0010 0000):
42
1. Текущее значение: 0011 0010 (Ох32).
2. Применяем операцию И с маской 0010 0000 (Ох20):
&
0011 0010 (Ох32)
0010 0000 (Ох20)
0010 0000 (Ох20)
3. Результат: 0010 0000 (Ох20). Это означает, что бит 5 уста­
новлен в ·1 •.
Если бы
значение
регистра
было Ох12
(двоичное:
0001
0010), результат был бы:
0001 0010 (Ох12)
& 0010 0000 (Ох20)
0000 0000 (ОхОО)
В этом случае бит 5 равен О.
Итог:
Макрос READ_BIT позволяет легко и безопасно читать зна­
чение определённого бита (или битов) в регистре. Это полезно
при проверке состояния флагов, входных сигналов или других
битовых полей в регистрах микроконтроллера.
МАКРОС MODIFY_REG ПОДРОБНЕЕ
Макрос
троллеров
MODIFY_REG в библиотеке CMSIS для микрокон­
STM32 используется для изменения значений кон­
кретных битов в регистре, не затрагивая остальные биты. Это
удобно, когда нужно изменить только часть регистра, сохранив
текущее состояние остальных битов.
43
Описание макроса:
Макрос MODIFY_REG определен следующим образом:
#define MODIFY_REG (REG, CLEARMASK, SEТMASK)
WRITE_REG ((REG), (((READ_REG (REG)) & (- (CLEARMASK))) 1
(SEТMASK)))
Разбор макроса побитно:
1. READ_REG (REG):
- Читает текущее значение регистра REG.
2. - (CLEARMASK):
- Инвертирует маску CLEARMASK. Это нужно для обнуления
битов, указанных в CLEARMASK.
3. (READ_REG (REG)) & (- (CLEARMASK)):
- Применяет инвертированную маску CLEARMASK к текуще­
му
значению
регистра.
Это
обнуляет
биты,
указанные
в
CLEARMASK.
4. 1 (SETMASK):
- Устанавливает биты, указанные в SETMASK, в результирую­
щем значении.
5. WRITE_REG ((REG), ... ):
- Записывает полученное значение обратно в регистр REG.
Пример использования:
Предположим, у нас есть регистр GPIOA->ODR (регистр дан­
ных вывода порта А), и мы хотим изменить биты 5 и 6, устано­
вив бит 5 и сбросив бит 6:
GPIO_ODR_ODR6,
ODR,
(GPIOA->
MODIFY_REG
GPIO_ODR_ODRS);
- GPIO_ODR_ODR6 - маска для сброса бита 6.
- GPIO_ODR_ODR5 - маска для установки бита 5.
44
Побитная работа:
1. Читается текущее значение GPIOA->ODR.
2. Применяется инвертированная маска -GPIO_ODR_ODR6,
чтобы обнулить бит 6.
3. Устанавливается бит 5 с помощью маски GPIO_ODR_ODRS.
4. Результат записывается обратно в GPIOA->ODR.
Этот подход гарантирует, что изменяются только указанные
биты, а остальные остаются без изменений.
ЧАСТЫЙ ВОПРОС: КАКИМ СПОСОБОМ
ПРАВИЛЬНО ПРИСВАИВАТЬ ЗНАЧЕНИЕ БИТА
РЕГИСТРА: "=" ИЛИ "1="?
В контексте работы с регистрами микроконтроллеров, осо­
бенно с регистрами управления GPIO, важно понимать разницу
между операциями присваивания (=) и побитового ИЛИ с при­
сваиванием (1=). В обычных битовых операциях принято следую­
щим образом работать с записью в них.
Возьмем такой пример:
GP/08-> BSRR = GPIO_BSRR_BS2;
В
этом
случае
вы
напрямую
записываете
значение
GPIO_BSRR_B52 в регистр BSRR. Это означает, что все остальные
биты регистра будут сброшены в О, а бит, соответствующий
GPIO_BSRR_B52, будет установлен в 1.
Это может быть нежелательно, если вы хотите изменить
только конкретный бит, не затрагивая остальные.
Следующий пример записи:
GP/08-> BSRR 1= GPIO_BSRR_BS2;
Здесь используется побитовая операция ИЛИ с присваива­
нием.
Это
означает,
что
только
45
бит,
соответствующий
GPIO_BSRR_B52, будет установлен в 1, а остальные биты оста­
нутся без изменений.
Это безопаснее, если вы хотите изменить только конкретный
бит, не трогая остальные.
Обе формы работы с битами регистрами справедливы, кро­
ме одной особенности: для бита
ность -
BSRR это следующая особен­
он, бит, имеет статут Write OnLy, как и некоторые дру­
гие биты регистров
GPIO, переферии, которых меньшинство,
а именно: чтение BSRR вернет всегда значение сброса, то есть
О. Дальше мы берем и делаем ИЛИ и пишем в BSRR, для кото­
рого важны только единицы. То есть с битом BSRR что-то зате­
реть невозможно.
Получается для таких битов достаточно делать операцию "=".
Получается, если кто-то пишет ПО для МК для чего-то очень
важного и быстрого, то он конечно должен знать эти особенные
регистры и сможет использовать работу МК на несколько тактов
быстрее. Иначе все тоже будет успешно работать, ведь
MCU
не вернет ошибку в ответ на чтение. Получается любителям или
начинающим спокойнее писать "1=», а профи решают сами, что
нужно для того чтобы иметь бОльшую производительность рабо­
ты мк.
46
ГЛАВА 3. АНАЛОГОВО-ЦИФРОВОЙ
ПРЕОБРАЗОВАТЕЛЬ:АDС
Что вообще такое аналого-цифровой преобразователь? Ана­
лого-цифровой
преобразователь
(АЦП,
Analog-to-digital
converter, ADC) - устройство, преобразующее входной аналого­
вый сигнал в цифровой сигнал (в цифровой двоичный код). Это
устройство одно из большего числа периферии микроконтрол­
леров от ST.
Рассмотрим АЦП применительно для нашего МК STM32F1.
В нем встроен 12-разрядный АЦП, который представляет со­
бой
аналого-цифровой
преобразователь
последовательного
приближения. У некоторых других МК бывает сигма-дельта АЦП.
В серии
F1 АЦП имеет до 18 мультиплексированных каналов,
что позволяет измерять сигналы от шестнадцати внешних и двух
внутренних источников сигнала. Аналого-цифровое преобразо­
вание
различных
каналов
может
выполняться
в
одиночном,
непрерывном, сканирующем или прерывистом режиме. Некото­
рые из этих режимов мы рассмотрим подробно в книге. Резуль­
тат работы АЦП сохраняется в 16-разрядном регистре данных,
выровненном по левому краю или по правому краю. В нашем
МК STM32F103C8 (В) Тб у нас два блока ADC по
10 каналов.
В первом блоке два внешних канала на встроенный температур­
ный датчики и измерении Vrefint -
это внутренний опорный .ис­
точник напряжения, используемый для калибровки АЦП.
Функция аналогового сторожевого таймера позволяет на­
шей
за
прошивке определять,
выходит ли
входное
напряжение
пределы установленных пользователем высоких или низких
пороговых значений.
Тактовая частота на входе АЦП генерируется из тактовой ча­
стоты РСLК2, разделенной на прескалер, и не должна превы-
47
шать 14МГц, смотрите рисунок 13 книги «Освоение STM32 само­
стояте-льно #1» -
[1].
Основные характеристики АЦП STM32F103 которые нужно
знать:
- разрешение 12 бит;
- формирование прерываний по событиям «Конец преобра-зования»,
«Конец
инжектированного
преобразования»
и «Аналоговый сторожевой таймер;
- Однократный и непрерывный режимы преобразования;
- Режим сканирования для автоматического преобразования ка-нала О в канал 'п';
-
Самокалибровка;
Согласование данных со встроенной когерентностью дан-
ных;
- Поканально программируемое время выборки;
- Возможность внешнего запуска для обычного и инжекторного преобразования;
- Прерывистый режим;
- Двойной режим (в устройствах с 2 АЦП и более);
- Время преобразования АЦП 1 мкс на частоте 56 МГц
(1,17 мкс на частоте 72 МГц);
- Требования к питанию АЦП: от 2,4 до 3,6 В;
- Диапазон входных сигналов АЦП: VREF- ~ VIN ~ VREF+;
- Формирование запроса ОМА при обычном преобразовании канала;
-
Вывод МК VREF-, если имеется (в зависимости от корпуса),
должен быть подключен к выводу VSSA.
На следующем рисунке представлена достаточно сложная
схема работы АЦП STM32F103:
48
ADC lnlcrrupc 10 NVIC
Analog
с
W&lchdog
"! Resuk
flqJ Tt,cshold (12 Ь.S)
LOW Thre$h08d (12 ЬitsJ
Regul.'Jr dat& registe,
(16Ь. sJ
ADCJLIN0ADCJLIN1 -
AOCCLK
Analog 1О d,gnal
Convelle<
ADCJLIN 1S-
From ADC prescater
JEXTSEЦ2 :0J bllS
TIM1 _TRGO
Т\М1 _СН4
TIM2_TRGO
TIM2_CH1
ТIМЗ_СН4
ТIM4_TRGO
JEXTSEL(2:0J Ьils
EXTRIG
ADCx- EТRGINJ _REMAP Ьil
Ьil
TIM1_TRGO
TIM1_CH4
ТIМ4 _СНЗ
TIM8_CH2
ТIМ8 _СН4
TIMS_TRGO
ТIМ5_СН4
EXTSEL(2:0J Ьits
ТIМЗ _ СН1
тIм2 _снз
ТIМ1 _СНЗ
TIM8_CH1
TIMBJRGO
TIM5_CH1
IMS_TRGOII J
ТIМS_СНЗ
ADCx _ETRGREG RЕМАР Ыt
Рисунок 3.1 -
Triggers fDr досз< 1 >
Блок-схема одиночного АЦП
Ссылки блок-схемы:
49
1. В ADC3 есть обычные и встроенные триггеры преобразо­
вания, отличные от таковых в ADC1 и ADC2.
2. TIME8_CH4 и TIM8_DRAGON с соответствующими битами
пере-назначения существуют только в продуктах высокой плот­
ности и ХL-плотности.
ВЫВОДЫ АЦП (PINS)
На
рисунке
3.1
показаны
выводы
работы АЦП, рассмот­
рим их:
-
VREF+: Вход, аналоговый опорный положительный: старшее/
положительное опорное напряжение для АЦП и в диапазоне
обязательно 2,4 В , VREF+ ,
VDDA;
- V00д: Вход, аналоговое питание: Аналоговый источник пи­
тания, равный VDD и в диапазоне обязательно 2,4 В , VDDA ,
3,6 В;
- Vш.: Вход, аналоговый опорный отрицательный: Нижнее/
отрицательное опорное напряжение для АЦП, VREf. = V 55 д;
- V55д: Вход, заземление аналогового питания: «земля» для
аналогового источника питания, равная V55 ;
- ADCx_lN [15:0]: входы аналоговых сигналов: Количество
F1, может быть
до 21 аналогового канала.
меняется в зависимости от корпуса и модели
УПРАВЛЕНИЕ ВКЛЮЧЕНИЕМ
И ВЫКЛЮЧЕНИЕМ АЦП
Включение питания АЦП осуществляется установкой бита
ADON в регистре ADC_CR2. При первой установке бита ADON
происходит пробуждение АЦП из режима Power Down.
Преобразование начинается, когда бит ADON устанавливает­
ся второй раз программно по истечении времени включения
АЦП (tsТАВ).
Преобразование может быть остановлено, а АЦП переведен
в режим пониженного энергопотребления сбросом бита ADON.
50
В этом режиме АЦП практически не потребляет энергии (всего
несколько мкА).
Тактовый
генератор
ADCCLK,
обеспечиваемый
ром тактовых импульсов, синхронизирован с
контролле­
PCLK2 (тактовый
генератор АРВ2). Контроллер RCC имеет специальный програм­
мируемый прескалер для тактового генератора АЦП [2].
ВЫБОР КАНАЛА АЦП
Существует 16 мулыиплексированных каналов. Преобразо­
вания можно разбить на две группы: обычные (они также назы­
ваются регулярные, от английского - regular) и инжекторные
(injected). Группа состоит из последовательности преобразова­
ний, которые могут выполняться в любом канале и в любом по­
рядке.
Например, можно выполнить преобразование в следующем
nopядкe:Ch2,Ch1,Ch8,Ch5,Ch5,Ch5,Ch2,Ch9,Ch1.
• Обычная группа состоит из преобразований до 16. Регу­
лярные каналы и их порядок в последовательности преобразо­
ваний должны быть выбраны в регистрах ADC_SQRx. Общее ко­
личество
преобразований
в
регулярной
группе должно быть
записано в разряды L [3:0] регистра ADC_SQR1.
• Инжектируемая группа состоит не более чем из 4 преобра­
зований. Инжектируемые каналы и их порядок в последователь­
ности
преобразований
должны
быть
выбраны
в
регистре
ADC_JSQR. Общее количество преобразований в инжектируемой
группе должно быть записано в разряды L [1:0] регистра
ADC_JSQR.
Если регистры ADC_SQRx или ADC_JSQR изменяются во вре­
мя преобразования АЦП, то текущее преобразование сбрасыва­
ется и на АЦП посылается новый стартовый импульс для преоб­
разования новой выбранной группы.
51
ВНУТРЕННИЕ КАНАЛЫ АЦП: ДДТЧИК
ТЕМПЕРАТУРЫ МК
Датчик температуры подключен к каналу ADCx_lN16, а внут­
реннее опорное напряжение VREFINT -
к
ADCx_lN17. Эти два
внутренних канала могут быть выбраны и преобразованы как
инжекторные так и обычные.
РЕЖИМ ОДНОКРАТНОГО ПРЕОБРАЗОВАНИЯ
В режиме одиночного преобразования АЦП выполняет толь­
ко одно преобразование.
Запуск этого режима осуществляется либо установкой бита
ADON в регистре ADC_CR2 (только для обычного канала), либо
внешним триггером (для обычного или инжектируемого канала),
при этом бит CONT равен О.
После завершения преобразования выбранного канала:
• Если был преобразован обычный канал:
- Преобразованные данные сохраняются в 16-разрядном
ре-гистре ADC_DR;
- Устанавливается флаг ЕОС (Епd Of Conversion);
- и прерывание генерируется, если установлен параметр
EOCIE.
• Если инжектированный канал был преобразован:
- Преобразованные данные сохраняются в 16-разрядном
регистре ADC_DRJ1;
- Устанавливается флаг JEOC (End OfConversion lnjected);
- и прерывание генерируется, если установлен бит
JEOCIE.
После этого АЦП останавливается.
52
РЕЖИМ НЕПРЕРЫВНОГО ПРЕОБРАЗОВАНИЯ
В
режиме
непрерывного
преобразования
АЦП
начинает
очередное преобразование, как только завершает одно. Этот ре­
жим запускается либо внешним триггером, либо установкой би­
та ADON в регистре ADC_CR2, когда бит CONT равен 1.
После каждого преобразования:
• Если был преобразован обычный канал:
- Преобразованные данные сохраняются в 16-разрядном
регистре ADC_DR;
- Устанавливается флаг ЕОС (End Of Conversion);
- Прерывание генерируется, если установлен параметр
EOCIE.
• Если инжектированный канал был преобразован:
- Преобразованные данные сохраняются в 16-разрядном
регистре ADC_DRJ1;
- Устанавливается флаг JEOC (Епd Of Conversion lnjected);
- Прерывание генерируется, если установлен бит JEOCIE.
53
ВРЕМЕННАЯ ДИАГРАММА РАБОТЫ АЦП:
ADC_CLK
ADON
SWSTART/ _ , . __
JSWSTART
__,___
__,n.,__________~--и-.jn,__.--____
\..
\...:
Start 1st f"version
S1art nex~conversi~
'
'
ADC-.-----.----➔1-ADC_co_nve..,.4rsю-·_пJ.-I_ _ _ _ _J.-1_Next_ADC_co_nveв_юn_
: Conversion time :
•
•.4
- - • •1 tsтАВ4
: (total oonv. lime) 1
1
ЕОС'-+-:--+-------;;,.........fr1-f-----<
и )-·--.---Software ctears the ЕОС Ьit
Рисунок 3.2 - Работа АЦП в сигналах
Как показано на рисунке 3.2, АЦП требуется время стабили­
зации, равное tsтдв секунд, прежде чем он начнет точное преоб­
разование. После начала преобразования АЦП и после 14 так­
тов устанавливается флаг ЕОС, и 16-разрядный регистр данных
АЦП содержит результат преобразования.
АНАЛОГОВЫЙ СТОРОЖЕВОЙ ТАЙМЕР
Бит состояния аналогового сторожевого таймера AWD уста­
навливается, если
аналоговое
напряжение,
преобразованное
АЦП, ниже низкого или выше высокого порога. Эти пороги про­
граммируются в 12 младших битах 16-разрядных регистров
ADC_HTR и ADC_LTR. Прерывание может быть разрешено с по­
мощью бита AWDIE в регистре ADC_CR1.
Пороговое значение не зависит от выравнивания, выбран­
ного битом ALIGN в регистре ADC_CR2. Сравнение производится
перед выравниванием (см. раздел Data alignment - Выравнива­
ние данных).
54
Аналоговый сторожевой таймер может быть включен на од­
ном или нескольких каналах путем конфигурирования регистра
ADC_CR1, как показано в табл. 3.1:
ADC_CR1 reglster control blts (х • don't care)
Chaпnels to Ье guarded Ьу analog
watchdog
AWDSGLblt
AWDEN Ьit
JAWDEN blt
None
х
о
о
AII injected channels
о
о
1
AII regular channels
о
1
о
AJI regular and injected channels
о
1
1
Single< 1) injected channel
1
о
1
Single< 1) regular channel
1
1
о
Single(1) regular or inJected channel
1
1
1
Таблица 3.1 -
Настройки всех АЦП сторожевого таймера
РЕЖИМ СКАНИРОВАНИЯ
Этот режим используется для сканирования группы аналого­
вых каналов. Режим сканирования может быть выбран установ­
кой бита SCAN в регистре ADC_CR1. После установки этого бита
АЦП сканирует все каналы, выбранные в регистрах
ADC_SQRx
(для обычных каналов) или ADC_JSQR (для инжектированных ка­
налов). Для каждого канала группы выполняется одно преобра­
зование. После каждого окончания преобразования автоматиче­
ски преобразуется следующий канал группы. Если установлен
бит CONT, то преобразование не останавливается на последнем
выбранном канале группы, а продолжается с первого выбранно­
го канала группы.
При использовании режима сканирования должен быть уста­
новлен бит DMA, и контроллер прямого доступа к памяти исполь­
зуется для передачи преобразованных данных каналов регуляр­
ной группы в SRAM после каждого обновления регистра ADC_DR.
Преобразованные данные инжектированного канала всегда
хранятся в регистрах ADC_JDRx.
55
УПРАВЛЕНИЕ ИНЖЕКТИРУЕМЫМ КАНАЛОМ
Инициированная инъекция (Тriggered injection)
Для использования триггерной инжекции необходимо сбро­
сить бит JAUTO и-установить бит SCAN в регистре ADC_CR1.
1. Запуск преобразования
группы обычных каналов осу­
ществляется либо по внешнему триггеру, либо по установке бита
ADON в регистре ADC_CR2.
2. Если во время преобразования обычного группового ка­
нала возникает внешний инжектируемый триггер, то текущее
преобразование сбрасывается и последовательность инжектиру­
емых каналов преобразуется в режиме однократного сканиро­
вания (Scan once).
3. После этого регулярное преобразование группового кана­
ла возобновляется с последнего прерванного регулярного пре­
образования. Если во время инжектируемого преобразования
происходит
регулярное
событие,
то
оно
не
прерывает его,
но регулярная последовательность выполняется в конце инжек­
тируемой последовательности.
На рис. 3.3 показана временная диаграмма:
ADCCLK
'
_Jl________
Событие
инъекции
П. . - - + - - - - - - - - -
Сброс
---+-_.....
АЦП
''
1
soc
,:◄
максимальная
задержка t•)
'
j,----.
.____________
1
1
1
Рисунок 3.3 - Введенная задержка преобразования
56
Сноска рисунка 3.3:
1. Максимальное значение задержки можно найти в электри­
ческих характеристиках технических даташитов STM32F101xx
и STM32F103xx.
Примечание: При использовании триггерной инжекции ин­
тервал между срабатываниями должен быть больше, чем длина
последовательности инжекции. Например, если длина последо­
вательности составляет 28 тактов АЦП (то есть два преобразо­
вания с временем выборки
мальный
интервал
между
1,5 тактового
периода), то мини­
триггерами
должен
составлять
29 тактов АЦП.
Автоинъекция (Auto-injection)
Если бит JAUTO установлен, то инжектированные групповые
каналы автоматически преобразуются после обычных группо­
вых каналов. Это может быть использовано для преобразования
последовательности до 20 преобразований, запрограммирован­
ных в регистрах ADC_SQRx и ADC_JSQR.
В этом режиме внешний триггер на инжектируемых каналах
должен быть отключен. Если в дополнение к биту JAUTO уста­
новлен бит CONT, то обычные каналы, за которыми следуют ин­
жектированные, преобразуются непрерывно.
Для прескалеров АЦП от 4 до 8 при переходе от обычной
последовательности к инжектированной (соответственно, от ин­
жектированной к обычной) автоматически вводится задержка
в 1 тактовый период АЦП. При установке прескалера АЦП в зна­
чение 2 задержка составляет 2 тактовых периода АЦП.
Примечание: Одновременное использование режимов авто­
инжекции и прерывистого режима невозможно.
57
ПРЕРЫВИСТЫЙ РЕЖИМ (DISCONTINUOUS
MODE)
Реrулярная rpynna каналов АЦП
Этот режим включается установкой бита DISCEN в регистре
ADC_CR1. Он может быть использован для преобразования ко­
роткой последовательности из п преобразований (п <=8}, которая
является частью последовательности преобразований, выбран­
ной в регистрах ADC_SQRx. Значение п задается записью в биты
DISCNUM [2:0] регистра ADC_CR1.
При возникновении внешнего триггера начинается следую­
щее п преобразований, выбранных в регистрах ADC_SQRx, пока
не будут выполнены все преобразования в последовательности.
Общая длина последовательности определяется битами
L [3:0]
регистра ADC_SQR1.
Пример:
п = 3, преобразуемые каналы = О, 1, 2, 3, 6, 7, 9, 10
первый триггер: последовательность преобразована О, 1, 2.
Событие ЕОС генерируется при каждом конверсии
второй триггер: последовательность преобразований 3, 6, 7.
При каждом преобразовании генерируется событие ЕОС
третий триггер: последовательность преобразована
9, 10.
Событие ЕОС генерируется при каждом преобразовании Четвер­
тый триггер:
последовательность преобразована О, 1, 2. Событие ЕОС ге­
нерируется при каждом преобразовании
Примечание:
При преобразовании обычной группы в прерывистом режи­
ме переноса не происходит. Когда все подгруппы будут преоб­
разованы, следующий триггер начнет преобразование первой
подгруппы.
В приведенном примере четвертый триггер переконверти­
рует каналы первой подгруппы О, 1 и 2.
58
Группа инъекций (lnjected group)
Этот режим включается установкой бита JDISCEN в регистре
ADC_CR1. Он может быть использован для поканального преоб­
разования
последовательности,
выбранной
в
регистре
ADC_JSQR, по событию внешнего триггера.
При возникновении внешнего триггера начинается преобра­
зование следующего канала, выбранного в регистрах ADC_JSQR,
пока не будут выполнены все преобразования в последователь­
ности. Общая длина последовательности определяется битами
JL (1:0] регистра ADC_JSQR.
Пример:
п = 1, преобразуемые каналы = 1, 2, 3
первое срабатывание: преобразован
канал 1
второй триггер: канал 2 преобразован
третий триггер: канал 3 преобразован и сформированы со­
бытия
ЕОС и JEOC четвертый триггер: канал 1
Примечание: Когда все инжектируемые каналы преобразо­
ваны, следующий триггер начинает преобразование первого ин­
жектируемого канала. В приведенном примере четвертый триг­
гер переконвертирует первый инжектируемый канал 1.
Одновременное использование автоинжекционного и пре­
рывистого режимов невозможно.
Пользователь не должен устанавливать прерывистый режим
для обычной и инжектируемой групп одновременно. Прерыви­
стый режим должен быть включен только для одного группового
преобразования.
КАЛИБРОВКА
АЦП имеет встроенный режим самокалибровки. Калибровка
значительно снижает погрешность, обусловленную вариациями
внутренней батареи конденсаторов. В процессе калибровки для
59
каждого
конденсатора
вычисляется
код
коррекции
ошибок
(цифровое слово), и при всех последующих преобразованиях
вклад ошибки каждого конденсатора устраняется с помощью
этого кода.
Калибровка запускается установкой бита CAL в регистре
ADC_CR2. По окончании калибровки бит CAL сбрасывается аппа­
ратным способом, и можно выполнять обычное преобразова­
ние. Рекомендуется проводить калибровку АЦП один раз при
включении питания. Коды калибровки сохраняются в
ADC_DR
сразу после окончания фазы калибровки.
Примечание: Рекомендуется
выполнять калибровку после
каждого включения питания. Перед началом калибровки АЦП
должен находиться в состоянии включения питания (бит ADON =
«1») не менее двух тактов АЦП.
CLK
_ГLГLЛ_Л_}1__f1_--Г\fU1-Л-Л-Л
1
СА1.
4
cбi,J каnиброеом
1
1 Калибровка
1.....,,.фтным сnособом
~::'""°'
•
ti>-----Н-ор_маn_ьное
_ _ _ __
=вереи-•----'---------....L·-------f\APi,.1all4itfiplll'IIOll080Нa1rмo,o.д1Щ~Re----
Рисунок 3.4 -
Временная диаграмма калибровки
ВЫРАВНИВАНИЕ ДАННЫХ
Бит ALIGN в регистре ADC_CR2 выбирает выравнивание дан­
ных, сохраняемых после преобразования. Данные могут быть
выровнены
влево
или
вправо,
как
показано
на
рис.
3.5 и рис. 3.6.
Инжектированное значение преобразованных данных груп­
повых каналов уменьшается на заданное пользователем смеще­
ние, записанное в регистрах ADC_JOFRx, поэтому результат мо­
жет быть отрицательным. Бит SEXT - это расширенное значение
знака.
60
Для
групповых
обычных
производится,
не
поэтому
смещения
вычитание
каналов
значимыми
являются
только двена­
дцать битов.
lnjected group
SE
SEXT SEXT SEXT
D11
D10
D9
D7
D8
D6
D5
D4
DЗ
D2
D1
00
Regular group
1О
IО IО I О 1 1 1 1 1 1 1 1 1 1 1 1 1
011
D10
Рисунок 3.5 -
D9
D7
D8
D6
D5
D4
03
D2
lnjected group
! I 1 оз 1 1 1 оо I о
1 1 1 1 1 1 1 1 1 1 1 1 1О I О
os
D4
D4
D3
02
01
D1
00
Regular group
D10
D9
07
D8
D6
Рисунок 3.6 -
00
Выравнивание данных вправо
1sехт! 011 1010 1 D9 1ов 101 1 D6
D11
01
D5
D2
Iо
О IО
о
Выравнивание данных влево
ПРОГРАММИРУЕМОЕ ВРЕМЯ ВЫБОРКИ
ОТ КАНАЛА К КАНАЛУ
АЦП производит выборку входного напряжения в течение
нескольких
с
и
помощью
циклов
битов
ADC_CLK, которые могут быть изменены
SMP [2:0] в регистрах ADC_SMPR1
ADC_SMPR2. Для каждого канала может быть выбрано свое
время выборки.
Общее время преобразования рассчитывается следующим
образом:
Тсопv = Время выборки +12,5 циклов
61
Пример:
При частоте ADCCLK = 14 МГц и времени выборки 1,5 цикла:
Tconv = 1,5 +12,5 = 14 циклов= 1 мкс.
ПРЕОБРАЗОВАНИЕ ПО ВНЕШНЕМУ ТРИГГЕРУ
Преобразование может быть инициировано внешним собы­
тием (например, захватом таймера, линией EXTI). Если установ­
лен управляющий бит ЕХТ- TRIG, то внешние события могут ини­
ЕХТ- SEL
преобразование. Управляющие биты
[2:0) и JEXТSEL [2:0] позволяют приложению выбрать, какое
из 8 возможных событий может запустить преобразование для
циировать
обычной и инжектируемой групп.
Примечание: Если для обычного или инжекторного преобра­
зования АЦП выбран внешний триггер, то запустить преобразо­
вание можно только по нарастающему фронту сигнала.
Тип
Источник
EXТSEL[2:0]
Событие TIM1_CC1
ООО
Событие TIM1_CC2
001
010
Событие ТIМ1_ССЭ
Внутренний сигнал от встроенных
Событие TIM2_CC2
таймеров
011
Событие ТIМЭ_TRGO
100
Событие TIM4_CC4
101
EXTI строка 11 1событие
TIMB TRGQ(1X 2I
SWSTART
Внешний вывод I Внутренний сигнал от
таймеров микросхемы
Бит программного управления
1.
Событие TIMS_TRGO существует только в устройствах высокой и ХL•nлотности.
2.
Выбор внешнего триrrера EXTI line11 или собып~я TIM8_TRGO для обычных каналов
110
111
осущестеляется, ссответственно, через конфиrурационные биты ADC1_ETRGREG_REMAP и
ADC2_ETRGREG_REMAP для АЦП1 и АЦП2.
Таблица 3.2 -
Внешний триггер для регулярных каналов для
АЦП1 и АЦП2
62
Тип соединения
Источник
JEXTSEL[2:0]
Событие TIM1_TRGO
ООО
Событие ТIМ1_СС4
001
010
Событие TIM2_TRGO
Внутренний сигнал от встроенных
таймеров
Событие TIM2_CC1
011
Событие ТIМ3_СС4
100
Событие TIM4_TRGO
101
Внешний вывод/внутренний сигнал
Линия EXTI 15fПМ8_СС4
событие(1 !(21
от таймеров микросхемы
JSWSTART
Бит программного управления
110
111
1.
Событие ТIМ8_СС4 существует только в устройсrвах высокой и Хl•nлотности.
2.
Выбор события внешнего триггера ЕХТI line15 или TIMB СС4 для инжектируемых каналов
осуществляется через конфиrурационные биты дDC1_1:1"RGINJ_REMдP и
дDC2_ETRGINJ_REMдP для дЦП1 и АЦП2 соответственно.
Таблица 3.3 -
Продолжение. Внешний триггер для регулярных
каналов для АЦП1 и АЦП2
Программные триггеры могут быть сформированы установ­
кой бита в регистре (SWSTART и JSWSTART в AOC_CR2). Обычное
групповое преобразование
может быть прервано введенным
триггером.
ЗАПРОС DMA
Поскольку значение преобразованных регулярных каналов
хранится в уникальном регистре данных, то для преобразования
более одного регулярного канала необходимо использовать DMA.
Это позволяет избежать потери данных, уже хранящихся в реги­
стре AOC_OR.
Только окончание преобразования обычного канала форми­
рует ОМА-запрос, который позволяет передать его преобразо­
ванные данные из регистра
AOC_OR в место назначения, вы­
бранное пользователем.
Примечание: Такая возможность ОМА есть только у АЦП1. Дан­
ные, преобразованные АЦП2, могут быть переданы в режиме
двойного АЦП с использованием ОМА благодаря ведущему АЦП1.
63
РЕЖИМ ДВОЙНОГО АЦП
В устройствах с двумя АЦП и более может использоваться
режим двойного АЦП. В режиме двойного АЦП начало преобра­
зования
запускается
поочередно
или
одновременно
ведущим
АЦП1 и ведомым АЦП2, в зависимости от режима, выбранного
битами DUALMOD [2:0] в регистре ADC1_CR1.
Примечание: В двойном режиме при настройке запуска пре­
образования по внешнему событию пользователь должен уста­
новить триггер только для ведущего и задать программный триг­
гер для ведомого, чтобы предотвратить ложные срабатывания,
запускающие нежелательное преобразование ведомого. Однако
внешние триггеры должны быть включены как на ведущем, так
и на ведомом АЦП.
Реализованы следующие шесть возможных режимов:
- Режим одновременного впрыска;
- Обычный одновременный режим;
- Режим быстрого чередования;
- Режим медленного чередования;
- Альтернативный режим срабатывания;
- Независимый режим.
Возможно также комбинированное использование предыду­
щих режимов:
-
Инжекторный одновременный режим
+ обычный однов­
ре-менный режим;
-
Обычный одновременный режим + режим альтернативно­
го запуска;
-
Режим одновременной инжекции
+ режим чередования.
Примечание: В режиме двойного АЦП для чтения преобразо­
ванных данных ведомого устройства в регистре данных ведуще­
го устройства необходимо включить бит
DMA, даже
если он
не используется для передачи преобразованных данных обыч­
ного канала.
Более подробно о многочисленных режимах можно ознако­
миться в RM0008 для STM32F1 [3].
64
Regular data register
(181,;ts)
lniec.ted data reg1sters
х 18blts)
<•
ADC2 (Slave)
Regulat data reg,s1t!lr
(18blts)(2)
ln}ected data reglsters
(4 х 18Ьrts)
ADCx_lNO ADCx_lN1 -
ADCx_lN1f>Oualmode
n--t---t--; control
ADC1 (Master)
Start tnggtt( mux
{regutar group)
Stan tnggм mui
(il1j8C1e<! group)
Рисунок 3.7 -
Блок-схема работы двух АЦП
65
ДАТЧИК ТЕМПЕРАТУРЫ
Температурный датчик может использоваться для измерения
температуры спая (Ч устройства, а именно нашего МК.
Датчик температуры внутренне подключен к входному ка­
налу
ADCx_lN16,
который
используется для
преобразования
выходного напряжения датчика в цифровое значение. Реко­
мендуемое время выборки для датчика температуры составля­
ет 17,1 мкс.
Блок-схема датчика температуры приведена на рис.
1.21.
Когда датчик не используется, он может быть переведен в ре­
жим пониженного энергопотребления.
Примечание: Для включения обоих внутренних каналов дол­
жен быть установлен бит TSVREFE: ADCx_lN16 (датчик темпера­
туры) и ADCx_lN17 (VREFINT).
Выходное напряжение датчика температуры изменяется ли­
нейно с температурой.
Смещение этой линии варьируется от микросхемы к микро­
схеме из-за различий в технологическом процессе (до
45° С
от микросхемы к микросхеме).
Внутренний датчик температуры больше подходит для при­
ложений, в которых определяются не абсолютные, а темпера­
турные колебания. При необходимости получения точных по­
казаний
температуры
следует использовать
температуры.
66
внешний
датчик
TSVREFE control Ьil
Temperalure
sensor
~
VsENSE
-
ADC1_1N16
"'
:,
.D
.
.1
Converted data
ADC1
~
/
V
lnternal
powerЫock
VREFINT
-
~ ADC1_IN17
/
Рисунок 3.8
-
~
-
Блок-схема датчика температуры и канала
VREFINT
Считывание температуры.
Для использования датчика:
1. Выбор входного канала ADCx_lN16;
2. Выберите время выборки 17,1 мкс;
3. Установка бита TSVREFE в регистре управления АЦ­
П2 (ADC_CR2) приводит к пробуждению датчика температуры
из режима пониженного энергопотребления;
4. Запуск преобразования АЦП осуществляется установкой
бита ADON (или внешним триггером);
5. Считать результирующие данные VSENSE в регистре данных АЦП;
6. Получите температуру по следующей формуле:
Температура (в 0 С) = {(V25 - VSENSE) / Avg_Slope} +25.
где:
25° С и
Avg_Slope = средний наклон кривой зависимости температу­
ры от VSENSE (задается в мВ/ 0 С или мкВ/ 0 С).
Y2s = значение VsENSE для температуры
67
Фактические значения V 25 и Avg_Slope см. в разделе «Элек­
трические характеристики».
Примечание: после выхода из режима питания датчику тре­
буется время на запуск, прежде чем он сможет выдать VSENSE
на нужном уровне. АЦП также имеет время запуска после вклю­
чения
поэтому
питания,
задержки
минимизации
для
биты
ADON и TSVREFE должны быть установлены одновременно.
ПРЕРЫВАНИЯ АЦП
Прерывание может вырабатываться по окончании преобра­
зования для обычных и инжекторных групп, а также при уста­
новке бита состояния аналогового сторожевого таймера. Для
обеспечения
гибкости
отдельные
имеются
биты
разрешения
прерывания.
Примечание:
Прерывания
АЦП1
и
АЦП2
отображаются
на один вектор прерываний.
В регистре ADC_SR присутствуют еще два флага, но преры­
вание с ними не связано:
• JSTRT (Начало
преобразования
для
инжектированных
групповых каналов);
• STRT (Начало конверсии для обычных групповых каналов).
Event flag
lnterrupt event
ЕnаЫе Control Ыt
End of conversion regular group
ЕОС
EOCIE
End of conversion injected group
JEOC
JEOCIE
Analog watchdog status ЬИ is set
AWO
AWOIE
Таблица 3.4 -
Прерывания АЦП
68
РЕГИСТРЫ АЦП
Регистр состояния АЦП (ADC_SR)
31
30
27
28
29
25
26
23
24
22
17
16
20
19
18
SТRT
JSТRT
JEOC
ЕОС
AWO
re_wO
rc_wO
rc_'NO
rc_WO
rc_wo
21
Reserved
15
14
12
13
10
11
Reser.-ed
Таблица 3.5 -
Регистр состояния АЦП (ADC_SR)
Смещение адреса: ОхОО
Сброшенное значение: ОхОООО 0000
Биты
31:24
Зарезервированы,
должны
быть
сохранены
в значении сброса.
Бит 4 STRT: флаг запуска обычного канала
Этот бит устанавливается аппаратно, когда начинается преобразование обычного канала. Он очищается программно:
О: Регулярное преобразование каналов не начато
1: Началось преобразование обычного канала
Бит 3 JSTRT: флаг запуска инжектируемого канала
Этот бит устанавливается аппаратно, когда начинается пре­
образование
группы
инжектируемых
каналов.
Он
очищается
программно.
О: Преобразование инжектируемых групп не началось
1: Преобразование инжектируемых групп началось
Бит 2 JEOC: конец преобразования инжектируемого канала
Этот бит устанавливается аппаратно в конце преобразования всех инжектируемых групповых каналов.
Он очищается программно.
О: Преобразование не завершено
1:Преобразованиезавершено
Бит 1 ЕОС: конец преобразования
Этот бит устанавливается аппаратно в конце преобразова-
69
ния группового канала (обычного или инжектированного). Он
очищается программно или чтением ADC_DR.
О: Преобразование не завершено
1:Преобразованиезавершено
Бит О AWD: флаг аналогового сторожевого таймера
Этот бит устанавливается аппаратно, когда преобразованное
напряжение
пересекает значения, запрограммированные в
ре­
гистрах ADC_LTR и ADC_HTR. Он очищается программно.
О: Событие аналогового сторожевого таймера не произошло
1: Событие аналогового сторожевого таймера произошло
Регистр управления АЦП 1 (ADC_CR1)
Смещение адреса: Ох04
31
30
,.
28
27
26
25
24
Reserved
,.
15
13
DISCNUМ(2 О]
,w
,w
12
11
10
JOISCE
N
DISC
EN
JAUТO
,w
,w
AWO
SGL
SCAN
,,
22
AWOE
N
JAWOE
N
JEDC
IE
AV«>IE
21
20
18
19
17
16
DUALMOD(З О]
ReseNed
EOCIE
AWDCHf-40]
rw
rw
Таблица 3.6 - Регистр управления АЦП 1 (ADC_CR1)
Биты
31:24
Зарезервированы,
должны
быть
сохранены
в значении сброса.
Бит 23 AWDEN: разрешение аналогового сторожевого тай­
мера на обычных каналах Этот бит устанавливается/сбрасывает­
ся программно.
О: Аналоговый сторожевой таймер отключен на обычных ка­
налах
1: Аналоговый сторожевой таймер включен на обычных ка­
налах
Бит 22 JAWDEN: разрешение аналогового сторожевого тай­
мера на инжектируемых каналах Этот бит устанавливается/сбра­
сывается программно.
70
О: Аналоговый сторожевой таймер отключен на инжектируе­
мых каналах
1: Аналоговый сторожевой таймер включен на инжектируе­
мых каналах
Биты
21:20
Зарезервированы,
должны
быть
сохранены
в значении сброса.
Биты 19:16 DUALMOD (3:0): Выбор двойного режима
Эти биты записываются программно для выбора режима ра­
боты. 0000: Независимый режим.
0001: Комбинированный обычный одновременный + инжек­
торный одновременный режим
0010: Комбинированный обычный одновременный + альтер­
нативный триггерный режим
0011: Комбинированный инжектируемый одновременный +
быстрый чередующийся режим
0100: Комбинированный инжектируемый одновременный +
медленный чередующийся режим
0101: Только инжектируемый одновременный режим
0110: Только обычный одновременный режим
0111: Только режим быстрого чередования
1000: Только режим медленного чередования
1001: Только режим альтернативного триггера
Примечание: В АЦП2 и АЦП3 (в других МК) эти биты заре­
зервированы.
В двойном режиме изменение конфигурации канала приво­
дит к перезапуску, что может привести к потере синхронизации.
Рекомендуется отключать двойной режим перед любым измене­
нием конфигурации.
Биты 15:13 DISCNUM (2:0): Счетчик каналов в прерывистом
режиме. Эти биты записываются программно для определения
количества регулярных каналов, которые должны быть преобра­
зованы в прерывистом режиме после получения внешнего триг­
гера.
0000: 1 канал
0001: 2 канала
71
1111: 8 каналов
Бит 12 JDISCEN: Прерывистый режим работы инжектируе­
мых каналов. Этот бит устанавливается и очищается программно
для включения/выключения прерывистого режима на инжекти­
руемых групповых каналах
О: Непрерывный режим по инжектируемым каналам отключен
1: Непрерывный режим по инжектируемым каналам включен
Бит 11 DISCEN: Прерывистый режим на обычных каналах
бит
Этот
снимается
и
устанавливается
включения/выключения режима
Discontinuous
программно
для
на обычных ка­
налах.
О: Прерывистый режим на обычных каналах отключен
1: Прерывистый режим на обычных каналах включен
Бит
10 JAUTO:
Автоматическое
преобразование
группы
впрыска
Этот бит устанавливается и сбрасывается программно для
включения/выключения автоматического
преобразования
ин­
жектированной группы после обычного преобразования группы.
О: Автоматическое преобразование инжектируемой группы
отключено
1: Автоматическое преобразование инжектируемой группы
включено
Бит 9 AWDSGL: включение сторожевого таймера на одном
канале в режиме сканирования. Этот бит устанавливается и очи­
щается
программно для
сторожевого таймера
на
включения/выключения
канале,
аналогового
идентифицируемом
битами
AWDCH (4:0].
О: Аналоговый сторожевой таймер включен на всех каналах
1: Аналоговый сторожевой таймер включен на одном канале
Бит 8 SCAN: режим сканирования
Этот бит устанавливается и очищается программно для вклю­
чения/выключения режима Sсап. В режиме Sсап преобразуются
входы, выбранные через регистры ADC_SQRx или ADC_JSQRx.
72
О: Режим сканирования отключен
1: Режим сканирования включен
Примечание: Прерывание ЕОС или JEOC формируется только
по окончании преобразования последнего канала, если установ­
лен соответствующий бит EOCIE или JEOCIE
Бит 7 JEOCIE: разрешение прерывания для инжектируемых
каналов. Этот бит устанавливается и очищается программно для
включения/выключения прерывания по окончанию преобразо­
вания для инжектируемых каналов.
О: Прерывание JEOC отключено
1: Прерывание JEOC разрешено. Прерывание генерируется,
когда бит JEOC установлен.
Бит 6 AWDIE: разрешение прерывания аналогового стороже­
вого таймера. Этот бит устанавливается и очищается программ­
но для включения/выключения прерывания аналогового сторо­
жевого таймера.
О: Прерывание аналогового сторожевого таймера отключено
1: Прерывание аналогового сторожевого таймера включено
Бит 5 EOCIE: разрешение прерывания для ЕОС
Этот
бит
устанавливается
и
очищается
программно
для
включения/выключения прерывания End of Conversion.
О: Прерывание ЕОС отключено
1: Прерывание ЕОС разрешено. Прерывание генерируется,
когда бит ЕОС установлен.
Биты 4:0 AWDCH [4:0]: Биты выбора канала аналогового сто­
рожевого таймера. Эти биты устанавливаются и очищаются про­
граммно. Они выбирают входной канал, который будет охра­
няться аналоговым сторожевым таймером.
00000: Аналоговый канал АЦПО
00001: Аналоговый канал АЦП1
01111: Аналоговый канал АЦП15
10000: Аналоговый канал АЦП16
10001: Аналоговый канал АЦП17
Другие значения: зарезервировано.
73
16 и 17 АЦП1 внутренне
Примечание: Аналоговые каналы
подключены к датчику температуры и к VREFINт, соответственно.
Аналоговые входы АЦП2 Канал16 и Канал17 внутренне под­
ключены к V55. Аналоговые входы АЦП3 (в других МК) Канал9,
Канал14, Канал15, Канал16 и Канал17 подключены к V55.
Регистр управления АЦП 2 (ADC_CR1)
Смещение адреса: Ох08
эо
31
29
28
26
21
25
24
З.аре,еренровано
,,
14
15
DISCNUM[2,0J
"'
,.,,
12
11
10
JDtSCE
DISC
EN
JAUTO
N
,w
,w
AWD
SGt
,.,,
СКАН
23
22
AWOE
N
ЯВДЕ
н
,.,,
,.
JEOC
rw
21
20
18
19
.....
Зщ№еремро
AWDtE
EOCIE
rw
rw
17
16
OUALMOO(З:0J
""
AWOCH{4:0I
rw
""
Таблица 3.7 - Регистр управления АЦП 2 (ADC_CR2)
Биты
31:24
Зарезервированы,
должны
быть
сохранены
в значении сброса.
Этот бит устанавливается
и
очищается
программно
для
включения/выключения
Бит 23 TSVREFE: разрешение работы датчика температуры
и Уш~Nт• Датчик температуры и канала VREFINT. В устройствах
с двумя АЦП этот бит присутствует только в АЦП1.
О: Датчик температуры и канал VREFINT отключены
1: Датчик температуры и канал VREFINT включены
Бит 22 SWSTART: Начало преобразования обычных кана­
лов
Этот бит устанавливается программно для начала преобра­
зования и снимается аппаратно сразу после начала преобразо­
вания. Он запускает преобразование группы обычных каналов,
если биты EXTSEL [2:0] выбраны в качестве триггерного события
SWSTART.
О: состояние сброса
1: Начинается преобразование обычных каналов
74
Бит 21 JSWSTART: Начало преобразования инжектируемых
каналов. Этот бит устанавливается
программно
и
очищается
программно или аппаратно сразу после начала преобразования.
Он запускает преобразование группы инжектируемых каналов
(если JSWSTART выбран в качестве триггерного события битами
JEXTSEL [2:0).
О: состояние сброса
1: Начинается преобразование инжектируемых каналов
Бит 20 EXТТRIG: режим преобразования внешнего триггера
для обычных каналов. Этот бит устанавливается и очищается
программно для включения/выключения внешнего триггера, ис­
пользуемого для запуска преобразования группы обычных ка­
налов.
О: Преобразование по внешнему событию отключено
1: Преобразование по внешнему событию включено
Биты 19:17 EXТSEL [2:0]: Выбор внешнего события
для
обычной группы. Эти биты выбирают внешнее событие, исполь­
зуемое для запуска преобразования очередной группы: Для АЦ­
П1 и АЦП2 назначаются следующие триггеры:
ООО: Событие таймера 1 СС1
001: Событие таймера 1 СС2
010: Событие таймера 1 СС3
011: Событие таймера 2 СС2
100: Событие TRGO таймера 3
101: Событие таймера 4 СС4
110: Событие ЕХТI линия 11/ТIM8_TRGO (ТIM8_TRGO доступ­
но только в устройствах высокой и ХL-плотности)
111: SWSTART
Бит 16 Зарезервирован, должен быть сохранен в значении
сброса.
Бит 15 JEXТTRIG: режим преобразования внешнего триггера
для инжектируемых каналов. Этот бит устанавливается и очища­
ется программно для включения/выключения внешнего тригге­
ра, используемого для запуска преобразования инжектируемой
группы каналов.
75
О: Преобразование по внешнему событию отключено
1: Преобразование по внешнему событию включено
Биты 14:12 JEXТSEL [2:0]: Выбор внешнего события для ин­
жектируемой группы. Эти биты выбирают внешнее событие, ис­
пользуемое для запуска преобразования инжектируемой группы:
Для АЦП1 и АЦП2 назначены следующие триггеры:
ООО: событие TRGO таймера 1
001: Событие таймера 1 СС4
010: Событие TRGO таймера 2
011: Событие таймера 2 СС1
100: Событие таймера 3 СС4
101: Событие TRGO таймера 4
110: Событие EXTI line15/ТIM8_CC4
(ТIМ8_СС4 доступен
только в устройствах высокой и ХL-плотности)
111: JSWSTART
Бит 11 ALIGN: выравнивание данных
Этот бит устанавливается и сбрасывается программно.
О: Выравнивание вправо
1: Выравнивание влево
Биты 10:9 Зарезервированы, должны быть сохранены в зна­
чении сброса.
Бит 8 DMA: режим прямого доступа к памяти
Этот бит устанавливается и очищается программно. Более
подробная информация приведена в главе «Контроллер ОМА».
О: Режим DMA отключен
1: Режим DMA включен
Только АЦП1 и АЦП3 могут генерировать запрос ОМА.
Биты 7:4 Зарезервированы, должны быть сохранены в зна­
чении сброса.
Бит 3 RSTCAL: Сброс калибровки
Этот бит устанавливается программно и сбрасывается аппа­
ратно. Он очищается после инициализации регистров калиб­
ровки.
О: Инициализация регистра калибровки.
1: Инициализация регистра калибровки.
76
Примечание: Если RSTCAL установлен во время выполнения
преобразования, то для очистки регистров калибровки потребу­
ются дополнительные циклы.
Бит 2 CAL: Калибровка АЦП
Этот бит устанавливается программно для начала калибровки. После завершения калибровки он сбрасывается аппаратно.
О:Калибровказавершена
1: Разрешить калибровку
Бит 1 CONT: непрерывное преобразование
Этот бит устанавливается и сбрасывается программно. Если
он
установлен,
то
преобразование
происходит
непрерывно
до тех пор, пока этот бит не будет сброшен.
О: Режим одиночного преобразования
1: Режим непрерывного преобразования
Бит О ADON: Включение/ выключение АЦП
Этот бит устанавливается и сбрасывается программно. Если
этот бит имеет нулевое значение и в него записана
1, то это
приводит к пробуждению АЦП из состояния Power Down. Преоб­
разование
начинается,
когда
этот
бит
принимает
значение
1 и в него записывается 1. В приложении должна быть преду­
смотрена задержка tsтдв между включением питания и началом
преобразования.
О: Отключение преобразования/калибровки АЦП и переход
в режим пониженного энергопотребления.
1: Включить АЦП и начать преобразование
Примечание: Если в этом регистре одновременно изменяет­
ся любой другой бит, кроме ADON, то преобразование не запус­
кается. Это сделано для предотвращения ошибочного преобра­
зования.
Регистр времени выборки АЦП 1 (ADC_SMPR1)
Смещение адреса: ОхОС
77
31
Э1)
29
29
71
26
25
38реиреироеано
15
14
13
SМР
..
SМP14(2.11J
15_0
rw
rw
12
11
rw
rw
Биты
22
23
..
21
19
20
SMP17(2:0J
18
SMP16(2:0J
rw
1W
17
16
SMP15(2:1J
1W
,w
rw
10
..
SMP13(2.1JJ
Таблица 3.8 -
24
SМP12j2.11)
SМP10(2cOI
SMP11[2c0J
rw
rw
,w
...
1W
Регистр времени выборки АЦП 1 (ADC_SMPR1)
31:24
Зарезервированы,
должны
быть
сохранены
в значении сброса.
Биты 23:0 SMPx [2:0]: Выбор времени выборки канала х
Эти биты записываются программно для выбора времени
выборки индивидуально для каждого канала. Во время циклов
выборки биты выбора канала должны оставаться неизменными.
ООО: 1,5 цикла
001: 7,5 циклов
010: 13,5 циклов
011: 28,5 циклов
100: 41,5 циклов
101: 55,5 циклов
110: 71,5 циклов
111: 239,5 циклов
Примечание: Аналоговые каналы
16 и 17 АЦП1 внутренне
подключены к датчику температуры и к VREFINT• соответственно.
Аналоговые входы АЦП2 Канал16 и Канал17 внутренне подклю­
чены к V55. Аналоговые входы АЦП3 Канал14, Канал15, Канал16
и Канал17 подключены к V55.
Регистр времени выборки АЦП 2 (ADC_SMPR2}
Смещение адреса: ОхОС
78
31
Э()
-
29
----····--··
З,аре30реир:,,е,аti
28
-·~'"··-··
SMP9j2.0)
27
12
11
23
24
25
26
21
22
19
20
18
SMPбj2.0J
SМP712.0J
SMP8{2.0J
17
16
SMP5(2:1J
о
15
1◄
SМР
13
SMP0(2'0]
SMP1(2:0]
SMP2f2c0f
SMP3[2:0J
SMP412:0)
'~"
"'
10
Таблица 3.9 - Регистр времени выборки АЦП 2 (ADC_SMPR2)
Биты
31:30
Зарезервированы,
быть
должны
сохранены
в значении сброса.
Биты 29:0 SMPx [2:0): Выбор времени выборки каналах
Эти биты записываются программно для выбора времени
выборки индивидуально для каждого канала. Во время циклов
выборки биты выбора канала должны оставаться неизменными.
ООО: 1,5 цикла
001: 7,5 циклов
010: 13,5 циклов
011: 28,5 циклов
100: 41,5 циклов
101: 55,5 циклов
110: 71,5 циклов
111: 239,5 циклов
Регистр
инжектируемого
данных
смещения
канала
АЦП х (ADC_JOFRx) (х=1 .. 4)
Смещение адреса:
Ох14-Ох20
31
"'
29
14
13
26
27
26
25
24
23
за
22
21
20
19
16
17
,..
rw
,..
16
....,,.
ировоно
15
12
11
1
10
JOFFSETx[11 :О)
Зt1ре38Рf11-1роес1но
Таблица 3.10 -
rw
,w
rw
Регистр смещения данных инжектируемого ка­
нала АЦП х
79
Биты
31:12
Зарезервированы,
должны
быть
сохранены
в значении сброса.
Биты 11:0 JOFFSETx [11:0): Смещение данных для инжекти­
канала
руемого
Эти
х.
записываются
биты
программно для
определения смещения, вычитаемого из исходных преобразо­
ванных данных при преобразовании инжектированных каналов.
преобразования
Результат
регистров
из
считан
может быть
ADC_JDRx.
Регистр
таймера
сторожевого
порога
высокого
АЦП
(ADC_HTR)
Смещение адреса: Ох24
31
31)
28
29
21
26
25
,.
23
22
21
19
20
18
17
,., 1
,w
18
за..,роеано
15
14
12
13
10
11
7
НТ(11·О\
Эаре,еремроеано
,w
Таблица 3.10 -
1
,w
1
,. 1 ,. 1 ,. 1 ,. 1 ,. 1
,w
1
,w
1
1
"'
Регистр высокого порога сторожевого таймера
АЦП (ADC_HTR)
Биты
31:12 Зарезервированы, должны быть сохранены
в значении сброса.
Биты 11:0 НТ [11:0): Высокий порог аналогового сторожево­
го таймера. Эти биты записываются программно для определе­
ния
высокого порога
срабатывания аналогового сторожевого
таймера.
Примечание: Программа может записывать в эти регистры,
когда идет преобразование АЦП. Запрограммированное значе­
ние вступит в силу после завершения следующего преобразова­
ния. Запись в этот регистр выполняется с задержкой, что может
создать
неопределенность
в
отношении
времени
в силу нового запрограммированного значения.
80
вступления
Регистр
нижнего
порога
сторожевого
таймера
АЦП
18
16
(ADC_LTR)
Смещение адреса: Ох28
"
15
зо
,.
28
,.
13
12
27
26
11
10
25
,. 1 ... 1 ... 1
за.,._.но
-
24
,w
23
22
21
7
6
5
.......
LТJ11c0)
,. 1 ,. 1 ,.
1
20
19
.. .. ,.
1
1
17
1
rw
1
...
Таблица 3.11 - Регистр нижнего порога сторожевого таймера
АЦП (ADC_LTR)
Биты
31:12
Зарезервированы,
должны
быть
сохранены
в значении сброса. Биты
Биты 11:0 LT [11:0]: Низкий порог аналогового сторожево­
го таймера. Эти биты записываются программно для определе­
ния
нижнего
порога
срабатывания
аналогового
сторожевого
таймера.
Примечание: Программа может записывать в эти регистры,
когда идет преобразование АЦП. Запрограммированное значе­
ние вступит в силу после завершения следующего преобразова­
ния. Запись в этот регистр выполняется с задержкой, что может
создать
неопределенность
в
отношении
времени
вступления
в силу нового запрограммированного значения.
Регистр реrупярной поспедоватепьности АЦП 1 (ADC_SQ.R1)
Смещение адреса: Ох2С
81
30
31
14
15
sa10 о
,..
29
13
,,,,
,.
......._.., "'
12
27
11
S015(4:0]
..,
,w
25
,.
2З
22
21
20
цз,01
,.. 1 ,,,, 1 ,,,, 1 ..,
,.
17
16
,.. 1
16
,,,, ·г;--j
S016(41}
,w
1
о
10
SQ13(4:0J
$014(4.0J
,..
Таблица 3.12- Регистр регулярной последовательности АЦП
1 {ADC_SQR1)
Биты
31:24
Зарезервированы,
должны
быть
сохранены
в значении сброса.
Биты
23:20 L [3:0]: Длина последовательности регулярных
каналов. Эти биты записываются программно для определения
общего количества преобразований в последовательности пре­
образования обычного канала.
0000: 1 преобразование
0001: 2 конверсии
1111: 16 преобразований
Биты 19:15 SQ16 [4:0]: 16-е преобразование в регулярной
последовательности. Эти биты записываются программно, при
этом номер канала (0 .. 17) назначается 16-м в последовательно­
сти преобразования.
Биты 14:10 SQ15 [4:0]: 15-е преобразование в обычной по­
следовательности
Биты 9:5 SQ14 [4:0]: 14-е преобразование в регулярной по­
следовательности
Биты 4:0 SQ13 [4:0]: 13-е преобразование в обычной после­
довательности
Регистр реrулярной последовательности АЦП 2 (ADC_SQR2)
Смещение адреса: Ох30
82
30
31
29
25
23
24
rw
14
,,
s010_
rw
rw
rw
12
11
10
rw
rw
rw
rw
"'
Z1
20
19
rw
rw
rw
1
18
17
18
S010(4:11
rw
SQ7(,4·0J
$08[4,0J
509[4,0J
о
22
SQ11f4:0J
S012(4:0J
....,
15
V
28
29
3аре,.,,..ро
,..
Таблица 3.13 - Регистр регулярной последовательности АЦП
2 (ADC_SQR2)
Биты
31:30
Зарезервированы,
должны
быть
сохранены
в значении сброса.
Биты 29:26 SQ12 [4:0]: 12-е преобразование в регулярной
последовательности. Эти биты записываются программно, при
этом номер канала
(0 .. 17) назначается 12-м в преобразуемой
последовательности.
Биты 24:20 SQ11 [4:0]: 11-е преобразование в регулярной
последовательности
Биты 19:15 SQ10 [4:0]: 10-е преобразование в обычной по­
следовательности
Биты 14:10 SQ9 [4:0]: 9-е преобразование в обычной после­
довательности
Биты 9:5 SQS [4:0]: 8-е преобразование в обычной последо­
вательности
Биты 4:0 SQ7 [4:0]: 7-е преобразование в обычной последо­
вательности
Регистр
инжектируемой
(ADC_JSQR)
Смещение адреса: Ох38
83
последовательности
АЦП
31
30
29
28
15
14
13
12
27
26
25
23
24
3аре...,.,_..о
JS04.. 0
11
JSQ3{4"0)
Таблица 3.14 -
21
22
19
20
1- ,:."'i OJ,:.-j
;--]
18
17
16
~il•: г-,.;
J
10
JSO2f4:0J
Регистр инжектируемой последовательности
АЦП (ADC_JSQR)
Биты
31:22
Зарезервированы,
должны
быть
сохранены
в значении сброса.
Биты 21:20 JL [1:0]: Длина вводимой последовательности
Эти биты записываются программно для определения обще­
го количества преобразований в последовательности преобра­
зований инжектируемого канала.
00: 1 преобразование
01: 2 конверсии
10: 3 конверсии
11: 4 конверсии
Биты 19:1S JSQ4 [4:0]: четвертое преобразование в инжек­
тируемой последовательности (когда JL [1:0) = 3) (1)
Эти биты записываются программно, при этом номер канала
(0 .. 17) назначается четвертым в преобразуемой последователь­
ности.
Примечание: В отличие от обычной последовательности пре­
образования, если длина JL [1:0) меньше четырех, то каналы пре­
образуются в последовательности,
начиная с
(4-JL).
Пример:
ADC_JSQR [21:0) = 10 00011 00011 00111 00010 означает, что при
сканирующем
преобразовании
будет
выполнено
следующее
преобразование последовательность каналов: 7, 3, 3 (а не 2, 7, 3).
Биты 14:10 JSQ3 [4:0]: третье преобразование в инжектиру­
емой
последовательности (при JL [1:0] = 3)
Биты 9:S JSQ2 [4:0]: второе преобразование в инжектируе­
мой последовательности (при JL [1:0] = 3)
84
Биты 4:0 JSQ1 [4:0): первое преобразование в инжектируе­
мой последовательности (при JL [1:0] = 3)
При JL=3 (4 инжектированных преобразования в секвенсо­
ре) АЦП преобразует каналы в таком порядке: JSQ1 [4:0]» JSQ2
[4:0]» JSQ3 [4:0]» JSQ4 [4:0]
При JL=2 (3 инжектированных преобразования в секвенсо­
ре) АЦП преобразует каналы в таком порядке: JSQ2 [4:0]» JSQ3
[4:0]» JSQ4 [4:0]
При JL=l (2 инжектированных преобразования в секвенсо­
ре) АЦП преобразует каналы в таком порядке: JSQ3 [4:0]» JSQ4
[4:0] Когда JL=0 (1 инжектированное преобразование в секвен­
соре), АЦП преобразует только канал JSQ4 [4:0].
Регистр
данных
инжектированных
АЦП
х
(ADC_JDRx)
20
19
18
(х=1 .. 4)
Смещение адреса: Ох3С - Ох48
31
ЭО
29
28
27
26
14
13
12
11
10
25
24
2Э
22
21
17
16
1
JDATA(15:0]
1
J ' J ' J ' J I J ' J ' J I J ' J ' J ' J ' J ' J ' J ' J '
Таблица 3.15 -
Регистр инжектированных данных АЦП х
(ADC_JDRx) (x=l .. 4)
Биты
31:16
Зарезервированы,
должны
быть
сохранены
в значении сброса.
Биты 15:0 JDATA [15:0]: Вводимые данные
Эти биты доступны только для чтения. Они содержат резуль­
тат преобразования из инжектированного канала х. Данные вы­
равниваются влево или вправо.
Регистр реrулярных данных АЦП (ADC_DR)
Смещение адреса: Ох4С
85
з,
, 1
15
'
1
'
1
, 1
14
13
, 1
'
27
28
29
30
'
1
12
1
, 1
, 1
11
' 1
'
2◄
25
26
1
, 1
10
, 1
' ! '
1
DATA(15:QJ
'
1
'
1
'
1
'
,
,.
20
21
22
23
AOC2DATA(150]
1
'
1
1
'
1
,
'
1
1
17
"
16
, 1 , 1
'
1
'
'
1
'
1
1
,
'
Таблица 3.16 - Регистр регулярных данных АЦП (ADC_DR)
Биты 31:16 ADC2DATA [15:0): Данные АЦП2
В АЦП1: В двойном режиме эти биты содержат обычные
даннь1е АЦП2.
В АЦП2 и АЦП3: эти биты не используются.
Биты 15:0 DATA [15:0): Обычные данные
Эти биты доступны только для чтения. Они содержат резуль­
тат преобразования из обычных каналов. Данные выравнивают­
ся влево или вправо.
86
КАРТА РЕГИСТРОВ АЦП
Смещ
Регистр
е ни е
о,оо
.... .. .. .. ..
.., ..,с, ~~ ,._"' "' ... 1:1 i:i
-
AOC_SR
ADC_CR1
,,
Эареэере"РОf.1-'НО
1,,орос 3Н8ЧЕЖ~
0,00
AOC_CR2
31'Ре,ерв..роеа~
-о,ос
:: ~ ., .., ,._"' ., ... ..,
i 1в
u
u
u
с,
~ ;н
, ~ , "'
~ i~ ~ ~ i i ~
! 1§
;~ н
OISC
DUALМOO
fЗ:01
NUM
{2.01
AVIOCНfA •O)
u uIu u u u u u u u u u u u u u u u u u
EXТSEL
12,01
u
-
r,,- --., -.,-r,,-
а
н
--.,-r,,- 11
.
.
Эаре:,еремрова№
-с5рос 3ka'1ёti~A
о,04
с, ~~ ~~ ~~ ~~
-
u Iu
u
1 ~ JEXТSE
1~
u
[2~01
u1u
u
v
~но:м,реир
i
!! и--.,
l1r--., -u-11>"
Биты 1.ремени •ыбор«м SМРк_х
ADC_SMPR1
--~- u "'1"' u "' 1"' u "'1"' u u1u1v "'1"'1"' "'1"'1"' "'l"'lu "'1"'1"' u1u1u u v1u v
Ох10
Биrы 8ре,.w!НИ eы6oplut SМРх_х
AOC_SМPR2
---·
u1u1u
U/U t V
u
ADC_JOfR1
"""
0,18
V JU
u
JOFFSEТ1l1 1 О)
--
--
ADC_JOFRЗ
АОС_НТR
ADC_SOR1
-'НQЧO!tl'IA
u 1
U
цз,01
V
Таблица 3.17 -
U[V
U
,
__
....,,,.,..,.
1-D'еВбt!ТЬI
н...е 8 биты
ре,уnяf:»«)Й
оос,нщоо,не
V
lV
v
v1v
v
v
V
""""""I j
V
V
V
t ',1 1 V
_ ..,,.u1
--
1 чоr~юр100
nреобр11юе11
н~ю в бит1о1
notnfЩ0811'fll
111>tЮС'Т ' И
V
V
IV jV
Карта регистров АЦП
87
U
"'1"'1"' "'1"'
SQ15[4:0J 15-й
nоследов1пе
IU IU
V
U-~~
V
u1u
LТ(11 .0J
u Iu
,_,,._
S016{4:0j16,.д
V
V
НТ(11'{)J
,.,,.,.,,._
.__..,.....,
u1u
U
u1u v1u1u u 1u1u u u1u u
nьно(щ•
- -.. -
v1u1u
JOFFSEТ4{11 О)
__...: эначеtмЯ
0'2С
U
..IOFFSET3/11 OJ
v 1v
заре_._...,
ADC_lTR
u1u
u1u u1u1u u uiu u u1u u
-
AOC_.IOFR4
V
JOFFSEl'2111 0J
заре,.,,..,.,..,.,
--,-- 3!ia-oet84A
""28
u1u u1u1u ., ., ., v., ., .,
u 1v u1u1u u1v1u
-~"'0,24
Ujv.,.,.,.,.,
Зареирв~!р088НО
AOC_JOffi2
--,Ох2О
u
--,.-3tЧr<U!tt'IIIII
1,,uрос:эн~-ниs~
OxlC
UJU
V
U
V
SO13[4.0J 1341
nреобра.юеан
ие efwrы
peryt,Apнoiii
...,.,.
nосnедоваtел
IV v v
v1v
v
Смещ
Регистр
ение
.., .., ~~ ~ re ~~ ~~ "'"'
- о ~~ ~~ ~:!: ~~ :: ~ '"
-о
·-- -·- ·-...,,,,....,.
1~
S012(40] 12-М
0,00
AOC_SOR2
S010(4:0J 1G-м
S011(4:0J 11
нме в биТhl
1tиевбtt1ы
,_,.
rюсnедовате
последоеате
реrуnярной
fCr;poc :.-tачения
01<34
ADC_SQRЗ
1
!~
..,..,.,.,...
О,,38
•
зна-~ен:ия
ADC_JSOR
!
·-- ..,,,..,,..,.
SQ5{4 ·0J5""
S06[4·01~
50<[4 О}
48Tfl.8PTO&
nреобр~:юва
HIIO 8 бч'fы
__
1
кие е битw
nocnoдoe•><•
последов~,е
"""°""'
nы.осн•
u u u1u
,.
u
UJV
ие в биrw
nос,,едоеа,е
nосnедоаате
nоспедоеате.т.
UJU
nреобра:юеани
е • биты
-- --·-·
ren
JЦ1 :
"'
Иtот:&1'1'МрО8#1НИО
•
Iu
ос'"
u " Iu u "
V
.......,,.
VJU
- u "
"
"
"1" "1"1"
VJV
v 1v v
VJV
u
JOATдl.15:0J
"1"1" "lu v
JDATдl.15:0J
UJU
u 1 v u v1v u v1v
u 1u
IV
U
"1"
у
U
JDAT,дl15;0]
3aprt38J)OИJ)0$8НO
.... upoc :~начения
u1u "1"1"
V
u u
V
V
" 1"
U
О6ь1чнwе DATAJ15:0J
ADC20ATA{15.0]
Таблица 3.18 -
Ьfl(ICfИ
JOATAJ15:0]
v1u vlu\" "\" u ulv
UJU
nоспедоеател
nocne.,ou,e
u u 1" u u "
~\1рое,DНО
ADC_DR
_.,
""
,......,,.
•
""""'"
...
11peo6~:IOIJ&H
иe•биri\Jt
ииеебюы
rюсnедовател
v1v 1 v
JS01{4:0J
nopooe
nреобраюеа
nрообра:юеан
Заре:1ер11ироеано
ADC_JDR4
v1v
.,.,,..
v1u v1v1v v1v u
AOC_JDRЗ
V
.. ..,,..... ,-.:u1
ие е t»IТ&k
ебмты
nocn@Ц()blTI!
""'""
V
третt:.е
ripooбpa:XJWJl4'8
ние в бм1ы
nocneдoвaren~
J$Q3(4.0}
четеертое
501(40]
.
""""°"
...,, ....,. ,.,..,,,,,.,.,..
...,,,,.,,..,.
IJOCIIOДONTefl
3.Ape№J>N4poмtIO
ADC_JDR2
" ~ - v u1u v
S<Щ◄ ·OJ еторое
1ретье
v1v1u u 1 v u u1v1v v
JS04{4:0J
u
ADC _JDR1
S03{4:0J
nрео6ра3083н
ьнос:rи
V
1,.,орос ~13'Ч8Н14.Я
о,,с
,.,,,.,,..,.
ние е бин:,1
нее биты
nос11едова
,_,,_ :ltli!Чe~ИЯ
°""'
S07(<1:0)7
_.,.,.,
508(4:0J 8
н..аеби'rw
не вбиты
1..,орос ~81iИЯ
0,44
--- -- ..
S09!◄ :0]9◄1
nрообра:юеан
реrупярной
•-.-- :ltiЗЧeНi-lЯ
0"40
"' ... .., "' - о
.rтВ%тарr ·отВ1~!;тu- отВтчvго -oтBffl-aтu- ,,,-в~1ч;тu- oт,rr"'W"roт,r
ООС1'18дО8аtеnьм
о,зс
... <D
nреобраюеа
nреобраэоез
Н&-tеебиты
..
u u1u u 1 u1v u1v1u u v1u v1v1u u1v v v1u
v1u u u1u u
Карта регистров АЦП. Продолжение
ПРИМЕРЫ РАБОТЫ С АЦП
ПРОЕКТ ПО ОЦИФРОВКИ ДАТЧИКА
ТЕМПЕРАТУРЫ LM3SDZ ПЛАТЫ BLUE КIТ
#incLude "stm32f10x.h"
#incLude <stdio.h>
#define SYSCLOCK 72000000U
88
_IO uint32_t tmpreg;
_IO uint32_t SysTick_CNT = О;
_IO uint8_t tim2_count = О;
char data = О;
char temp_str [20]; // Буфер для строки температуры
volatile uintlб_t adc_value =О;// Значение АЦП
volatile uint32_t pulse_count =О;// Счетчик импульсов
_Jorceinline void de/ay (_/О uint32_t tck)
{
while (tck)
{tck - ;}
}
void de/ay_ms (uint32_t ms)
{
MODIFY_REG (SysТick-> VAL,
SYSCLOCK / 1000 - 1);
SysTick_CNT = ms;
while(SysTick_ CNT) {}
}
SysTick_VAL_CURRENT_Msk,
void SysТick_lnit (void)
{
MODI FY_REG (SysТick-> LOAD, SysTick_LOAD_RELOAD _Msk,
SYSCLOCK / 1000 - 1);
CLEAR_BIT (SysTick-> VAL, SysТick_VAL_CURRENT_Msk);
SET_BIT (SysTick-> CTRL, SysTick_CТRL_CLKSOURCE_Msk
SysTick_CTRL_ENABLE_Msk I SysTick_CTRL_TICKINT_Msk);
}
void SetRCC_C/ockTo72 (void)
{
RCC-> CR 1= RCC_CR_HSEON;
89
while (READ_BIT (RCC-> CR, RCC_CR_HSERDY == RESET)) {}
FLASH-> ACR &= -FLASH_ACR_PRFTBE;
FLASH-> ACR 1= FLASH_ACR_PRFTBE;
FLASH-> ACR &= -FLASH_ACR_LATENCY;
FLASH-> ACR 1= FLASH_ACR_LATENCY_2;
RCC-> CFGR &= -RCC_CFGR_HPRE;
RCC-> CFGR 1= RCC_CFGR_HPRE_DIV1;
RCC-> CFGR &= -RCC_CFGR_PPRE2;
RCC-> CFGR 1= RCC_CFGR_PPRE2_DIV1;
RCC-> CFGR &= -RCC_CFGR_PPRE1;
RCC-> CFGR 1= RCC_CFGR_PPRE1_DIV2;
RCC-> CFGR &= (uint32_t) ((uint32_t) - (RCC_CFGR_PLLSRC 1
RCC_ CFGR_PLLXTPRE I RCC_ CFGR_PLLMULL));
RCC-> CFGR 1= (uint32_t) (RCC_CFGR_PLLSRC_HSE
RCC_ CFGR_PLLMULL9};
RCC-> CR 1= RCC_CR_PLLON; // Включаем ФАПЧ (PLL)
RCC_CR_PLLRDY}!=
CR,
(RCC->
(READ_BIT
while
(RCC_CR_PLLRDY)) {}
RCC-> CFGR &= -RCC_CFGR_SW;
RCC-> CFGR 1= RCC_CFGR_SW_PLL;
RCC_CFGR_SWS}!=
CFGR,
(RCC->
(READ_BIT
while
RCC_CFGR_SWS_PLL) {}
}
// Инициализация GPIO
void GP/0_/nit (void)
{
APB2ENR
RCC->
RCC_APB2ENR_AFIOEN
RCC_APB2ENR_IOPCEN;
1=
1
RCC- APB2ENR - IOPAEN
RCC_APB2ENR_IOPBENI
// USARТ1 настройка:
AFIO-> MAPR 1= AFIO_MAPR_USARТ1_REMAP;
// Настройка РВ7 (RX) как вход с подтяжкой
90
GPIOB->CRL &= -(GPIO_CRL_CNF7
1 GPIO_CRL_MODE7);
//
Сброс битов
GPIOB-> CRL 1= GPIO_CRL_CNF7_О;// Вход с подтяжкой
GPIOB-> ODR 1= GPIO_ODR_ODR7; // Включение подтяжки
вверх
// Настройка РВб (ТХ) как альтернативная функция (pushpull)
GPIOB->CRL &= -(GPIO_CRL_CNFб I GPIO_CRL_MODEб}; //
Сброс битов
GPIOB-> CRL 1= GPIO_CRL_CNF6_1 1GPIO_CRL_MODEб; //Аль­
терна-тивная функция, 50 МГц
// Настройка USARТ1 регистрами
RCC->APB2ENR i= RCC_APB2ENR_USARТ1EN; // USARТ1
Clock ON
USARТ1->BRR = 0x1D4C; // Baudrate for 9600 and 72Mhz-RCC
1= USART_CR1_UE I USART_CR1_ТE 1
USARТ1->CR1
USART_CR1_RXNEIE;
I
USART_CR1_RE
// USARТ1 ON, ТХ ON, RX ON, RXNEIE - разрешаем прерыва­
ние по приему данных
// Настройка РА3 как аналоговый вход (ADC1_1N3) -
джам­
пер РА9
GPIOA->CRL &= -(0xF « 12); // Очищаем настройки для РА3
GPIOA->CRL 1= (ОхО « 12); // РА3: аналоговый вход (CNF =
00, MODE = 00)
}
void ADC1_/nit (void)
{
// Включаем тактирование ADC1
RCC->APB2ENR 1= RCC_APB2ENR_ADC1EN;
// Настройка ADC1
ADC1-> SQR3 = 3; // Выбираем канал 3 (РА3)
91
ADC1-> SMPR2
1= ADC_SMPR2_SMP3_2; // Устанавливаем
время выборки (239.5 циклов)
ADC1-> CR2 1= ADC_CR2_ADON; // Включаем ADC1
}
// Чтение значения АЦП
uint16_t ADC1_Read (void)
{
ADC1->CR2 1= ADC_CR2_ADON;
// Запускаем преобра-
зование
whiLe (!(ADC1->SR & ADC_SR_EOC));
// Ждем завершения
преобразования
return ADC1-> DR; // Возвращаем результат
}
// Вывод строки на USARП
void USARП_SendString (char *str)
{
whiLe (*str) {
whiLe ((USARТ1->SR & USART_SR_TXE) == О);// Ждем, пока
флаг ТХЕ не установится
USARТ1-> DR = *str++; // Отправляем символ}
}
int main (void)
{
SET_BIT(RCC->APB2ENR, RCC_APB2ENR_AFIOEN);
//Delay after ап RCC peripheral clock enaЫing
delay(1);
SetRCC_ClockTo720;
SysTick_lnit0;
ADC1_1nit0; // Инициализация ADC1
GPIO_lnit0; // Инициализация GPIO
while (1)
92
// Чтение значения АЦП
adc_value = ADC1_Read0;
// Преобразование значения АЦП в напряжение (в вольтах)
float voltage = (adc_value • 3.3f) / 4096.0f;
// Преобразование напряжения в температуру (LM3SDZ: 10
мВ/ 0 С)
float temperature = voltage • 100.0f;
// Форматирование строки температуры
snprintf(temp_str, sizeof(temp_str), "Temp:
temperature);
%.2f
C\r\n';
// Вывод строки на USARТ1
USARТ1_Send5tring(temp_str);
delay_ms(300); }
}
void SysТick_Handler (void)
{
if(SysTick_CNT > О)
SysTick_CNT--;
}
Комментарии проекта:
Здесь и далее по книге функции выделены курсивом, для
лучшей читаемости.
Для работы с датчиком температуры LM3SDZ платы BLue Кit
необходимо установить джамnер РА9 рядом с ним и этого доста­
точно для версии платы
Rev1.01. Другие джамперы на этой ис­
пользуемой линии, согласно схемы платы, отключить. В более
93
новых версиях его можно подключить через комплектные про­
вода DuPont или колодку J4.
Данный датчик показал себя не очень стабильно, это вид­
но по большому разбегу значений температуры приходящих
через
на терминальную
USARТ1
программу РС. Это
прежде
всего связано с длинной линией между датчиком входом АЦП
МК, и из-за этого на подобные линии наводятся помехи, осо­
бенно
которые
SОГц,
уже
1В
меньше
Revl.02 он
вносят искажения
значительно.
в сигнал значением
Поэтому
с
версии
заменен на более надежный цифровой
платы
D518B20.
Это яркий пример того, что, желательно уходить от аналоговых
сигналов, на цифровые в подобных решениях и тем более их
оцифровки.
Комментарии кода проекта:
Проект начинается как обычно с подключения файлов биб­
лиотек
и
объявления
инициализации
переменных,
массива
в проекте, тут вопросов, после прочтения первой книги [2] уже
быть не должно.
Функции
delay, delay_ms, SysTick_lnit и SysTick_Handler со­
здают блок кода для работы необходимой нам задержки в про­
грамме. Они построены на макросах библиотеки CMSIS уже по­
дробно рассмотренных в данной книге в главе 2.
Функция SetRCC_ClockTo72, в которой тактирование МК на­
страивается на 72МГц, была рассмотрена самым подробных об­
разом, с учетом каждого бита регистров тактирования сигналов,
STM32 самостоятельно #1». Повторяться
и раздувать в объёме книгу #2 не стоит.
Функция ADC1_1nit пример инициализации выбора с какого
в
книге
«Освоение
канала и сколькими выборками производится оцифровка сиг­
нала.
Функция ADC1_Read чтение значения АЦП.
Функция USARП_SendString это вывод целой строки в тер­
минал консоли используя по сути посимвольную отправку, с чем
его справляется.
94
Функция main, тело основной программы с вызовом необхо­
димых функций, непрерывных циклом
while где выполняется
основной
из
алгоритм: чтение
значения
АЦП,
его
пересчет
в значение Вольты, затем в понятное нам значение в градусы
и дальнейшее формирование строки данных для отправки че­
рез USART1 в консоль нашей программы на персональном ком­
пьютере. И конечно небольшая задержка выполнения, чтобы
контроллер выдавал нам не слишком быстро данные, с которы­
ми сам справлялся МК.
ПРОЕКТ ПО ОЦИФРОВКИ 4-Х
ПОТЕНЦИОМЕТРОВ ИЛИ ЛЮБЫХ 4-Х
АНАЛОГОВЫХ СИГНАЛОВ ОДНОВРЕМЕННО
#include "stm32f10x.h"
#include <stdio.h>
#define SYSCLOCK 72000000U
_IO uint32_t tmpreg;
_IO uint32_t SysTick_CNT = О;
_IO uint8_t tim2_count = О;
volatile uint16_t adc_values [4] = {О};// Значения АЦП для
РАО,РА1,РА2,РА3
char voltage_str [65]; // Буфер для строки напряжения
_forceinline void deLay LIO uint32_t tck)
{
while(tck)
{tck - ;}
}
void deLay_ms (uint32_t ms)
{
95
MODIFY_REG (SysTick->
SYSCLOCK / 1000 - 1);
SysTick_CNT = ms;
while(SysТick_ CNT) {}
}
VAL,
SysTick_VAL_CURRENT_Msk,
void SysTick_lnit (void)
{
MODIFY_REG(SysTick>LOAD,SysTick_LOAD_RELOAD_Msk,SYSCLOCK / 1000 - 1);
CLEAR_BIT (SysTick-> VAL, SysTick_VAL_CURRENT_Msk);
SET_BIT (SysTick-> CTRL, SysTick_CTRL_CLKSOURCE_Msk
SysTick_CТRL_ENABLE_Msk I SysТick_CTRL_TICKINT_Msk);
}
void SetRCC_CLockTo72 (void)
{
RCC-> CR 1= RCC_CR_HSEON;
while (READ_BIT (RCC-> CR, RCC_CR_HSERDY == RESET)) {}
FLASH-> ACR &= -FLASH_ACR_PRFTBE;
FLASH-> ACR 1= FLASH_ACR_PRFTBE;
FLASH-> ACR &= -FLASH_ACR_LATENCY;
FLASH-> ACR 1= FLASH_ACR_LATENCY_2;
RCC-> CFGR &= -RCC_CFGR_HPRE;
RCC-> CFGR 1= RCC_CFGR_HPRE_DIV1;
RCC-> CFGR &= -RCC_CFGR_PPRE2;
RCC-> CFGR 1= RCC_CFGR_PPRE2_DIV1;
RCC-> CFGR &= -RCC_CFGR_PPRE1;
RCC-> CFGR 1= RCC_CFGR_PPRE1_DIV2;
RCC-> CFGR &= (uint32_t) ((uint32_t) - (RCC_CFGR_PLLSRC 1
RCC_CFGR_PLLXТPRE I RCC_CFGR_PLLMULL));
RCC-> CFGR 1= • (uint32_t) (RCC_CFGR_PLLSRC_HSE
RCC_ CFGR_PLLMULL9);
RCC-> CR 1= RCC_CR_PLLON; // Включаем ФАПЧ (PLL)
RCC_CR_PLLRDY)!=
CR,
(RCC->
(READ_BIT
while
96
(RCC_CR_PLLRDY)) {}
RCC-> CFGR &= -RCC_CFGR_SW;
RCC-> CFGR 1= RCC_CFGR_SW_PLL;
whiLe
(READ_BIT
(RCC->
CFGR,
RCC_CFGR_SWS_PLL) {}
}
RCC_CFGR_SWS}!=
void GPIO_lnit (void)
{
RCC->
APB2ENR
RCC_APB2ENR_USARТ1EN
1=
1
RCC_APB2ENR_IOPBENI
RCC_APB2ENR_AFIOEN;
RCC_APB2ENR_IOPAEN
RCC_APB2ENR_AFIOEN
RCC_APB2ENR_IOPCEN
// USARП настройка:
// настройка вывода на передачу
AFIO->MAPR 1= AFIO_MAPR_USARП_REMAP;
// Настройка РВ7 (RX) как вход с подтяжкой
GPIOB->CRL &= -(GPIO_CRL_CNF7 1 GPIO_CRL_MODE7); //
Сброс битов
GPIOB-> CRL 1= GPIO_CRL_CNF7_О;// Вход с подтяжкой
GPIOB-> ODR 1= GPIO_ODR_ODR7; // Включение подтяжки
вверх
// Настройка РВ6 (ТХ) как альтернативная функция (push-puLL}
GPIOB-> CRL &= - (GPIO_CRL_CNF6 1 GPIO_CRL_MODE6); //
Сброс битов
GPIOB-> CRL 1= GPIO_CRL_CNF6_1 1GPIO_CRL_MODE6; // Аль­
терна-тивная функция, 50 МГц
// Настройка USARП регистрами
USARП->BRR = 0x1D4C; // 9600 бод при тактовой частоте
36 МГц (АРВ1) 72Mhz-RCC
CR1 1= USART_CR1_UE
USART_CR1_TE
USARТ1->
USART_CR1_RE;
97
// настройка вывода РВ2 BluePill+
GPIOB->CRL &= -GPIO_CRL_MODE2_0;//Bыxoд, максималь­
ная частота 2 MHz;
GPIOB->CRL 1= GPIO_CRL_MODE2_1;//Bыxoд, максимальная
частота 2 MHz;
GPIOB-> CRL &= -GPIO_CRL_CNF2_0;//General purpose output
push-pull - выход в режиме Push-pull;
GPIOB-> CRL &= -GPIO_CRL_CNF2_1;//General purpose output
push-pull - выход в режиме Push-pull;
// Настройка РАО, PAl, РА2, РА3 как аналоговые входы:
// Очищаем настройки для РАО-РА3
GPIOA-> CRL &= - (0xFFFF «О);
// Аналоговый вход (CNF = 00, MODE = 00)
GPIOA-> CRL 1= (ОхО «О) 1(ОхО «4) 1(ОхО «8) 1(ОхО «12);
}
void ADC1_1nit (void)
{
// Включаем тактирование ADCl
RCC->APB2ENR 1= RCC_APB2ENR_ADC1EN;
// Настройка ADCl
ADC1->SQR1 = (3 « 20); // 4 канала в последовательности
(L = 3)
ADC1->SQR3 =(О« О) 1(1 « 5) 1(2 « 10) 1(3 « 15); // Кана­
лы О, 1, 2, 3 (РАО, PAl, РА2, РА3)
ADC1->SMPR2 1= ADC_SMPR2_SMP0_2 1ADC_SMPR2_SMP1_2 1
ADC_SMPR2_SMP2_2 1 ADC_SMPR2_SMP3_2; // Время выборки
(239.5 циклов)
ADC1->CR2 1= ADC_CR2_ADON; // Включаем ADCl
}
// Чтение значений АЦП для всех каналов
void ADC1_ReadALL (void)
98
{
for (int i = О; i <4; i++) {
ADC1-> SQR3 = (i «О); // Выбираем
канал
i (РАО,
РА1,
РА2, РА3)
ADC1-> CR2 1= ADC_CR2_SWSTART; // Запускаем преобразо­
вание
ADC1-> CR2 1= ADC_CR2_ADON; // Запускаем преобразование
while (! (ADC1-> SR & ADC_SR_EOC)); // Ждем завершения
преобразования
adc_values [i] = ADC1-> DR; // Сохраняем результат}
}
// Вывод строки на USARТ2
void USARТ1_SendString (char *str) {
wh i le (*str) {
while ((USARТ1->SR & USART_SR_TXE) == О);// Ждем, пока
флаг ТХЕ не установится
USARТ1-> DR = *str++; // Отправляем символ}
}
int main (void)
{
SET_BIT(RCC->APB2ENR, RCC_APB2ENR_AFIOEN);
//Delay after an RCC peripheral clock enaЫing
delay(l);
SetRCC_ClockTo72Q;
SysТick_lnit0;
ADCl_lnit0; // Инициализация ADC1
GPIO_lnit0; // Инициализация GPIO
while (1) {
// Чтение значений АЦП для всех каналов
ADCl_ReadALLQ;
99
// Преобразование значений АЦП в напряжения (в вольтах)
float voLtage0 = (adc_vaLues[0] • 3.3f) / 4096.0f;
float voLtage1 = (adc_vaLues[1] • 3.3f) / 4096.0f;
float voLtage2 = (adc_vaLues[2] • 3.3f) / 4096.0f;
float voLtage3 = (adc_vaLues[3] • 3.3f) / 4096.0f;
// Форматирование строки напряжений
snprintf (voLtage_str, sizeof (voLtage_str), «РАО: %.2f V\r\nPA1:
%.2f V\r\nPA2: %.2f V\r\nPA3: %.2f V\r\n\n _ _ _\r\n\n»,
voLtage0, voLtage1, voLtage2, voLtage3);
// Вывод строки на USARП
USARП _SendStri ng(voLtage_str);
deLay_ms (500);}
}
void SysTick_HandLer (void)
{
if(SysTick_CNT > О)
SysTick_CNT--;
}
Комментарии проекта:
Проект мало чем отличается от предыдущего, по сути только
увеличение числа каналов с 1-го до 4-х.
Комментарии кода проекта:
Для работы с проектом необходимо подключить дажамперы
расположенные
около
потенциометров.
Другие
джамперы
на этих используемых линиях, согласно схемы платы, отключить.
Многие проекты начинаются со схожих, практически полно­
стью одинаковых, функций или наборов функций. Поэтому рас­
сматривать будем значимые отличия данного проекта от преды­
дущего. Это справедливо и для других проектов книги.
100
Функции
нальную
ADC1_1nit и ADC1_ReadAll настроены
оцифровку
с
потенциометров
BLue Кit. Возможно и большее и
на 4-х ка­
имеющихся
на
плате
меньшее значение каналов
оцифровки, МК это позволяет, но тут мы работаем с отладочной
платой, для удобства и наглядности, что наш код действительно
работает и не только написан в книге, или скачан с githab'a. Ка­
налы
переключаются
соответствующим
образом
описанном
в текущей главе.
В бесконечном цикле
while значении со
всех источников
считывается АЦП и пересчитывается в вольты, которые мы функ­
цией
snprintf успешно и структурированно выдаем
в консоль
персонально компьютера.
Также в МК имеется возможность первичной калибровки
выводов АЦП МК. Предлагаю Вам использовать это возмож­
ность самим и сравнить с первичными значениями АЦП, без ка­
либровки которые.
Также хочется отметить один момент, измеренное напряже­
ние в данном проекте значительно меньше «колеблется» чем
напряжение в проекте с датчиком LM35DZ.
РЕКОМЕНДАЦИИ ПО ВИДЕОМАТЕРИАЛАМ
Если, тем не менее, сложно разобраться и хочется визуаль­
ной наглядности, то рекомендую к просмотру видео канала NR.
electronics:
STM32. CMSIS #13. Теоретическая и практическая настройки
ADC на CMSIS. Проект в CubelDE.
Его можно посмотреть как на YouTube, так и на отечествен­
ных платформах Rutube и VK Видео.
101
ГЛАВА 4. СИСТЕМА ПИТАНИЯ
И ЭНЕРГОСБЕРЕЖЕНИЕ: PWR
Для
работы
нашего
МК
требуется
напряжение
питания
от 2,0 до 3,6 В (VDD). д,1я питания внутреннего цифрового пита­
ния 1,8 В используется встроенный стабилизатор.
(Vssд) V REF(from 2.4 V up to Vooд)VREF+
J
V 00 дdomain
~
A/D converter
D/A converter
Temp. sensor
Reset Ыосk
PLL
~
(Voo) Vоод
(Vss) Vssд L,
V00 domain
1.8 Vdomain
1/0 Ring
Core
Memories
digltal
peripherals
Vss
Voo
Standby circuitry
(Wakeup logic,
IWDG)
'
Voltage Regulator
f-
Low voltage detector 1
.1
Backup domain
Vвдт )-.---
LSE crystal 32К osc
ВКР registers
RCC BDCR register
RTC
Рисунок 4.1 - Обзор подключения источника питания для F1
102
Питание часов реального времени (RTC) и резервных реги­
стров может осуществляться от напряжения Увдт при отключен­
ном основном питании V00.
Для повышения точности преобразования АЦП и ЦАП име­
ют независимые источники питания, которые могут быть от­
дельно отфильтрованы и экранированы от помех на печатной
плате.
• Входное напряжение питания АЦП и ЦАП доступно на от­
дельном выводе V 0 од•
• На выводе Yssд имеется изолированное соединение с зем­
лей питания.
При наличии (в зависимости от корпуса МК) Уш- должен
быть привязан к Yssд•
ДОМЕН РЕЗЕРВНОГО ПИТАНИЯ
Для сохранения содержимого регистров резервного копиро­
вания и питания функции RTC при отключении VDD вывод VBAT
может быть подключен к дополнительному резервному напря­
жению, подаваемому от батареи или другого источника.
Вывод VBAT обеспечивает питание блока RTC, генератора
LSE и входов РС13 - РС15, что позволяет RTC работать даже
при отключении основного цифрового питания (VDD). Переход
на питание от VBAT управляется сбросом Power Down Reset,
встроенным в блок Reset.
Внимание:
Во время tштЕмРо (временной задержки при включении V00)
или после обнаружения PDR переключатель питания между Увдт
и V00 остается подключенным к Увдт•
На этапе запуска, если напряжение V00 устанавливается ме­
нее чем за tRsпEмPo (значение tRsпEмPo см. в техническом описа­
нии) и V00> Увдт+О,бВ, в Увдт может инжектироваться ток через
внутренний диод, подключенный между V00 и выключателем пи­
тания (V 8 дт)-
103
Если
Vвдт, не
к
выводу
может поддерживать эту текущую инъекцию,
источник питания/батарея,
подключенная
насто­
ятельно рекомендуется подключите внешний низкоомный диод
между этим источником питания и выводом Vвдт• Настоятельно
рекомендуется подключить Vвдт к V00 с помощью внешнего ке­
рамического развязывающего.
Если в приложении не используется внешний аккумулятор,
рекомендуется подключить Vвдт к V00 с помощью внешнего ке­
рамического развязывающего конденсатора емкостью
100 нФ
(подробнее см. AN2586 от SТ).
Если резервный домен питается от VDD (аналоговый пере­
ключатель подключен к VDD), то доступны следующие функции:
• РС14 и РС15 могут использоваться как выводы GPIO
или LSE;
• РС13 может использоваться как GPIO, вывод TAMPER, часы
кали-бровки RTC, сигналы тревоги RTC или второй выход.
Примечание: В связи с тем, что переключатель потребляет
только ограниченный ток (3мА), использование
GPIO РС13 -
РС15 в режиме вывода ограничено: скорость должна быть огра­
ничена
2 МГц при максимальной нагрузке 30 пФ, и эти
1О не должны использоваться в качестве источника тока (напри­
мер, для управления светодиодом).
Если резервный домен питается от VBAT (аналоговый пере­
ключатель подключен к VBAT, так как VDD отсутствует), то до­
ступны следующие функции:
• РС14 и РС15 могут использоваться только в качестве выво­
дов LSE;
• Вывод РС13 может использоваться как вывод TAMPER,
ава-рийный или второй выход RTC.
Реrулятор напряжения
Стабилизатор
напряжения
всегда
включен
после сброса.
В зависимости от режимов применения он работает в трех раз­
личных режимах.
104
• В режиме Run регулятор подает полное питание на домен
1,8В (ядро, память и цифровые периферийные устройства).
•В
режиме останова
регулятор
подает малую мощность
на домен 1,8В, сохраняя содержимое регистров и SRAM.
• В режиме ожидания питание регулятора отключается. Со­
де-ржимое регистров и SRAM теряется, за исключением схемы
Standby и резервного домена.
СУПЕРВИЗОР ИСТОЧНИКА ПИТАНИЯ
Сброс при включении питания (POR) /сброс при выключе­
нии питания (PDR)
МК имеет встроенную схему
POR/PDR,
обеспечивающую
нормальную работу при старте/понижении напряжения до 2В.
VDDNDDA
VPOR/PDR
rising edge
··---------···! ··1··~~~~-----········· -
VPOR/PDR
falling edge
. --~-- ___hys!e!e.sls_____ ..... _____
'' ''
''' '''
''' '''
:~:
Temporization
:
:
tRSТТEMPO
'''
'''
'
'
..
PDR
L
Reset
Рисунок 4.2 - Форма сигнала сброса при включении питания
и сброса
МК остается в режиме сброса, если V 0 o/Vooд ниже заданного
порога, VPoR/PDR• без необходимости использования внешней схе-
105
мы сброса. Более подробную информацию о пороге сброса при
включении/выключении питания см. в электрических характе­
ристиках обычного даташита, не RM.
ПРОГРАММИРУЕМЫЙ ДЕТЕКТОР НАПРЯЖЕНИЯ
(PVD)
PVD может использоваться для контроля питания V 0 r,/V 00д
путем сравнения его с порогом, выбранным битами PLS [2:0] ре­
гистра управления питанием (PWR_CR). PVD включается установ­
кой бита PVDE.
В регистре управления/статуса питания (PWR_CSR) имеется
флаг PVDO, указывающий на превышение или понижение уров­
ня VDD/VDDA по сравнению с пороговым значением
PVD. Это
событие внутренне связано с линией ЕХТI16 и может генериро­
вать прерывание, если оно разрешено через регистры EXTI.
VDD
PVD threshold
100mV
. _hysteresis
'''
'
PVD oulput ,....,----;~-·····························--·-·г
Рисунок 4.3 -
Пороговые значения PVD
106
Прерывание по выходу PVD может быть сгенерировано, ко­
гда VDD/VDDA падает ниже порога PVD и/или когда VDD/VDDA
поднимается выше порога PVD, в зависимости от конфигурации
фронта нарастания/спада сигнала на линии ЕХТI16.
В качестве примера можно привести сервисную процедуру,
выполняющую задачи аварийного выключения.
РЕЖИМЫ С НИЗКИМ ЭНЕРГОПОТРЕБЛЕНИЕМ
По умолчанию после сброса изделия или питания наш мик­
роконтроллер переходит в режим
Run. Для экономии энергии
в тех случаях, когда МК не требуется держать в рабочем состоя­
нии, например, при ожидании внешнего события, предусмотре­
но несколько режимов пониженного энергопотребления. Выбор
режима, обеспечивающего наилучший компромисс между низ­
ким энергопотреблением, малым временем запуска и доступны­
ми источниками пробуждения, остается за пользователем.
В устройствах STM32F10xxx реализованы три режима пони­
женного энергопотребления:
• Спящий режим (тактовая частота процессора отключена,
все
пе-риферийные
устройства,
включая
периферию
ядра
Cortex®-M3, такую как NVIC, SysTick и т.д., продолжают рабо­
тать);
• Режим останова (все часы остановлены);
• Режим ожидания (питание домена 1,8 В).
Кроме того, энергопотребление в режиме
Run может быть
снижено одним из следующих способов:
• Замедление работы системных часов;
• Переключение тактовых импульсов на периферийные уст­
ро-йства АРВ и АНВ, когда они не используются.
107
WFI
Cott
CPU dock OFF
Любое
nоеоывание
не впияет на
выходе)
вкл
Нет
другие часы или
Событие
WFE
напряжения
YDD
часы 1.е в
(Сон сейчас
или Сон при
Реrуnятор
часы домена
доменнь1е
е
режима
Вnмяние на
Вnиянме на
Пробужден,
Вход
Название
аналоговые
пробуждения
источники
тактовой частоты
ON или в
Биты PDDS и
Любая линия
режим
ЕХТI
LPDS +
(конфиrурируетс
SLEEPDEEP
бит + WFI или WFE я в регистрах
EXTI)
Остановить
пониженного
эwергаnотреблени
я (зависит от
Все часы
Осцилляторы
домена 1,8 В
HSI и HSE
регистра
выкл.
ВЫКЛЮЧЕНЫ
упрввлвния
питанием
l!PWR CR)\
Повышающий
В режиме
фронт сигнала на
Бит PDDS + бит
SLEEPDEEP + WFI выводе WKUP,
ожидания
илиWFЕ
выкл
си11-1ал тревоги
RTC, внешний
сброс на выводе
NRST,
Переэаrрузка
IWDG
Таблица 4.1 - Сводная информация о режиме пониженного
энергопотребления
ЗАМЕДЛЕНИЕ РАБОТЫ СИСТЕМНЫХ ЧАСОВ
В режиме
Run скорость системных часов (SYSCLK, HCLK,
PCLK1, PCLK2) может быть уменьшена путем программирова­
ния
регистров
прескалера. Эти
прескалеры также
могут
ис­
пользоваться для замедления периферийных устройств перед
переходом в режим
ведена
в
Sleep. Более подробная информация при­
[2]: Регистр
конфигурации
тактового
генератора
(RCC_CFGR).
ПЕРИФЕРИЙНЫЕ ТАКТОВЫЕ ГЕНЕРАТОРЫ
В режиме работы HCLK и PCLKx для отдельных периферий­
ных устройств и памяти могут быть остановлены в любой мо­
мент для снижения энергопотребления.
Для дальнейшего снижения энергопотребления в режиме
108
Steep периферийные часы могут быть отключены перед выпол­
нением инструкций WFI или WFE.
Управление стробированием периферийных тактовых гене­
раторов осуществляется с помощью регистра разрешения пери­
ферийных тактовых генераторов АНВ
разрешения
периферийных
(RCC_AHBENR), регистра
тактовых
генераторов
АРВ1
(RCC_APB1ENR) и регистра разрешения периферийных тактовых
генераторов АРВ2 (RCC_APB2ENR). Более подробная информа­
ция приведена в [2).
РЕЖИМ СНА
Вход в спящий режим
Вход в спящий режим осуществляется путем выполнения ин­
струкций WFI (Wait For lnterrupt) или WFE (Wait for Event). В за­
висимости от бита
мой
Cortex®-M3
SLEEPONEXIT в регистре управления систе­
возможны два варианта выбора механизма
входа в спящий режим:
• Steep-now: если бит SLEEPONEXIT сброшен, то после вы­
полнения инструкции WFI или WFE микроконтроллер переходит
в режим Steep.
• Steep-on-exit: если бит SLEEPONEXIT установлен, то MCU
переходит в режим Steep сразу после выхода из ISR с наимень­
шим приоритетом.
В режиме Steep все выводы ввода/вывода сохраняют то же
состояние, что и в режиме Run.
Подробнее о переходе в режим
Steep смотрите таблицы
3.2 и 3.3.
ВЫХОД ИЗ СПЯЩЕГО РЕЖИМА
Если для перехода в спящий режим используется инструк­
ция
WFI, то любое периферийное
прерывание, квитируемое
контроллером вложенных векторных прерываний (NVIC), может
вывести устройство из спящего режима.
109
Если для входа в спящий режим используется инструкция
WFE, то MCU выходит из спящего режима, как только происхо­
дит событие. Событие пробуждения может быть сгенерировано
либо:
• включение прерывания в регистре управления перифери­
NVIC, и включение бита SEVONPEND в регистре
управления системой Cortex®-M3. При возобновлении работы
MCU из WFE необходимо очистить бит ожидания периферийно­
го прерывания и бит ожидания периферийного канала NVIC
IRQ (в регистре NVIC interrupt clear pending).
• или конфигурирование внешней или внутренней линии
ей, но не в
ЕХТI в событийном режиме. При возобновлении работы процес­
сора из WFE нет необходимости очищать бит ожидания перифе­
рийного прерывания или бит ожидания канала NVIC IRQ, так как
бит ожидания, соответствующий линии событий, не установлен.
Этот режим обеспечивает наименьшее время пробуждения,
так как не тратится время на ввод/вывод прерываний. Более по­
дробная
информация
о
выходе
из
режима
Sleep
приведе­
на в таблицах 4.2 и 4.3.
Sleep-now mode
Descrlptlon
WFI (Wait for lnterrupt) or WFE (Walt for Event) while:
Mode entry
- SLEEPDEEP = О and
- SLEEPONEXIT = О
Refer to the Cortex<l>-мз System Control register.
lf WFI was used for entry:
Mode exit
Wakeup latency
lnterrupt: Refer to Section : lnterrupt and exception vectors
lf WFE was used for entry
Wakeup event: Refer to Section : Wakв11p evвnt твпаgвтепt
None
Таблица 4.2 -
110
Sleep-now
РЕЖИМ ОСТАНОВКИ (STOP MODE)
Sleep-on•xit
Descriptlon
Mode enlry
WFI (wait for interrupt) whlle:
- SLEEPDEEP = О and
- SLEEPONEXIT = 1
Refer to the СоrtехФ-м3 System Control register.
Modeexit
lnterrupt: refer to Section: lnterrupt and exception vectors.
Wakeup latency
None
Таблица 4.3 -
SLeep-on-exit
Режим остановки основан на режиме глубокого сна микро­
контроллеров на ядре Cortex®-M3 в сочетании с регулировкой
тактовой частоты периферийных устройств. Стабилизатор на­
пряжения может быть сконфигурирован как в нормальном, так
и в маломощном режиме. В режиме Stop все тактовые генера­
торы в области 1_,8В останавливаются, PLL, HSI и
раторы отключаются. Содержимое
HSE RС-гене­
SRAM и регистров сохраня­
ется.
В режиме Stop все выводы ввода/вывода сохраняют то же
состояние, что и в режиме Run.
Вход в режим останова
Подробнее о входе в режим Stop см. в таблице 4.4.
Для дальнейшего снижения энергопотребления в режиме
Stop внутренний стабилизатор напряжения может быть переве­
ден в режим пониженного энергопотребления. Это конфигури­
руется битом LPDS регистра управления питанием (PWR_CR).
Если программирование Flаsh-памяти продолжается, вход
в режим Stop откладывается до завершения доступа к памяти.
Если доступ к домену АРВ продолжается, то вход в режим
Stop задерживается до завершения доступа к АРВ.
В режиме Stop следующие функции могут быть выбраны пу­
тем программирования отдельных управляющих битов:
111
• Независимый сторожевой таймер (IWDG): IWDG запускает­
ся записью в его регистр Кеу или аппаратной опцией. После за­
пуска он не может быть остановлен, кроме как сбросом. Смотри­
те: функциональное описание IWDG.
• Часы реального времени (RTC): настраиваются битом
RTCEN в регистре управления доменом резервного копирования
(RCC_BDCR)
• Внутренний RС-генератор (LSI RC): конфигурируется битом
LSION в регистре управления/статуса (RCC_CSR).
• Внешний генератор 32,768 кГц (LSE OSC): конфигурируется
битом LSEON в Регистр управления резервным доменом
(RCC_BDCR).
АЦП и ЦАП могут потреблять энергию и в режиме останова,
если они не отключены перед входом в него. Для их отключения
необходимо записать в О бит ADON в регистре ADC_CR2 и бит
ENx в регистре DAC_CR.
Примечание: Если перед входом в режим останова необхо­
димо отключить внешний генератор, то сначала необходимо от­
ключить бит HSEON и переключить системный генератор на HSI.
В противном случае, если бит
HSEON остается включенным,
а внешний тактовый генератор (внешний генератор) при вхо­
де в режим Stop удаляется, необходимо включить функцию си­
стемы защиты тактового генератора
(CSS), чтобы обнаружить
любой сбой внешнего генератора и избежать сбойного поведе­
ния при входе в режим Stop.
Выход из режима останова
Более подробная информация о выходе из режима
Stop
приведена в таблице 4.4.
При выходе из режима Stop по прерыванию или событию
пробуждения в качестве системного тактового генератора выби­
рается RС-генератор HSI.
Если регулятор напряжения работает в режиме пониженного
энергопотребления, то при выходе из режима останова возника­
ет дополнительная задержка при запуске.
112
Если держать внутренний регулятор включенным в режиме
останова, то потребление будет выше, но время запуска умень­
шится.
Описание
Режим
остановки
WFI (Wait for lnterrupt) или WFE (Wait for Event):
- Установить бит SLEEPDEEP в регистре управления системой
СоrtехФ-МЗ
Ввод режима
- Очистить бит PDDS в регистре управления питанием (PWR_CR)
- Выбор режима работы стабилизатора напряжения осуществляется
путем конфигурирования бита LPDS в PWR_CR
Примечание: Для входа в режим останова необходимо сбросить все
биты ожидания линии ЕХТI (в регистре Pвnding (EXTI_PR)), все биты
ожидания периферийных прерываний и флаг RTC Alarm. В противном
случае процедура входа в режим Stop игнорируется, и выполнение
программы продолжается.
Если для ввода использовался WFI:
Выход из режима
Любая линия EXTI, сконфигурированная в режиме прерывания
(соответствующий вектор прерывания ЕХТI должен быть включен в
NVIC). См. раздел: Векторы прерываний и исключений.
Если для ввода использовался WFE:
Любая линия EXTI, сконфигурированная в режиме событий. См.
раздел : Управление событиями при пробуждении
Задержка
Время пробуждения HSI RC + время пробуждения регулятора из
пообvжnения
режима пониженного энергопотребления
Таблица 4.4 -
Режим останова
РЕЖИМ ОЖИДАНИЯ
Режим Standby позволяет достичь минимального энергопо­
требления. Он основан на режиме глубокого сна ядра Cortex®-
M3 с отключенным регулятором напряжения.
Соответственно, отключается питание домена 1,8 В. PLL, ге­
нератор
HSI и генератор HSE также отключаются. Содержимое
SRAM и регистров теряется, за исключением регистров в домене
Backup и схемы Standby (см. рис. 4.1).
Вход в режим ожидания
Более подробная информация о переходе в режим ожида-
113
ния приведена в табл. 3.5 ниже.
В режиме Standby следующие функции могут быть выбраны
путем
программирования отдельных управляющих битов:
• Независимый сторожевой таймер (IWDG): IWDG запускает­
ся записью в его регистр Кеу или аппаратной опцией. После за­
пуска он не может быть остановлен, кроме как сбросом. См.
Раздел по функциональному описанию IWDG в RM0008.
• Часы реального времени (RTC): настраиваются битом
RTCEN в регистре управления доменом резервного копирования
(RCC_BDCR)
• Внутренний RС-генератор (LSI RC): конфиrурируется битом
LSION в регистре управления/статуса (RCC_CSR).
• Внешний генератор 32,768 кГц (LSE OSC): конфиrурируется
битом LSEON в регистре управления резервным доменом
(RCC_BDCR).
Выход из режима ожидания
Микроконтроллер выходит из ждущего режима при внеш­
нем сбросе (вывод
NRST), сбросе IWDG, нарастающем фронте
сигнала на выводе WKUP или нарастающем фронте сигнала тре­
воги RTC (см. рис. ХХ: упрощенная блок-схема RTC). После выхо­
да из ждущего режима все регистры сбрасываются, кроме реги­
стра управления/состояния питания (PWR_ CSR).
После пробуждения из ждущего режима выполнение про­
граммы возобновляется так же, как и после сброса (выборка
загрузочных контактов, считывание вектора сброса и т.д.). Флаг
SBF в регистре управления/статуса питания
(PWR_CSR) указывает на то, что MCU находился в ждущем ре­
состояния
жиме.
Более подробная информация о выходе из режима ожида­
ния приведена в таблицу 4.5.
114
Описание
Ре-м ожидания
WFI (Wait for lnterrupt) или WFE (Wait for Event):
- Установите значение SLEEPDEEP в pen,icтpe управления системой
Corte~MЗ
Ввод режима
Выход из режима
Задержка
- Установить бит PDDS в регистре управления питанием (PWR_CR)
- Очистить бит WUF в реrистре Power Control/Slatus (PWR_CSR)
- Поеоывание /nnя WFI\ или событие /nnя WFI\ не ожипается
Повышающий фронт сиrнала на выводе WKUP, повышающий фронт
сиrмала тревоп,~ RTC, внешний сброс в
Вывод NRST, сбоос IWDG.
Фаза сброса
~_о)1!"8&НИЯ
Таблица 4.5 -
Режим ожидания
Состояния входов/выходов в режиме ожидания
В режиме ожидания все выводы ввода/вывода имеют высо­
кий импеданс, кроме:
• Колодка сброса (все еще доступна);
• Вывод TAMPER, если он сконфигурирован для тампера или
выхода калибровки;
• Вывод WKUP, если он включен.
Режим отладки
По умолчанию отладочное соединение теряется, если при
использовании
отладочных
функций
приложение
переводит
MCU в режим Stop или Standby. Это связано с тем, что ядро
Согtех®-М3 больше не тактируется.
Однако, установив некоторые конфигурационные биты в ре­
гистре DBGMCU_CR, можно отлаживать программное обеспече­
ние даже
при
активном
использовании
режимов пониженного
энергопотребления. Более подробная информация приведена
в разделе: Поддержка отладки в режимах низкого энергопо­
требления.
Автоматическое пробуждение (AWU) из режима пониженно­
го энергопотребления
RTC может использоваться для пробуждения MCU из режима
115
пониженного энергопотребления без внешнего прерывания (ре­
жим автоматического пробуждения). RTC обеспечивает програм­
мируемую временную базу для пробуждения из режима
Stop
Standby через регулярные интервалы времени. Для этого
или
можно выбрать два из трех альтернативных источников тактово­
го сигнала RTC, запрограммировав биты RTCSEL [1:0] в регистре
управления доменом резервного копирования (RCC_BDCR):
• Внешний кристаллический генератор с низким энергопо­
32,768 кГц (LSE OSC). Этот источник тактовых им­
треблением
пульсов обеспечивает точную временную базу с очень низким
энергопотреблением (менее
1 мкА добавочного потребления
в типичных условиях);
• Внутренний RС-генератор с низким энергопотреблением
(LSI RC) Преимущество этого источника тактовых импульсов за­
ключается в экономии стоимости кристалла 32,768 кГц. Внутрен­
ний RС-генератор рассчитан на минимальное энергопотребле­
ние.
Для выхода из режима Stop по сигналу тревоги RTC необхо­
димо:
• Настройте ЕХТI Line 17 на чувствительность к нарастающе­
му фронту импульса;
• Настройка RTC для генерации сигнала тревоги RTC Для
пробуждения из ждущего режима нет необходимости конфигу­
рировать EXTI Line 17.
РЕГИСТРЫ УПРАВЛЕНИЯ ПИТАНИЕМ
Доступ к периферийным регистрам может осуществляться
по полусловам (16-бит) или словам (32-бит).
Реrистр управления питанием (PWR_CR)
Смещение адреса: ОхОО
Значение сброса: ОхОООО 0000 (сбрасывается при пробуж­
дении из ждущего режима
116
31
3)
,.
,.
28
29
27
26
25
24
22
23
21
Зережtемров8НО
12
13
11
За-
10
8
1:1
8
7
PL5\2,0J
,w
1
,w
1
"'
20
19
18
17
16
•
3
2
1
о
:-::1::1::.1:s1c:s1
Таблица 4.6 - Регистр управления питанием (PWR_CR)
Биты
31:9.
Зарезервированы,
должны
быть
сохранены
в значении сброса.
Бит 8 DBP: отключение защиты от записи домена резервно­
го копирования. В состоянии сброса регистры RTC и резервного
копирования защищены от паразитного доступа по записи. Для
разрешения доступа к этим регистрам на запись этот бит должен
быть установлен. О: Доступ к регистрам RTC и Backup запрещен
1: Доступ к регистрам RTC и Backup разрешен.
Примечание: Если в качестве тактового генератора
RTC ис­
пользуется HSE, деленное на 128, то этот бит должен оставаться
установленным в 1.
Биты 7:5 PLS (2:0): Выбор уровня PVD. Эти биты записыва­
ются программно для выбора порога напряжения, определяемо­
го программируемым детектором напряжения:
ООО: 2.2V
001: 2.3V
010: 2.4V
011:2.SV
100: 2.бV
101: 2.7V
110: 2.8V
111: 2.9V
Примечание: Более подробную информацию см. в электри­
ческих характеристиках, приведенных в техническом паспорте.
Бит 4 PVDE: разрешение программируемого детектора на­
пряже-ния. Этот бит устанавливается и сбрасывается программ­
но. О: PVD отключен 1: PVD включен.
117
Бит 3 CSBF: очистка флага режима ожидания. Этот бит всегда
читается как О. О: Нет эффекта 1: Очистить флаг режима ожида­
ния SBF (запись).
Бит 2 CWUF: сброс флага пробуждения. Этот бит всегда чита­
ется как О. О: Нет эффекта 1: Сброс флага пробуждения WUF че­
рез 2 системных такта. (запись)
Бит 1 PDDS: Power down deepsleep. Этот бит устанавливается
и сбрасывается программно. Он работает совместно с битом
LPDS. О: Входит в режим Stop, когда процессор переходит
в Deepsleep. Состояние регулятора зависит от бита LPDS. 1: Вход
в режим ожидания при переходе процессора в глубокий сон.
LPDS: глубокий сон с низким энергопотреблением.
Бит О
Этот бит устанавливается и сбрасывается программно. Он рабо­
тает совместно с битом
О: Стабилизатор
PDDS.
напряжения
включен в режиме останова 1: Регулятор напряжения в режиме
пониженного энергопотребления в режиме Stop.
Регистр управления/состояния питания (PWR_CSR)
Смещение адреса: Ох04
Значение сброса: ОхОООО 0000 (не сбрасывается при про­
буждении из ждущего режима) Для чтения этого регистра требу­
ются дополнительные циклы АРВ по сравнению со стандартным
чтением АРВ.
31
:ю
29
28
V
26
"
14
13
12
"
10
24
25
23
22
21
20
За
Зlilреэервмровано
Таблица 4.7
-
f ":р 1
Зарезuреироеано
19
16
" "
l~ls~,1~•1
Регистр управления/состояния питания
(PWR_CSR)
Биты 31:9 Зарезервированы, должны быть сохранены в зна­
чении сброса.
118
Бит 8 EWUP: Разрешить вывод WKUP Этот бит устанавлива­
ется и сбрасывается программно.
О: вывод WKUP используется для ввода/вывода общего на­
значения. Событие на выводе WKUP не приводит к пробужде­
нию устройства из ждущего режима.
1: Вывод WKUP используется для пробуждения из ждущего
режима и принудительно переведен в конфигурацию подтягива­
ния входа (нарастающий фронт импульса на выводе WKUP про­
буждает систему из ждущего режима).
Примечание: Этот бит сбрасывается системным Reset.
Биты 7:3 Зарезервированы, должны быть сохранены в зна­
чении сброса.
Бит 2 PVDO: выход PVD Этот бит устанавливается и сбрасы­
вается аппаратно. Он действителен только в том случае, если
PVD разрешен битом PVDE.
О: VDD/VDDA выше порога PVD, выбранного битами PLS
[2:0];
1: VDD/VDDA ниже порога PVD, выбранного битами PLS
[2:0). Примечание: Работа PVD останавливается в режиме
Standby. По этой причине после перехода в ждущий режим или
сброса этот бит равен О до тех пор, пока не будет установлен
бит PVDE.
Бит 1 SBF: флаг режима ожидания Этот бит устанавливается
аппаратно
и
сбрасывается только
при
POR/PDR
(сброс при
включении/выключении питания) или при установке бита CSBF
в регистре управления питанием (PWR_CR).
О: Устройство не находилось в ждущем режиме;
1: Устройство находилось в ждущем режиме.
Бит О WUF: флаг пробуждения Этот бит устанавливается ап­
паратно и очищается аппаратно, сбросом системы или установ­
кой бита CWUF в регистре управления питанием (PWR_CR).
О: Событие пробуждения не произошло
1: Получено событие пробуждения от вывода WKUP или
RTC Примечание: Дополнительное событие
пробуждения обнаруживается, если вывод WKUP разрешен
от сигнализации
119
(установкой бита EWUP), когда уровень вывода WKUP уже высо­
кий.
КАРТА РЕГИСТРОВ PWR
Offset
ОхООО
Register
,., ,.,с,
-
1
re l~
MN - с,
,_N "'N "'..,
N ~~ ~~ ~~
N N NN N
PWR_CR
N
:: ~
а,
,о
,_ "' "'.., MN - с,
~
Reserved
PLS
(2:0]
~ ~ р~
, u u 1" : u u u u u u
l"'(eset va1ue
Ох004
М
1
PWR_CSR
Reserved
n.ese va ue
Таблица 4.8 -
i
Карта регистров PWR
120
Reserved
~н
11Т1гu
ГЛАВА S. ИНТЕРФЕЙС ПЕРЕДАЧИ
ДАННЫХ 12С
Интерфейс шины I2С (inter-integrated circuit) служит интер­
фейсом между микроконтроллером и последовательной шиной
I2С. Он обеспечивает возможность мультимастеринга и управля­
ет всеми специфическими для шины I2С функциями последова­
тельности, протокола, арбитража и синхронизации.
На F1 I2С-контроллер поддерживает стандартный режим Sm
(до 100 кГц) и режим Fm (до 400 кГц). Он может использоваться
для различных целей, включая генерацию и проверку CRC, ши­
ны SMBus (шина управления системой) и PMBus (шина управле­
ния
питанием).
В
зависимости
от
конкретной
реализации
устройства может быть доступна возможность DMA для сниже­
ния нагрузки на ядро МК.
Основные характеристики:
• Преобразователь протокола параллельная шина/I2С;
• Возможность Multimaster: один и тот же интерфейс может
выступать в роли ведущего или ведомого;
• I2С Основные характеристики:
- Генерация тактовых импульсов;
- Запуск и остановка генерации;
• I2С Ведомые функции:
- Программируемый I2С Определение адреса;
- Двойная адресация Возможность квитирования 2 адресов
ведомых устройств;
- Определение стоп-бита;
• Формирование и обнаружение 7-битной/10-битной адре­
сации и общего вызова;
• Поддержка различных скоростей передачи данных:
- Стандартная скорость (до 100 кГц).
121
- Высокая скорость (до 400 кГц).
• Аналоговый фильтр помех
• Флаги состояния: - Флаг режима работы передатчика/приемника.
- Флаг окончания передачи байта
- 12 С флаг занятости
• Флаги ошибок:
- Состояние потери арбитража для режима ведущего;
- Сбой квитирования после передачи адреса/данных;
- Обнаружение ошибочного состояния запуска или
оста-
новки;
-
Перебор/недобор при отключенном растягивании такто-
вой частоты.
• 2 Векторы прерываний:
- 1 Прерывание при успешной передаче адреса/данных;
- 1 Прерывание по состоянию ошибки;
• Дополнительное растягивание часов.
• 1-байтовый буфер с возможностью DMA.
• Конфигурируемая генерация или проверка РЕС (проверка
ошибок пакетов):
-
В режиме Тх значение РЕС может быть передано в каче-
стве последнего байта;
- Проверка ошибки РЕС для последнего принятого байта.
• Совместимость с шиной SMBus 2.0:
- Задержка ожидания низкого тактового сигнала 25 мс;
- Время задержки низкого уровня кумулятивного тактового
генератора 10 мс;
- 25 мс Время выдержки низкого уровня кумулятивного
тактового генератора ведомого устройства;
- Аппаратная генерация/проверка РЕС с контролем АСК;
- Поддерживается протокол разрешения адресов (ARP).
• Совместимость с шиной PMBus
Примечание: некоторые из перечисленных выше функций
могут быть недоступны в определенных продуктах. Пользова­
тель должен обратиться к техническому паспорту изделия, чтобы
122
определить конкретные
возможности,
поддерживаемые
реали­
зацией интерфейса 12С.
Помимо приема и передачи данных, этот интерфейс пре­
из последовательного формата
образует их
и
наоборот. Прерывания включаются
или
в
параллельный
выключаются
про­
граммно. Интерфейс подключается к шине 12С с помощью вы­
вода данных
(SDA)
и вывода тактового генератора
может быть подключен к стандартной (до
рой (до
(SCL).
Он
100 кГц) или бью­
400 кГц) шине 12С. Логическое развитие данного ин­
терфейса вырожденное в
13( в данной книге мы не рассмат­
риваем.
Выбор режима
Интерфейс может работать в одном из четырех следующих
режимов:
• Ведомый передатчик;
• Ведомый приемник;
• Ведущий передатчик;
• Мастер-приемник.
По умолчанию он работает в режиме ведомого. Интерфейс
автоматически переключается из ведомого в ведущий после ге­
нерации условия
START и из ведущего в ведомый при потере
арбитража или генерации Stop, что обеспечивает возможность
работы в режиме мультимастера.
Коммуникационный поток
В режиме Master интерфейс 12 С инициирует передачу дан­
ных и генерирует тактовый сигнал. Последовательная передача
данных
всегда
начинается
с
условия
«старт»
и
заканчивается
условием «стоп». В режиме ведущего устройства условия старта
и останова формируются программно.
В режиме SLave интерфейс способен распознавать собствен­
ные адреса (7- или 10- битные) и адрес GeneraL CaLL. Определе­
ние адреса
GeneraL CaLL может быть включено или отключено
программно.
123
Данные и адреса передаются в виде 8-разрядных байтов,
первым идет MSB. Первый байт (байты), следующий за старто­
вым, содержит адрес (один в 7-битном режиме, два в 10-бит­
ном). Адрес всегда передается в режиме Master.
9-й тактовый импульс следует за 8 тактами передачи байта,
в течение которых приемник должен отправить передатчику бит
подтверждения. Смотрите рисунок ниже:
SDA
SCL
Sюр
Start
condilion
condilion
Рисунок 5.1 -
Протокол шины 12(
Квитирование может быть включено или выключено про­
граммно. Адреса интерфейса 1 2 С (двойная адресация 7 бит/
10 бит и/или адрес общего вызова) могут быть выбраны про­
граммно. Блок-схема интерфейса 12 С приведена на рисунке
ниже:
124
Data reglster
SDA
Data
control
РЕС calculalion
Own address regisler
Dual address register
SCL
Clock
control
РЕС register
Clock control
Register (CCR)
Control registers
(CR1&CR2)
Control
logic
Status registers
(SR1&SR2)
SМВА 9+------------,~--т----т--r_J
lnterrupts
DMA requests & АСК
Рисунок 5.2 - 12С блок-схема
SMBA -
необязательный сигнал в режиме SMBus. Этот сиг­
нал не применяется, если SMBus отключен.
12С ВЕДОМЫЙ РЕЖИМ
По умолчанию интерфейс 12С работает в режиме Stave. Для
перехода из стандартного режима Stave в режим Master необхо­
дима генерация условия Start. Для формирования правильных
таймингов необходимо запрограммировать тактовую частоту пе­
риферийного входа в регистре 12C_CR2. Тактовая частота пери-
125
ферийного входа должна быть не менее:
• 2 МГц в режиме Sm;
• 4 МГц в режиме Fm.
Как только обнаруживается условие запуска, адрес поступа­
SDA и отправляется в сдвиговый регистр. Затем он
интерфейса (OAR1) и с OAR2 (если
ENDUAL=1) или с адресом общего вызова (если ENGC = 1).
ет с линии
сравнивается с адресом
Ведомый передатчик
После приема адреса и сброса
ADDR ведомое устройство
через внутренний сдвиговый регистр пересылает байт из реги­
стра DR на линию SDA.
Ведомый вытягивает низкий уровень SCL до тех пор, пока
ADDR не будет очищен и DR не заполнится пересылаемыми дан­
ными (см. рисунок 5.3: Последовательность передачи данных
EV1 EV3).
При получении импульса подтверждения:
• Бит ТхЕ устанавливается аппаратно с прерыванием, если
установлены биты ITEVFEN и ITBUFEN.
Если ТхЕ установлен, а некоторые данные не были записаны
в регистр 12C_DR до окончания очередной передачи данных, то
BTF не будет
12C_SR1 с последующей записью в регистр
12C_DR, растягивая SCL на низкий уровень.
устанавливается бит BTF и интерфейс ждет, пока
очищен чтением в
126
7-Ыt slave transmitter
151 Address I А 1
1 Data1
EV1 1ЕVЭ•\ ЕVЭ 1
jд
1
Dj2
IA~
EV1
ЕVЗ_1
ЕVЭ
ЕVЗ
iDsloN
м
INAI
рI I
ЕVЗ-2
10-Ьlt slave transmltter
S Header
А
Address
А
Dala1
А
ЕVЭ
Legend: S= Start, S, = Repealed Start, Р= Slop, А= Acknowledge, NA= Non-acknowledge,
EVx= Even\ (with inlerrupt if ITEVFEN=1)
EV1: ADDR=1. cleared Ьу reading SR1 followed Ьу reading SR2
ЕVЗ-1: ТхЕ=1, shifl register empty, data regisler empty, write Data1 in DR.
ЕVЗ: ТхЕ= 1, shifl register not empty, data register empty, cleared Ьу wriling DR
ЕVЗ-2: AF=1; AF is cleared Ьу writing 'О' in AF blt of SR1 register.
Рисунок 5.3 - Схема последовательности передачи данных для
ведомого передатчика
Ведомый приемник
После приема адреса и сброса
ADDR ведомый получает
байт с линии SDA в регистр DR через внутренний сдвиговый ре­
гистр. После каждого байта интерфейс последовательно форми­
рует:
• Импульс подтверждения, если установлен бит АСК;
• Бит RxNE устанавливается аппаратно, и прерывание гене­
рируется, если установлены биты ITEVFEN и ITBUFEN.
Если установлен RxNE и данные в регистре DR не прочитаны
до
окончания
очередного
приема
данных, то устанавливается
бит BTF и интерфейс ждет, пока BTF не будет очищен чтением
из I2C_SR1, за которым следует чтение из регистра I2C_DR, рас­
тягивая SCL на низкий уровень (см. рис. 5.4 Последовательность
передачи данных).
127
ld
7-Ыt slave receiver
1 S I Address I А
Data1
Е
10-Ыt slave receiver
1 S I Header I А I Address I А
ld
Data1
1А
~
EV2
EV1
Legend: S= Start, S, = Repeated Start, Р= Stop, А= Acknowledge,
EVx= Event (with interrupt if ITEVFEN=1)
EV1: ADDR=1, cleared Ьу reading SR1 followed Ьу reading SR2
EV2: RxNE=1 cleared Ьу reading DR register.
EV4: STOPF=1, cleared Ьу reading SR1 register followed Ьу writing to the CR1 register
Рисунок 5.4 -
Последовательность передачи данных для ведо­
мого приемника
1. Событие EV1 растягивает низкий уровень SCL до оконча­
ния соответствующей программной последовательности.
2. Программная последовательность EV2 должна быть за­
вершена до окончания передачи текущего байта
3. После проверки содержимого регистра SR1 пользователь
должен
выполнить
полную
последовательность
действий
по очистке каждого установленного флага. Таким образом, для
флагов
ADDR и STOPF внутри подпрограммы прерывания 12С
необходимо
выполнить
следующую
последовательность дей­
ствий: СЧИТЫВАНИЕ SR1 if (ADDR == 1) {READ SR1; READ SR2} if
(STOPF == 1) {READ SR1; WRITE CR1} Цель -
убедиться, что оба
флага ADDR и STOPF будут сброшены, если оба окажутся уста­
новленными.
Закрытие ведомой связи
После передачи последнего байта данных ведущим устрой­
ством генерируется условие Stop. Интерфейс обнаруживает это
состояние и устанавливает:
• бит STOPF и генерирует прерывание, если установлен бит
ITEVFEN.
Бит STOPF очищается чтением регистра SR1 и последующей
128
записью в регистр CRl (см. EV4 на рис. 5.4).
12С РЕЖИМ ВЕДУЩЕГО УСТРОЙСТВА
В режиме Master интерфейс 12 С инициирует передачу дан­
ных и генерирует тактовый сигнал. Последовательная передача
данных всегда начинается с условия Start и заканчивается усло­
вием Stop.
Режим Master выбирается, как только на шине формируется
условие Start с помощью бита START.
Ниже приведена необходимая последовательность действий
в режиме мастера.
• Запрограммируйте входной тактовый генератор перифе­
рийного устройства в регистре I2C_CR2 для формирования пра­
вильных таймингов;
• Конфигурирование регистров управления тактовыми гене­
раторами;
• Настройка регистра времени нарастания;
• Запрограммируйте регистр I2C_CR1 для включения пери­
фе-рийного устройства;
• Установите бит START в регистре I2C_CR1 для генерации
условия запуска.
Входная тактовая частота периферийного устройства должна
быть не менее:
• 2 МГц в режиме Sm;
• 4 МГц в режиме Fm.
Генерация задающего генератора SCL
Биты
CCR используются для генерации высокого и низкого
уровня тактового генератора SCL, начиная с генерации нараста­
ющего и спадающего фронта (соответственно). Поскольку ведо­
мое устройство может растягивать линию
SCL, периферийное
устройство проверяет вход SCL с шины по истечении времени,
запрограммированного в битах TRISE, после генерации нараста­
ющего фронта.
129
• Если на линии SCL низкий уровень, то это означает, что ве­
домое устройство растягивает шину, и счетчик высокого уровня
останавливается до тех пор, пока на линии SCL не будет обнару­
жен высокий уровень. Это позволяет гарантировать минималь­
ный период HIGH тактового параметра SCL.
• Если на линии SCL высокий уровень, то счетчик высокого
уровня продолжает считать.
Действительно, цикл обратной связи от генерации перифе­
рийным устройством нарастающего фронта SCL до обнаружения
периферийным устройством нарастающего фронта SCL занима­
ет время, даже если ни одно ведомое устройство не растягивает
такт. Длительность петли обратной связи связана с временем на­
растания SCL (влияет на обнаружение входа SCL VIH), плюс за­
держка из-за фильтра помех, присутствующего на входном трак­
те SCL, плюс задержка из-за внутренней синхронизации входа
SCL с тактовым генератором АРВ. Максимальное время, исполь­
зуемое петлей обратной связи, программируется в битах TRISE,
чтобы частота SCL оставалась стабильной независимо от време­
ни нарастания SCL.
Начальное условие
Установка бита START приводит к тому, что интерфейс гене­
рирует условие Start и переходит в режим Master (бит MSL уста­
новлен), когда бит BUSY сброшен.
Примечание: В режиме ведущего устройства установка бита
START приводит к тому, что интерфейс генерирует условие
ReStart по окончании передачи текущего байта.
После отправки условия Start:
• Бит SB устанавливается аппаратно, и прерывание генери­
руется, если установлен бит ITEVFEN.
Затем ведущий ожидает чтения регистра SR1, за которым
следует запись в регистр DR с адресом stave (см. рис. 5.5 и рис.
5.6 Последовательность передачи EV5).
Передача адреса ведомого устройства
130
Затем через внутренний сдвиговый регистр на линию SDA
передается адрес ведомого устройства.
• В режиме 10-битной адресации отправка последователь­
ности заголовков вызывает следующее событие:
- Бит ADD10 устанавливается аппаратно, и прерывание ге­
нерируется, если установлен бит ITEVFEN. Затем мастер ожидает
чтения регистра
SR1, после чего следует запись в регистр DR
со вторым байтом адреса (см. рис. 5.5 и рис. 5.6 Последователь­
ность передачи).
-
Бит ADDR устанавливается аппаратно, и прерывание гене­
рируется, если установлен бит ITEVFEN. Затем ведущее устрой­
ство ожидает чтения регистра SR1, за которым следует чтение
регистра SR2 (см. рис. 5.7 и рис. 5.8 Последовательность переда­
чи данных).
• В режиме 7-битной адресации передается один
байт адреса. Как только байт адреса будет отправлен, - Бит
ADDR устанавливается аппаратно, и прерывание генерируется,
если установлен бит ITEVFEN. Затем ведущее устройство ожида­
ет чтения регистра SR1, за которым следует чтение регистра SR2
(см. рис. 5.5 и рис. 5.6 Последовательность передачи данных).
Мастер может принять решение о переходе в режим пере­
датчика или приемника в зависимости от LSB переданного ад­
реса ведомого.
• В режиме 7-битной адресации, - Для перехода в режим
передатчика
ведущее
устройство
устройства со сброшенным LSB. -
посылает
адрес
ведомого
Для перехода в режим при­
емника ведущее устройство посылает адрес ведомого устрой­
ства с установленным LSB.
• В режиме 10-битной адресации,
- Для перехода в режим передатчика ведущий передает за­
головок (11110хх0), а затем адрес ведомого (где хх обозначает
два старших бита адреса).
-
Для перехода в режим приемника ведущий передает за­
головок (11110хх0), а затем адрес ведомого. Затем он должен
послать повторное условие Start, за которым следует заголовок
(11110хх1), (где хх обозначает два старших бита адреса).
131
Бит TRA указывает, находится ли мастер в режиме приемни­
ка или передатчика.
Ведущий передатчик
После передачи адреса и сброса ADDR ведущее устройство
через внутренний сдвиговый регистр пересылает байт из реги­
стра
DR на линию SDA. Ведущее устройство ожидает, пока
в I2C_DR не будет записан первый байт данных (см. рис. 5.7 По­
следовательность передачи данных EV8_1). При получении им­
пульса подтверждения бит ТхЕ устанавливается аппаратно и ге­
нерируется
прерывание,
если
установлены
биты
ITEVFEN
и ITBUFEN. Если ТхЕ установлен, а байт данных не был записан
в регистр DR до окончания последней передачи данных, то уста­
навливается BTF, и интерфейс ждет, пока BTF не будет очищен
чтением из I2C_SR1 с последующей записью в I2C_DR, растяги­
вая SCL на низкий уровень.
Закрытие коммуникации
После записи последнего байта в регистр
DR программно
устанавливается бит STOP для формирования условия Stop (см.
рис.
5.5 Последовательность передачи данных EV8_2). Интер­
фейс автоматически возвращается в режим ведомого (бит MSL
сброшен).
Примечание: Состояние останова должно быть запрограмми­
ровано во время события EV8_2, когда установлен ТхЕ или BTF.
132
7-Ьlt master tranamltter
~ Add,.,., А I EV6! EV8_1 1 °:' 1 А Q•ta2 ... · - - ~
DataN
10-Ьlt ma818r tranamltter
Гsl_J
~
- ....~,A~I
......, , А LJ~,...
га.iа.---г,:~
(§еvв[ еvв_, [ evвT@!J
Legend: S= Start, s, = Repeated Start, Р= Stop, А= Acknowtedge.
EVx= Event (with interrupt if ITEVFEN = 1)
EVS: S8=1, cleared Ьу reading SR1 reglster followвd Ьу writing ОА register with Address.
EV&: ADDR=1, cleared Ьу reading SR1 reglster followed Ьу reading SA2.
EV8_1: ТхЕ=1, shih registerempty, data register empty, write Data1 in DR.
EVI: ТхЕ=1, sr,m rogisternot emp,y"data rogister emp,y, cleanld Ьу wnling DR regisler
EV8_2: ТхЕ= t. ВТF = 1, Program Stop request ТхЕ and BTF are cleared Ьу hardware Ьу the Stop condltion
EVD: ADD10=1. cleared Ьу reading SR1 reglster followed Ьу wnting DR register.
Noles: 1- Тhе EVS, EV&, EV9, EV8_1 and EV8_2 evenls stretch SCL low unШ the end of the co,responding soltware sequence.
2- Тhе EV8 sof1ware sequence must co,nplete Ьetore the end of the C1Jnent byte transter. ln саае EV8 software
sequence сап not Ье managed Ьefore the current Ьуtе end of transfer, il is recommended 10 uae ВТF lnstead
ot ТХЕ with the drawЬвck ot slc)wjng lhe communicaUOn.
Рисунок 5.5 - Схема последовательности передачи данных для
ведущего передатчика
Мастер-приемник
После передачи адреса и сброса ADDR интерфейс 12 С пе­
реходит в режим
Master Receiver. В этом режиме интерфейс
принимает байты с линии SDA в регистр DR через внутренний
сдвиговый регистр. После каждого байта интерфейс последова­
тельно формирует:
1. Импульс подтверждения, если установлен бит АСК
2. Бит RxNE устанавливается и генерируется прерывание, если
установлены биты ITEVFEN и ITBUFEN (см. рис. 5.8 Последова­
тельность передачи EV7). Если бит RxNE установлен и данные
в регистре DR не прочитаны до окончания последнего приема
данных, то бит BTF устанавливается аппаратно, и интерфейс ждет,
пока BTF не будет очищен чтением регистра SR1, за которым сле­
дует чтение регистра DR, растягивая SCL на низкий уровень.
Закрытие коммуникации
Метод 1: Этот метод предназначен для случая, когда 12( ис­
пользуется с прерываниями, имеющими наивысший приоритет
в приложении.
133
Ведущий посылает NACK для последнего байта, полученного
от ведомого. После получения этого NACK ведомый освобожда­
ет управление линиями SCL и SDA. После этого ведущий может
послать условие Stop/Restart.
1. Чтобы сформировать импульс непризнания после послед­
него принятого байта данных, бит АСК должен быть сброшен
сразу после считывания второго последнего байта данных (по­
сле второго последнего события RxNE).
2. Чтобы сгенерировать состояние остановки/перезапуска,
необходимо установить бит STOP/START сразу после считывания
второго последнего байта данных (после второго последнего со­
бытия RxNE).
3. Если необходимо принять один байт, то отключение кви­
тирования и генерация условия Stop производятся сразу после
ЕVб (в EV6_1 - сразу после сброса ADDR).
После генерации
условия
Stop
интерфейс автоматически
возвращается в режим ведомого (бит MSL очищен).
7-bit master receiver
10-Ыt master receiver
legend: S= Start, Sr = Repeated Start, Р= Stop, А= Acknowledge, NA= Non-acknowledge,
EVx= Event (with interrupt if ITEVFEN=1)
EV5: SB=1, cleared Ьу reading SR1 register followed Ьу writing DR register.
ЕVб: ADDR=1, cleared Ьу reading SR1 register followed Ьу reading SR2. ln 10-Ыt master receiver mode, this se-
quence should Ье followed Ьу writing CR2 with START = 1.
EV6_ 1; по associated flag event, used for 1 Ьуtе reception only. The Acknowledge disaЫe and Stop condilion
generaUon are made just atter EV6. that is after ADOR is deared.
EV7: RxNE=1 deared Ьу reading DR register.
EV7 _ 1: RxNE=1 cleared Ьу reading DR register, program АСК=О and STOP request
EV9: ADO10=1, deared Ьу reading SR1 register followed Ьу writing DR register.
Рисунок 5.6 - Метод 1: схема последовательности передачи для
ведущего приемника
134
1. Если получен один байт, то он является NA.
2. События EVS, ЕVб и EV9 растягивают низкий уровень
SCL до окончания соответствующей программной последова­
тельности.
3. Программная последовательность EV7 должна завершить­
ся до конца передачи текущего байта. В случае если программ­
ная последовательность EV7 не может быть выполнена до окон­
чания передачи текущего байта, рекомендуется использовать
BTF вместо RXNE, что приведет к замедлению обмена данными.
4. Программная последовательность EV6_1 или EV7 _1 долж­
на завершиться до появления импульса АСК текущей передачи
байта.
Метод 2: Этот метод предназначен для случая, когда 12( ис­
пользуется с прерываниями, не имеющими наивысшего приори­
тета в приложении, или когда 12( используется с опросом.
При таком способе DataN_2 не считывается, поэтому после
DataN_1 обмен данными растягивается (устанавливаются значе­
ния RxNE и BTF). Затем перед чтением DataN-2 в DR необходи­
мо очистить бит АСК, чтобы он был очищен до импульса под­
тверждения
DataN. После этого, сразу после чтения DataN_2,
установите бит STOP/ START и прочитайте DataN_1. После уста­
новки бита RxNE следует чтение DataN. Это показано на рисунке
ниже:
135
7. Ыt master recelver
[sJ
5tJ
ev
u
Оа'81
EV6
-,~I
_1
! А ll1i'"' 1 А ~
. . . _1 DalaN-2 1
Е
EV7
OatoN
~
~
~
~
Неаdм I А
.~L ... Oau,N-2IАIOai,N-11 А u_
-,~1.-jo.t~o-...
~~~о.-..
~
INAW
~
А I OataN-1 ! А Ь1 DalaN !NAkbl
ЕVТ _2
EV7
Legend: S = Star1. Sr = Repeated Start, Р = Stop, А= Acknowledge, NA = Non-acknowledge,
EVx = Event (with interтupl ~ IТEVFEN = 1)
EV5: S8=1, cleared Ьу reading SR1 register followed Ьу writing the DR reg;ster,
EV6: ADDR1, cleared Ьу reading SR1 register follow-ed Ьу reading SR2.
ln 10-bll master receiver mode, this sequence should Ье followed Ьу writing CR2 with START = 1.
EV7: RxNE=1, cleared Ьу reading DR register
EV7 _:z: BTF = 1. DataN-2 iп OR and OataN-1 in shift register, program АСК = О. Read OataN-2 in OR.
Program STOP = 1, read DataN-1.
EV9: AOD10= 1, cleared Ьу reading SR1 register followed Ьу writing DR register.
Рисунок 5.7 -
Метод 2: схема последовательности передачи для
ведущего
1. События EVS, ЕVб
и
EV9 растягивают низкий уровень
SCL до окончания соответствующей
программной последова­
тельности.
2. Программная последовательность EV7 должна завершить­
ся до конца передачи текущего байта. В случае если программ­
ная последовательность EV7 не может быть выполнена до конца
передачи текущего байта, рекомендуется использовать BTF вме­
сто RXNE, что приведет к замедлению обмена данными.
Если осталось прочитать 3 байта:
• RxNE = 1 => Ничего (данныеN-2 не прочитаны);
• ДанныеN-1 получены;
• BTF = 1, так как оба регистра сдвига и данных заполнены:
DataN-2 в DR и DataN-1 в сдвиговом регистре=> SCL привязан
к низкому уровню: другие данные на шину поступать не будут.
• Очистить бит АСК;
• Чтение DataN-2 в DR => Это запустит прием DataN в сдви­
говый регистр • ДанныеN получены (с NACK);
136
• Программа СТАРТ/СТОП;
• Чтение данных N-1;
• RxNE = 1;
• Чтение данных N.
Описанная выше процедура справедлива для N> 2. Случаи,
когда необходимо принять один или два байта, должны обраба­
тываться по-разному, как описано ниже:
• Случай приема одного байта:
- В событии ADDR сбросьте бит АСК;
- Очистить ADDR;
- Запрограммируйте бит STOP/START;
- Считывание данных после установки флага RxNE.
• Случай двух принимаемых байтов:
- Установка POS и АСК;
- Дождаться установки флага ADDR;
- Очистить ADDR;
- Очистить АСК;
- Дождаться установки BTF;
- Программа STOP;
- Прочитать DR дважды;
137
7• Ыt master recelv&t
G"\JAdd,и,!AIJk;j
EV EV6 1
EV
!A!Dala2
l••ь_yJ
E.V7 З
10· Ыt master recelver
s
s,
= Repeatвd Slar1, р = Stop, А= Acknowtвdge, NA = Non-acknowledge,
Logond: = Star1,
EVx = Event (with interrupt if ITEVFEN = 1)
EVS: S8=1, deared Ьу reading SR1 register followed Ьу vwiting the DR regisler.
EV6: ADDR1, cleared Ьу reading SR1 register followed Ьу reading SR2.
tn 10-Ыt masterreceiver mode, lhis sequence should ье followed Ьу writing CR2 wilh START = 1.
EV6_1: No associated flag event. Тhе acknowledge disaЫe should Ье done just after EV6. that is after ADOR is cleared.
EV7_3: BTF = 1, program STOP = 1, read DR twice (Read Dala1 and Data2) Just a~er programming the STOP.
EV9: ADD10= 1, cleared Ьу reading SR1 register foltowed Ьу writing DR register.
Рисунок 5.8 -
Метод 2: схема последовательности передачи для
ведущего приемника при N=2
1. События EVS, ЕVб и EV9 растягивают низкий уровень
SCL до окончания соответствующей программной последова­
тельности.
2. Программная последовательность EV6_1 должна завер­
шиться до появления АСК-импульса передачи текущего байта.
138
7• Ыt master recelver
CsiJ-• I• ь&°""'
ЕV6.,З
10· Ыt master recelver
s
s,
= Repealed Start, р. Slop, А= Acknowledge, NA. Noo-acknowledge,
Legend: = Start
EVx = Event (with lnterrupt if ITEVFEN = 1)
EV5: S8=1. cleared Ьу reading SR1 regisler followed Ьу wrning lhe DR reglster.
EV6: ADDR =1, cleared Ьу reading SRt resisler followed Ьу reading SR2 register.
rтi-,.з~~?u~afte~
~ ~ : i clear ADDR Ьу reading SR1 register followed Ьу reading SR2 regisler, program
~f:1;
Note: The EV6_3 sollware sequence must complete before the current byte end of transfer.
EV7: RxNE = 1, cleared Ьу reading DR register.
EV9: ADD10= 1, cleared Ьу reading SR1 register followed Ьу wming DR reglsler.
Рисунок 5.9 - Метод 2: схема последовательности передачи для
ведущего приемника при N=1
1. События EVS, EV6 и EV9 растягивают низкий уровень
SCL до окончания соответствующей программной последова­
тельности.
Условия ошибки
Ниже перечислены условия ошибок, которые могут привести
к сбою связи.
Ошибка шины (BERR)
Эта ошибка возникает, когда интерфейс 12 С обнаруживает
внешнее условие Stop или Start во время передачи адреса или
данных. В этом случае:
• устанавливается бит BERR и генерируется прерывание, ес­
ли установлен бит IТERREN;
• в режиме Stave: данные отбрасываются, а линии освобож­
даются аппаратно:
-
в случае ошибочного Старта ведомое устройство считает
139
это перезапуском и ожидает адреса или состояния Стоп;
-
в случае неправильной установки Stop ведомый ведет се­
бя как при состоянии Stop, и линии освобождаются аппаратным
способом.
• В режиме Master: линии не освобождаются и на состояние
текущей передачи не влияют. Прервать или не прервать теку­
щую передачу зависит от программного обеспечения
Сбой квитирования (AF)
Эта ошибка возникает, когда интерфейс обнаруживает бит
неподтверждения. В этом случае:
• устанавливается бит AF и генерируется прерывание, если
установлен бит ITERREN
• передатчик, получивший NACK, должен сбросить обмен
данными:
-
Если линии SLave: освобождены аппаратными средствами;
Если
Master: условие остановки или повторного запуска
должно быть сгенерировано программно.
Арбитраж проигран (ARLD)
Эта ошибка возникает, когда интерфейс
12( обнаруживает
состояние потери арбитража. В этом случае:
• бит ARLO устанавливается аппаратно (и генерируется пре­
ры-вание, если установлен бит ITERREN);
• интерфейс 12 С автоматически переходит в режим ведомо­
12 С проигрывает арбитраж, он
го (бит MSL очищается). Когда
не может подтвердить свой ведомый адрес в той же передаче,
но может подтвердить его после повторного Start от выигравше­
го мастера;
• линии освобождаются аппаратными средствами.
Ошибка перерасхода/недорасхода (OVR)
Ошибка превышения может возникнуть в режиме ведомого
устройства, когда
а интерфейс
растягивание тактовой частоты отключено,
12( принимает данные. Интерфейс принял байт
140
(RxNE=1), а данные в DR не были прочитаны, до того как интер­
фейс примет следующий байт. В этом случае,
• Последний принятый байт теряется.
• В случае ошибки Overrun программное обеспечение долж­
но очистить бит RxNE, а передатчик должен повторно передать
последний принятый байт. Ошибка Underrun может возникнуть
в режиме slave, когда растягивание тактовых импульсов отклю­
чено, а интерфейс 12 С передает данные. Интерфейс не успел
обновить DR следующим байтом {ТхЕ=1) до прихода тактового
генератора для следующего байта. В этом случае,
• Тот же самый байт, находящийся в регистре DR, будет от­
правлен еще раз;
• Пользователь должен убедиться, что данные, полученные
на приемной стороне во время ошибки недопробега, отбрасы­
ваются и что запись следующего байта осуществляется в течение
времени тактового разряда, указанного в стандарте шины 12С.
Чтобы первый байт был передан, запись в DR должна быть
произведена после сброса
ADDR и до первого нарастающего
фронта SCL. Если это невозможно, приемник должен отбросить
первые данные.
УПРАВЛЕНИЕ ЛИНИЯМИ SDд/SCL
• Если растягивание тактовой частоты включено:
- Режим передатчика: Если ТхЕ=1 и BTF=1:
интерфейс
удерживает тактовую линию в низком уровне перед передачей,
чтобы дождаться, пока микроконтроллер прочитает SR1, а за­
тем запишет байт в регистр данных (буфер и сдвиговый ре­
гистр пусты).
-
Режим приемника: Если RxNE=1 и BTF=1: интерфейс удер­
живает тактовую линию в низком уровне после приема, чтобы до­
ждаться, пока микроконтроллер прочитает SR1, а затем прочитает
байт в регистре данных (буфер и сдвиговый регистр заполнены).
• Если в режиме Slave растягивание тактовой частоты от­
ключено:
141
- Overrun Еггог в случае, если RxNE=1 и перед приемом сле­
дующего байта не было выполнено чтение DR. Последний при­
нятый байт теряется.
- Underrun Еггог в случае, если ТхЕ=1 и запись в DR не была
произведена до передачи следующего байта. Тот же байт будет
передан повторно.
- Write Collision not managed.
ЗАПРОСЫ DMA
Запросы DMA (если они включены) формируются только для
передачи данных. Запросы DMA формируются при опустошении
регистра данных при передаче и при заполнении регистра дан­
ных при приеме. Перед передачей данных по протоколу 12С
необходимо инициализировать и включить
DMA. Бит DMAEN
должен быть установлен в регистре 12C_CR2 до события ADDR.
В режиме ведущего или ведомого, когда включено растягивание
тактовой частоты, бит
во время события
DMAEN может быть также установлен
ADDR, до сброса флага ADDR. Запрос DMA
должен быть обслужен до окончания передачи текущего байта.
По достижении запрограммированного для соответствующего
потока DMA количества передач данных контроллер DMA посы­
лает на интерфейс 12 С сигнал End of Transfer ЕОТ и генерирует
прерывание Transfer Complete, если оно разрешено:
• Ведущий передатчик: В процедуре прерывания после пре­
рывания ЕОТ отключите запросы DMA, затем дождитесь события
BTF перед программированием условия Stop.
• Мастер-приемник: когда количество принимаемых байтов
равно или больше двух, ОМА-контроллер посылает аппаратный
сигнал ЕОТ_1, соответствующий предпоследнему байту данных
(number_of_bytes - 1). Если в регистре 12C_CR2 установлен бит
LAST, то 12 С автоматически посылает NACK после следующего
за ЕОТ_1 байта. Пользователь может сгенерировать условие
Stop в подпрограмме прерывания DMA Transfer Complete, если
оно разрешено.
142
Передача с использованием
DMA Режим DMA может быть включен для передачи данных
установкой бита DMAEN в регистре I2C_CR2. При установке бита
ТхЕ в регистр I2C_DR данные будут загружаться из области памя­
ти, сконфигурированной с помощью периферийного устройства
DMA (см. спецификацию DMA). Чтобы сопоставить поток DMA х
для передачи 12 С (где х - номер потока), выполните следую­
щую последовательность:
1. Установите адрес регистра I2C_DR в регистре DMA_SxPAR.
По этому адресу будут перемещаться данные из памяти после
каждого события ТхЕ.
2. Установите адрес памяти в регистре DMA_SxMAOR (и в ре­
DMA_SxMA1R в случае режима двойного буфера). Дан­
ные будут загружаться в I2C_DR из этой памяти после каждого
гистре
события ТхЕ.
3. В регистре DMA_SxNDTR задается общее количество пе­
редаваемых байт. После каждого события ТхЕ это значение бу­
дет декрементироваться.
4. Настройка приоритета потока DMA с помощью битов PL
[0:1] регистра DMA_SxCR
5. Установите бит DIR в регистре DMA_SxCR и настройте пре­
рывания после половины передачи или полной передачи в за­
висимости от требований приложения.
6. Активизируйте
DMA_SxCR.
поток,
установив
бит
EN
в
регистре
По достижении запрограммированного в регистрах контрол­
лера DMA количества передач данных контроллер DMA посыла­
ет на интерфейс 12 С сигнал End of Transfer ЕОТ/ ЕОТ_1, а DMA
генерирует прерывание, если
оно
разрешено,
по
вектору пре­
DMA. Примечание: Не включайте бит ITBUFEN
в регистре I2C_CR2, если для передачи используется DMA.
рывания потока
Примечание:
Не включайте бит ITBUFEN в регистре I2C_CR2, если для пе­
редачи используется DMA.
143
Прием с использованием
ОМА Режим ОМА может быть включен для приема данных
установкой бита OMAEN в регистре 12C_CR2. При приеме байта
данных данные будут загружаться из регистра 12C_OR в область
памяти,
сконфигурированную
с
помощью
периферийного
устройства ОМА (см. спецификацию ОМА). Чтобы сопоставить
поток ОМА х для приема 12 С (где х -
номер потока), выполните
следующую последовательность действий:
1. Установите адрес регистра 12C_OR в регистре OMA_SxPAR.
Данные будут перемещаться с этого адреса в память после каж­
дого события RxNE.
2. Установите адрес памяти в регистре OMA_SxMAOR (и в ре­
OMA_SxMA1R в случае режима двойного буфера). Дан­
ные будут загружаться из регистра 12C_OR в эту область памяти
после каждого события RxNE.
3. В регистре OMA_SxNOTR задается общее количество пе­
редаваемых байт. После каждого события RxNE это значение бу­
гистре
дет декрементироваться.
4. Настройка приоритета потока с помощью битов PL [0:1)
регистра OMA_SxCR
5. Сброс бита OIR и конфигурирование прерываний в реги­
стре OMA_SxCR после половины передачи или полной передачи
в зависимости от требований приложения.
6. Активизируйте поток, установив бит EN в регистре
OMA_SxCR.
По достижении запрограммированного в регистрах контрол­
лера ОМА количества передач данных контроллер ОМА посыла­
ет на интерфейс 12 С сигнал End of Transfer ЕОТ/ ЕОТ_1, а ОМА
генерирует прерывание, если оно разрешено, по вектору пре­
рывания потока ОМА.
Примечание:
Не включайте бит
ITBUFEN в регистре 12C_CR2, если для
приема используется ОМА.
144
Проверка ошибок при передаче пакетов
Для повышения надежности связи реализован вычислитель
РЕС. РЕС вычисляется путем последовательного использования
полинома С (х) = х8 + х2 + х +1 CRC-8 на каждом бите.
• Вычисление РЕС разрешается установкой бита ENPEC в ре­
12C_CR1. РЕС представляет собой CRC-8, вычисляемый
для всех байтов сообщения, включая адреса и биты R/IN.
- При передаче: установите бит передачи РЕС в регистре
12C_CR1 после события ТхЕ, соответствующего последнему бай­
гистре
ту. РЕС будет передан после последнего переданного байта.
-
При приеме: установить бит РЕС в регистре 12C_CR1 после
события RxNE, соответствующего последнему байту, чтобы при­
емник отправил NACK, если следующий принятый байт не равен
внутренне рассчитанному РЕС. В случае Master- Receiver за РЕС
должен следовать
NACK независимо от результата
проверки.
РЕС должен быть установлен до импульса АСК приема текущего
байта.
• Флаг/прерывание ошибки PECERR также доступен в реги­
стре 12C_SR1.
• Если ОМА и вычисление РЕС включены:
- При передаче: когда интерфейс 12 С получает сигнал ЕОТ
от контроллера ОМА, он автоматически посылает РЕС после по­
следнего байта.
-
При
приеме:
когда
интерфейс
12
С
получает
сигнал
ЕОТ_1 от контроллера ОМА, он автоматически рассматривает
следующий байт как РЕС и проверяет его. После приема РЕС
формируется ОМА-запрос.
• Чтобы разрешить промежуточные передачи РЕС, в реги­
12C_CR2 имеется контрольный бит (бит LAST), определяю­
стре
щий, действительно ли это последняя передача ОМА или нет.
Если это последний ОМА-запрос для ведущего приемника, то
после последнего принятого байта автоматически посылается
NACK.
• Расчет РЕС нарушен из-за потери арбитража.
145
12С ПРЕРЫВАНИЯ
В таблице ниже приведен список запросов прерываний 12(:
Собьrтие nрерыuни11
Фnar СобЫТНII
6И1' уnревnения
...,,.,.wением
Стартовый бит отправлен (мастер)
SB
Адрес отправлен (Master) или адрес совпал
АДР
IISlave)
Передача 10-битноrо эаrоловка (Мaster)
ADD10
Остановить прием (Slave)
STOPF
Передача байта данных завершена
ВТF
Буфер приема не пусr
RxNE
Буфер передачи пуст
ТхЕ
Оwибкашины
BERR
Арбитражные потери (Master)
АРЛО
Признать неудачу
AF
Перерасход/недорасход
OVR
Поrрешностъ УИК
IТEVFEN и IТВUFEN
IТERREN
PECERR
Тайм-аут/оwиllка НИЭ11Drо уровня
TIMEOUT
Предуnреждение no шине SMBus
SMBALERT
Таблица 5.1 -
ITEVFEN
12( Запросы на прерывание
Примечание: SB, ADDR, ADD10, STOPF, BTF, RxNE и ТхЕ логи­
чески объединены в один канал прерывания.
OVR, PECERR, TIMEOUT
и
BERR, ARLO, AF,
SMBALERT логически объединены
в один канал прерывания.
146
IТEVFEN
k_event
it_enor
Рисунок 5.10 -
12( диаграмма отображения прерываний
I2С РЕЖИМ ОТЛАДКИ
Когда микроконтроллер переходит в режим отладки (ядро
Cortex®-M3 остановлено), таймаут SMBUS либо продолжает ра­
ботать нормально, либо останавливается, в зависимости от кон­
битов DBG_l2Cx_SMBUS_TIMEOUT в модуле
DBG. Более подробная информация приведена в разделе: Под­
держка отладки таймеров, сторожевого таймера, bxCAN и 12С.
фигурационных
РЕГИСТРЫУПРАВЛЕНИЯI2С
Доступ к периферийным регистрам осуществляется по полу­
словам (16 бит) или словам (32 бита).
12( Регистр управления 1 (I2C_CR1)
147
Смещение адреса: ОхОО
Сброшенное значение: ОхОООО
Таблица 5.2 - Регистр управления 1 (12C_CR1)
Бит 15 SWRST: программный сброс
Когда этот бит установлен, 12С находится в состоянии сбро­
са. Перед сбросом этого бита убедитесь, что линии 12С освобож­
дены и шина свободна.
О: 12 С Периферийное устройство не находится в состоянии
сброса;
1: 12С
Периферийное устройство находится
в состоянии
сброса.
Примечание: Этот бит может быть использован для повтор­
ной инициализации периферийного устройства после ошибки
или блокировки. Например, если бит BUSY установлен и остает­
ся заблокированным из-за сбоя на шине, то для выхода из этого
состояния можно использовать бит SWRST.
Бит 14 Зарезервировано, должно быть сохранено значение
сброса
Бит 13 ALERT: предупреждение SMBus Этот бит устанавли­
вается и сбрасывается программно, а при РЕ=О - аппаратно.
О: Разблокирует вывод SMBA по высокому уровню. За заго­
ловком адреса ответа на предупреждение следует NACK.
1: Переводит вывод SMBA в низкий уровень. За заголовком
адреса ответа на предупреждение следует АСК.
Бит 12 РЕС: Проверка ошибок при передаче пакетов Этот
бит устанавливается и сбрасывается программно, а также сбра­
сывается аппаратно при передаче РЕС или по условию
148
START
или Stop, или когда РЕ=О.
О: Нет передачи РЕС;
1: Передача РЕС (в режиме Тх или Rx).
Примечание: Расчет РЕС нарушается при потере арбитража.
Бит
11 POS: Квитирование/Положение
ПЭК (для
приема
данных) Этот бит устанавливается и сбрасывается программно
и очищается аппаратно, когда РЕ=О.
О: Бит АСК контролирует (N) АСК текущего байта, поступаю­
щего в сдвиговый регистр. Бит РЕС указывает на то, что текущий
байт в сдвиговом регистре является РЕС.
1: Бит АСК управляет (N) АСК следующего байта, который бу­
дет принят в регистр сдвига. Бит РЕС указывает, что следующий
байт в регистре сдвига является РЕС
Примечание: Бит POS используется при выполнении проце­
дуры приема 2-х байт (см. Метод 2: схема последовательности
передачи данных для ведущего приемника при N=2). Он должен
быть сконфигурирован до начала приема данных. В этом случае
для NACK 2-го байта бит АСК должен быть сброшен сразу после
сброса ADDR. Для проверки 2-го байта как РЕС бит РЕС должен
быть установлен в событии растягивания ADDR после конфигу­
рирования бита POS.
Бит 10 АСК: разрешение квитирования Этот бит устанавли­
вается и сбрасывается программно, а также сбрасывается аппа­
ратно, когда РЕ=О.
О: квитирование не возвращается;
1: Квитирование возвращается после получения байта (сов­
падающего адреса или данных).
Бит 9 STOP: Генерация стопа Бит устанавливается и сбрасы­
вается программно, сбрасывается аппаратно при обнаружении
состояния
Stop, устанавливается аппаратно при обнаружении
ошибки тайм-аута. В режиме Master Mode:
О:.Нет генерации остановки.
1: Остановка генерации после передачи текущего байта или
после отправки текущего условия Start.
В режиме Slave:
149
О: Нет генерации остановки.
1: Освобождение линий SCL и SDA после передачи текущего
байта.
Бит
8 START: начало генерации Этот бит уста.навливается
и сбрасывается программно, а также сбрасывается аппаратно,
когда посылается старт или РЕ=О. В режиме Master:
О: Нет генерации запуска
1: Повторная генерация старта
В режиме Slave:
О: Нет генерации запуска
1: Запуск генерации при свободной шине
Бит 7 NOSTRETCH: Отключение растягивания тактовой ча­
стоты (режим Slave) Этот бит используется для отключения рас­
тягивания тактовой частоты в режиме ведомого устройства, ко­
гда установлен флаг ADDR или BTF, до тех пор, пока он не будет
сброшен программно.
О: Растягивание тактовых импульсов включено
1: Растягивание тактовых импульсов выключено
Бит 6 ENGC: разрешение общего вызова
О: Общий вызов запрещен. По адресу 00h выводится
NACK.
1: Общий вызов разрешен. По адресу 00h передается сигнал АСК.
Бит 5 ENPEC: Разрешение РЕС О
: Расчет УИК отключен
1: Расчет УИК включен
Бит4 ENARP:
ARP еnаЫе
О: ARP disaЫe
1: ARP разрешен Адрес устройства SMBus по умолчанию,
распознаваемый, если SМВТУРЕ=О Адрес хоста SMBus, распо­
знаваемый, если SМВТУРЕ=1
Бит 3 SМВТУРЕ: Тип SMBus
О: Устройство SMBus
1: SMBus Host
150
Бит 2 Зарезервировано, должно быть сохранено значение
сброса
Бит 1 SMBUS: режим SMBus
О: 12 С режим
1: Режим SMBus
Бит О РЕ: PeripheraL еnаЫе
О: PeripheraL disaЫe
1: Разрешение периферийного устройства
Примечание: Если этот бит сброшен в процессе обмена дан­
ными, то по окончании текущего обмена периферийное устрой­
ство будет отключено и вернется в состояние IDLE. Все сбросы
битов, связанные с РЕ=О, происходят в конце обмена данными.
В режиме ведущего этот бит не должен сбрасываться до оконча­
ния обмена данными.
Примечание: Если установлен бит STOP, START или РЕС, то
программное
обеспечение
не
должно
выполнять
запись
в I2C_CR1 до того, как этот бит будет очищен аппаратно. В про­
тивном случае существует риск повторной установки запроса
STOP, START или РЕС.
12С Регистр управления 2 (12C_CR2)
Смещение адреса: Ох04
15
14
,з
.....,,,.. !
12
LAST
rw
11
10
!DМAEN ПBUFEN: 1теvтен lпERREN j ........
rw
,w
rw
1
rw
FREQl5:01
rw
rw
rwj,w
Таблица 5.3 - Регистр управления 1 (I2C_CR2)
Биты 15:13 Зарезервировано, должно сохраняться значение
сброса
Бит 12 LAST: последняя передача DMA
151
О: Следующий ОМА ЕОТ не является последней передачей
1: Следующий ОМА ЕОТ является последней передачей При­
мечание: Этот бит используется в режиме ведущего приемника
для разрешения генерации NACK на последние принятые данные.
Бит 11 DMAEN: Разрешение запросов ОМА
О: Запрет запросов ОМА
1: Запрос ОМА разрешен, если
ТхЕ=1 или RxNE =1
Бит 10 ITBUFEN: разрешение прерывания буфера
О: ТхЕ = 1 или RxNE = 1 не генерирует прерывание.
1: ТхЕ = 1 или RxNE = 1 генерирует прерывание по событию
(независимо от состояния OMAEN)
Бит 9 ITEVТEN: Разрешение прерывания по событию
О: Прерывание по событию отключено
1: Прерывание по событию разрешено
Это прерывание генерируется, когда:
- SB = 1 (Master)
- AOOR = 1 (ведущий/ведомый)
- АОО10= 1 (Master)
- STOPF = 1 (ведомый)
- BTF = 1 при отсутствии событий ТхЕ или RxNE
- Событие ТхЕ в 1, если ITBUFEN = 1
- Событие RxNE в 1, если ITBUFEN = 1
Бит 8 ITERREN: Разрешение прерывания ошибки
О: Прерывание ошибки отключено
1: Прерывание по ошибке разрешено Это прерывание генерируется, когда:
- BERR = 1
- ARLO = 1
-AF = 1
- OVR = 1
- PECERR = 1
- TIMEOUT = 1
- SMBALERT = 1
Биты 7:6 Зарезервированы, должны быть сохранены в зна­
чении сброса
152
S:0 FREQ [S:0]:
Биты
Тактовая
частота
периферийного
устройства Биты FREQ должны быть сконфигурированы со значе­
нием тактовой частоты АРВ (периферийное устройство I2С под­
ключено к АРВ). Поле FREQ используется периферийным устрой­
ством для формирования времени установки и удержания дан­
ных в соответствии со спецификациями I2С. Минимально допу­
стимая частота составляет 2 МГц, максимальная частота ограни­
чена максимальной частотой АРВ и не может превышать 50 МГц
(максимальный предел, присущий периферийным устройствам).
ОЬОООООО: не разрешено
ОЬ000001: Не разрешено
ОЬ000010: 2 МГц
ОЫ10010: 50 МГц
Выше ОЫО1010: не допускается
12С Регистр собственного адреса 1 (12C_OAR1)
Смещение адреса: Ох08
15
14
12
13
11
10
ADOO
ADD[l 1)
ADD[9:8)
Reaervecl
Таблица 5.4 - Регистр собственного адреса 1 (I2C_OAR1)
Бит 1S ADDMODE Режим адресации (ведомый режим) О: 7битный адрес ведомого (10-битный адрес не квитируется) 1: 10битный адрес ведомого (7-битный адрес не квитируется)
Бит 14 должен всегда поддерживаться в состоянии
1 про­
граммой.
Биты 13:10 Зарезервировано, должно быть сохранено зна­
чение сброса
153
Биты 9:8 ADD [9:8]: Адрес интерфейса 7-битный режим ад­
ресации: безразлично 10-битный режим адресации: биты9:8 ад­
реса
Биты 7:1 ADD [7:1]:Биты 7:1 адреса интерфейса
Бит О ADD0: Адрес интерфейса
7-битный режим адресации: безразлично;
10-битный режим адресации: бит О адреса.
12С Регистр собственного адреса 2 (12C_OAR2)
Смещение адреса: ОхОС
15
14
13
12
11
10
9
R...rvod
Таблица S.S -
Регистр собственного адреса 2 (12C_OAR2)
Биты 15:8 Зарезервировано, должно сохраняться значение
сброса
Биты
7:1 ADD2 [7:1]: Адрес интерфейса Биты 7:1 адреса
в режиме двойной адресации
Бит О ENDUAL: Разрешение режима двойной адресации О:
В режиме 7-битной адресации распознается только OARl 1: Оба
OARl и OAR2 распознаются в режиме 7-битной адресации.
12( Регистр данных (12C_DR)
Смещение адреса: 0xl0
154
13
14
15
12
11
10
,wJ,wJ,w
,wJ,w
,wJ.wJ
,w
Таблица 5.6 - I2С Регистр данных (I2C_DR)
Биты 15:8 Зарезервировано, должно быть сохранено значе­
ние сброса
Биты 7 :О DR [7 :О]
8-разрядный регистр данных gринятый или передаваемый
на шину байт:
-
Режим передатчика: Передача байта начинается автома­
тически при записи байта в регистр DR. Непрерывный поток пе­
редачи
может
(ТхЕ=1)
в
поддерживаться,
регистр
DR
если
после
начала
помещаются очередные
передачи
передаваемые
данные.
- Режим приемника: Принятый байт копируется в DR
(RxNE=1). Непрерывный поток передачи может поддерживаться,
если DR считывается перед приемом следующего байта данных
(RxNE=1).
Примечание: В режиме ведомого устройства адрес не копи­
руется в DR. Коллизия записи не управляется (DR может быть за­
писана, если ТхЕ=О). Если по импульсу АСК происходит событие
ARLO, то принятый байт не копируется в DR и поэтому не может
быть прочитан.
12С Регистр состояния 1 (12C_SR1)
Смещение адреса: Ох14
155
13
14
15
12
11
10
9
SB
д~~~Т ~~i i Res. :~~ OVR AF ARLO BERR ТхЕ RxNE Res STOPF ADD10 BTF ADDR
1---+--+----+-+-----1
1---+---+---+----+-t----+---I
r
rc_wO rc_wO rc... wiJ ,c_WO rc _wO
,c_wO rc_WO !
Таблица 5.7 -
I2С Регистр состояния 1 (I2C_SR1)
Бит 15 SMBALERT: SMBus alert В режиме хоста SMBus: О: нет
SMBALERT 1: На выводе произошло событие SMBALERT В ведо­
мом режиме SMBus:
О: заголовок адреса ответа SMBALERT отсутствует
1: Заголовок адреса ответа SMBALERT на полученный
SMBALERT LOW - Снимается программной записью О, либо ап­
паратно, если РЕ=О.
Бит 14 TIMEOUT: Ошибка тайм-аута или Тlow
О: Ошибка таймаута отсутствует
1: SCL оставался НИЗКИМ в течение 25 мс (тайм-аут) или
Время продления низкого уровня кумулятивного тактового гене­
ратора более 10 мс (Тlow: mext) или Время продления низкого
уровня кумулятивного тактового генератора ведомого устрой­
ства более 25 мс (Тlow: sext)
-
При установке в режиме ведомого: ведомый сбрасывает
связь и линии освобождаются аппаратно
-
При установке в режиме ведущего: Условие останова пе­
редается аппаратно
- Снимается программной записью О или аппаратно, если
РЕ=О. Примечание: Данная функциональность доступна только
в режиме SMBus.
Бит 13 Зарезервировано, должно быть сохранено значение
сброса
Бит 12 PECERR: ошибка приема РЕС
О: ошибки РЕС нет: приемник возвращает АСК после приема
РЕС (если ACK=l)
1: Ошибка РЕС: приемник возвращает NACK после приема
156
РЕС (независимо от АСК)
Примечание: Снимается программной записью О или аппаратно, если РЕ=О.
Бит 11 OVR: Overrun/Underrun
О: No overrun/underrun
1: Overrun ог underrun - Устанавливается аппаратно в режи­
ме ведомого, когда NOSTRETCH=l и:
-
При
приеме,
когда
принимается
новый
байт (включая
АСК-импульс), а регистр DR еще не прочитан. Новый принятый
байт теряется.
-
При передаче, когда должен быть отправлен новый байт,
а в регистр DR еще не была произведена запись. Один и тот же
байт передается дважды.
- Снимается программной записью О или аппаратно, если
РЕ=О. Примечание: Если запись DR происходит очень близко
к нарастающему фронту SCL, то передаваемые данные не опре­
деляются, и возникает ошибка синхронизации удержания.
Бит 10 AF: Сбой квитирования
О: Нет сбоя квитирования
1: Сбой квитирования
- Устанавливается аппаратно, когда квитирование не воз­
вращается.
-
Снимается программной записью О или аппаратно, если
РЕ=О.
Бит 9 ARLD: Арбитраж потерян (режим ведущего)
О: Арбитраж не обнаружен
1: Обнаружена потеря арбитража Устанавливается аппарат­
но, когда интерфейс теряет арбитраж шины для другого ведуще­
го устройства
- Снимается программной записью О или аппаратно, если
РЕ=О. После события ARLO интерфейс автоматически переклю­
чается в режим Slave (MSL=0).
Примечание: В шине SMBUS арбитраж данных в режиме ве­
домого происходит только во время фазы данных или передачи
подтверждения (не при подтверждении адреса).
157
Бит 8 BERR: ошибка шины
О: Нет ошибочных условий пуска или останова
1: Ошибочные условия пуска или останова
- Устанавливается аппаратно, когда интерфейс обнаружива­
ет нарастающий или спадающий фронт SDA при высоком уровне
SCL, возникающий в невалидной позиции во время передачи
байта.
-
Снимается программной записью О или аппаратно, если
РЕ=О.
Бит 7 ТхЕ: регистр данных пуст (передатчики)
О: регистр данных не пуст
1: Регистр данных пуст
- Устанавливается, когда DR пуст при передаче. В фазе ад­
ресации ТхЕ не устанавливается.
- Снимается программной записью в регистр DR или аппа­
ратно после запуска или останова, а также при РЕ=О.
ТхЕ не устанавливается, если получен либо NACK, либо если
следующий передаваемый байт РЕС (РЕС=1)
Примечание: ТхЕ не очищается ни при записи первых пере­
даваемых данных,
ни
при
записи данных
при
установленном
значении BTF, так как в обоих случаях регистр данных остается
пустым.
Бит 6 RxNE: Регистр данных не пуст (приемники) О: Регистр
данных пуст 1: Регистр данных не пуст
- Устанавливается, когда регистр данных не пуст в режиме
приемника. В фазе адресации RxNE не устанавливается.
- Снимается программным чтением или записью в регистр
DR или аппаратно, если РЕ=О. В случае события ARLO RxNE
не устанавливается.
Примечание: RxNE не очищается при чтении данных, когда
установлен BTF, так как регистр данных все еще заполнен.
Бит 5 Зарезервировано, должно быть сохранено значение
сброса
Бит 4 STOPF: обнаружение остановки (ведомый режим)
О: Состояние останова не обнаружено
158
1: Состояние останова обнаружено
- Устанавливается аппаратно, когда после подтверждения
(если АСК=1) ведомый обнаруживает на шине состояние Stop.
- Снимается программным чтением регистра SR1 с последу­
ющей записью в регистр CR1 или аппаратно, если РЕ=О
Примечание: Бит STOPF не устанавливается после приема
NACK. Рекомендуется после установки STOPF выполнить полную
последовательность очистки (READ SR1, затем WRITE CR1).
Бит 3 ADD10: отправлен 10-битный заголовок (режим
Master) О: Событие ADD10 не произошло.
1: Ведущий передал первый байт адреса (заголовок).
- Устанавливается аппаратно, когда ведущее устройство от­
правило первый байт в режиме 10-битного адреса.
-
Снимается программным чтением регистра SR1 с последу­
ющей записью в регистр
DR второго байта адреса, либо аппа­
ратно, если РЕ=О.
Примечание: бит ADD10 не устанавливается после приема
NACK.
Бит 2 BTF: передача байта завершена
О: Передача байта данных не выполнена
1: Передача байта данных выполнена
- Устанавливается аппаратно, если NOSTRETCH=0 и:
- В режиме приема, когда получен новый байт (включая
импульс АСК), а DR еще не прочитан (RxNE=1).
- При передаче, когда должен быть отправлен новый байт,
а DR еще не записан (ТхЕ=1).
- Очищается программным чтением SR1 с последующим
чтением или записью в регистр DR или аппаратно после состоя­
ния старта или останова передачи или при РЕ=О.
Примечание:
Бит
BTF
устанавливается
не
после
приема
NACK. Бит BTF не устанавливается, если следующим передавае­
мым
байтом
является
РЕС
(ТRА=1
в
регистре
12C_SR2
и РЕС=1 в регистре 12C_CR1).
Бит 1 ADDR: адрес отправлен (режим ведущего) /сопостав­
лен (режим ведомого) Этот бит очищается программным чтени-
159
ем регистра SR1 с последующим чтением SR2 или аппаратно, ес­
ли РЕ=О. Сопоставление адресов (Slave)
О: Адрес не совпадает или не получен.
1: Полученный адрес совпадает.
- Устанавливается аппаратно, как только полученный адрес
ведомого устройства совпадет с содержимым регистров OAR
или будет распознан общий вызов, или адрес по умолчанию
SMBus Device, или SMBus Host, или SMBus Alert. (при включении
в зависимости от конфигурации).
Примечание: В режиме ведомого устройства рекомендуется
ADDR выполнить полную последовательность
очистки (READ SR1, затем READ SR2). См. рисунок по «Передан­
ный адрес (Master)».
после установки
О: Нет конца передачи адреса
1: Конец передачи адреса
- При 10-битной адресации бит устанавливается после АСК
второго байта.
При 7-битной адресации бит устанавливается после АСК
байта.
Примечание:
ADDR
не
устанавливается
после
приема
NACK.
Бит О SB: Стартовый бит (режим Master)
О: Условие старта отсутствует
1: Генерируется условие запуска.
12С Регистр управления тактовым генератором (12C_CCR)
15
14
13
12
11
10
Таблица 5.8 - 12С Регистр состояния 2 (12C_SR2)
160
Биты 15:8 РЕС [7:0) Регистр проверки ошибок пакетов Этот
регистр содержит внутренний РЕС, когда ENPEC=1.
Бит 7 DUALF: двойной флаг (режим Slave)
О: Полученный адрес совпадает с OAR1;
1: Полученный адрес совпадает с OAR2.
- Очищается аппаратно после состояния Stop или повторного состояния Start, или когда РЕ=О.
Бит 6 SMBHOST: заголовок хоста SMBus (режим Slave)
О: адрес хоста SMBus отсутствует
1: Адрес хоста SMBus получен, если SМВТУРЕ=1 и ENARP=1.
- Очищается аппаратно после состояния Stop или повторного состояния Start, или когда РЕ=О.
Бит 5 SMBDEFAULT: Адрес устройства SMBus по умолчанию
(режим SLave)
О: Адрес устройства SMBus по умолчанию отсутствует
1: Адрес устройства SMBus по умолчанию, полученный при
ENARP=1
- Очищается аппаратно после состояния Stop или повторного состояния Start, или когда РЕ=О.
Бит 4 GENCALL: адрес общего вызова (режим Slave)
О: нет общего вызова
1: Адрес общего вызова получен при ENGC=1 - Очищается
аппаратно после состояния Stop или повторного состояния Start,
или когда РЕ=О.
Бит
3 Зарезервировано, должно быть сохранено значение
сброса
Бит 2 TRA: Передатчик/приемник
О: Получены байты данных
1: Передаются байты данных
Этот бит устанавливается в зависимости от бита R/W адрес­
ного байта, в конце фазы полного адреса. Он также очищается
аппаратно после обнаружения состояния
Stop (STOPF=1), по­
вторного состояния Start, потери арбитража шины (ARLO=1) или
при РЕ=О.
Бит 1 BUSY: шина занята
161
О: Связь по шине отсутствует
1: Связь по шине продолжается
- Устанавливается аппаратно при обнаружении низкого
уровня SDA или SCL - очищается аппаратно при обнаружении
состояния Stop. Она указывает на то, что по шине идет обмен
данными. Эта информация продолжает обновляться, когда ин­
терфейс отключен (РЕ=О}.
Бит О MSL: Master/slave
О: Ведомый режим
1: Режим ведущего
- Устанавливается аппаратно, как только интерфейс перехо­
дит в режим Master (SB=1}.
- Очищается аппаратно после обнаружения состояния Stop
на шине или потери арбитража (ARLO=1), либо аппаратно, когда
РЕ=О.
Примечание: Чтение
12C_SR2 после чтения 12C_SR1 сбрасы­
вает флаг ADDR, даже если флаг ADDR был установлен после
12C_SR1. Следовательно, чтение 12C_SR2 должно произ­
водиться только в том случае, если флаг ADDR установлен
в 12C_SR1 или если сброшен бит STOPF.
чтения
12( Регистр управления тактовым генератором (12C_CCR)
Смещение адреса: Ох1С
Примечание: f PcLкi должен быть не менее 2 МГц для достиже­
ния частот режима Sm 12С. Для достижения частот режима 12С
Fm оно должно быть не менее 4 МГц. Для достижения макси­
мальной частоты 400 кГц в режиме 12С Fm частота fPCLK1 долж­
на быть кратна 10 МГц. Регистр CCR должен быть сконфигуриро­
ван только при отключенном 12С (РЕ= О).
162
15
14
F/S
DUТY
13
12
11
10
9
CCR(11:0J
Rese,ved
Таблица 5.9 - Регистр управления тактовым генератором
Бит 15 F/S: выбор режима ведущего устройства 12(:
О: режим Sm I2С
1: Fm режим I2С
Бит 14 DUlY: рабочий цикл
режима Fm
О: режим Fm tlow/thigh = 2
1: Режим Fm tlow/thigh = 16/9 (см. CCR)
Биты 13:12 Зарезервированы, должны
быть
сохранены
в значении сброса
Биты 11:0 CCR [11:0): Регистр управления тактовым генера­
тором в режиме Fm/Sm (режим Master) Управляет тактовым ге­
нератором SCL в режиме Master.
Режим Sm или SfvtBus:
Thigh = CCR * TPCLK1
Тlow = CCR * TPCLK1
Режим Fm:
Если DUТY = О:
Thigh = CCR * TPCLK1
Тlow = 2 * CCR * TPCLK1
Если DUТY = 1:
Thigh = 9 * CCR * TPCLK1
Тlow = 16 * CCR * TPCLK1
Например: в режиме Sm для генерации частоты SCL 100 кГц:
Если FREQ = 08, то TPCLK1 = 125 нс, поэтому CCR должен быть
запрограммирован на Ох28 (Ох28 <=> 40d х 125 нс= 5000 нс).
Примечание: Минимально допустимое значение равно Ох04,
за исключением режима
FAST DUТY, где минимально допусти163
мое значение равно Ох01 thigh = tr (SCL) + tw (SCLH). Определе­
ния параметров см. в техническом описании устройства. tLow =
tf (SCL) + tw (SCLL). Определения параметров см. в техническом
описании устройства. Скорость обмена данными по интерфейсу
12С, fSCL -
1/ (thigh + tLow). Реальная частота может отличаться
из-за задержки на входе аналогового шумового фильтра. Ре­
гистр CCR должен быть сконфигурирован только в том случае,
если 12 С отключен (РЕ = О).
12С Реrистр TRISE (12С_TRISE)
Смещение адреса: Ох20
W
ffi
d
~
n
ю
.........
9
Таблица 5.10 - 12С Регистр TRISE
Биты 15:6 Зарезервированы, должны быть сохранены в зна­
чении сброса
Биты 5:0 TRISE [5:0]: Максимальное время нарастания в ре­
жиме Fm/Sm (режим Master)
Эти
биты
должны
обеспечивать
ность цепи обратной связи
максимальную длитель­
SCL в режиме ведущего устрой­
ства.
Цель
-
поддержание стабильной частоты
SCL независимо
от длительности фронта нарастания SCL.
Эти биты должны быть запрограммированы на максималь­
ное время нарастания сигнала SCL, указанное в спецификации
шины 12С, увеличенное на 1.
Например: в режиме Sm максимально допустимое время на­
растания SCL составляет 1000 нс. Если в регистре 12C_CR2 зна-
164
чение битов FREQ (5:0) равно Ох08, а TPCLKl = 125 нс, то биты
TRISE (5:0] должны быть запрограммированы на 09h. (1000 нс/
125 нс= 8 +1)
КАРТА РЕГИСТРОВ 12С
Register
Offset
19~~~9~9~999~~~9~
l(')"'lt
--
12C_CR2
0,0<
,,,
u
~
,,,
ш
ш
ш
о
00
!:1
о·
Reset~
-о
'11"'"
tu ~ u"
g: z
а:
Roиr,ed
..-
....
з;
t;
12C_ C R1
0,00
.. "' ...... ., "'
ш ~ ~ ~ i; 11
С"-1! 1 - ~ '" .,
f')
о
, о
о
00о о
о
~ 1 ~ "'ffi 1
Reserved
~esetvalue
O JO
z
z
о
о
"'а:
,,,~ ~
00
ш
о
FREO(S:0J
Iо о о
о
~
12C_OAR1
о.оа
о
""~
R.........,
12C_OAR2
0, 10
Ох14
·-
l2C_DR
-
R~etvaltН!I
12C_SR1
R...,,,e<J
"-
:,
"ffi
о
о
о То ] о Т о о r o
о
O[ Oi 0 / 0 . о ! О
DR\700]
о
~ ш ] 1
:\;
1:~ 1
:l ~ il ~ о
~~
77
о
ffi §
"'
Rcscl valuo
"<
ADD2(7:1)
"""""""
Resetvalue
-
8
ADD(7:1)
iОТ• о го Гоl •ТЬТ• Jо ·0-1
о
Resetvatue -
о,ос
AOD[Q·8)
Reseм,d
о .
а:
а:
<
ш
о
о
а:
; о
о
~ ~а:
,-
н ~.,
о
о о а.
о
а:
- u.
",-
".,
а"'
о
о
о
<
Iо
,- 5 :j
0,18
Ох1С
-
0,20
12C_SR2
., "
а
"' р ~
":,;
,.-,.-,,-•T•l • Т•
Reset vatue
о
12C_CCR
rt! ~
Rese,ved
u.
а:
1о I о
о
о ' о
о
о
о
о
о
о
Iо
CCRjl! 0J
5 ] 1
о о
Resel vatue
12C_TRISE
~:, .,~ ~ z~ н ~ ~
PEC(7:0J
Reserwd
о
о
Re-
о
о
"J о
о
TRtSE\5:0J
::OТ• f o f o
Rescl value
Таблица 5.11 -
1fo 1
Карта регистров 12(
Значение фильтра также может быть добавлено к
TRISE
(5:0]. Если результат не является целым числом, то для соблюде165
ния параметра tHIGH
[5:0] целой частью.
необходимо
запрограммировать
TRISE
Примечание: конфигурирование TRISE [5:0] должно произво­
диться только при отключенном 12( (РЕ = О).
ПРИМЕРЫ РАБОТЫ С I2С
ПРОЕКТ ПО ВЫВОДУ ИНФОРМАЦИИ
НА ДИСПЛЕЙ LCD1602 ЧЕРЕЗ ИНТЕРФЕЙС I2С
файл main. с:
#incLude «stm32f10x.h»
#incLude «Lcd. h»
#incLude «i2c.h»
#incLude <stdio.h>
#define SyscLock 72000000U
uint32_t SysTick_CNT = О;
void deLay_ms (uint32_t ms)
{
MODIFY_REG (SysTick-> VAL,
SyscLock / 1000 - 1);
SysTick_CNT = ms;
whiLe(SysTick_CNT) {}
}
SysTick_VAL_CURRENT_Msk,
void SysTick_lnit (void)
{
MODI FY_REG(SysTick>LOAD,SysTick_LOAD_RELOAD _Msk,SyscLock / 1000 - 1);
SysTick->VAL &= SysTick_VAL_CURRENT_Msk;
166
SET_BIT(SysTick->CTRL,
SysTick_CTRL_CLKSOURCE_Msk
SysТick_ CTRL_ENABLE_Msk I SysTick_CTRL_TICKINT_Msk);
}
void SetRCC_CLockTo72 (void)
{
RCC-> CR 1= RCC_CR_HSEON;
while (READ_BIT (RCC-> CR, RCC_CR_HSERDY == RESET)) {}
FLASH-> ACR &= -FLASH_ACR_PRFTBE;
FLASH-> ACR 1= FLASH_ACR_PRFTBE;
FLASH-> ACR &= -FLASH_ACR_LATENCY;
FLASH-> ACR 1= FLASH_ACR_LATENCY_2;
RCC-> CFGR &= -RCC_CFGR_HPRE;
RCC-> CFGR 1= RCC_CFGR_HPRE_DIV1;
RCC-> CFGR &= -RCC_CFGR_PPRE2;
RCC-> CFGR 1= RCC_CFGR_PPRE2_DIV1;
RCC-> CFGR &= -RCC_CFGR_PPRE1;
RCC-> CFGR 1= RCC_CFGR_PPRE1_DIV2;
RCC-> CFGR &= (uint32_t) ((uint32_t) - (RCC_CFGR_PLLSRC 1
RCC_CFGR_PLLXTPRE I RCC_CFGR_PLLMULL));
RCC-> CFGR 1= (uint32_t) (RCC_CFGR_PLLSRC_HSE
RCC_CFGR_PLLMULL9);
RCC-> CR 1= RCC_CR_PLLON; // Включаем ФАПЧ (PLL)
RCC_CR_PLLRDY)!=
CR,
(RCC->
(READ_BIT
while
(RCC_CR_PLLRDY)) {}
RCC-> CFGR &= -RCC_CFGR_SW;
RCC-> CFGR 1= RCC_CFGR_SW_PLL;
RCC_CFGR_SWS)!=
CFGR,
(RCC->
(READ_BIT
while
RCC_CFGR_SWS_PLL) {}
}
int main (void)
{
uint16_t i;
char str1[10];
167
SetRCC_CLockTo720;
SysTick_lnit0;
I2C_lnit0;
LCD_ini0;
LCD_String("Hi !NR.eLectronics");
LCD _SetPos(S,1);
LCD_String("String 2");
deLay_ms(2000);
LCD_SetPos(1,1);
LCD_String (>»>);
whiLe (1) {
sprintf (str1,»%5d», i++);
LСD_SеtРоs(О,1);//Позиция О и строка 1
LCD _String(str1);//Вывод строки
deLay_ms (1000);}
}
void SysTick_HandLer (void)
{
if(SysTick_CNT > О)
SysTick_CNT--;
}
файл i2c. h:
#ifndef I2C_USER_H_
#define I2C_USER_H_
fi-----------------------#incLude «stm32f10x.h»
fi-----------------------void I2C_SendByteByADDR (I2C_TypeDef * i2c, uint8_t
uint8_t addr);
void I2C_lnit (void);
с,
fi-----------------------#endif i I2C_USER_H_ */
168
файл ilc. с:
#include "i2c.h"
#define 12C_REQUEST_WRITE
#define 12C_REQUEST_READ
#define 12С_ OWNADDRESS1_7BIT
#define 12C_MODE_l2C 0x00000000U
void 12C_lnit (void)
{
APB2ENR
RCC->
RCC_APB2ENR_AFIOEN;
1=
ОхОО
Ох01
0x00004000U
RCC_APB2ENR_IOPBEN
// Настройка РВ8 (SCL) и РВ9 (SDA) в альтернативном режи­
ме с открытым стоком
AFIO->MAPR 1= AFIO_MAPR_l2C1_REMAP;// Ремаппинг 12С1
на РВ8 и РВ9
GPIOB->CRH &= -(GPIO_CRH_CNF8 1 GPIO_CRH_MODE8
GPIO_CRH_CNF9 1 GPIO_CRH_MODE9); // Сброс
GPIOB-> CRH 1= GPIO_CRH_CNF8_1 1 GPIO_CRH_CNF9_1
GPIO_CRH_CNF8_0 1 GPIO_CRH_CNF9_0; // Альтернативная функ­
ция с открытым стоком
GPIOB->CRH 1= GPIO_CRH_MODE8_0 1 GPIO_CRH_MODE9_0 1
GPIO_CRH_MODE8_1 1 GPIO_CRH_MODE9_1; // Режим вывода,
50 МГц
RCC-> APB1ENR 1= RCC_APB1ENR_l2C1EN; // 12С1
12C1->OAR2 &=- 12C_OAR2_ENDUAL; //DisaЫe acknowledge
оп Own Address2 match address
12C1->CR1 &=- 12C_CR1_ENGC; //DisaЫe General Call
12C1->CR1 &=- 12C_CR1_NOSTRETCH; //ЕпаЫе Clock
stretching
12(1-> CR1 &=- 12C_CR1_PEj/ Отключаем 12( перед на­
стройкой
12C1->CR2 = 36;// Устанавливаем частоту АРВ1 (36 МГц)
169
I2(1->TRISE = 37; //// TRISE = 37 (1000 нс) - но АРВ1 у
STM32F103 делится на 2, поэтому частота АРВ1 здесь 36 МГц.
Если стандартное время нарастания для 12( в стандартном ре­
жиме (100 кГц) составляет 1000 нс, то подставляем в формулу:
(36 * 1000) / 1000 + 1 = 36 + 1 = 37. Отсюда значение 37.
I2C1->CCR = 180; // CCR = 180 (SCL = 100 кГц)
12(1-> CR1 = I2C_CR1_PE; // Включаем 12(
I2С1-> CR1 1= I2C_CR1_ACK; //ТypeдcknowLedge
I2C1->OAR2 = I2C_OAR2_ADD2;
}
void 12C_SendByteByADDR (12(_TypeDef * i2c, uint8_t
uint8_t addr)
{
//Disable Pos
CLEAR_BIT(i2c->CR1, I2C_CR1_POS);
MODIFY_REG(i2c->CR1, I2C_CR1_ACK, I2C_CR1_ACK);
SET_BIT (i2c-> CR1, 12C_CR1_START);
whiLe (!READ_BIT(i2c->SR1, I2C_SR1_SB)){};
(void) i2c->SR1;
//I2C_Write_Byte(addr);
MODIFY_REG(i2c->DR,
I2C_DR_DR,
addr
I2C_REQUEST_WRITE);
whiLe (!READ_BIT(i2c->SR1, I2C_SR1_ADDR)){};
(void) i2c-> SR1;
(void) i2c->SR2;
//I2C_Write_Byte(c);
MODIFY_REG(i2c->DR, I2C_DR_DR,c);
whiLe (!READ_BIT(i2c->SR1, I2C_SR1_ТХЕ)){};
//I2C_StopCondition0;
SET_BIT(i2c->CR1, I2C_CR1_STOP);
}
файлlсd. h:
#ifndef I2C_USER_H_ #define I2C_USER_H_
170
с,
#ifndef LCD Н
#define LCD_H_
//- ------- -- --------- -------- -------- ------- -----# i nclu de "stm32f10x.h"
//--------- --------- - ------- - ------ -------- ------//устан о в ка линии Е в 1
#define e_set OLCD_WriteByte12CLCD (portlcdl=0x04)
//установка линии Е в О
#define e_reset О LCD_WriteBytel2CLCD (portlcd&=-0x04)
//установка линии RS в 1
#define rs_set OLCD_WriteBytel2CLCD (portlcdl=0x01)
//установка линии RS в О
#define rs_reset О LCD_WriteBytel2CLCD (portlcd&=-0x01)
//установка линии RS в 1
#define setled OLCD_WriteBytel2CLCD (portlcdl=0x08)
//установка линии RS в О
#define setwrite О LCD_WriteByte12CLCD (portlcd&=-0x02)
// ---------------------------------------------voi d LCD_ini(void);
void LCD_Clear(void);
void LCD_SendChar(char ch);
void LCD _String(char* st);
void LCD_SetPos(uint8_t х, uint8_t у);
//- -------- --------- -------- ------- -------- ------#endif i LCD_H_ */
файл lcd. с:
#include "lcd.h"
#include "i2c.h"
171
char str1[100];
uint8_t buf[l]={0};
uint8_t portlcd;
void deLay_ms (uint32_t ms);
_STAТIC_INLINE void DeLayMicro LIO uint32_t micros)
{
micros *=(SystemCoreClock / 1000000) / 9;
while (micros--);
}
_STAТIC_INLINE void DeLayNano LIO uint32_t nanos)
{
nanos = nanos * (SystemCoreClock / 1000000) / 9000;
while (nanos--);
}
void LCD_WriteBytel2CLCD (uint8_t bt)
{
12C_SendByteByADDR (12С1, bt,0x4E);
}
void sendhaLfЬyte (uint8_t с)
{
с«=4;
LCD _WriteBytel2CLCD(portlcdlc);
LCD _WriteBytel 2CLCD((portlcdl=0x04)1c);
DelayNano(200);
LCD _WriteBytel 2CLCD((portlcd &=-Ох04)1с);
}
void sendbyte (uint8_t с, uint8_t mode)
{
if(mode==0) rs_reset0;
172
else rs_set0;
uint8_t hc=0;
hc=c»4;
sendhalfbyte (hc);
sendhalfbyte (с);
}
void LCD _Clear(void)
{
sendbyte(0x01,0);
delay_ms(2);
}
void LCD_SendChar (char ch)
{
sendbyte(ch,1);
}
void LCD_String (сhаг* st)
{
uint8_t i=0;
while (st [i]!=0) {
sendbyte(st[i], 1);
i++;}
}
void LCD_SetPos (uint8_t х, uint8_t у)
{
switch (у) {
case О:
sendbyte(xl0x80,0);
break;
case 1:
sendbyte((0x35+x)l0x80,0);
break;}
173
}
void LCD_ini (void)
{
deLay_ms(S0);
LCD_WriteBytel2CLCD(O);
setwrite0;//зanиcь
deLay_ms(100);
sendhaLfbyte(0x03);
DeLayMicro(4500);
sendhaLfbyte(0x03);
DeLayMicro(4500);
sendhaLfbyte(0x03);
DeLayMicro(200);
sendhaLfbyte(0x02);
sепdЬуtе(Ох28,О);//режим 4 бит, 2 линии (для нашего большого дисплея это 4 линии, шрифт Sx8
sendbyte (Ох08,О);//дисплей выключаем
deLay_ms(1);
sendbyte(0x01,0);// уберем мусор
deLay_ms(2);
sendbyte(0x06,0);// пишем влево
deLay_ms(1);
sепdЬуtе(ОхОС,О);//дисплей включаем (D=1), курсоры никакие не нужны
sendbyte(0x02,0);//кypcop на место
deLay_ms(2);
setLed О ;//подсветка
}
Комментарии проекта:
Данный
проект удобнее скачать со
странички
книги
на
github.com для анализа, т.к. думаю, можно запутаться листая
книгу. Это справедливо и для других примеров книги. Этот про­
ект состоит из нескольких файлов и сформирован согласно:
174
«Глава
1.
По-дключение
библиотек
или
файлов
в
проект
на Keil IDE».
Комментарии кода проекта:
Для работы дисплея необходимо вставить джамперы отла­
BLue Кit, которые находятся рядом с дисплеем
с именами: CLK1 и D, а для новых версий плат BLue Кit РВ8
дочной платы
и РВ9. Проект достаточно простой несмотря на обилие кода.
Суть его в том что в первой строке выводится приветствие «HI!
NR. electronic» -
буква s к сожалению не помещается в 16 сим­
волов строки дисплея, а во второй строке выводится сообщение,
что это вторая строка: «String 2» и затем происходит инкремент
значения. Начинается он с 1.
Файл
main. с практически полностью нам уже знаком и от­
личается только вызываемыми функциями, алгоритмом работы
в теле оператора бесконечного цикла while.
Файлы i2c.h и i2c.c это объявление функций и их работа со­
ответственно. В файле i2c.c две функции это полная инициали­
зация интерфейса i2c, функция отправки байт на определенный
адрес -
12C_SendByteByADDR.
Также
функция
присутствует
LCD_WriteBytel2CLCD -
отправки
в
дисплей
с написанным адресом в данной плате
Ох4Е. Он может отличаться на других платках под дисплеем.
Произвожу заранее проверку на каждой плате BLuu Кit.
Более детально хочу остановиться на файле
Lcd. с, блок
функций для delay_ms, поэтому смотрим далее как построена ра­
бота микросхемы и дисплея:
1. Основные функции передачи данных
LCD_Write8yte/2CLCD (uintB_t Ьt):
Отправляет байт bt по 1 2 С на адрес Ох4Е (адрес PCF8574T
со сдвигом на единицу). PCF8574T преобразует этот байт в сиг­
налы для LCD (управление пинами RS, RW, Е, D4-D7).
sendhaljЬyte (uintB_t с) :
Передаёт полбайта (4 бита) на LCD: Сдвигает данные в стар-
175
шую тетраду (с «4), так как LCD использует линии D4-D7.
Устанавливает бит Е (строб) в 1, затем в О (имитация импульса
для подтверждения данных).
Задержка DeLayNano (200) для стабилизации сигнала.
sendbyte (uintB_t с, uintB_t mode):
Передаёт целый байт в два этапа (по полбайта): mode=0 -+
команда (RS=0), mode=1 -+ данные (RS=1).
Сначала старшая тетрада (с» 4), затем младшая.
2. Управление дисплеем
LCD_Clear O:
Отправляет команду Ох01 - очистка экрана.
Задержка 2 мс (LCD требует время на выполнение).
LCD_SendChar (char ch) :
Выводит символ ch в
ных mode=1).
LCD_String (char* st)
текущую
позицию
(режим
дан-
Поочерёдно выводит строку st до нуль-терминатора (\О).
LCD_SetPos (uintB_t х, uintB_t у) :
Устанавливает курсор в позицию (х, у): у=О -+ первая строка
(адрес Ох80 + х).
у=1 -+ вторая строка (адрес ОхСО + х).
3. Инициализация LCD (LCD_ini ()}
- Аппаратный сброс:
Задержка 50 мс для стабилизации питания
Отправка нулевого байта (ОхОО) для сброса.
-
Настройка 4-битного режима:
Трижды отправляется Ох03 (задержки 4.5 мс и 200 мкс) для
син-хронизации.
Затем Ох02 - переход в 4-битный режим.
-
Конфигурация дисплея:
Ох28 - 4-бит, 2 строки, шрифт 5х8.
Ох08 - временное отключение дисплея.
Ох01 - очистка экрана.
176
Ох06 - автоинкремент позиции курсора.
ОхОС -
включение дисплея (без курсора).
Ох02 -
возврат курсора в начало.
4. Включение подсветки (setLed ()).
Как это работает вместе?
PCF8574T преобразует 1 2 (-команды в сигналы для LCD1602
(управляет RS, Е, данными).
Данные передаются в 4-битном режиме (экономия пинов
MCU).
Команды и символы отправляются по полбайта с контролем
проба (Е).
Важные нюансы:
Задержки критичны для корректной работы LCD (например,
4.5 мс после сброса).
Адрес PCF8574T жёстко задан как Ох4Е (может отличаться
в другой плате под дисплеем L(D1602).
Подсветка управляется отдельно (через setled Q). Код опти­
мизирован для минимального использования пинов MCU за счёт
1 2 С и 4-битного режима.
177
ГЛАВА 6. ИНТЕРФЕЙС ПЕРЕДАЧИ
ДАННЫХ: SPI
F1 семейства с большим размером флеш-памяти
(не F103C8/CB) линии подключения интерфейса 5PI выполняет
две основные функции, поддерживается протокол SPI, либо
аудиопротокол 12S. По умолчанию выбирается функция линий
5PI. Переключить интерфейс с 5PI на 125 можно программно, но,
к сожалению, не в моделях F103C8/CB. Поэтому в книге 125 рас­
В
МК
сматриваться не будет.
Последовательный периферийный интерфейс (5PI) позволя­
ет осуществлять полудуплексный
хронный
последовательный
полнодуплексный
или
обмен
данными
с
син­
внешними
устройствами. Интерфейс может быть сконфигурирован как ве­
дущий, и в этом случае он обеспечивает передачу тактового сиг­
нала (5СК) внешнему ведомому устройству. Интерфейс также
может работать в конфигурации multimaster.
Он может использоваться для различных целей, включая
симплексную синхронную передачу по двум линиям с возмож­
ной двунаправленной линией данных или надежную связь с ис­
пользованием проверки CRC.
ОСНОВНЫЕ ХАРАКТЕРИСТИКИ SPI
• Полнодуплексная синхронная передача по трем линиям
• Симплексные синхронные передачи по двум линиям с дву­
направленной линией данных или без нее
• Выбор 8- или 16-разрядного формата кадра передачи •
Работа в режиме ведущего или ведомого
• Возможность работы в режиме мультимастера
• 8 прескалеров скорости передачи данных в режиме веду178
щего устройства (fPCLK/2 макс.)
• Частота ведомого режима (fPCLK/2 макс.)
• Более быстрый обмен данными для ведущего и ведомого
• Управление НСС с помощью аппаратных или программных
средств
как для
ведущего,
так
ведомого: динамическая
для
и
смена операций ведущего/ведомого
• Программируемая полярность и фаза синхронизации
• Программируемый порядок следования данных со сдви­
гом по MSB или LSB в первую очередь
• Выделенные флаги передачи и приема с возможностью
прерывания
• Флаг состояния занятости шины SPI
• Аппаратная функция CRC для обеспечения надежной свя­
зи: - В режиме Тх значение CRC может быть передано в каче­
стве последнего байта - Автоматическая проверка ошибки CRC
для последнего принятого байта
Address and data bus
~ SPI CR2
:
!1 ~ЕЕ 1~•1 e~RI 1 lssaef#:Nм1R~~1 !
O
0
:
: SPI_SR
1
: 8SY
0VR
МОО CRC
F
ERR
О
О
ТХЕ RXNE
i
1
,_____ -- --- -- -------------
8aud rate generator
Master control logic
Рисунок 6.1 - Блок-схема SPI
179
• Флаги
неисправности
основного
режима,
перерасхода
и ошибки CRC с возможностью прерывания
• 1-байтовый буфер передачи и приема с возможностью
DMA: Запросы Тх и Rx.
Обычно SPI подключается к внешним устройствам через че­
тыре вывода:
• MISO: Master ln / Slave Out данных. Этот вывод может ис­
пользоваться для передачи данных в режиме ведомого и прие­
ма данных в режиме ведущего.
• MOSI: Master Out / Slave ln data. Этот вывод может исполь­
зоваться для
передачи
данных
в
режиме
ведущего
и
приема
данных в режиме ведомого.
• SCK: выход последовательного тактового генератора для
SРl-мастеров и вход для SРl-ведомых.
• NSS: выбор ведомого устройства. Это дополнительный вы­
вод для выбора ведомого устройства. Этот вывод работает как
«выбор микросхемы», позволяя ведущему устройству SPI взаи­
модействовать с ведомыми устройствами по отдельности и из­
бегая
зацикливания
линий
данных.
Входы
NSS
ведомых
устройств могут управляться стандартными портами ввода-вы­
вода ведущего устройства. Вывод
NSS может также использо­
ваться как выход, если он разрешен (бит SSOE) и имеет низкий
SPI находится в конфигурации ведущего устрой­
ства. Таким образом, все выводы NSS устройств, подключенных
к выводу NSS ведущего устройства, получают низкий уровень
уровень, если
и становятся ведомыми, если они сконфигурированы в аппарат­
NSS. При конфигурировании в режиме ведущего
вход
как
сконфигурированным
NSS,
с
(MSTR=1 и SSOE=0), и если NSS подтягивается к низкому уров­
ню, SPI переходит в состояние ошибки ведущего режима: бит
MSTR автоматически очищается, и устройство конфигурируется
ном режиме
устройства
в режим ведомого устройства.
Базовый пример взаимосвязи между одним ведущим и од­
ним ведомым устройством показан на рисунке ниже:
180
Slave
Master
MSBit -LSBit
LSВil
MSВit -
M_IS0--0--1 8-Ь~ shift register
____
8--Ьlt shlft register 1+-----o-M_ISO
SPI clock
MOSI
MOSI
sск
SCK
generвtor
~ - - - - ~ ' - - , N o l used if NSS is managed
Ьу sonware
Рисунок 6.2 -
Применение одного ведущего/одного ведомого
Комментарий к схеме:
Здесь вывод NSS сконфигурирован как вход.
Выводы MOSI соединены вместе, а выводы MISO соединены
вместе. Таким образом, данные между ведущим и ведомым пе­
редаются последовательно (старший бит первым).
Инициатором
обмена данными
всегда
является
ведущее
устройство. Когда ведущее устройство передает данные ведомо­
му устройству через вывод MOSI, ведомое устройство отвечает
через вывод
MISO. Таким образом, обеспечивается полнодуп­
лексная связь, при которой выход и вход данных синхронизиру­
ются с одним и тем же тактовым сигналом (который подается ве­
дущим устройством через вывод SCK).
Выводы MOSI соединены вместе, а выводы MISO соединены
вместе. Таким образом, данные между ведущим и ведомым пе­
редаются последовательно (старший бит первым).
Инициатором
обмена данными
всегда
является
ведущее
устройство. Когда ведущее устройство передает данные ведомо­
му устройству через вывод MOSI, ведомое устройство отвечает
через вывод
MISO. Таким образом, обеспечивается полнодуп­
лексная связь, при которой выход и вход данных синхронизиру­
ются с одним и тем же тактовым сигналом (который подается ве­
дущим устройством через вывод SCK).
181
УПРАВЛЕНИЕ ВЫВОДОМ SLAVE SELECТ (NSS)
Аппаратное или программное управление выбором ведомо­
го устройства может быть установлено с помощью бита 55М
в регистре 5PI_CR1.
• Программное управление НСС (55М = 1)
Информация о выборе ведомого определяется значением
бита 551 в регистре 5PI_CR1. Внешний вывод N55 остается сво­
бодным для использования в других приложениях.
• Аппаратное управление нес (55М = О)
В зависимости от конфигурации выхода N55 (бит 550Е в ре­
гистре 5PI_CR2) возможны две конфигурации.
- Выход N55 разрешен (55М = О, 550Е = 1)
Эта конфигурация используется только в том случае, если
устройство работает в режиме мастера. Сигнал N55 переводится
в
низкий
уровень,
когда
мастер
начинает обмен данными,
и удерживается в низком состоянии до отключения 5PI.
- Выход N55 отключен (55М = О, 550Е = О)
Такая
конфигурация
обеспечивает
возможность
работы
в режиме muLtimaster для устройств, работающих в режиме
master. Для устройств, установленных в режим ведомого, вывод
N55 работает как классический вход N55: ведомый выбирается
при низком уровне N55 и отменяет выбор при высоком
уровне N55.
Фаза и полярность синхронизации
С помощью битов
CPOL и СРНА регистра 5PI_CR1 можно
программно выбрать четыре варианта временных соотношений.
Бит CPOL (полярность тактового генератора) управляет устойчи­
вым значением тактового генератора
при отсутствии
передачи
данных. Этот бит влияет на работу как ведущего, так и ведомого
режимов. Если CPOL сброшен, то вывод 5СК находится в состоя­
нии низкого уровня холостого хода. Если
вывод 5СК находится
CPOL установлен, то
в состоянии холостого хода высокого
уровня. Если установлен бит СРНА (тактовая фаза), то второй
182
фронт на выводе SCK (падающий фронт, если бит CPOL сбро­
шен, и нарастающий фронт, если бит CPOL установлен) является
стробом захвата MSBit. Данные защелкиваются при наступлении
второго тактового перехода.
Если бит СРНА сброшен, то первый фронт импульса на вы­
воде SCK (падающий фронт, если бит CPOL установлен, нараста­
ющий фронт, если бит CPOL сброшен) является стробом захвата
MSBit. Данные защелкиваются при появлении первого тактового
перехода.
Комбинация
битов
CPOL
(полярность тактового
сигнала)
и СРНА (фаза тактового сигнала) выбирает фронт тактового сиг­
нала захвата данных.
На рис.
5.3 показана передача данных по интерфейсу SPI
с четырьмя комбинациями битов СРНА и CPOL. Диаграмма мо­
жет быть интерпретирована как временная диаграмма ведущего
SCK, вывод MISO, вывод
MOSI напрямую соединены между ведущим и ведомым устрой­
или ведомого устройства, где вывод
ством.
Примечание:
Перед изменением битов
CPOL/CPHA необходимо отклю­
чить SPI, сбросив бит SPE.
Ведущее и ведомое устройства должны быть запрограмми­
рованы на один и тот же режим синхронизации.
Состояние холостого хода
SCK должно соответствовать по­
лярности, выбранной в регистре SPI_CR1 (подтягивание SCK, ес­
ли CPOL=1, или опускание SCK, если CPOL=0).
Формат кадра данных (8- или 16-битный) выбирается с по­
мощью бита DFF в регистре SPI_CR1 и определяет длину данных
при передаче/приеме.
183
СРНА:1
CPOL= 1
г
NSS\
(tOa-law'°•- - - , . - - , . - - - - : . ; , · 1 - . . . - - . . . - - - - - , . - -
_ _ _ _ _ _ _ _ _1-ill-..__..______
"-N...,..
CPOL= 1
CPOL=O
MISO
МOSI
~
,
(loslave)
г
1
'"-+--;---;.--;.!• 1 1 - , ; - - . ; - - - + - - + - J
1
Caplure
1_1-1_.._ _ _ __ . . _
&1,оое,
_ _ __.._ _ _ _...
Рисунок 6.3 - Временная диаграмма тактового генератора
Комментарий к схеме:
Эти тайминги
показаны
при
сброшенном
бите
LSBFI RST
в регистре SPI_CR1.
Формат кадра данных
Данные могут быть сдвинуты как по MSB, так и по LSB в за­
висимости от значения бита LSBFIRST в регистре SPI_CR1.
Каждый кадр данных имеет длину 8 или 16 бит в зависимо­
сти от размера данных, запрограммированного с помощью бита
DFF в регистре SPI_CR1. Выбранный формат кадра данных при-
184
меняется для передачи и/или приема.
КОНФИГУРИРОВАНИЕ SPI В РЕЖИМЕ
ВЕДОМОГО УСТРОЙСТВА
В
конфигурации
ведомого
устройства
последовательный
SCK от ведущего
устройства. Значение, установленное в битах BR (2:0] регистра
SPI_CRl, не влияет на скорость передачи данных.
тактовый
генератор
поступает
на
вывод
Примечание: Рекомендуется включать ведомое устройство
SPI до того, как ведущее устройство передаст тактовый сигнал.
В противном случае может произойти нежелательная передача
данных. Регистр данных ведомого устройства должен быть готов
до первого фронта тактового генератора или до окончания теку­
щего обмена данными. Перед включением ведомого и ведущего
устройств необходимо установить полярность тактового генера­
тора в устойчивое состояние.
Для конфигурирования
SPI в режиме ведомого устройства
выполните следующую процедуру:
Процедура
1. Установите бит DFF для определения 8- или 16-разрядно­
го формата кадра данных
2. Выбор битов CPOL и СРНА определяет одну из четырех
взаимосвязей
между передачей данных и
последовательным
тактовым генератором (см. рис. 6.3). Для корректной передачи
данных биты CPOL и СРНА должны быть одинаково сконфигури­
рованы в ведомом и ведущем устройствах.
3. Формат кадра (МSВ-первый или LSВ-первый в зависимо­
сти от значения бита LSBFIRST в регистре SPI_CRl) должен быть
таким же, как у ведущего устройства.
4. В аппаратном режиме (см. раздел «Управление выводом
Slave select (NSS)») вывод NSS должен быть подключен к сигна­
лу низкого уровня в течение всей последовательности передачи
байта. В программном режиме NSS необходимо установить бит
185
55М и сбросить бит 551 в регистре 5PI_CR1.
Регистр состояния 5PI (5Pl_5R)
Последовательность передачи начинается с того момента,
когда ведомое устройство получает тактовый сигнал и старший
бит данных на свой вывод MOSI. Остальные биты (7 бит в 8-бит­
ном формате кадра данных и 15 бит в 16-битном формате кадра
данных) загружаются в сдвиговый регистр. При передаче дан­
ных из буфера Тх в сдвиговый регистр устанавливается флаг ТХЕ
в регистре 5Pl_5R и генерируется прерывание, если установлен
бит ТХЕIЕ в регистре 5PI_CR2.
Последовательность приема
Для приемника - по завершении передачи данных:
• Данные из сдвигового регистра передаются в буфер Rx
и устанавливается флаг RXNE (регистр 5Pl_5R);
• Прерывание генерируется, если в регистре 5PI_CR2 уста­
новлен бит RXNEIE.
После последнего фронта тактовой частоты выборки бит
RXNE
устанавливается,
копия
байта
данных,
поступившего
в сдвиговый регистр, перемещается в буфер Rx. При чтении ре­
гистра 5PI_DR периферийное устройство 5PI возвращает это бу­
феризованное значение.
Очистка бита RXNE осуществляется чтением регистра 5PI_DR.
КОНФИГУРИРОВАНИЕ SPI В РЕЖИМЕ
ВЕдУЩЕГО УСТРОЙСТВА
В
конфигурации
ведущего
устройства
последовательный
тактовый генератор формируется на выводе 5СК.
Процедура
1. Выбор битов BR [2:0] определяет скорость передачи данных
последовательного тактового генератора (см. регистр 5PI_CR1).
2. Выбор битов CPOL и СРНА задает одну из четырех взаи­
мосвязей между передачей данных и последовательным такто­
вым генератором (см. рис. 240).
186
3. Установите бит DFF для определения 8- или 16-разрядно­
го формата кадра данных
4. Для определения формата кадра настройте бит LSBFIRST
в регистре SPI_CR1.
5. Если вывод NSS необходим в режиме ввода, то в аппарат­
ном режиме подключите его к сигналу высокого уровня на вре­
мя полной последовательности передачи байта. В программном
режиме NSS следует установить биты SSM и SSI в регистре
SPI_CR1. Если вывод NSS необходим в режиме вывода, то следу­
ет установить только бит SSOE.
6. Биты MSTR и SPE должны быть установлены (они остаются
установленными только в том случае, если вывод NSS подклю­
чен к сигналу высокого уровня).
В этой конфигурации вывод MOSI является выходом данных,
а вывод MISO - входом данных.
Последовательность передачи
Последовательность передачи начинается с момента записи
байта в буфер Тх.
Байт данных параллельно загружается в сдвиговый регистр
(с внутренней шины) во время передачи первого бита и затем
последовательно выводится на вывод
MOSI MSB первым или
LSB первым в зависимости от бита LSBFIRST в регистре SPI_CR1.
При передаче данных из буфера Тх в сдвиговый регистр уста­
навливается флаг ТХЕ и генерируется прерывание, если уста­
новлен бит TXEIE в регистре SPI_CR2.
Последовательность приема
Для приемника - по завершении передачи данных:
• Данные из сдвигового регистра передаются в буфер RX
и устанавливается флаг RXNE;
• Прерывание генерируется, если в регистре SPI_CR2 уста­
новлен бит RXNEIE.
По последнему фронту тактовой частоты выборки устанав­
ливается бит RXNE, копия байта данных, поступившего в сдвига-
187
вый регистр, перемещается в буфер Rx. При чтении регистра
SPI_DR периферийное устройство SPI возвращает это буферизо­
ванное значение.
Очистка
бита
осуществляется
RXNE
чтением
регистра
SPI_DR.
Непрерывный поток передачи может поддерживаться, если
после начала передачи в буфер Тх помещаются очередные дан­
ные, подлежащие передаче. Обратите внимание, что флаг ТХЕ
должен быть равен
перед любой попыткой записи в бу­
«1
фер Тх.
Примечание: Если ведущее устройство взаимодействует с ве­
домыми устройствами
SPI,
которые должны быть отключены
NSS должен быть сконфигурирован
как GPIO или должен использоваться другой GPIO и переклю­
между передачами, вывод
чаться программно.
КОНФИГУРИРОВАНИЕ SPI ДЛЯ
ПОЛУДУПЛЕКСНОЙ СВЯЗИ
SPI может работать в полудуплексном режиме в двух конфи­
гурациях.
• 1 тактовый и 1 двунаправленный провод данных
• 1 тактовый провод и 1 провод данных (только прием или
только передача)
1 тактовый
(BIDIMODE = 1)
и
1
двунаправленный
провод
данных
BIDIMODE в реги­
SPI_CRl. В этом режиме в качестве тактового генератора
используется SCK, а для передачи данных - MOSI в режиме ве­
дущего или MISO в режиме ведомого. Направление передачи
данных (вход/выход) выбирается битом BIDIOE в регистре
SPI_CRl. Если этот бит равен 1, то линия данных является вы­
ходной, в противном случае - входной.
Этот режим включается установкой бита
стре
1 тактовый
(BIDIMODE = О)
и
1
однонаправленный
188
провод
данных
В этом режиме приложение может использовать
SPI либо
только в режиме передачи, либо только в режиме приема.
• Режим «только передача» аналогичен полнодуплексному
режиму {BIDIMODE=0, RXONLY=0}: данные передаются на вывод
передачи (MOSI в режиме ведущего или MISO в режиме ведомо­
го), а вывод приема {MISO в режиме ведущего или MOSI в режи­
ме ведомого) может быть использован в качестве ввода-вывода
общего назначения. В этом случае приложению достаточно иг­
норировать буфер
Rx (если
регистр данных прочитан, то он
не содержит принятого значения).
• В режиме «только прием» приложение может отключить
функцию вывода SPI, установив бит RXONLY в регистре SPI_CR1.
В этом случае освобождается вывод 1О передачи (MOSI в режи­
ме ведущего или MISO в режиме ведомого), и его можно ис­
пользовать для других целей.
Чтобы запустить обмен данными в режиме «только прием»,
настройте и включите SPI:
• В режиме ведущего обмен данными начинается немедлен­
но и прекращается при сбросе бита SPE и остановке текущего
приема. Считывание флага BSY в этом режиме не требуется. Он
всегда установлен, когда идет SРl-связь.
• В режиме ведомого устройства SPI продолжает принимать
сигнал до тех пор, пока NSS подтянут вниз (или бит SSI сброшен
в программном режиме NSS) и работает SCK.
ПРОЦЕДУРЫ ПЕРЕДДЧИ И ПРИЕМА ДДННЫХ
Буферы Rx и Тх
При
приеме
данные
принимаются,
а
затем
сохраняются
во внутреннем буфере Rx, в то время как при передаче данные
сначала сохраняются во внутреннем буфере Тх, а затем переда­
ются.
При обращении к регистру SPI_DR на чтение возвращается
значение из буфера Rx, а при обращении к SPI_DR на запись за­
писываемые данные сохраняются в буфере Тх.
189
Последовательность запуска в режиме ведущего
• В полнодуплексном режиме (BIDIMODE=0 и RXONLY=0)
- Последовательность начинается с момента записи данных
в регистр SPI_DR (буфер Тх);
- Во время передачи первого бита данные параллельно за­
гружаются из буфера Тх в 8-разрядный сдвиговый регистр, а за­
тем последовательно выводятся на вывод MOSI;
- Одновременно с этим принятые данные на выводе MISO
последовательно сдвигаются в 8-разрядный сдвиговый регистр
и затем параллельно загружаются в регистр SPI_DR (буфер Rx).
режиме
«только
прием»
•В
однонаправленном
(BIDIMODE=0 и RXONLY=1);
- Последовательность начинается, как только SPE=1;
- Активизируется только приемник, и принятые данные
на выводе MISO последовательно сдвигаются в 8-разрядный
сдвиговый регистр, а затем параллельно загружаются в регистр
SPI_DR (буфер Rx).
режиме
при
передаче
•В
двунаправленном
(BIDIMODE=1 и BIDIOE=1)
- Последовательность начинается с момента записи данных
в регистр SPI_DR (буфер Тх).
- Во время передачи первого бита данные параллельно за­
гружаются из буфера Тх в 8-разрядный сдвиговый регистр, а за­
тем
последовательно
выводятся
на
вывод
MOSI.
Данные
не получены.
•В
двунаправленном
режиме
при
приеме
(BIDIMODE=1 и BIDIOE=0)
начинается,
как
только
- Последовательность
SPE=1 и BIDIOE=0.
- Принятые на вывод MOSI данные последовательно сдви­
гаются в 8- разрядный сдвиговый регистр и затем параллельно
загружаются в регистр SPI_DR (буфер Rx);
- Передатчик не активирован, и данные на вывод MOSI последовательно не передаются.
190
ПОСЛЕДОВАТЕЛЬНОСТЬ ЗАПУСКА В РЕЖИМЕ
ВЕДОМОГО
• В полнодуплексном режиме (BIDIMODE=0 и RXONLY=0)
- Последовательность начинается с того момента, когда ве­
домое устройство получает тактовый сигнал и первый бит дан­
на
ных
свой
вывод
MOSI.
Оставшиеся
7
битов загружаются
в сдвиговый регистр.
- В то же время при передаче первого бита данные парал­
лельно загружаются из буфера Тх в 8-разрядный сдвиговый ре­
гистр, а затем последовательно выводятся на вывод MISO. Перед
тем как ведущее устройство SPI инициирует передачу, програм­
ма должна записать данные для отправки.
прием»
«только
режиме
однонаправленном
• В
(BIDIMODE=0 и RXONLY=l)
- Последовательность начинается с того момента, когда ве­
домое устройство получает тактовый сигнал и первый бит дан­
на
ных
свой
вывод
MOSI.
Оставшиеся
7 битов
загружаются
в СДВИГОВЫЙ регистр.
-
Передатчик не активирован, и данные на вывод MISO по­
следовательно не передаются.
передаче
при
режиме
двунаправленном
• В
(BIDIMODE=l и BIDIOE=l)
- Последовательность начинается с момента получения ве­
домым устройством тактового сигнала и передачи первого бита
в буфере Тх на вывод MISO.
-
Во время передачи первого бита данные параллельно за­
гружаются из буфера Тх в 8-разрядный сдвиговый регистр, а за­
тем последовательно выводятся на вывод
MISO. Адрес перед
тем как ведущее устройство SPI инициирует передачу данных,
программа должна записать их в память.
- Данные не получены.
приеме
при
двунаправленном
режиме
• В
(BIDIMODE=l и BIDIOE=0)
- Последовательность начинается с того момента, когда ве-
191
домое устройство получает тактовый сигнал и первый бит дан­
ных на свой вывод MISO.
-
Принятые на вывод MISO данные последовательно сдви­
гаются в 8- разрядный сдвиговый регистр и затем параллельно
загружаются в регистр SPI_DR (буфер Rx).
-
Передатчик не активирован, и данные на вывод MISO по­
следовательно не передаются.
Обработка передачи и приема данных
Флаг ТХЕ (Тх
buffer empty) устанавливается при передаче
данных из Тх-буфера в сдвиговый регистр. Он указывает на то,
что внутренний буфер Тх готов к загрузке следующими данны­
ми. Прерывание может быть сгенерировано, если установлен
бит TXEIE в регистре SPI_CR2. Очистка бита ТХЕ производится
записью в регистр SPI_DR.
Примечание: Перед попыткой записи в буфер Тх программа
должна убедиться, что флаг ТХЕ установлен в
1. В противном
случае произойдет перезапись данных, ранее записанных в бу­
фер Тх.
Флаг RXNE (Rх-буфер не пуст) устанавливается по последне­
му фронту тактовой частоты выборки, когда данные передаются
из сдвигового регистра в Rх-буфер. Он указывает на то, что дан­
ные готовы к считыванию из регистра SPI_DR. Прерывание мо­
жет быть сгенерировано, если установлен бит RXNEIE в регистре
SPI_CR2. Очистка бита RXNE осуществляется чтением регистра
SPI_DR.
В некоторых конфигурациях флаг BSY может использоваться
во время последней передачи данных для ожидания заверше­
ния передачи.
Полнодуплексная передача и прием в режиме ведущего или
ведомого (BIDIMODE=0 и RXONLY=0)
Для передачи и приема данных программное обеспечение
должно следовать этой процедуре (см. рис. 5.4 и Рис. 5.5):
1. Включите SPI, установив бит SPE в 1.
2. Запишите в регистр SPI_DR первый передаваемый эле-
192
мент данных (при этом снимается флаг ТХЕ).
3. Дождитесь TXE=l и запишите второй передаваемый эле­
мент данных. Затем дождитесь RXNE=l и прочитайте SPI_DR,
чтобы получить первый принятый элемент данных (при этом бит
RXNE очищается). Повторяйте эту операцию для каждого пере­
даваемого/принимаемого элемента данных до тех пор, пока
не будет получено п-1 данных.
4. Подождите, пока RXNE=l, и прочитайте последние приня­
тые данные.
5. Перед отключением SPI подождите, пока TXE=l, а затем
подождите, пока BSY=0.
Эта процедура также может быть реализована с помощью
специальных подпрограмм прерывания, запускаемых по каждо­
му нарастающему фронту флага RXNE или ТХЕ.
1: Прерывание по ошибке разрешено.
Example in Slave mode wlth СР~1. СРНА-..1
sск
MISO,МOSI (out)
ТХЕ llag
1oset Ьу hardware
BSY llag
MISOIМOSI (ln)
softwateweita
unllt RXNe.-1
and re&ds ОхА3
from SPI_DR
Рисунок 6.4 - Поведение TXE/RXNE/BSY в режиме Slave / пол­
нодуплексном режиме (BIDIMODE=0, RXONLY=0) при непрерыв­
ных передачах
193
Процедура «только передача)) (BIDIMODE=O RXONLY=O)
В этом режиме процедура может быть сокращена, как опи­
сано ниже, а бит BSY может быть использован для ожидания за­
вершения передачи (см. рис. 6.5 и рис. 6.6).
1. Включите SPI, установив бит SPE в 1.
2. Запишите в регистр SPI_DR первый элемент данных для
отправки (при этом очищается бит ТХЕ).
3. Подождите, пока ТХЕ=1, и запишите следующий переда­
ваемый элемент данных. Повторите этот шаг для каждого пере­
даваемого элемента данных.
4. После записи последнего элемента данных в регистр
SPI_DR подождите, пока ТХЕ=1, затем подождите, пока BSY=0,
это свидетельствует о завершении передачи последних данных.
Эта процедура также может быть реализована с помощью
специальных подпрограмм прерывания, запускаемых по каждо­
му нарастающему фронту флага ТХЕ.
Примечание:
При
прерывистом
обмене
данными
операцией записи в SPI_DR и установкой бита
между
BSY существует
задержка в 2 такта АРВ. Как следствие, в режиме «только пе­
редача» после записи последних данных необходимо сначала
дождаться установки ТХЕ, а затем сброса BSY.
После передачи двух элементов данных в режиме «только
передача» в регистре
SPI_SR устанавливается флаг OVR, по­
скольку принятые данные никогда не считываются.
194
Example in Master mode with CPOL,.:.1, СРНА:1
~wr1tes
O•F1 into
SPI_DR:
Рисунок 6.5 Поведение TXE/BSY в режиме Master transmitonly (BIDIMODE=0 и RXONLY=0) в случае непрерывных пере­
дач
Exзmple ;,, slave mode wi!h CPOL:1, СРНА:1
eoftwar•wntм
OJ:f1 into
SPI_DR
TXE/BSY в режиме Slave только для передачи
(BIDIMODE=0 и RXONLY=0) при непрерывных передачах
Рисунок 6.6 -
Процедура
двунаправленной
передачи
(BIDIMODE=1 и BIDIOE=1)
В этом режиме процедура аналогична процедуре в режиме
Transmit-only, за исключением того, что перед включением SPI
195
в регистре SPI_CR2 должны быть установлены биты
BIDIMODE
и BIDIOE.
Однонаправленная
процедура
«только
прием»
(BIDIMODE=0 и RXONLY=1)
В этом режиме процедура может быть сокращена, как опи­
сано ниже (см. рис. 6.7):
1. Установите бит RXONLY в регистре SPI_CR1.
2. Включите SPI, установив бит SPE в 1:
а) В режиме ведущего устройства это немедленно активизи­
рует генерацию тактового генератора SCK, и данные поступают
последовательно
до тех
пор,
пока
SPI
не
будет отключен
(SPE=O).
Ь) В режиме ведомого устройства данные принимаются, ко­
гда ведущее устройство SPI подает низкий уровень сигнала NSS
и генерирует тактовый сигнал SCK.
3. Дождитесь, пока RXNE=1, и прочитайте регистр SPI_DR,
чтобы получить принятые данные (при этом бит RXNE очищает­
ся). Повторите эту операцию для каждого принимаемого эле­
мента данных.
Эта процедура также может быть реализована с помощью
специальных подпрограмм прерывания, запускаемых по каждо­
му нарастающему фронту флага RXNE.
Example w"h CPOL,.1, СРНА=1, RXONLYa1
sск
MISOМOSI (ln)
aof\wwewalr$untilRXNE•,
and ruds ОхА1 tom SPI_DR
№Rwarewail1untilRXNE•1
__,,_OIIAЗlnxnSPI_DR
Рисунок 6.7 - Поведение RXNE в режиме «только прием»
(BIDIRMODE=O и RXONLY=1) при непрерывных передачах
196
двунаправленного
Процедура
приема
(BIDIMODE=1 и BIDIOE=0)
В этом режиме процедура аналогична процедуре режима
«только
прием»,
за
исключением
того,
что
перед
включением
SPI необходимо установить бит BIDIMODE и очистить бит BIDIOE
в регистре SPI_CR2.
Непрерывные и прерывные переносы
При передаче данных в режиме ведущего устройства, если
программное
обеспечение
достаточно
быстро
обнаруживает
каждый нарастающий фронт сигнала ТХЕ (или прерывание ТХЕ)
и немедленно производит запись в регистр SPI_DR до заверше­
ния текущей передачи данных, то связь считается непрерывной.
В этом случае не происходит прерывания генерации тактового
генератора SPI между каждым элементом данных, а бит BSY ни­
когда не очищается между каждой передачей данных.
Напротив, если программное обеспечение работает недо­
статочно быстро, это может привести к некоторым разрывам
связи. В этом случае бит BSY очищается между каждой переда­
чей данных (см. рис. 6.8).
В режиме
Master только
прием
(RXONLY=1) связь
всегда
непрерывна, а флаг BSY всегда считывается в 1.
В режиме ведомого устройства непрерывность обмена дан­
ными определяется ведущим устройством SPI. В любом случае,
даже если обмен данными происходит непрерывно, флаг
BSY
переходит в низкий уровень между каждой передачей данных
на время не менее одного такта SPI (см. рис. 6.6).
197
ExamplewilhCPOt..1, СРНА;1
SCK
МOSI (out)
ТXEtlag
Тх bufter
(wrileto SPI_DA)
--"-l--------+1-...------+-+--"+-+------++--
ВS'fllag
Рисунок 6.8 - Поведение TXE/BSY при передаче
(BIDIRMODE=0 и RXONLY=0) в случае прерывистых передач
РАСЧЕТСRС
Для обеспечения надежности связи реализован СRС-кальку­
лятор. Отдельные СRСкалькуляторы реализованы для передава­
емых и принимаемых данных. CRC вычисляется с помощью про­
граммируемого полинома последовательно для каждого бита.
Он вычисляется по фронту тактовой частоты выборки, определя­
емому битами СРНА и CPOL регистра SPI_CR1.
Примечание: Данный SPI предлагает два вида стандарта вы­
числения
CRC, которые напрямую зависят от формата кадра
данных, выбранного для передачи и/или приема: 8-битные дан­
ные (CR8) и 16-битные данные (CRC16).
Вычисление CRC разрешается установкой бита CRCEN в ре­
гистре SPI_CR1. Это действие сбрасывает регистры CRC
(SPI_RXCRCR и SPI_TXCRCR). В полнодуплексном режиме или ре­
жиме «только передатчик»,
когда
передачей управляет про­
граммное обеспечение (режим CPU), необходимозаписывать бит
CRCNEXT сразу после записи в SPI_DR последних передаваемых
данных. В конце этой последней передачи данных передается
значение SPI_ТXCRCR.
В режиме «только прием» и при программном управлении
198
передачей (режим
CPU) необходимо записывать бит CRCNEXТ
после приема вторых последних данных. CRC принимается сра­
зу
после
приема
последних
данных,
после
чего
выполняется
проверка CRC.
По окончании передачи данных и
CRC в регистре SPI_SR
устанавливается флаг CRCERR, если во время передачи произо­
шли повреждения.
Если в буфере ТХ присутствуют данные, то значение CRC пе­
редается только после передачи байта данных. Во время пере­
дачи
CRC вычислитель CRC выключается, а значение регистра
остается неизменным. Связь по SPI с использованием CRC воз­
можна по следующей процедуре:
1. Запрограммируйте значения CPOL, СРНА, LSBFirst, BR,
SSM, SSI и MSTR.
2. Запрограммируйте полином в регистре SPI_CRCPR.
3. Включите вычисление CRC, установив бит CRCEN в реги­
стре SPI_CR1. При этом также очищаются регистры SPI_RXCRCR
и SPI_TXCRCR.
4. Включите SPI, установив бит SPE в регистре SPI_CR1.
5. Начните обмен данными и поддерживайте его до тех пор,
пока не будут переданы или приняты все байты или полуслова,
кроме одного.
-
В полнодуплексном режиме или режиме «только передат­
чик», когда управление передачей осуществляется программно,
при записи последнего байта или полуслова в буфер Тх необхо­
димо установить бит CRCNEXT в регистре SPI_CR1, чтобы ука­
зать, что CRC будет передан после передачи последнего байта.
- В режиме «только приемник» необходимо установить бит
CRCNEXT сразу после приема предпоследних данных, чтобы
подготовить SPI к переходу в фазу CRC по окончании приема
последних данных. Во время передачи СRС-вычисление замора­
живается.
6. После передачи последнего байта или полуслова SPI пе­
CRC. В полнодуплексном
режиме или режиме «только приемник» принятый CRC сравниреходит в фазу передачи и проверки
199
вается со значением
SPI_RXCRCR. Если значение не совпадает,
то устанавливается флаг CRCERR в SPI_SR и может быть сгенери­
ровано
прерывание
при
установке
бита
ERRIE
в
регистре
SPI_CR2.
Примечание:
Когда SPI находится в режиме ведомого устройства, будьте
внимательны и включайте вычисление CRC только при стабиль­
ном тактовом генераторе, т.е. когда он находится в устойчивом
состоянии. В противном случае может произойти неправильное
вычисление
CRC. Действительно, CRC чувствителен к тактовой
частоте ведомого входа SCK, как только установлен CRCEN, и это
независимо от значения бита SPE.
При высоких битрейтах следует соблюдать осторожность
при передаче CRC. Поскольку количество используемых циклов
процессора на этапе передачи
CRC должно быть как можно
меньше, во избежание ошибок при передаче последних данных
и
приеме
CRC запрещается
вызывать программные функции
в последовательности передачи CRC. Фактически бит CRCNEXТ
должен быть записан до окончания передачи/приема последних
данных.
При работе с высокими частотами рекомендуется использо­
вать режим
DMA, чтобы избежать снижения скоростных харак­
SPI из-за того, что обращения к процессору влияют
на пропускную способность SPI.
теристик
Если устройства сконфигурированы как ведомые и исполь­
зуется аппаратный режим NSS, то между фазой данных и фазой
CRC вывод NSS должен поддерживаться в низком уровне.
Если SPI сконфигурирован в режиме ведомого устройства
с включенной функцией CRC, то вычисление CRC происходит да­
же при подаче высокого уровня на вывод NSS. Это может про­
изойти,
например,
в
многоведомой
среде,
когда
ведущий
по связи обращается к ведомым поочередно.
Между отменой выбора ведомого (высокий уровень на NSS)
и новым выбором ведомого (низкий уровень на NSS) значение
CRC
должно
быть
очищено
как
200
на
стороне
ведущего,
так
и на стороне ведомого, чтобы заново синхронизировать веду­
щего и ведомого для вычисления их CRC.
Чтобы очистить CRC, выполните следующую процедуру:
1. Отключить SPI (SPE = О);
2. Очистить бит CRCEN;
3. Установить бит CRCEN;
4. Включить SPI (SPE = 1).
Флаги состояния
Для полного контроля состояния шины
SPI в приложении
предусмотрены четыре флага состояния.
Флаг опустошения буфера Тх (ТХЕ)
При установке этот флаг указывает на то, что буфер Тх пуст
и в него можно загружать следующие передаваемые данные.
Флаг ТХЕ снимается при записи в регистр SPI_DR.
Rх-буфер не пуст (RXNE)
В установленном состоянии этот флаг указывает на наличие
в буфере
Rx корректных принятых данных. Он очищается при
чтении SPI_DR.
ФлагВUSУ
Флаг BSY устанавливается и сбрасывается аппаратно (запись
в этот флаг не имеет эффекта). Флаг BSY указывает на состояние
коммуникационного уровня SPI. Когда флаг BSY установлен, это
означает, что SPI занят обменом данными. Исключение состав­
ляет режим
ведущего устройства
/
двунаправленный
режим
приема (MSTR=1 и BDM=1 и BDOE=0), когда флаг BSY поддержи­
вается в низком состоянии во время приема.
Флаг BSY используется для определения окончания переда­
чи данных, если программа хочет отключить SPI и перейти в ре­
жим
Halt (или отключить периферийный тактовый генератор).
Это позволяет избежать повреждения последней передачи. Для
этого необходимо строго соблюдать описанную ниже процедуру.
201
Флаг BSY также полезен для предотвращения коллизий при
записи в многомастерной системе. Флаг
BSY устанавливается,
когда начинается передача данных, за исключением режима ве­
дущего
устройства
/
(MSTR=1 и BDM=1 и BDOE=0).
двунаправленного
приема
Он очищен:
• при завершении передачи данных (кроме режима ведуще­
го, если связь непрерывна)
• когда SPI отключен
• при возникновении
устройства (MODF=1)
неисправности
в
режиме
ведущего
Если обмен данными происходит не непрерывно, то между
каждым обменом данными флаг BSY имеет низкий уровень. При
непрерывной связи:
• в режиме ведущего устройства флаг BSY поддерживается
на высоком уровне во время всех передач
• в режиме ведомого флаг BSY переходит в низкий уровень
на один тактовый цикл SPI между каждой передачей данных
Примечание: Не используйте флаг BSY для обработки каж­
дой передачи или приема данных. Вместо этого лучше исполь­
зовать флаги ТХЕ и RXNE.
Отключение SPI
Когда
передача данных завершается,
приложение
может
остановить обмен данными, отключив периферию SPI. Это дела­
ется путем сброса бита SPE.
В некоторых конфигурациях отключение SPI и переход в ре­
жим Halt во время выполнения передачи может привести к по­
вреждению
текущей
передачи
и/или
недостоверности
фла­
га BSY.
Чтобы избежать этих последствий, рекомендуется соблюдать
следующую процедуру отключения SPI:
В
ведущем
или
ведомом
полнодуплексном
режиме
(BIDIMODE=0, RXONLY=0)
1. Для получения последних данных подождите, пока RXNE=1
202
2. Подождите, пока ТХЕ=1
3. Затем подождите, пока BSY=0
4. Отключить SPI (SPE=0) и, в конечном итоге, перейти в ре­
жим Halt (или отключить периферийный тактовый генератор)
В режиме ведущего или ведомого однонаправленной пере­
дачи (BIDIMODE=0, RXONLY=0) или двунаправленной передачи
(BIDIMODE=1, BIDIOE=1)
После записи последних данных в регистр SPI_DR:
1. Подождите, пока ТХЕ=1
2. Затем подождите, пока BSY=0
3. Отключить SPI (SPE=0) и, в конечном итоге, перейти в ре­
жим Halt (или отключить периферийный тактовый генератор)
В режиме ведущего однонаправленного приема (MSTR=1,
BIDIMODE=0, RXONLY=1) или двунаправленного приема
(MSTR=1, BIDIMODE=1, BIDIOE=0)
Этот случай должен управляться особым образом, чтобы SPI
не инициировал новую передачу:
1. Дождаться предпоследнего появления RXNE=1 (n-1)
2. Затем подождите один такт SPI (с помощью программного
цикла), после чего отключите SPI (SPE=0).
3. Затем дождаться последнего RXNE=1 перед переходом
в режим Halt (или отключением периферийного тактового гене­
ратора)
Примечание: В режиме двунаправленного приема ведущего
устройства (MSTR=1 и BDM=1 и BDOE=0) флаг BSY поддержива­
ется в низком состоянии во время передачи данных.
В режиме ведомого только приема (MSTR=0, BIDIMODE=0,
(MSTR=0,
приема
двунаправленного
или
RXONLY=1)
BIDIMODE=1, BIDOE=0)
1. Отключить SPI (записать SPE=1) можно в любой момент:
текущая передача завершится до того, как SPI будет фактически
отключен
2. Тогда, если вы хотите войти в режим Halt, то перед вхо­
дом в него (или отключением периферийного тактового генера­
тора) необходимо сначала дождаться, пока BSY = О.
203
СВЯЗЬ ПО SPI С ИСПОЛЬЗОВАНИЕМ DMA
(ПРЯМАЯ ДДРЕСАЦИЯ ПАМЯТИ)
Для работы на максимальной скорости в
SPI необходимо
подавать данные для передачи, а полученные в буфер Rx дан­
ные необходимо считывать, чтобы избежать перерасхода. Для
облегчения передачи данных в
SPI реализована возможность
ОМА, реализующая простой протокол «запрос-отказ».
Запрос на ОМА-доступ осуществляется при включенном бите
разрешения в регистре SPI_CR2. Для буферов Тх и
Rx должны
быть выданы отдельные запросы (см. рис. 5.10 и рис. 5.11):
• При передаче запрос ОМА выдается каждый раз, когда
ТХЕ устанавливается в 1. Затем ОМА производит запись в ре­
гистр SPI_OR (при этом снимается флаг ТХЕ).
• При приеме запрос ОМА выдается каждый раз, когда RXNE
устанавливается в 1. Затем ОМА считывает регистр SPI_OR (при
этом снимается флаг RXNE).
Если SPI используется только для передачи данных, то мож­
но включить только канал SPI Тх ОМА. В этом случае флаг OVR
устанавливается, так как принятые данные не считываются.
Если SPI используется только для приема данных, то можно
включить только канал SPI Rx ОМА.
В режиме передачи, когда ОМА записал все передаваемые
данные (в регистре
OMA_ISR установлен флаг TCIF), флаг BSY
может контролироваться, чтобы убедиться в завершении SРl­
связи. Это необходимо для того, чтобы не испортить последнюю
передачу перед отключением SPI или переходом в режим Stop.
Программа должна сначала дождаться ТХЕ=1, а затем BSY=O.
Примечание: При прерывистой связи между операцией запи­
си в SPI_OR и установкой бита BSY существует задержка в 2 так­
та АРВ. Как следствие, после записи последних данных необхо­
димо дождаться сначала ТХЕ=1, а затем BSY=O.
204
ExamP'f! \NIU, CPOL.=1, СРНА:1
MISO/МOSI (out)
ТХЕI~
ВSУ ll&g
OMArequesl
Тк buffer
(wrile to SPI_DR)
..,,
O<F2
sottwtre conrtourм lhe
DМА SPI Tk Chennet
IOsend]dataltem$
а1'!С1 anat,lea 1N SPt
Рисунок 6.9 - Передача с использованием DMA
Example wllt'I CPOL:1, СРНА:1
sск
MISO/МOSI (in)
ОМА reques1_,f.l----------l
AxЬuffer-+t--------1л11---------1r11---------1rtt---­
(read lrom SPI_DR~i-1--------IЩ=.:....-----JЧl=~-----.A!i~:,_-
"'"""
Рисунок 6.10 -
Прием с использованием DMA
205
Возможность DMA с CRC
При включении SРl-связи с СRС-связью и режима DMA пере­
дача и прием CRC по окончании связи происходят автоматиче­
ски, то есть без использования бита CRCNEXТ. После приема CRC
необходимо считать CRC в регистре
SPI_DR, чтобы снять флаг
RXNE.
По окончании передачи данных и CRC устанавливается флаг
CRCERR в SPI_SR, если во время передачи произошли повре­
ждения.
ФЛАГИ ОШИБОК
Неисправность режима ведущего устройства (MODF}
Сбой в режиме ведущего устройства возникает, когда его вы­
вод NSS подтягивается к низкому уровню (в аппаратном режиме
NSS) или к низкому уровню бита SSI (в программном режиме NSS),
что автоматически устанавливает бит MODF. Сбой режима веду­
щего устройства влияет на периферию SPI следующим образом:
• Бит MODF установлен, и если установлен бит ERRIE, то ге­
нерируется прерывание SPI.
• Бит SPE очищается. Это блокирует все выходы устройства
и отключает интерфейс SPI.
• Бит MSTR очищается, переводя устройство в режим ведо­
мого. Для сброса бита MODF используйте следующую программ­
ную последовательность:
1. Осуществите доступ к регистру SPI_SR на чтение или за­
пись, если установлен бит MODF.
2. Затем произведите запись в регистр SPI_CR1.
Во избежание конфликтов между несколькими ведомыми
устройствами в системе, состоящей из нескольких MCU, вывод
NSS должен быть подтянут к высокому уровню во время после­
очистки битов MODF. После этого биты SPE
и MSTR могут быть возвращены в исходное состояние.
довательности
В качестве защиты аппаратные средства не позволяют уста­
навливать биты SPE и MSTR при установленном бите MODF.
206
В ведомом устройстве бит MODF не может быть установлен.
Однако в многомастерной конфигурации устройство может на­
ходиться в ведомом режиме с установленным битом
MODF.
В этом случае бит MODF указывает на то, что, возможно, произо­
шел конфликт нескольких мастеров за управление системой.
Для выхода из этого состояния можно использовать процедуру
прерывания,
выполнив
сброс
или
вернувшись
в
состояние
по умолчанию.
Состояние превышения
Состояние превышения возникает, когда ведущее устройство
отправило байт данных, а ведомое устройство не очистило бит
RXNE, возникший в результате передачи предыдущего байта
данных. При возникновении условия обгона:
• устанавливается бит OVR и генерируется прерывание, если
установлен бит ERRIE.
В этом случае содержимое буфера приемника не будет об­
новлено новыми данными, полученными от ведущего устрой­
ства. Чтение
из регистра
SPI_DR
возвращает этот байт. Все
остальные последующие переданные байты теряются.
Очистка бита OVR производится чтением из регистра SPI_DR
с последующим доступом к регистру SPI_SR.
Ошибка CRC
Этот флаг используется для проверки достоверности полу­
ченного значения при установленном бите CRCEN в регистре
SPI_CR1. Флаг CRCERR в регистре SPI_SR устанавливается, если
значение,
полученное
в
сдвиговом
значению приемника SPI_RXCRCR.
207
регистре, не
соответствует
ПРЕРЫВАНИЯ SPI
Фnar собьrтия
Событие прерывания
Бит уnравnения
включением
Флаг опустошения буфера передачи
ТХЕ
ТХЕIЕ
Флаг "Буфер приема не пуст
RXNE
RXNEIE
Событие неисправности основного режима
MODF
Ошибка превышения
OVR
ERRIE
CRCERR
Флаг ошибки CRC
Таблица 6.1 - Запросы прерываний SPI
РЕГИСТРЫ SPI
Доступ к периферийным регистрам осуществляется по полу­
словам (16 бит) или словам (32 бита).
Регистр управления SPI 1 (SPI_CR1)
Смещение адреса: ОхОО
Сброшенноезначение:ОхОООО
15
010/
MODE
141
13
12
10
11
АХ
ONI.Y
SSM
SSI
F~:T
SPE
вя12,01
MSTR
CPOl
СРНА
Таблица 6.2 - Регистр управления SPI 1 (SPI_CR1)
Бит 15 BIDIMODE:
разрешение двунаправленного режима передачи данных О:
208
выбран 2-строчный однонаправленный
режим передачи данных 1: выбран 1-арочный двунаправ­
ленный режим передачи данных
Бит 14 BIDIOE: разрешение выхода в двунаправленном ре­
жиме Этот бит в сочетании с битом BIDlmode выбирает направ­
ление передачи в двунаправленном режиме:
О: Выход отключен (режим только приема)
1: Выход разрешен (режим «только передача»)
Примечание: В режиме ведущего используется вывод MOSI,
а в режиме ведомого - вывод MISO.
Бит 13 CRCEN: Разрешение аппаратного вычисления CRC:
О: Вычисление CRC отключено;
1: Расчет CRC включен Примечание: Для корректной работы
этот бит должен быть записан только при отключенном SPI (SPE
= «О»).
Бит 12 CRCNEXТ: Следующая передача CRC О: Фаза данных
(фаза CRC отсутавует) 1: Следующая передача -
CRC (фаза CRC)
Примечание: Если SPI сконфигурирован в полнодуплексном
режиме или режиме «только передатчик», то запись CRCNEXT
должна
производиться
сразу
после
записи
последних
данных
в регистр SPI_DR. Если SPI сконфигурирован в режиме «только
приемник», то CRCNEXT должен быть установлен после второго
последнего приема данных. Этот бит должен быть очищен, если
передача данных осущеавляется с помощью DMA.
Бит 11 DFF: формат кадра данных:
О: Для передачи/приема выбран 8-разрядный формат кадра
данных
1: Для передачи/приема выбран 16-разрядный формат кад­
ра данных
Примечание: Для корректной работы этот бит должен быть
записан только при отключенном SPI (SPE = «О»).
Бит 10 RXONLY: Только прием Этот бит в сочетании с битом
BIDlmode выбирает направление передачи данных в двухли­
нейном однонаправленном
режиме. Этот бит также полезен
в многоведомавенной системе, в которой к данному ведомому
209
нет доступа, вывод от ведомого, к которому есть доступ, не по­
вреждается. О: Полный дуплекс (передача и прием) 1: Выход от­
ключен (режим «только прием»)
Бит 9 SSM: программное управление ведомым устройством
Если бит SSM установлен, то на вход вывода NSS подается
значение из бита SSI.
О: Программное управление ведомым устройством отклю­
чено
1: Программное управление ведомыми включено
Бит 8 SSI: Внутренний выбор ведомого Этот бит действует
только в том случае, если установлен бит SSM. Значение этого
бита принудительно подается на вывод NSS, а значение 1О вы­
вода NSS игнорируется.
Бит 7 LSBFIRST: формат кадра:
О: первым передается MSB$;
1: первым передается LSB.
Примечание: Этот бит не должен изменяться в процессе обмена данными.
Бит 6 SPE: разрешение SPI
О: Периферия отключена;
1: Периферийное устройство включено.
Биты 5:3 BR [2:0]: Управление скоростью передачи данных
ООО: fPCLK/2 001: fPCLK/4 010: fPCLK/8 011: fPCLK/16 100:
fPCLK/32 101: fPCLK/64 110: fPCLK/128 111: fPCLK/256
Примечание: Эти биты не должны изменяться в процессе обмена данными.
Бит 2 MSTR: выбор ведущего:
О: конфигурация ведомого
1: Конфигурация мастера Примечание: Этот бит не должен
изменяться в процессе обмена данными.
Бит 1 CPOL: Полярность тактового генератора:
О: СК в О в режиме ожидания;
1: СК в 1 при холостом ходе Примечание: Этот бит не дол­
жен изменяться в процессе обмена данными.
Бит О СРНА: фаза тактового генератора
210
О: Первый тактовый переход является первым фронтом за­
хвата данных
1: Второй тактовый переход является первым фронтом за­
данных
хвата
Примечание: Этот бит не должен
изменяться
в процессе обмена данными.
Регистр управления SPI 2 (SPI_CR2)
Смещение адреса: Ох04
15
13
1-4
12
t1
10
TXEIE AXNEIE EARIE
◄
з
Rn.
Res
SS0E
TkDМAEN RXDМAEN
Таблица 6.3 - Регистр управления SPI 2 (SPI_CR2)
Биты 15:8 Зарезервированы, должны быть сохранены в зна­
чении сброса.
Бит 7 ТХЕIЕ: разрешение прерывания при опустошении бу­
фера Тх
О: Прерывание ТХЕ замаскировано
1: Прерывание ТХЕ не маскируется. Используется для формирования запроса на прерывание при установленном флаге ТХЕ.
Бит 6 RXNEIE: разрешение прерывания по буферу RX не пуст
О: прерывание RXNE замаскировано;
1: Прерывание RXNE не замаскировано. Используется для
генерации запроса на прерывание, когда флаг RXNE набор.
Бит 5 ERRIE: разрешение прерывания по ошибке Этот бит
управляет генерацией прерывания при возникновении состоя­
ния ошибки (CRCERR, OVR, MODF в режиме SPI}.
О: Прерывание по ошибке замаскировано;
211
1: Прерывание по ошибке разрешено.
Биты 4:3 Зарезервированы, должны быть сохранены в зна­
чении сброса.
Бит 2 SSOE: разрешение выхода SS
О: Выход SS отключен в режиме мастера, и ячейка может ра­
ботать в конфигурации muLtimaster;
1: Выход SS включен в режиме мастера и при включении
ячейки. Ячейка не может работать в мультимастерной конфигу­
рации.
Бит 1 ТXDMAEN: разрешение DMA буфера Тх
Когда этот бит установлен, запрос DMA выполняется всякий
раз, когда установлен флаг ТХЕ.
О: DMA буфера Тх отключен
1: Разрешен DMA буфера Тх
Бит О RXDMAEN: разрешение DMA буфера Rx
Когда этот бит установлен, запрос DMA выполняется всякий
раз, когда установлен флаг RXNE.
О: DMA буфера Rx отключен
1: Разрешен DMA буфера Rx
Регистр состояния SPI (SPI_SR)
J5
14
13
12
11
10
87654
321
О
Таблица 6.4 - Регистр состояния SPI (SPI_SR)
Смещение адреса: Ох08
Биты 15:8 Зарезервированы; должны быть сохранены в зна­
чении сброса.
212
Бит 7 BSY: флаг занятости:
О: SPI (или 12S) не занят;
1: SPI
(или
12S)
занят обменом
данными
или
Тх-буфер
не пуст Этот флаг устанавливается и сбрасывается аппаратно.
Примечание: флаг
BSY следует использовать с осторожно-
стью.
Бит 6 OVR: флаг превышения:
О: Перерасход не произошел;
1: Перерасход произошел.
Этот флаг устанавливается аппаратно и сбрасывается про­
граммной последовательностью. Порядок работы с программ­
ным обеспечением см. в разделе 25.4.7: Флаги ошибок.
Бит 5 MODF: Неисправность режима:
О: Сбой режима не произошел;
1: Сбой режима произошел.
Этот флаг устанавливается аппаратно и сбрасывается про­
граммной последовательностью. Порядок работы с программ­
ным обеспечением см. в разделе: Флаги ошибок.
Бит 4 CRCERR: флаг ошибки CRC:
О:
Этот
флаг
CRC
значение
Полученное
SPI_RXCRCR;
1: Полученное
SPI RXCRCR.
значение
CRC
устанавливается
не
соответствует
значению
соответствует значению
аппаратно
и
снимается
про-
граммной записью О.
Бит 3 UDR: флаг недопробега (Underrun flag)
О: Пробег не произошел;
1: Пробег произошел Этот флаг устанавливается аппаратно
и
сбрасывается
программной
последовательностью.
Порядок
работы с программным обеспечением см. в разделе Флаги оши­
бок.
Примечание: В режиме SPI этот бит не используется.
Бит 2 CHSIDE: Сторона канала:
О: Левый канал должен быть передан или уже принят;
1: Правый канал должен быть передан или уже принят
213
Примечание:
Этот
бит
не
используется
в
режиме
SPI
и не имеет смысла в режиме РСМ.
Бит 1 ТХЕ: Буфер передачи пуст:
О: Буфер Тх не пуст;
1: Тх-буфер пуст.
Бит О RXNE: Буфер приема не пуст:
О: Буфер Rx пуст;
1: Буфер Rx не пуст.
Реrистр данных SPI (SPI_DR)
15
14
13
12
11
10
t
8
7
6
О
2
Таблица 6.5 - Регистр данных SPI (SPI_DR)
Смещение адреса: ОхОС
Биты 15:0 DR [15:О]: Регистр данных
Полученные
или
подлежащие
передаче данные.
Регистр
данных разделен на
2 буфера - один для записи (Тransmit
Buffer), другой для чтения (Receive Buffer). При записи в регистр
данных происходит запись в буфер Тх, а при чтении из регистра
данных возвращается значение, хранящееся в буфере Rx.
Примечание: Данные указания относятся к режиму SPI: В за­
висимости от бита выбора формата кадра данных (DFF в реги­
стре SPI_CR1), передаваемые или принимаемые данные будут 8или 16- разрядными. Для обеспечения корректной работы SPI
этот выбор должен быть сделан до его включения. Для 8-битно­
го кадра данных буферы являются 8-битными, и для передачи/
приема используется только LSB регистра (SPI_DR [7:0]). В режи-
214
ме приема MSB регистра (SPI_DR [15:8)) принудительно устанав­
ливается в О. Для 16-битного кадра данных буферы являются
16-битными, а для передачи/приема используется весь регистр
SPI_DR [15:0).
Регистр полинома SPI CRC (SPI_CRCPR)
15
14
13
12
11
7
10
8
О
5
CRCPOt.ytШ>J
1
Таблица 6.6 - Регистр полинома SPI CRC (SPI_CRCPR)
Смещение адреса: Ох10
Сброшенноезначение:Ох0007
Биты 15:0 CRCPOLY [15:О]: Регистр полинома CRC Этот ре­
гистр содержит полином для вычисления
CRC. Полином CRC
(0007h) является значением сброса этого регистра. При необхо­
димости можно сконфигурировать другой полином.
Регистр SPI RX CRC (SPI_RXCRCR)
15
141
13
12
,,
10
8
7
4
О
, 1 , 1 ,
, 1 , 1 , 1 ,
RXCRCJ15--oJ
, 1 ,
, 1 , 1 , 1 , 1 , 1 , 1 ,
Таблица 6.7 - Регистр SPI RX CRC (SPI_RXCRCR)
215
Смещение адреса: Ох14
Биты 15:0 RXCRC (15:0): Регистр Rx CRC
Если вычисление CRC разрешено, то биты RxCRC [15:0] со­
держат вычисленное значение CRC для последующих принятых
байтов. Этот регистр сбрасывается, когда бит CRCEN в регистре
SPI_CR1 записывается в 1. CRC вычисляется последовательно
с использованием полинома, запрограммированного в регистре
SPI_CRCPR. При установке 8-битного формата кадра данных (бит
DFF в SPI_CR1 сброшен) учитываются только 8 LSВ-битов. Расчет
CRC производится на основе любого стандарта CRC8. При выбо­
ре 16-битного формата кадра данных (бит DFF регистра SPI_CR1
установлен) учитываются все 16 бит этого регистра. Расчет CRC
производится на основе любого стандарта CRC16.
Примечание: Чтение этого регистра при установленном фла­
ге BSY может вернуть неверное значение.
Регистр SPI ТХ CRC (SPI_ТXCRCR)
Смещение адреса: Ох18
15
14
13
12
11
10
8
Таблица 6.8 - Регистр SPI ТХ CRC (SPI_TXCRCR)
Биты
15:0 ТХСRС (15:0): Регистр Тх CRC Если вычисление
TxCRC [7:0] содержат вычисленное
значение. CRC для последующих передаваемых байтов. Этот ре­
гистр сбрасывается при записи бита CRCEN в SPI_CR1 в 1. CRC
CRC
разрешено, то биты
216
вычисляется последовательно с
полинома, за­
использованием
SPI_CRCPR. При установке 8битного формата кадра данных (бит DFF в SPI_CRl сброшен)
учитываются только 8 LSВ-битов. Расчет CRC производится
на основе любого стандарта CRC8. При выборе 16-битного
формата кадра данных (бит DFF регистра SPI_CRl установлен)
учитываются все 16 бит этого регистра. Расчет CRC производит­
ся на основе любого стандарта CRC16.
программированного в регистре
Примечание: Чтение этого регистра при установленном фла­
ге BSY может вернуть неверное значение .
КАРТА РЕГИСТРОВ SPI
Offset
Reglsler
о; IC!I'" Ф
Ф: I Фi
N
N
N1
t 'lJ
1~:NI NIN1-,N1N1.,,. - . - . -1. 1•;N
~: N
'"i N1
o:tI".,,J1
-;
~
.--
-
о
"ф
ОхОО
SPI_CR1
~ а
""u
а:
~ ai u u
о
Reset value
о,
..
SPI_CR2
о
о
о
с
~.
N-
~
:s ~ ! ~ "'а"' BR(2:0J "~ u~ iu
о
"'
о
~
о
о
о
о
w ~
- w
UJ
о
о
о
о
'ооо
... "'
О1е14
Ох18
Ок1С
SPI_CRCPR
Re~e1 value
SPI_RXCRCR
Roset vaJiie
о Iо Iо
о
01010 о 01010
о
0101010
о
о 1 1 1' 11
о
0101010
о
о
CRCPOLY(15:0J
Reaen1ed
о Iо
о
о
о
о
о Iо
о
о
01010 о 01010
о
о
о
о
о Iо
01010
FЬ:CRC( 1 5;0J
Reseм,d
TxCRCL15.0I
Ro"rved
о
о
о
SPl_l2SCFGR
R""""ed
о
о
о
о
о
u
w
::;
~ ~
о
ReиtvllUt
SPl_l2SPR
"'
fZ i: 11
о
о
~ ~ ! "'~
о
о
о
~ о
Re,erved
"'о
о
u
с'!
~
u
о
z
w
о
z
~ u~
о Iо
о
01010 о 01011
о
о
о
о
о
о
I2SOIV
Карта регистров SPI и значения сброса
217
о
::;
о
Roset vгlue
Таблица 6.9 -
о
о
Q."'
0'20
1
о
о
DR(150J
Reиrved
Resetvalue
SPI_TXCRCR
..
о
о
о
Reset value
01t10
w
!/!
> "' 8 ~ а: о ~ ~
"'>
g
~
"'о
"5 u
Reseм,d
Reset value
SPI_DR
~ ~
.. а:
")
а:
а:
о,ос
о
l ~i ~
1i
Ооо
SPI_SR
о
z z
~ ~ ffi
R.-
R...,,_
о,ов
о
"'
g ~ uwz "wz ~ ~
Roserved
"
...
w
ПРИМЕРЫ РАБОТЫ С SPI
ПРОЕКТ ПО ВЫВОДУ ИНФОРМАЦИИ
НА ДИСПЛЕЙ ST7789V3 ЧЕРЕЗ
ИНТЕРФЕЙС SPI
#incLude "stm32f10x.h"
#define TFT_COLUMN_NUMBER 240
#define TFT_LINE_NUMBER 280
#define TFT_COLUMN_OFFSET О
#define TFT_LINE_OFFSET 20
#define PIC_NUM 28800
#define RED 0XF800
#define GREEN ОХО7ЕО
#define ВШЕ 0X001F
#define PIC_LEN 120
#define PIC_HIG 120
#define PIC_NUMBER 28800
#define SPI_SCK_0 GPIOA->BRR=GPIO_BSRR_BSS
#define SPI_SCK_1 GPIOA->BSRR=GPIO_BSRR_BSS
#define SPI_SDA_0 GPIOA->BRR=GPIO_BSRR_B57
#define SPI_SDA_1 GPIOA->BSRR=GPIO_BSRR_B57
#define SPI_RST_о GPIOA->BRR=GPIO_BSRR_B54
#define SPI_RST_1 GPIOA->BSRR=GPIO_BSRR_B54
#define SPI_DC_0 GPIOA->BRR=GPIO_BSRR_B56
#define SPI_DC_1 GPIOA->BSRR=GPIO_BSRR_B56
#define SPI_CS_0 GPIOC-> BRR=GPIO_BSRR_B513
#define SPI_CS_1 GPIOC-> BSRR=GPIO_BSRR_B513
#define BL_0 GPIOB-> BRR=GPIO_BSRR_BS0
#define BL_1 GPIOB-> BSRR=GPIO_BSRR_BS0
const unsigned char china_char [] [32] 218
надпись, к примеру,
на китайском, выводить сюда нет смысла, это набор шестнадца­
теричных данных.
const unsigned char picture_tab [PIC_NUM] -
картинка пред­
ставлена шестнадцатеричными данными, смысла тоже не вижу
сюда представлять.
const unsigned char *point;
void GPIO_init (void) //
{
RCC->APB2ENRl=RCC_APB2ENR_IOPBEN
RCC_APB2ENR_IOPCEN I RCC_APB2ENR_IOPAEN ;
GPIOB-> CRL &= - (GPIO_CRL_CNF0_0 I GPIO_CRL_CNF0_l 1
GPIO_CRL_MODE0_0 I GPIO_CRL_MODE0_l); // Очистить CNF0
[1:0) и MODE0 [1:0) (РВО)
GPIOB-> CRL 1= GPIO_CRL_MODE0_0 I GPIO_CRL_MODE0_l; //
MODE0 [1:0) = ОЫ1 (Output mode, max speed 50 MHz)
GPIOB-> ODR=0XFFFF;// Устанавливаем все биты в регистре
ODR порта GPIOB в состояние 1
GPIOC->
CRH
&=
(GPIO_CRH_CNF13_0
GPIO_CRH_CNF13_1
1
GPIO_CRH_MODE13_0
GPIO_CRH_MODE13_1); // Очистить
GPIOC->
CRH
1=
(GPIO_CRH_MODE13_0
1
GPIO_CRH_MODE13_1);// Установить MODE13 [1:0] = ОЫ1 (РС13)
GPIOC-> ODR=0XFFFF;
GPIOA-> CRL &= - (GPIO_CRL_CNFб_0 I GPIO_CRL_CNF6_1 1
GPIO_CRL_MODEб_0 I GPIO_CRL_MODE6_1); // Очистить
GPIOA-> CRL 1= (GPIO_CRL_MODEб_0 I GPIO_CRL_MODE6_1);//
Рдб - DC
GPIOA->CRL &= -(GPIO_CRL_CNF4_0 1 GPIO_CRL_CNF4_1 1
GPIO_CRL_MODE4_0 1GPIO_CRL_MODE4_1); // Очистить
GPIOA-> CRL 1= (GPIO_CRL_MODE4_0 1GPIO_CRL_MODE4_1);//
РА4 - RST
GPIOA-> CRL &= - (GPIO_CRL_CNFS_0 I GPIO_CRL_CNFS_l 1
GPIO_CRL_MODES_0 I GPIO_CRL_MODES_l); // Очистить
GPIOA-> CRL 1= (GPIO_CRL_MODES_0 I GPIO_CRL_MODES_l);//
PAS - SCL
219
GPIOA-> CRL &= - (GPIO_CRL_CNF7 _О I GPIO_CRL_CNF7 _1 1
GPIO_CRL_MODE7_О I GPIO_CRL_MODE7 _1); // Очистить
GPIOA-> CRL 1= (GPIO_CRL_MODE7 _О I GPIO_CRL_MODE7 _1);//
РА7 - SDA
GPIOA-> ODR=0XFFFF; // Устанавливаем все биты в регистре
ODR порта GPIOB в состояние 1
}
void deLay_us (unsigned int _us_time)
{
unsigned char х=О;
for (;_us_time> 0;_us_time - ) {
х++;х++;х++;х++;х++;х++;х++;х++;х++;х++;х++;х++;
х++·х++·х++·х++·х++·х++·х++·х++·х++·х++·х++·х++·}
'
'
'
'
t
'
'
'
'
'
'
,
}
void deLay_ms (unsigned int _ms_time)
{
unsigned int i,j;
for (i=0;i <_ms_time; i++) {
for G=0;j <900;j++) {
;}}
}
//Этот код реализует программную передачу данных по ин­
терфейсу
SPI (SeriaL PeripheraL lnterface)
GРIО-пинов микроконтроллера:
void SPI_SendByte (unsigned char byte)
{
unsigned char counter;
for (counter=0; counter <8; counter++) {
SPI_SCK_0;
220
с
использованием
if {(byte&0x80) ==О) {
SPI_SDA_0;}
else SPI_SDA_1;
byte=byte«1;
SPI_SCK_1;
SPI_SCK_0;}
}
void TFТ_SEND_CMD (unsigned char o_command}
{
SPI_DC_0;
SPI_CS_0;
SPI_SendByte(o_command);
SPI_CS_1;
}
void TFТ_SEND_DATA (unsigned char o_data)
{
SPI_DC_1;
SPI_CS_0;
SPI_SendByte(o _data);
SPI_CS_1;
}
void ТFТ_SЕТ_ADD (unsigned short int x_start, unsigned short
int y_start, unsigned short int x_end, unsigned short int y_end}
{
unsigned short int х = x_start + TFT_COLUMN_OFFSET
,y=x_end+ TFT_COLUMN_OFFSET;
TFT_SEND _CMD(0x2a); //Column address set
TFT_SEND_DATA{x»8}; //start column
TFT_SEND _DATA{x);
TFT_SEND _DATA{y»8}; //end column
TFT_SEND_DATA{y);
221
х = y_start + TFT_LINE_OFFSET;
y=y_end+ TFT_LINE_OFFSET;
TFT_SEND _CMD(0x2b); //Row address set
TFT_SEND_DATA(x»8); //start row
TFT_SEND _DATA(x);
TFT_SEND_DATA(y»8); //end row
TFT_SEND _DATA(y);
TFT_SEND_CMD(0x2C); //Меmогу write
}
void TFТ_cLear (void)
{
unsigned int ROW,column;
TFT_SET_ADD(0,O,TFT_COLUMN_NUMBER-1,ТFT_LINE_NUMBER-1)
for (ROW=0;ROW <TFT_LINE_NUMBER; ROW++) {
for (column=0;column <TFT_COLUMN_NUMBER; column++) {
TFT_SEND _DATA(0xFF);
TFT_SEND_DATA (0xFF);}}
}
void TFТ_fuLL (unsigned int соlог)
{
unsigned int ROW,column;
TFT_SET_ADD(0,O,TFT_COLUMN_NUMBER-1,ТFT_LINE_NUMBER-1)
for(ROW=0;ROW<TFT_LINE_NUMBER;ROW++)
Loop
{
for(column=0;column<TFT_COLUMN_NUMBER
column Loop
{
TFT_SEND _DATA(color»8);
TFT_SEND _DATA (color);}}
222
//ROW
;column++) //
}
void ТFТ_init (void)
{
SPI_SCK_1;
SPI_RST_0;
deLay_ms(1000);
SPI_RST_1;
deLay_ms(1000);
TFT_SEND_CMD(0x11); //SLeep Out
deLay_ms (120); //DELAY120ms
// - - - - - - ST7789V Frame rate setting - - - - - -//
TFT_SEND_CMD(0x3A);
//65k mode
TFT_SEND_DATA(0x0S);
TFT_SEND_CMD(0xCS); //VCOM
ТFТ_SEND _DATA(0x1A);
TFT_SEND_CMD (Ох36);
TFT_SEND_DATA(0x00);
//-------------SТ7789V Frame rate setting-----------//
TFТ_SEND_CMD(0xЫ); //Porch Setting
TFT_SEND_DATA(0x0S);
TFT_SEND_DATA(Ox0S);
TFT_SEND _DATA(0x00);
TFT_SEND_DATA(Ox33);
TFT_SEND_DATA(0x33);
TFT_SEND_CMD(0xЫ); //Gate ControL
TFT_SEND _DATA (0xOS); //12.2v -10.43v
//--------------ST7789V Power setting---------------//
TFT_SEND_CMD(0xBB);//VCOM
TFT_SEND_DATA(0x3F);
TFT_SEND_CMD(0xC0); //Power controL
223
TFT_SEND _DATA(0x2c);
TFT_SEND_CMD(0xC2);//VDVand VRH Command ЕnаЫе
TFT_SEND _DATA(0x01);
TFT_SEND_CMD(0xC3); //VRH Set
TFT_SEND _DATA(0x0F); //4.3+( vcom+vcom offset+vdv)
TFT_SEND _CMD(0xC4); //VDV Set
TFT_SEND _DATA(0x20); //0v
TFT_SEND_CMD (ОхСб); //Frame Rate Control in Normal Mode
TFT_SEND_DATA(0X01); //111Hz
TFT_SEND_CMD(0xd0); //Power Control 1
TFT_SEND _DATA(0xa4);
TFT_SEND _DATA(0xa1);
TFT_SEND _CMD(0xE8); //Power Control 1
TFT_SEND _DATA(0x03);
TFT_SEND _CMD(0xE9); //Equalize time control
TFT_SEND _DATA(0x09);
TFT_SE ND_DAТА(Ох09);
TFT_SEND_DATA (Ох08);
//---------------ST7789V gamma setting-------------//
TFT_SEND _CMD(0xE0); //Set Gamma
TFT_SEND _DATA(0xD0);
TFT_SEND _DATA(0x0S);
TFT_SEND _DATA(0x09);
TFT_SEND _DATA(0x09);
TFT_SEND _DATA(0x08);
TFT_SEND _DATA(0x14);
TFT_SEND _DATA(0x28);
224
TFT_SEND_DATA(0x33);
TFT_SEND_DATA(0x3F);
TFT_SEND_DATA(0x07);
ТFТ_SEND _DATA(0x13);
ТFТ_SEND_DATA(0x14);
TFT_SEND_DATA(0x28);
TFT_SEND_DATA(0x30);
TFT_SEND_CMD(0XE1); //Set Gamma
TFT_SEND_DATA(0xD0);
TFT_SEND_DATA(0x0S);
TFT_SEND_DATA(0x09);
TFT_SEND_DATA(0x09);
TFT_SEND_DATA(0x08);
TFT_SEND_DATA(0x03);
TFT_SEND_DATA(0x24);
TFT_SEND_DATA(0x32);
TFT_SEND _DATA(0x32);
TFT_SEND_DATA(0x3B);
TFT_SEND_DATA(0x14);
TFT_SEND_DATA(0x13);
TFT_SEND_DATA(0x28);
TFT_SEND_DATA(0x2 F);
TFT_SEND_CMD (Ох21);
TFT_SEND_CMD (Ох29);
}
void Picture_dispLay (const unsigned char *ptr_pic)
{
unsigned Long number;
TFT_SET_ADD (20,20,139,139);
for (number=0;number <PIC_NUM; number++) {
TFT_SEND_DATA (*ptr_pic++);}
225
}
void dispLay_char16_16 (unsigned int х, unsigned int
unsigned Long color, const unsigned char *point)
{
unsigned int column;
unsigned char tm=0,temp;
TFT_SEND_CMD(0x2a); //Column address set
TFT_SEND_DATA(0X00); //start column
TFT_SEND _DATA(x);
х=х+15;
TFT_SEND_DATA(0X00);
TFT_SEND_DATA(x);
//end column
TFT_SEND_CMD(0x2b); //Row address set
TFT_SEND_DATA(0X00); //start row
TFT_SEND_DATA(y);
у=у+15;
TFT_SEND_DATA(0X00);
TFT_SEND_DATA(y);
TFT_SEND_CMD(0x2C);
//end row
//Memory write
for(column=0;column<32 ;column++) //column Loop
{
temp=*point;
for(tm=0;tm<8;tm++)
{
if (temp&0x01) {
TFT_SEND_DATA(color»8);
TFT_SEND _DATA (color);}
else {
TFT_SEND_DATA(0);
TFT_SEND_DATA (О);}
temp» =1;}
point++;}
226
у,
}
int main (void)
{
point= &picture_tab[0]; //установка позиционирования картинки в некоторые координаты
//RCC_init(4);
GPIO_init0;
BL_l;
SPI_SCK_0;
TFT_init0;
while (1) {
TFT_fuЩRED);
deLay_ms(l00);
TFT_full(GREEN);
deLay_ms(l00);
TFT_full(BLUE);
deLay_ms(l00);
TFT_clear0;
deLay_ms(S00);
dispLay_char16_16(16,64,RED,china_char[0));
dispLay_char16_16(32,64,GREEN,china_char[l]);
dispLay_char16_16(48,64,BLUE,china_char[2]);
dispLay_char16_16(64,64,0XFFFF,china_char[3]);
dispLay_char16_16(80,64,BLUE,china_char[4]);
dispLay_char16_16(96,64,GREEN,china_char[S]);
dispLay_char16_16(112,64,RED,china_char[6]);
dispLay_char16_16(40,80,BLUE,china_char[7]);
dispLay_char16_16(56,80,GREEN,china_char[8]);
dispLay_char16_16(72,80,RED,china_char[9]);
dispLay_char16_16(88,80,BLUE,china_char[10]);
deLay_ms(l000);
TFT_clear0;
227
Picture_display(point);
delay_ms(1000);
//Picture_ReverseDisplay(point);
delay_ms (3000);}
}
Комментарии кода проекта:
Для работы дисплея необходимо вставить джамnеры отла­
дочной платы
Biue Kit, которые находятся рядом с дисплеем,
а именно все выше него. Тема вывода видео изображения на­
столько огромна и обширна, что конечно, не может поместиться
в один пример или одну главу. Поэтому по данному направле­
нию планируется выход дополнительных примеров к плате Biue
Кit, а также отдельной книге по работе с бесплатной видео биб­
лиотекой Touch GFX. Ожидайте.
Кратко по блокам кода:
1. Основные функции передачи данных
'SPI_SendByte O'
- Бит-бэнг SPI: Последовательно передаёт байт, управляя
пинами ·sск· (такт) и 'SDA' (данные) вручную.
- Алгоритм:
1. Опускает 'SCK' (лог. О).
2. Устанавливает 'SDA' в ·о· или Тв зависимости от старше­
го бита ('byte & Ох80').
3. Сдвигает байт влево и повторяет для всех 8 бит.
'TFT_SEND_CMD O' и TFT_SEND_DATA O.
- ••команды••: Устанавливают 'DC=o· (режим команды), активируют
(выбор
чипа),
отправляют
байт
через
·cs·
'SPI_SendByteQ'.
- ••данные••: Аналогично, но с 'DC=1 • (режим данных).
2. Управление дисплеем
TFT_SET_ADD O.
228
- Задаёт область вывода (окно) через команды:
- 'Ох2А' - установка столбцов (Х-координаты).
- 'Ох2В' - установка строк (У-координаты).
- 'Ох2С - начало записи пикселей.
'TFT_clear O ' и 'TFT_full O '
- Очистка: Заполняет весь дисплей белым цветом ('OxFFFF').
- Заливка: Закрашивает экран заданным цветом (например,
'RED', 'GREEN').
3. Инициализация ('ТFТ_init () ')
Аппаратный сброс:
- Держит 'RST=O' 1 секунду, затем отпускает ('RST=1 ').
Команды настройки:
- 'Ох11' - выход из спящего режима.
- 'Ох3А' - режим цвета (бSК).
- 'Ох36' - ориентация экрана.
- Настройки мощности, гаммы, частоты обновления (например, 'Ох82', 'ОхСО', 'ОхЕО').
- 'Ох29' -
включение дисплея.
4. Вывод графики и текста
'Picture_display О •
- Выводит изображение из массива 'ptr_pic' в заданное окно
(координаты '20х20' до '139х139').
'display_char16_16 О •
- Рисует символ 1бх16 пикселей:
- Устанавливает окно 16х16.
- Читает биты из массива 'point' (1 бит= 1 пиксель).
- Если бит ·1 • - выводит цвет 'соlог·, иначе ('ОхОООО').
5. Главный цикл ('main () ')
Инициализация GPIO, SPI и дисплея.
229
чёрный
Бесконечный цикл:
- Заливка экрана цветами ('RED', 'GREEN', 'ВШЕ').
- Очистка экрана.
- Вывод китайских символов (16х16) в разные координаты.
- Отображение картинки ('Picture_dispLay').
Как это работает вместе?
- SPI в режиме бит-бэнга эмулирует аппаратный SPI, передавая команды и данные.
- ST7789V интерпретирует команды, обновляет дисплей.
- Цвета передаются как 2 байта (старший и младший).
- Оптимизация: Окно ('TFT_SET_ADD') задаётся один раз
для заполнения области.
Важные нюансы.
- Цвета: Формат 'RGB565' (16 бит на пиксель).
- Задержки: Критичны для инициализации (например,
'120 мс· после 'Ох11 ').
- Ориентация: Настраивается командой 'Ох36' (в коде
'ОхОО' - стандартная).
Код подходит для базового управления дисплеем, но может
быть оптимизирован (например, используя DMA для SPI).
С течением времени будут написаны еще программы для
этого дисплея, здесь поле для деятельности хоть для третьей
книги, и бесплатно выложены на github страницы книги.
ПРОЕКТ УПРАВЛЕНИЮ RGB WS2812B
СВЕТОДИОДАМИ ЧЕРЕЗ ИНТЕРФЕЙС SPI
#incLude "stm32f10x.h"
#define SYSCLOCK 40000000U
#define NUM_LED 36 //количество светодиодов на плате
uint8_t LED_Data [NUM_LED] [4];
230
#define USE_BRIGHTNESS 1
int brightness = 1;
// установка яркости, чем больше значение тем ярче светятся
_IO uint32_t tmpreg;
_IO uint32_t SysTick_CNT = О;
_IO uint8_t tim2_count = О;
_forceinline void deLay LIO uint32_t tck)
{
while (tck) {
tck - ;}
}
void deLay_ms (uint32_t ms)
{
MODIFY_REG(SysТick>VAL,SysTick_VAL_CURRENT_Msk,SYSCLOCK / 1000 - 1);
SysTick_CNT = ms;
while(SysTick_CNT) {}
}
void SysTick_lnit (void)
{
MODIFY_REG (SysTick-> LOAD, SysTick_LOAD_RELOAD_Msk,
SYSCLOCK / 1000 - 1);
CLEAR_BIT (SysTick-> VAL, SysTick_VAL_CURRENT_Msk);
SET_BIT (SysTick-> CTRL, SysTick_CTRL_CLKSOURCE_Msk
SysTick_CTRL_ENABLE_Msk I SysTick_ CТRL_ТICKINT_Msk);
}
void RCC_lnit_HSI_PLL_SMHz (void)
{
RCC-> CR 1= RCC_CR_HSION;
// Включаем внутренний генератор HSI
231
whiLe (! (RCC-> CR & RCC_CR_HSIRDY));
// Ждем, пока HSI стабилизируется
// Настраиваем PLL
RCC-> CFGR &= -RCC_CFGR_PLLMULL; // Очищаем биты множи­
теля PLL
RCC-> CFGR 1= RCC_CFGR_PLLMULL10; // Устанавливаем множи­
тель PLL на 5 (8 МГц• 5 = 40 МГц)
RCC-> CFGR &= -RCC_CFGR_PLLSRC; // Выбираем HSI как источ­
ник PLL
// Включаем PLL
RCC-> CR 1= RCC_CR_PLLON;
whiLe (! (RCC-> CR & RCC_CR_PLLRDY));
// Ждем, пока PLL стабилизируется
// Настраиваем предделители:
RCC-> CFGR &= -RCC_CFGR_HPRE;
// Сбрасываем предделитель АНВ (HCLK = SYSCLK)
RCC-> CFGR 1= RCC_CFGR_HPRE_DIV1;
// Делим SYSCLK на 8 (40 МГц/ 8 = 5 МГц)
RCC-> CFGR &= -RCC_CFGR_PPRE1;
// Сбрасываем предделитель АРВ1
RCC-> CFGR 1= RCC_CFGR_PPRE1_DIV8;
// Делим HCLK на 2 (6 МГц/ 2 = 3 МГц)
RCC-> CFGR &= -RCC_CFGR_PPRE2;
// Сбрасываем предделитель АРВ2
RCC-> CFGR 1= RCC_CFGR_PPRE2_DIV8;
// Делим HCLK на 2 (6 МГц/ 2 = 3 МГц)
// Переключаем систему на PLL
RCC-> CFGR &= -RCC_CFGR_SW;
// Сбрасываем биты выбора источника тактирования
RCC-> CFGR 1= RCC_CFGR_SW_PLL;
// Выбираем PLL как источник тактирования
232
while ((RCC-> CFGR & RCC_CFGR_SWS)!= RCC_CFGR_SWS_PLL);
// Ждем переключения
}
void SPl1_1nit (void)
{
// Включение тактирования для SPl1 и GPIO (если SPl1 на
nop:rax А)
RCC_APB2ENR_SPl1EN
1=
iKC->APB2ENR
RCC_APB2ENR_IOPAEN;
// РА7 (MOSI) - Alternate function push-pull
GPIOA->CRL &= -(GPIO_CRL_CNF7 1GPIO_CRL_MODE7);
GPIOA->CRL 1= GPIO_CRL_CNF7 _11 GPIO_CRL_MODE7;
// Настройка SPl1:
SPl1->CR1 = О; // Сброс регистра CR1
// Настройка режима MODE О (CPOL = О, СРНА = 1)
SPl1->CR1 &= -SPI_CR1_CPOL; // CPOL = О
SPl1->CR11= SPI_CR1_CPHA; // СРНА = 1
// Настройка других параметров SPI:
SPl1->CR11= SPI_CR1_MSTR; // Режим Master
SPl1->CR11= Ох0345; // Baud rate control (fPCLK/4)
SPl1-> CR11= SPI_CR1_SSM I SPI_CR1_SSI;
// Программное управление NSS
SPl1->CR11= SPI_CR1_SPE; // Включение SPI
}
void setLED (int led, int RED, int GREEN, int ВШЕ) //установили расположение цветов более удобно в RGВ-порядок
{
LED_Data[led](0] = led;
LED_Data[led](1] = GREEN;
233
LED_Data[Led][2] = RED;
LED_Data[Led][3] = ВШЕ;
}
void SPI_Transmit_CMSIS (SPI_TypeDef *SPlx, uint8_t *pData,
uint16_t Size)
{
for (uint16_t i = О; i < Size; i++) {
// Ждем, пока SPI не будет готов к передаче (ТХЕ = 1)
while (!(SPlx->SR & SPI_SR_ТХЕ));
// Записываем данные в регистр данных SPI
SPlx->DR = pData[i];
}
// Ждем, пока SPI завершит передачу (BSY = О)
while (SPlx->SR & SPI_SR_BSY);
}
void ws2812_spi (int GREEN, int RED, int ВШЕ)
{
#if USE_BRIGHTNESS
if (brightness>100)brightness = 100;
GREEN = GREEN*brightness/100;
RED = RED*brightness/100;
ВШЕ = BLUE*brightness/100;
#endif
uint32_t color = GREEN«16 1 RED«8 1 ВШЕ;
uint8_t sendData[24];
uint16_t indx = О;
for (int i=23; i> =О; i - ) {
if (((color»i)&0x01) == 1)
sendData [indx++] = ОЫ10; // store 1
else
234
sendData[indx++] = ОЫОО; // store О
}
// Передача данных через SPI (CMSIS)
SPI_Transmit_CMSIS (SPl1, sendData, 24);
// выставлена задержка между светиками в 200мкС (прове­
рено)
for (int i=0; i <90; i++);
}
void WS2812_Send (void)
{
for (volatile int i=0; i <NUM_LED; i++) {
ws2812_spi (LED_Data [i] [1], LED_Data [i] [2], LED_Data [i]
(3]);}
for (int i=0; i<180; i++);
}
int main (void)
{
RCC_lnit_HSI_PLL_5MHz ОJ/Настроили тактирование на 5МГц
SysTick_lnitQ;
SPll_lnit Q;//Чтобы получить 2.5МГц тактирования SPI для
точных таймингов
for (int i=0; i <NUM_LED; i++) {
setLED (i, О, О, О); //очистка светодиодов от любого цвета,
сброс}
WS2812_SendQ;
delay_ms (1000);
while (1) {
for (int i=0; i <NUM_LED; i++) {
setLED (i, 255, О, О); //вывод красного цвета}
WS2812_SendQ;
235
detay_ms (1000);
for (int i=0; i ~NUM_LED; i++) {
setLED (i, О, 255, О); //вывод зеленого цвета}
WS2812_SendQ;
detay_ms (1000);
for (int i=0; i <NUM_LED; i++) {
setLED (i, О, О, 255); //вывод зеленого цвета}
WS2812_SendQ;
detay_ms (1000);
for (int i=0; i <NUM_LED; i++) {
setLED (i, 255, 255, 255); //вывод белого цвета}
WS2812_SendQ;
detay_ms (1000);}
}
void SysTick_HandLer (void)
{
if(SysTick_CNT > О)
SysTick_CNT--;
}
Краткие комментарии кода проекта:
Для работы
одиночным
36 светодиодов WS2812 необходимо замкнуть
комплектным
проводом
dupont вывод РА7
STM32F103 и единственный вывод стоящий около светодиодов
с надписью DIN1 отладочной платы BLue Kit.
Этот код управляет светодиодами WS2812 (или аналогичны­
ми,
например, WS2811,
SK6812) через интерфейс SPI
на STM32F103C. Разберём сначала кратко его работу по ключе­
вым функциям:
236
1. Основные принципы работы с WS2812
- WS2812 использует *протокол 1-wire* с таймингами:
- ·о·: Короткий высокий уровень (-0.35 мкс), затем низкий
(-0.8 мкс).
- ·1 ·: Длинный высокий уровень (-0.7 мкс), затем низкий
(-0.6 мкс).
- В коде используется эмуляция протокола через SPI (биты
·оы10· для ·1 • и ·оыоо· для ·о·).
2. Инициализация периферии
'RCC_lnit_HSI_PLL_SMHz O•
- Настраивает тактирование от HSI (8 МГц) с PLL (40 МГц).
- Делители для HCLK (5 МГц).
'SPl1_1nit O•
- Настраивает SPl1 в режиме Master:
- MOSI (РА7) - выход с альтернативной функцией.
- CPOL=0, CPHA=l ** (режим SPI Mode О).
- Скорость передачи: 2.5 МГ/ц.
·sysTick_lnit О •
- Настраивает системный таймер для задержек ('delay_ms').
3. Работа с LED
·setLED O.
- Записывает цвет (R, G, В) для конкретного светодиода в
массив 'LED Data·.
·ws2812_spi О •
1. Корректировка яркости (если 'USE_BRIGHTNESS=l ').
2. Формирование 24-битного цвета (G-R-B порядок).
3. Преобразование битов в SРl-пакеты:
- ·1 ·-+ ·оы10· (длинный импульс).
- ·о· -+ ·оыоо· (короткий импульс).
4. Передача через SPI ('SPI_Transmit_CMSIS').
237
'WS2812_Send O•
- Последовательно передаёт данные для всех светодиодов
из 'LED_Data·.
- Добавляет задержку 200 мкс (RЕSЕТ-сигнал для WS2812).
4. Главный цикл ('main (} '}
1. Инициализация: RCC, SPI, SysTick.
2. Очистка светодиодов (все в ·о, О, О').
3. Бесконечный цикл:
- Поочерёдно включает все светодиоды в *красный*, *зелё­
ный*, *синий*, *белый* с задержкой 1 сек.
S. Особенности реализации
- SPI как эмуляция 1-wire:
- Частота SPI подобрана так, что:
- 'ОЫ10' на MOSI даёт импульс -0.7 мкс (логическая ·1 • для
WS2812).
- ·оыоо· - -0.35 мкс (логический 'О').
- Яркость•• регулируется умножением цветов на коэффициент ('brightness').
- RЕSЕТ-сигнал•• - задержка 200 мкс (90 тактов в коде).
Почему именно так?
- SPI используется для точности таймингов•• (аппаратная
генерация сигналов).
- Порядок цветов G-R-B* - стандарт для WS2812.
- Задержки критичны для корректной работы WS2812.
Ограничения:
-
Скорость SPI ограничена (для STM32F103 лучше исполь­
зовать DMA в следующих проектах).
-
Число светодиодов
('NUM_LED') можно еще увеличить,
но нужно учитывать память MCU не безгранична.
Подробное пояснение особо важных dzункций:
238
Листинг кода:
void setLED (int led, int RED, int GREEN, int ВШЕ)
{
LED_Data [led] [О]= led;
LED_Data[led][1] = GREEN;
LED_Data[led][2] = RED;
LED_Data[led][3] = ВШЕ;
}
setLED предназначена для установки цвета кон­
кретного светодиода в массиве данных LED_Data. Давайте раз­
Функция
берем, как она работает, шаг за шагом.
1.Параметрыфункции
Функция принимает четыре параметра:
- int led - индекс светодиода, который нужно настроить.
- int RED - значение красного цвета (от О до 255).
- int GREEN - значение зеленого цвета (от О до 255).
- int ВШЕ - значение синего цвета (от О до 255).
2. Массив 'LED_Data·
Предполагается, что LED_Data -
это двумерный массив, где:
- Первый индекс (led) указывает на конкретный светодиод.
- Второй индекс определяет тип данных для этого светодиода:
- LED_Data[led][O] -
индекс светодиода (возможно, исполь-
зуется для идентификации).
- LED_Data[led][1] - LED_Data[led][2] - LED_Data[led][3] -
значение зеленого цвета.
значение красного цвета.
значение синего цвета.
3. Как работает функция
Функция setLED заполняет массив LED_Data для конкретно­
го
светодиода
(led)
значениями
внутри:
239
цветов.
Вот что
происходит
void setLED (int led, int RED, int GREEN, int ВШЕ) {
LED_Data[led][O] = led; // Сохраняем индекс светодиода
LED_Data(led][1] = GREEN; // Сохраняем значение зеленого
цвета
// Сохраняем значение красного
LED_Data(led][2] = RED;
цвета
// Сохраняем значение синего
LED_Data[led][3] = ВШЕ;
цвета
}
сохраняет индекс светодиода в
- LED_Data(led](O] = led; -
массиве. Это может быть полезно для идентификации светодио­
да, если массив используется для других целей.
- LED_Data(led][1] = GREEN; -
сохраняет значение зеленого
цвета.
сохраняет значение красного
- LED_Data[led](2] = RED; цвета.
- LED_Data(led](3] =
ВШЕ;
-
сохраняет значение синего
цвета.
4. Пример использования
Предположим, у нас есть 3 светодиода, и мы хотим устано­
вить цвет для второго светодиода (индекс
1) на красный (255,
О, О):
setLED(1, 255, О, О);
После вызова функции массив
LED _Data
так:
LED_Data[1][0] = 1; // Индекс светодиода
LED_Data[1][1] = О; // Зеленый
LED_Data[1](2] = 255; // Красный
LED_Data(1](3] = О; // Синий
5. Зачем нужен 'LED_Data [Led] [О]= Led;'?
240
будет выглядеть
Строка LED_Data[Led](O] = Led; сохраняет индекс светодиода
в массиве. Это может быть полезно, если:
- Вы хотите хранить дополнительную информацию о свето­
диоде.
- Массив LED_Data используется для других целей, где ин­
декс светодиода должен быть явно указан.
- Это может быть задел на будущее для расширения функци­
ональности.
Если это не требуется, эту строку можно удалить, и функция
будет выглядеть так:
void setLED (int Led, int RED, int GREEN, int ВШЕ) {
LED_Data[Led](1] = GREEN; // Зеленый
LED_Data[Led](2] = RED; // Красный
LED_Data[Led][3] = ВШЕ; // Синий
}
6. Как это связано с WS2812B?
Массив LED_Data, используется для хранения данных о цве­
тах светодиодов перед их отправкой на «ленту» WS2812B платы
BLue PiLL. После заполнения массива данные передаются через
SPI или другой интерфейс, чтобы обновить цвета на физической
ленте.
7. Пример полного цикла работы
1. Вы вызываете setLED для каждого светодиода, чтобы за­
дать их цвета.
2. После настройки всех светодиодов данные из LED_Data
передаются на ленту WS2812B.
Пример:
// Установка цветов для 3-х светодиодов
setLED{O, 255, О, О); // Красный
setLED(1, О, 255, О); // Зеленый
setLED(2, О, О, 255); // Синий
241
// Передача данных на ленту WS2812B
sendDataToWS2812B(LED_Data);
Итог:
Функция
setLED
заполняет
массив
LED_Data
значениями
цветов для конкретного светодиода. Этот массив затем исполь­
зуется для передачи данных на ленту
WS2812B. Если
строка
LED_Data [led) [О]= led; не нужна, её можно удалить.
Функция ws2812_spi.
Настройка яркости (опционально)
Если определена директива USE_BRIGHTNESS, функция кор­
ректирует
значения
цветов
в
зависимости
от
переменной
brightness:
#if USE_BRIGHTNESS
if (brightness> 100) brightness = 100; // Ограничение яркости
до 100%
GREEN = GREEN * brightness / 100; // Корректировка зеленого
RED = RED * brightness / 100; // Корректировка красного
ВШЕ = ВШЕ * brightness / 100; // Корректировка синего
#endif
- brightness - это глобальная переменная, которая задает
яркость светодиодов (от О до 100%).
- Значения цветов умножаются на brightness и делятся
на 100, чтобы уменьшить их интенсивность.
Функция ws2812_spi.
Кодирование битов для WS2812B. Листинг кода:
uint8_t sendData [24]; // Массив для хранения закодирован­
ных битов
// Индекс для заполнения массива
int indx = О;
for (int i = 23; i> = О; i - ) {
242
if (((coLor» i) & Ох01) == 1) sendData [indx++] = ОЫ10; // Ко­
дирование «1»
eLse sendData[indx++] = ОЫОО; // Кодирование 'О'
}
Комментарий к коду:
сдвиг числа coLor на i бит вправо, чтобы из­
- coLor» i влечь текущий бит.
- & Ох01 -
маскирование всех битов, кроме младшего (те­
кущего).
-
Если бит равен 1, в массив записывается ОЫ10 (кодиро­
вание «1»).
-
Если бит равен О, в массив записывается ОЫОО (кодиро­
вание «О»).
Функция ws2812_spi.
Листинг кода:
for (int i=23; i> =О; i - )
{
if (((coLor» i) &Ох01) == 1)
sendData [indx++] = ОЫ10; // store 1
eLse
sendData [indx++] = ОЫОО; // store О
}
Комментарий к коду:
Исходные данные:
coLor - 24-битное значение цвета в формате G-R-8 (напри­
мер, 0x00FF00 - зелёный).
sendData - массив, куда записываются SРl-пакеты для передачи.
Цикл for (int i=23; i> =О; i -
):
Перебирает все 24 бита цвета (от старшего к младшему):
Биты 23-16: Зелёный (G).
Биты 15-8: Красный (R).
243
Биты 7-0: Синий (В).
Проверка бита ((color» i) &Ох01) == 1:
Сдвигает
color
на
i позиций
вправо
и
извлекает
млад­
ший бит.
Если бит ==
1, кодирует его как ОЫ10 (логическая 1 для
WS2812B).
Если бит== О, кодирует как ОЫОО (логический О).·
244
ГЛАВА 7. ТАЙМЕР ОБЩЕГО
НАЗНАЧЕНИЯ: TIM
Таймеры общего назначения состоят из 16-разрядного счет­
чика с автозагрузкой, управляемого программируемым преска­
лером.
Они могут использоваться для различных целей, включая
измерение длительности импульсов входных сигналов (захват
входного сигнала) или генерацию выходных сигналов (сравне­
ние выходов и ШИМ).
Длительность импульсов и периоды осциллограмм можно
модулировать от нескольких микросекунд до нескольких милли­
секунд с помощью прескалера таймера и прескалеров тактового
контроллера RCC.
Таймеры полностью независимы и не имеют общих ресур­
сов. Они могут быть синхронизированы между собой, как будет
описано в главе далее.
Основные характеристики таймера общего назначения:
Функции таймера общего назначения TIMx включают в себя:
• 16-разрядный счетчик с автозагрузкой вверх, вниз, вверх/
вниз.
• 16-разрядный программируемый прескалер, используе­
мый для деления (в том числе «на лету») тактовой частоты счет­
чика на любой коэффициент от 1 до 65536.
• До 4 независимых каналов для:
- Входной захват;
- Сравнение выходов;
- Формирование ШИМ (режимы с выравниванием по краям
и по центру);
- Выходной сигнал в одноимпульсном режиме.
245
• Схема синхронизации для управления таймером с помо­
щью внешних сигналов и объединения нескольких таймеров.
• Генерация прерывания/ОМА по следующим событиям:
- Обновление: переполнение/недополнение счетчика, ини­
циализация
счетчика
(программно
или
внутренним/внешним
триггером);
-
Событие триггера (запуск, остановка, инициализация или
счет по внутреннему/внешнему триггеру) ;
Входной захват;
Сравнение выходов.
TIMk._.EfA П--------­
""' __.:::-~---~...~.....~~
Т1"'""'
n----~-
L-=="--'=~
Рисунок 7.1 -
ri
Блок-схема таймера общего назначения
246
• Поддержка инкрементальных (квадратурных) энкодеров
и датчиков Холла для целей позиционирования;
• Вход триггера для внешнего тактового генератора или цик­
лического управления током.
ФУНКЦИОНАЛЬНОЕ ОПИСАНИЕ
Единица измерения времени
Основным блоком программируемого таймера является 16разрядный счетчик со связанным с ним регистром автопереза­
грузки. Счетчик может вести счет вверх, вниз или одновременно
вверх и вниз. Тактовый сигнал счетчика может быть разделен
прескалером. Счетчик, регистр автоперезагрузки и регистр прес­
калера могут быть записаны или прочитаны программно. Это
справедливо даже при работающем счетчике. В состав блока
временной базы входят:
• Регистр счетчика (ТIMx_CNT)
• Регистр прескалера (ТIMx_PSC):
• Регистр автоматической перезагрузки (ТIMx_ARR) Регистр
авто-загрузки является предварительно загруженным. При за­
писи в регистр автозагрузки или чтении из него осуществляется
доступ к регистру предварительной загрузки. Содержимое ре­
гистра преднагрузки передается в теневой регистр постоянно
или
при
каждом событии
обновления
(UEV), в зависимости
от бита разрешения преднагрузки автоперезагрузки (ARPE)
в регистре TIMx_CR1. Событие обновления посылается, когда
счетчик достигает переполнения (или недополнения при нисхо­
дящем счете) и если бит
UDIS в регистре TIMx_CR1 равен О.
Оно также может быть сформировано программно. Формиро­
вание события обновления подробно описано для каждой кон­
фигурации. Счетчик тактируется выходом прескалера
CK_CNT,
который включается только при установленном бите разреше­
ния счетчика (CEN) в регистре TIMx_CR1 (подробнее о включе­
нии счетчика см. также описание контроллера ведомого режи­
ма). Обратите внимание, что сигнал фактического разрешения
247
работы
счетчика
CNT_EN
устанавливается
через
1 такт
по­
сле CEN.
Описание прескапера.
Прескалер может делить тактовую частоту счетчика на лю­
бой коэффициент от 1 до 65536. Он основан на 16-разрядном
счетчике, управляемом через 16-разрядный регистр (в регистре
TIMx_PSC). Он может быть изменен «на лету», так как этот
управляющий регистр буферизован. Новый коэффициент прес­
калера
учитывается
при
следующем
обновлении.
На
рис.
8.2 и рис. 8.3 приведены примеры поведения счетчика при опе­
ративном изменении коэффициента прескалера:
CK_PSC
CNT_EN
Тimer clock = СК_СNТ
:
:
i
_JUU1JUULJLJLJLЛ
_
Counter register --~,__,,.._,,__.,__,,__,,,___,,..__,,___,._
F7
00
01
02
03 _,~
Update event (UEV)
Prescaler control register
о
j~" ~ - - ~ - - -
Write а new value in TIMx_PSC
Prescaler buffer
о
Prescaler counter
о
Рисунок 7.2 -
01;010101
Временная диаграмма работы счетчика при изме­
нении деления прескалера с 1 на 2
248
CK_PSC
CNT_EN
Timer clock = CK_CNT
Counter register
F7
01
00
_ __ _ , , _ _ , , ~ , ' ' - - . J ' - - . J ~ ' - - - - - - ' L - - - - - ' ' -
Update event (UEV)
Prescaler contrcl register
о
"
3
--/-11-,..·~---------
Write а new value in TIMx_PSC
Prescaler bulfer
о
3
Prescaler counter
о
01230123
Рисунок 7.3 -
Временная диаграмма работы счетчика при изме­
нении деления прескалера с 1 на 4
РЕЖИМЫ РАБОТЫ СЧЕТЧИКА
Режим пересчета
В режиме наращивания счетчик считает от О до значения ав­
топерезагрузки (содержимое регистра TIMx_ARR), затем переза­
пускается с О и формирует событие переполнения счетчика.
Событие Update может быть сформировано при каждом пе­
реполнении счетчика или при установке бита
UG в
региаре
ТIMx_EGR (программно или с помощью контроллера ведомого
режима).
UEV может быть отключено программно путем
уаановки бита UDIS в региаре TIMx_CR1. Это делается для то­
Событие
го, чтобы избежать обновления теневых регистров при записи
новых значений в регистры предварительной загрузки. Тогда со­
бытие обновления не произойдет до тех пор, пока бит
UDIS
не будет записан в О. Однако счетчик перезапускается с О, как
249
и счетчик прескалера (но скорость прескалирования не изменя­
ется). Кроме того, если в регистре TIMx_CR1 установлен бит URS
(выбор запроса обновления), то установка бита
UG генерирует
событие обновления UEV, но без установки флага UIF (таким об­
разом, прерывание или запрос DMA не посылаются). Это сдела­
но для того, чтобы избежать генерации прерываний обновления
и захвата при очистке счетчика по событию захвата.
При наступлении события обновления происходит обновле­
ние всех регистров и устанавливается флаг обновления (бит UIF
в регистре TIMx_SR) (в зависимости от бита URS):
• Буфер прескалера перезагружается значением предвари­
тельной загрузки (содержимым регистра TIMx_PSC);
• Теневой регистр автоперезагрузки обновляется значением
пред-загрузки (ТIMx_ARR).
На
следующих
рисунках
приведены
примеры
поведения
счетчика для различных тактовых частот при TIMx_ARR=0x36.
CK_INT
CNТ_EN
Тimer clock = СК_СNТ - - ~
Counter register
31
--~-~-~-~-~-~-~-~-~~~~~~~~~~~~
Counter overflow
Update event (UEV)
Update interrupt flag (UIF)
Рисунок 7.4 -
Временная диаграмма счетчика, внутренний так­
товый генератор делится на 1
250
CK_INT
CNT_EN
Тimer clock = CK_CNT
Counter register
0034
_ _ _ _ , , ~ _ _ , , _ _ _ , , . _ _ . , , _ _ . . . , , . __
_,1,._
_...,,_
Counter overflow
Update event (UEV)
Update interrupt flag (UIF)
Рисунок 7.5 -
Временная диаграмма счетчика, внутренний так­
товый генератор делится на 2
CK_INT
CNT_EN
Tlmer clock = CK_CNT
Counter register
--~п~~п~_ГL_
Х
0035
0036
Х
0000
х~
Counter overflow
Update event (UEV)
Update interrupt llag (UIF)
Рисунок 7.6 -
Временная диаграмма счетчика, внутренний так­
товый генератор делится на 4
251
CK_INT
,IUlГLГUUUlJl
Тlmer clock = CK_CNT
,Jl~-
Counter register
_1_F_.......,_20
_ _~
~
00
Counter overflow
Update event (UEV)
Update interrupt flag {UIF)
Рисунок 7.7 - Временная диаграмма счетчика, внутренний так­
товый генератор, деленный на N
CK_INT
CNT_EN
Тlmer clock = CK_CNT
Counter overflow
Update event (UEV)
Update interrupl flag (UIF)
Auto-reload reglsler
36
~
FF
-/~
~•---------
Write а new vaJue in ТIMx_ARR
Рисунок 7.8 -
Временная диаграмма счетчика, событие обнов­
ления при ARPE=O (ТIMx_ARR не загружен)
252
CK_PSC
CNT_EN
Тimer clock
=СК_СNТ - - ~
Counler register
_____,,_,,_,,_,._,._,,_,,_,.___,,_,,_,,_,,___,,~
FO
Counter overflow
Update event (UEV)
Update inlerrupt llag (UIF)
z..._,_______36_ _ _ _ __
Auto-reload preload register __
FS__
Aulo-reload shadow register
~
FS /
36
-7-г---~•---
Write а new value 1n TIMx_ARR
Рисунок 7.9 -- Временная диаграмма счетчика, событие обнов­
ления при ARPE=1 (ТIMx_ARR предварительно загружен)
РЕЖИМ ПОНИЖЕННОГО СЧЕТА
В режиме понижающего счета счетчик считает от значения
автоперезагрузки (содержимое регистра TIMx_ARR) до О, затем
перезапускается от значения автоперезагрузки и формирует со­
бытие переполнения счетчика. Событие Update может генериро­
ваться
при каждом недополнении счетчика
или при установке
бита UG в регистре TIMx_EGR (программно или с помощью кон­
троллера ведомого режима). Событие обновления
UEV может
быть отключено программно путем установки бита UDIS в реги­
стре TIMx_CR1. Это делается для того, чтобы избежать обновле­
ния теневых регистров при записи новых значений в регистры
предварительной
загрузки.
После этого события обновления
253
не происходит до тех пор, пока бит UDIS не будет записан в О.
При этом счетчик перезагружается с текущего значения автоза­
грузки, а счетчик прескалера перезагружается с О (но частота
прескалирования не изменяется). Кроме того, если в регистре
TIMx_CR1 установлен бит URS (выбор запроса обновления), то
установка бита UG генерирует событие обновления UEV, но без
установки флага UIF (таким образом, прерывание или запрос
ОМА не посылаются). Это сделано для того, чтобы избежать ге­
нерации прерываний обновления и захвата при очистке счетчи­
ка по событию захвата.
При наступлении события обновления происходит обновле­
ние всех регистров и устанавливается флаг обновления (бит UIF
в регистре TIMx_SR) (в зависимости от бита URS):
• Буфер прескалера перезагружается значением предвари­
тельной загрузки (содержимым регистра TIMx_PSC).
• Активный регистр автоперезагрузки обновляется значени­
TIMx_ARR). Обратите
ем предзагрузки (содержимым регистра
внимание,
что
автоперегрузка
обновляется до
перезагрузки
счетчика, чтобы следующий период был ожидаемым.
На
следующих рисунках
приведены
примеры
поведения
счетчика для различных тактовых частот при TIMx_ARR=0x36.
254
CK_INT
CNT_EN
Timer clock = CK_CNT
Counter register
05
---•~J~-•~-•~~L~,~~•~•~J~~~~~__,~~~
Counler underflow (cnt_udf)
Update event (UEV)
Update interrupl f1ag (UIF)
Рисунок 7.10 -
Временная диаграмма счетчика, внутренний так­
товый генератор делится на 1
CK_INT
CNT_EN
Timer clock = CK_CNT
Counter register
0002
---~·~-,~-~~-~'---'"---J~---'~-
Counter underflow
Update event (UEV)
Update interrupt flag (UIF)
Рисунок 7.11 -
Временная диаграмма счетчика, внутренний так­
товый генератор делится на 2
255
CK_INT
CNT_EN
Тimer c\ock
=CK_CNT _ _____,П.__~П.___ГL_
-----~~------.',.----,,---
Counter register _ _ _
000_1_~Х
0000
х
ооЗб
х оозs
Counter underflow
Update event (UEV)
Update interrupt flag (UIF)
Рисунок 7.12 - Временная диаграмма счетчика, внутренний так­
товый генератор делится на 4
CK_INT
JLJLГUlJUU1Л_
Тimer c\ock = CK_CNT
1-Л~-
Counter register
_2_0_ _,,__
1F_ __,,
~----Зб____
Counter underflow
Update event (UEV)
Update lnterrupt flag (UIF)
Рисунок 7.13 -
Временная диаграмма счетчика, внутренний так­
товый генератор делится на N
256
CK_INТ
CNТ_EN
Timer clock = СК_СNТ
05
Counter register
Counter underflow
Update evenl (UEV)
Update interrupt flag (UIF)
FF
Auto-reload register
/~ ~ - - - - - З6
W ri l e а new value in TIMx_ARR
Рисунок 7.14 -
Временная диаграмма счетчика, событие
Update
РЕЖИМ ВЫРАВНИВАНИЯ ПО ЦЕНТРУ (СЧЕТ
ВВЕРХ/ВНИЗ)
В
от
О
режиме
до
ТIMx_ARR)
выравнивания
значения
-
по
автоперезагрузки
1, формирует
счетчик
считает
(содержимое
регистра
центру
событие переполнения счетчика,
затем считает от значения автоперезагрузки до 1 и формирует
событие недополнения счетчика. Затем счетчик начинает от­
счет с О.
Режим выравнивания по центру активен, если биты
CMS
в регистре TIMx_CR1 не равны «00». Флаг прерывания выходно­
го сравнения каналов, сконфигурированных в выход, устанавли­
вается,
когда:
счетчик
считает
вниз
(режим
выравнивания
по центру 1, CMS = «01»), счетчик считает вверх (режим вырав­
нивания по центру 2, CMS = «10») счетчик считает вверх и вниз
(режим выравнивания по центру 3, CMS = «11»).
257
В этом режиме бит направления (DIR из регистра TIMx_CR1)
не может быть записан. Он обновляется аппаратно и задает те­
кущее направление движения счетчика.
Событие обновления может формироваться при каждом пе­
реполнении счетчика и
новка бита
при
каждом его
недополнении, а уста­
UG в регистре ТIMx_EGR (программно или с помо­
щью контроллера ведомого режима) также формирует событие
обновления. В этом случае счетчик начинает отсчет с О, так же
как и счетчик прескалера.
Событие обновления UEV может быть отключено программ­
но путем установки бита UDIS в регистре TIMx_CR1. Это делает­
ся для того, чтобы избежать обновления теневых регистров при
записи новых значений в регистры предварительной загрузки.
Тогда событие обновления не произойдет до тех пор, пока бит
UDIS не будет записан в О. Однако счетчик продолжит отсчет
вверх и
вниз, основываясь на текущем
значении автозагрузки.
Кроме того, если в регистре Т1Мх_СR1 установлен бит URS
(выбор запроса обновления), то установка бита
UG генерирует
событие обновления UEV, но без установки флага UIF (таким об­
разом, прерывание или запрос DMA не посылаются). Это сдела­
но для того, чтобы избежать генерации прерывания обновления
и захвата при очистке счетчика по событию захвата.
При наступлении события обновления происходит обновле­
ние всех регистров и устанавливается флаг обновления (бит UIF
в регистре ТIMx_SR) (в зависимости от бита URS):
• Буфер прескалера перезагружается значением предвари­
тельной загрузки (содержимым регистра ТIMx_PSC).
ем
• Активный регистр автоперезагрузки обновляется значени­
предзагрузки (содержимым регистра TIMx_ARR). Обратите
внимание, что если источником обновления является перепол­
нение счетчика, то автоперегрузка обновляется до перезагрузки
счетчика, чтобы следующий период был ожидаемым (счетчик
загружен новым значением).
На следующих рисунках показаны примеры поведения счет­
чика для различных тактовых частот.
258
CK_INT
CNT_EN
Тimer clock = СК_СNТ
Counter register
04
--~~··~''-''-J~~~~~~~~~~--'•~·~•~'~
Counter underflow
Counter overflow
Update event (UEV)
Update interrupt flag (UIF)
Рисунок 7.15 - Временная диаграмма счетчика, внутренний так­
товый генератор делится на 1, TIMx_ARR=Oxб
1. Здесь используется
режим выравнивания по центру 1, по­
дробнее см. раздел: Регистр управления TIMx 1 {ТIMx_CRl).
CK_INT
CNT_EN
Tlmer clock = CK_CNT
0003
Counter register _ _
__,,_
__,,.____,,.___,.__J,.__
_,L_....J\..._
Counter underflow
Update event (UEV)
Update interrupt flag (UIF)
Рисунок 7.16 -
Временная диаграмма счетчика, внутренний так­
товый генератор делится на 2
259
CK_INT
CNT_EN
Timer clock = CK_CNT
Counter register _ _ _
00_34_
__,У
0035
Х
0036
Х 0035
Counter overflow (cnt_ovf)
Update event (UEV)
Update interrupt flag ( UI F)
Рисунок 7.17 - Временная диаграмма счетчика, внутренний так­
товый генератор делится на 4, ТIMx_ARR=0x36
jU1JU1JUUUl_
CK_INT
;-fl.___
Timer clock = CK_CNT
Counter register
1F_ _,,,
_2_0_----f,__
____
в~___оо
Counter underflow
Update evenl (UEV)
Update interrupt flag (UIF)
Рисунок 7.18 -
Временная диаграмма счетчика, внутренний так­
товый генератор делится на N
260
CK_INT
CNT_EN
Timer clock = CK_CNT
Counter register
_ _ _,,_J.___,,.__,.__J\-J'--''-J'-J'---''----''-_J\--'''---''---
Counter underflow
Update event (UEV)
Update interrupl flag (UIF)
Auto-reload preload register
FD
1v
36
---/.,.-1"'~---------
Write а new value in TIMx_ARR
Auto-reload active register
Рисунок 7.19 -
х
FD
36
Временная диаграмма счетчика, событие обнов­
ления с ARPE=l (недополнение счетчика)
261
CK_INT
CNT_EN
Counter regisler
- - ~ ' - ~ ...~~~~~~~~~~~~J~J~J~~~,~,~
Counter overflow
Update event (UEV)
Update interrupt Паg (UIF)
Auto-reload preload register
FD
'l
36
--7""""*"''----------
Wrile а new value ln nмx_ARR
Auto-reload active register __
FD
_ _ _ _ _ _. .,_У_ _зв
_ _ _ _ __
Рисунок 7.20 - Временная диаграмма счетчика, событие обнов­
ления с ARPE=1 (переполнение счетчика)
ВЫБОР ЧАСОВ (CLDCK SELECТION)
Тактовый генератор счетчика может быть обеспечен следую­
щими источниками тактового сигнала:
• Внутренний тактовый генератор (CK_INT)
• Режим внешней синхронизации1: внешний входной кон­
такт (Тlх)
• Режим внешнего тактового генератора2: вход внешнего
триггера (ETR).
• Внутренние триггерные входы (ITRx): использование одно­
го таймера в качестве прескалера для другого, например, тай­
мер 1 может быть настроен на работу в качестве прескалера для
таймера 2. Более подробная информация приведена в разделе
Использование одного таймера в качестве прескалера для дру­
гого таймера.
262
Источник внутреннего тактового сигнала (CK_INT)
Если контроллер ведомого режима отключен (SMS=000 в ре­
гистре TIMx_SMCR), то биты CEN, DIR (в регистре TIMx_CR1) и UG
(в регистре
TIMx_EGR) являются фактическими управляющими
битами и могут быть изменены только программно (кроме UG,
который остается очищенным автоматически). Как только бит
CEN записывается в 1, прескалер начинает тактироваться внут­
ренним тактовым генератором CK_INT.
На рис. 7.21 показано поведение схемы управления и повы­
шающего счетчика в нормальном режиме, без прескалера.
lnlemal clock
CEN=CNT_EN
UG
CNT_INIT
Coonler clod< = CK_CNT = CK_PSC
Counter regisler
Рисунок 7.21 - Схема управления в нормальном режиме, внут­
ренний генератор делится на 1
Режим внешнего источника тактовой частоты 1
Этот
режим
выбирается
при
SMS=111
в
регистре
TIMx_SMCR. Счетчик может вести отсчет по каждому нарастаю­
щему или спадающему фронту импульса на выбранном входе.
263
TIМx_SMCR
or Tl2F S or"t_
Tl1F _f or1_
Encoder
mode
.f
Extemal clock
mode 1
EТRF .f
Extemal dock
mode2
TRGI
CK_PSC
CK_INT S
(intemal clock)
Т1Мх_ССМR1
TIMx_CCER
TIMx_SMCR
Рисунок 7.216 -
Пример подключения внешнего тактового гене­
ратора Т12
1. (конфигурируйте канал 2 для обнаружения нарастающих
фронтов на входе Т12, записав в регистр TIMx_CCMR1 значение
CC2S= '01.
2. Настройка длительности входного фильтра осуществляет­
ся записью битов IC2F [3:0) в регистр TIMx_CCMR1 (если фильтр
не нужен, сохраните IC2F=0000).
Примечание: прескалер захвата не используется для тригге­
ра, поэтому настраивать его не нужно.
3. Выбор полярности нарастающего фронта осуществляется
записью СС2Р=О в регистр TIMx_CCER.
4. (конфигурируйте таймер в режиме внешнего тактового
генератора 1, записав в регистр TIMx_SMCR значение SMS=111.
5. Выберите Т12 в качестве источника входного сигнала, за­
писав TS=110 в регистр TIMx_SMCR.
6. Включите счетчик, записав CEN=1 в регистр TIMx_CR1.
Когда на Т12 возникает нарастающий фронт импульса, счет­
чик считает один раз и устанавливается флаг TIF.
Задержка между нарастающим фронтом на Т12 и реальным
тактовым импульсом счетчика обусловлена работой схемы ре­
синхронизации на входе Т12.
264
Т12
1
1
1
1
CNT_EN
п
Counter clock = СК_СNТ = CK_PSC
Counter register
34
1
36
35
TIF
Рисунок 7.22 - Схема управления в режиме внешнего тактового
генератора 1
Режим внешнего источника тактовой частоты 2
Выбор этого режима осуществляется записью ЕСЕ=1 в ре­
гистр TIMx_SMCR. Счетчик может считать по каждому нарастаю­
щему или спадающему фронту импульса на входе внешнего
триггера ETR.
На рис.
7.23 приведен обзор блока входа внешнего триг­
гера.
0 ,Тl2Fj;o~
Т11F.. ~
ТRGl,t,;
EТRF4i
TIMx_SМCR
TIМ._SМCR
Рисунок 7.23 -
~·
exremвl clock
modo 1
CK_PSC
extemal ctock
modo2
TIMx_SМCR
Блок входа внешнего триггера
Например, чтобы настроить счетчик на подсчет каждых двух
нарастающих фронтов сигнала ETR, выполните следующую про­
цедуру:
265
1. Поскольку в данном примере фильтр не нужен, запишите
в регистр TIMx_SMCR значение ЕТF [3:0] =0000.
2. Установите прескалер, записав ETPS [1:0] =01 в регистр
ТIМх SMCR
3. Выберите обнаружение нарастающего фронта
импульса
на выводе ETR, записав ЕТР=О в регистр ТIMx_SMCR
4.
Включите
режим
внешней
синхронизации
2,
записав
ЕСЕ=1 в регистр TIMx_SMCR.
5. Включите счетчик, записав CEN=l в регистр Т1Мх_СR1.
Счетчик считает один раз за каждые 2 нарастающих фрон­
та ЕТR.
Задержка между нарастающим фронтом на
ETR и фактиче­
ским тактовым импульсом счетчика обусловлена работой схемы
ресинхронизации по сигналу ETRP.
CK_INТ
CNT_EN
ЕТR
ЕТRР
EТRF
Counter clock = СК_СNТ = CK_PSC - - - - - - - < ~ - - - ~ - - - - - - <
Рисунок 7.24 - Схема управления в режиме внешнего тактового
генератора 2
Захват/сравнение каналов
Каждый канал захвата/сравнения (см. рис.
7.25) построен
на базе регистра захвата/сравнения (включая теневой регистр),
входного каскада захвата (с цифровым фильтром, мультиплек­
сированием и прескалером) и выходного каскада (с компарато­
ром и управлением выходом). Входной каскад дискретизирует
266
соответствующий вход Тlх и формирует отфильтрованный сиг­
нал TlxF. Затем детектор фронтов с выбором полярности фор­
мирует сигнал (ТlxFPx), который может быть использован как
вход триггера
контроллера
ведомого
режима
или
как команда
захвата. Он предварительно масштабируется перед регистром
захвата (ICxPS).
to the slave mode controller
~-т=11____.~-nп-.,~ Tl1Fг--Edg-.-J.'_!.'.!~~
downcounter
Detector
ICF(3.0J
Т1Мх_ССМR1
Т1Мх_ССМR1
Рисунок 7.25 -
nМx_CCER
Канал захвата/сравнения (пример: входной кас­
кад канала 1)
Выходной каскад формирует промежуточную форму сигна­
ла, которая затем используется в качестве опорной: OCxRef (ак­
тивный высокий уровень). Полярность действует в конце цепи.
267
АРВ Bus
Рисунок 7.26 -
Основная схема канала захвата/сравнения 1
То the mas.ter mOde
controUer
Output
ос,
Enal>le
Circu,t
ТIMx_SMCA
CNT>CCR1
CNT = CCR1
Output mode ос1 ref
TIMx_CCER
coлtroller
TIMx_CCER
TIMx_CCMR1
Рисунок 7.27 - Выходной каскад канала захвата/сравнения (ка­
нал 1)
Блок захвата/сравнения состоит из одного регистра предва­
рительной загрузки
и
одного теневого регистра.
При записи
и чтении доступ всегда осуществляется к регистру предваритель­
ной загрузки.
268
В режиме захвата захват фактически осуществляется в тене­
вом регистре, который копируется в регистр предварительной
загрузки. В
режиме сравнения содержимое регистра предварительной
загрузки копируется в теневой регистр, который сравнивается
со счетчиком.
РЕЖИМ ЗАХВАТА ВХОДНОГО СИГНАЛА
В режиме захвата входа регистры захвата/сопоставления
(ТIMx_CCRx) используются для фиксации значения счетчика по­
сле перехода, обнаруженного соответствующим сигналом
Когда
происходит
захват,
устанавливается
ICx.
соответствующий
флаг CCXIF (регистр TIMx_SR) и может быть отправлено преры­
вание или запрос ОМА, если они разрешены. Если захват проис­
ходит, когда флаг CCxlF уже был высоким, то устанавливается
флаг избыточного захвата CCxOF (регистр ТIMx_SR). Флаг CCxlF
может быть сброшен программно путем записи в О или путем
чтения
данных
хранящихся
захвата,
в
регистре
ТIMx_CCRx.
CCxOF сбрасывается при записи в О.
В следующем примере показано, как перехватить значение
счетчика в Т1Мх_ССR1 при повышении уровня сигнала на входе
Т11. Для этого необходимо выполнить следующую процедуру:
• Выберите активный вход: Т1Мх_ССR1 должен быть связан
со входом Т11, поэтому запишите в регистр Т1Мх_ССМR1 биты
CC1S в 01. Как только CC1S станет отличным от 00, канал будет
сконфигурирован на вход, а регистр Т1Мх_ССR1 станет доступен
только для чтения.
• Запрограммируйте
необходимую длительность
входного
фильтра относительно сигнала, подключенного к таймеру (путем
ICxF в регистре TI Мх_CCMRx, если
вход является одним из входов Tlx). Представим, что при пере­
программирования битов
ключении входной сигнал нестабилен в течение не менее пяти
внутренних тактов.
Мы
должны
запрограммировать длитель­
ность фильтра, превышающую эти пять тактов. Мы можем под-
269
твердить переход на Т11, когда будет обнаружено восемь после­
довательных выборок с новым уровнем (выборка на частоте
fDTS). Тогда в регистр TIMx_CCMR1 запишем биты IC1F в 0011.
• Выберите фронт активного перехода по каналу Т11, запи­
сав в регистр ТIMx_CCER бит СС1Р в О (в данном случае - на­
растающий фронт).
• Запрограммируйте входной прескалер. В нашем примере
мы хотим, чтобы захват осуществлялся при каждом допустимом
переходе, поэтому прескалер отключен
(запишите
в
регистр
Т1Мх_ССМR1 биты IC1PS в 00).
• Разрешите захват данных из счетчика в регистр захвата,
установив бит СОЕ в регистре ТIMx_CCER.
• При
необходимости
разрешите соответствующий запрос
прерывания, установив бит СС11Е в регистре ТIMx_DIER, и/или
запрос DMA, установив бит CC1DE в регистре TIMx_DIER. Когда
происходит захват входа:
• Регистр TIMx_CCR1 получает значение счетчика по актив­
ному переходу.
• Устанавливается флаг CC11F (флаг прерывания). CC1OF так­
же устанавливается, если произошло не менее двух последова­
тельных захватов, когда флаг не был сброшен.
• Прерывание генерируется в зависимости от бита СС11Е.
• Запрос DMA формируется в зависимости от бита CC1DE.
Для того чтобы справиться с перехватом,
рекомендуется
считывать данные до флага перехвата. Это необходимо для того,
чтобы не пропустить перехват, который может произойти после
считывания флага и до считывания данных.
Примечание: Запросы на прерывание ИС и/или
DMA могут
быть сформированы программно путем установки соответствую­
щего бита CCxG в регистре TIMx_EGR.
270
РЕЖИМ ШИМ-ВХОДД
Этот режим является частным случаем режима захвата вво­
да. Процедура аналогична, за исключением:
• Два сигнала ICx отображаются на один и тот же вход Тlх.
• Эти два сигнала ICx активны на фронтах с противополож­
ной полярностью.
• Один из двух сигналов TlxFP выбирается в ·качестве входа
триггера, а контроллер ведомого режима конфигурируется в ре­
жиме сброса.
Например, пользователь может измерить период (в регистре
TIMx_CCR1) и рабочий цикл (в регистре TIMx_CCR2) ШИМ, пода­
ваемой на Т11, с помощью следующей процедуры (в зависимо­
сти от частоты CK_INT и значения прескалера):
• Выберите активный вход для TIMx_CCR1: запишите в ре­
гистр TIMx_CCMR1 биты CC1S в 01 (выбран Т11).
• Выберите активную полярность для Tl1FP1 (используется
как для захвата в TIMx_CCR1, так и для сброса счетчика): запи­
шите в СС1Р значение «О» (активен по нарастающему фронту).
• Выберите активный вход для TIMx_CCR2: запишите в ре­
гистр TIMx_CCMR1 биты СС25, равные 10 (выбран Т11).
• Выберите активную полярность для Tl1FP2 (используется
для захвата в TIMx_CCR2): запишите бит СС2Р в «1» (активен
по падающему фронту).
• Выберите допустимый вход триггера: запишите в регистр
TIMx_SMCR биты TS в значение 101 (выбран Tl1FP1).
• (конфигурируйте контроллер ведомого режима в режиме
сброса: запишите в регистр TIMx_SMCR биты SMS, равные 100.
• Разрешить захват: записать в регистр TIMx_CCER биты
СС1Е и СС2Е в «1».
271
ТI1
0002
0001
TIMx_CNT
TIMx_CCR1
0004
TIMx_CCR2
0002
0000
0004
IC1 capture
IC2capture
IC2capture
pulse width
IC1 capture
period
measurement
measurement
reset counter
Рисунок 7.28 - Временные характеристики режима входного
Режим ШИМ-ввода может быть использован только с сигна­
лами ТIМх_СН1/ТIМх_СН2 в связи с тем, что к контроллеру ведо­
мого режима подключены только Т11FР1 и Tl2FP2.
Режим принудительного вывода
В
режиме
TIMx_CCMRx)
вывода
(биты
выходной
каждый
в
CCxS
00
сигнал
сравнения
регистре
(OCxREF
и затем ОСх) может быть переведен в активный или неактив­
уровень
ный
от
сравнения
непосредственно
между
выходным
программно,
регистром
независимо
и
сравнения
счет­
чиком.
Чтобы перевести выходной сигнал сравнения
в
активный
уровень,
пользователю
(ocxref/OCx)
достаточно
записать
101 в биты ОСхМ соответствующего регистра ТIMx_CCMRx. Та­
ким образом, ocxref принудительно переводится в высокий уро­
вень (OCxREF всегда активный высокий уровень), а ОСх получа­
ет значение, противоположное биту полярности ССхР.
Например: ССхР=О (ОСх активный высокий уровень) => ОСх
принудительно переводится в высокий уровень. Сигнал
ocxref
может быть принудительно понижен путем записи в регистр
ТIMx_CCMRx битов ОСхМ в значение 100.
272
В
любом
TIMx_CCRx
случае
сравнение
и счетчиком
теневым
регистром
все равно выполняется и
между
позволяет
установить флаг. Соответственно, могут быть отправлены запро­
сы на прерывание и DMA. Это описано в следующем разделе.
РЕЖИМ СРАВНЕНИЯ ВЫХОДОВ
Эта функция используется для управления формой выходно­
го
сигнала
или
индикации
истечения
определенного
периода
времени.
При обнаружении совпадения между регистром захвата/
сравнения и счетчиком срабатывает функция сравнения выхо­
дов:
• Присваивает соответствующему
граммируемое
значение,
выходному выводу про­
определяемое
режимом
выходного
сравнения (биты ОСхМ в регистре TIMx_CCMRx) и полярностью
выхода (бит ССхР в регистре TIMx_CCER). Выходной вывод мо­
жет
сохранять
(ОСхМ=ОО1),
свой
уровень
неактивным
(ОСХМ=ООО),
(ОСхМ=О10)
или
быть
активным
переключаться
(ОСхМ=О11) при совпадении.
• Устанавливает флаг в регистре состояния прерывания (бит
CCxlF в регистре TIMx_SR).
• Генерирует прерывание, если установлена соответствую­
щая маска прерывания (бит CCXIE в регистре ТIMx_DIER).
• Посылает запрос DMA, если установлен соответствующий
разрешающий бит (бит CCxDE в регистре TIMx_DIER, бит CCDS
в регистре TIMx_CR2 для выбора запроса DMA).
Регистры TIMx_CCRx могут быть запрограммированы с реги­
страми предварительной загрузки или без них с помощью бита
ОСхРЕ в регистре TIMx_CCMRx.
В
режиме сравнения
выходов событие
обновления
UEV
не влияет на выход ocxref и ОСх. Временное разрешение со­
ставляет один отсчет счетчика. Режим сравнения выходов может
также использоваться для вывода одного импульса (в режиме
One pulse).
273
Процедура:
1. Выбор тактового генератора счетчика (внутренний, внеш­
ний, прескалер).
2.
Запишите
нужные
данные
в
регистры
ТIМх ARR
и TIMx_CCRx.
3. Установите биты CCxlE и/или CCxDE, если
необходимо
сформировать прерывание и/или запрос ОМА.
4. Выбор режима вывода. Например, пользователь должен
записать ОСхМ=О11, ОСхРЕ=О, ССхР=О и ССхЕ=1, чтобы пере­
ключить вывод ОСх, когда CNT совпадает с CCRx, предваритель­
ная нагрузка CCRx не используется, ОСх включен и имеет актив­
ный высокий уровень.
5. Включите счетчик, установив бит CEN в регистре
TIMx_CR1.
Регистр TIMx_CCRx может быть обновлен в любой момент
времени программно для управления формой выходного сигна­
ла, при условии, что не включен регистр предварительной на­
грузки (ОСхРЕ=О, иначе теневой регистр ТIMx_CCRx обновляется
только при следующем событии обновления UEV). Пример при­
веден на рис. 7.29:
Write B201h in the CC1R register
TIMx_CNТ~
=- ====
В200 Х В201
L
00_3_A_ _ _ _ _~C---~B=2~01~--T!Mx_CCR1 _ _ _ _ _ _
OC1REF=OC1
__,~~
/
Match detected оп CCR1
lnterrupt generated lf епаЫеd
Рисунок 7.29 - Режим сравнения выходов, переключение
на ОС1
274
РЕЖИМШИМ
Режим широтно-импульсной модуляции позволяет форми­
ровать сигнал с частотой, определяемой значением регистра
TIMx_ARR, и рабочим циклом, определяемым значением реги­
стра TIMx_CCRx.
Режим ШИМ может быть выбран независимо на каждом ка­
нале (по одному ШИМ на выход ОСх) путем записи 110 (режим
ШИМ 1) или «111 (режим ШИМ 2) в биты ОСхМ регистра
TIMx_CCMRx. Пользователь должен включить соответствующий
регистр
преднагрузки,
установив
бит
ОСхРЕ
в
регистре
TIMx_CCMRx, и, в конечном счете, регистр преднагрузки с авто­
перегрузкой, установив бит ARPE в регистре TIMx_CR1.
Поскольку регистры предварительной загрузки передаются
в теневые регистры только при наступлении события обновле­
ния, перед запуском счетчика пользователь должен инициализи­
ровать все регистры, установив бит UG в регистре TIMx_EGR.
Полярность ОСх программируется программно с помощью
бита ССхР в регистре TIMx_CCER. Он может быть запрограмми­
рован как активный высокий или активный низкий уровень. Вы­
ход ОСх разрешается битом ССхЕ в регистре TIMx_CCER. Более
подробная
информация
приведена
в
описании
регистра
TIMx_CCERx.
В режиме ШИМ
(1 или 2) TIMx_CNT и TIMx_CCRx всегда
определить, TIMx_CCRx, TIMx_CNT или
TIMx_CNH TIMx_CCRx (в зависимости от направления работы
счетчика). Однако для соблюдения требования ETRF (OCREF
может быть очищен внешним событием через сигнал ETR
до следующего периода ШИМ) сигнал OCREF только утвержда­
сравниваются, чтобы
ется:
• При изменении результата сравнения или
• Когда режим сравнения выходов (биты ОСхМ в регистре
TIMx_CCMRx) переключается из «замороженной» конфигурации
(сравнение отсутствует, ОСхМ=«ООО) в один из режимов ШИМ
(ОСхМ=«110 или «111).
275
Это позволяет программно заставить ШИМ работать во вре­
мя работы таймера.
Таймер может генерировать ШИМ в режиме выравнивания
по фронту или по центру в зависимости от битов CMS в регистре
TIMx_CR1.
Режим выравнивания фронтов ШИМ
Конфиrурация пересчета
Пересчет активен, когда бит DIR в регистре TIMx_CR1 имеет
низкий уровень. См. раздел Пересчет режим. В следующем при­
мере рассматривается режим ШИМ
1. Опорный ШИМ-сигнал
OCxREF имеет высокий уровень до тех пор, пока TIMx_CNT
<TIMx_CCRx, в противном случае он становится низким. Если
значение сравнения в TIMx_CCRx больше значения автопереза­
грузки (в TIMx_ARR), то OCxREF удерживается в «1. Если значе­
ние сравнения равно О, то OCxREF удерживается в «О. На рис.
7.30 показаны некоторые формы ШИМ с выравниванием
по фронту в примере, когда TIMx_ARR=8.
CCRx=4
OCxREF
CCxlF
ССАх=В
_______,
OCxREF
CCxlF
OCxREF
CCRx>B
-----------~
"1
.-----------------
CCxlF
CCRx=0
OCxREF
'О
-,...---_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_::-_-_-_-...=
CCxlF
Рисунок 7.30 - Формы ШИМ с выравниванием по краям (ARR=8)
276
Конфиrурация с понижающим коэффициентом
Режим
Downcounting активен, если бит DIR в регистре
ТIMx_CRl имеет высокий уровень. См. раздел «Режим спуска».
В режиме ШИМ 1 опорный сигнал осхгеf имеет низкий уро­
вень до тех пор, пока TIMx_CNT> TIMx_CCRx, в противном слу­
чае
он
становится
высоким.
Если
значение
сравнения
в TIMx_CCRx больше значения автоперезагрузки в TIMx_ARR, то
ocxref удерживается в состоянии «1. 0% ШИМ в этом режиме
невозможна.
Режим выравнивания ШИМ по центру
Режим выравнивания по центру активен, если биты
CMS
в регистре TIMx_CRl отличны от '00 (все остальные конфигура­
ции оказывают одинаковое влияние на сигналы
ocxref/OCx).
Флаг
ведет
сравнения
устанавливается,
когда
счетчик
счет
вверх, когда он ведет счет вниз или когда он ведет оба счета
вверх и вниз в зависимости от конфигурации битов CMS. Бит на­
правления
(DIR) в регистре TIMx_CRl обновляется аппаратно
и не должен изменяться программно. См. раздел «Режим вырав­
нивания по центру (счет вверх/вниз)».
На
рис.
7.31 показаны некоторые осциллограммы ШИМ
с выравниванием по центру в примере, где:
• TIMx_ARR=B,
• Режим ШИМ - это режим ШИМ 1,
• Флаг устанавливается при отсчете счетчика, соответствую­
щего режиму 1 с центральным выравниванием, выбранному для
CMS=0l в регистре ТIMx_CRl.
277
0J1J2Jз
Counter register
4JsJs
1JsJs 1 4JзJ2J1] о 11)
7) 8
OCxREF
CCRx=4
CMS:01
CMS:10
CMS:11
CCxlF
1
1
1
1
OCxRE F
--
CCRx=7
CMS:10or11
CCxlF
'1'
OCxREF
CCRx=B
OCxREF
CCRx>B
1
'1'
~
CMS:01
CMS:10
CCxlF
OCxREF
CCRx=0
!
CMS--01
CMS:10
CMS:11
CCxlF
~
~
СМS=11
•n•
СМS:01
CCxlF
~
1 СМS=10
~ СМS=11
jl
Рисунок 7.31 - Формы ШИМ с выравниванием по центру (ARR=8}
Подсказки
по
использованию
режима
выравнивания
по центру:
• При запуске в режиме выравнивания по центру использу­
ется текущая конфигурация «вверх-вниз». Это означает, что счет­
чик ведет отсчет вверх или вниз в зависимости от значения, за­
писанного в бите DIR в регистре TIMx_CR1. Кроме того, биты DIR
и CMS не должны быть одновременно изменены программно.
• Запись
по
центру
в счетчик
не
при
работе
рекомендуется,
так
в
режиме
как
к неожиданным результатам. В частности:
278
это
выравнивания
может
привести
-
Направление не обновляется, если пользователь записы­
вает в счетчик значение, превышающее значение автопереза­
грузки (ТIMx_CNT> ТIMx_ARR). Например, если счетчик вел счет
вверх, то он продолжает вести счет вверх.
-
Направление обновляется, если пользователь записывает
О или записывает в счетчик значение
TIMx_ARR, но при этом
не генерируется событие Update Eveпt UEV.
• Наиболее безопасным способом
использования режима
выравнивания по центру является программная генерация об­
новления (установка бита
UG в регистре TIMx_EGR) непосред­
ственно перед запуском счетчика и недопущение записи в счет­
чик во время его работы.
ОДНОИМПУЛЬСНЫЙ РЕЖИМ
Одноимпульсный режим (ОРМ) является частным случаем
предыдущих режимов. Он позволяет запускать счетчик в ответ
на стимул и формировать импульс программируемой длительно­
сти после программируемой задержки.
Управление запуском счетчика может осуществляться через
контроллер ведомого режима. Генерация сигнала может осу­
ществляться в режиме сравнения выходов или в режиме ШИМ.
Выбор одноимпульсного режима осуществляется установкой би­
та ОРМ в регистре TIMx_CR1. При этом счетчик автоматически
останавливается по следующему событию обновления UEV.
Импульс может быть корректно сформирован только в том
случае, если значение сравнения отличается от начального зна­
чения счетчика. Перед запуском (когда таймер ожидает тригге­
ра) конфигурация должна быть:
• В пересчете: CNT <CCRx <ARR (в частности, О <CCRx);
• При дауншифтинге: CNT> CCRx.
279
Т12
OC1REF
ОС1
s
~ TIM1_CCR
о
~ loELAV ➔~
IPULSE
Рисунок 7.32 - Пример одноимпульсного режима
Например, пользователь может захотеть сформировать по­
ложительный импульс на ОС1 длительностью tPULSE и с задерж­
кой tDELAY, как только на входном выводе Т12 будет обнаружен
положительный фронт импульса.
В качестве триггера 1 будем использовать Tl2FP2:
• Сопоставление Tl2FP2 с Т12 осуществляется записью
CC2S=01 в регистр TIMx_CCMR1.
• Tl2FP2 должен обнаружить нарастающий фронт импульса,
запишите СС2Р=О в регистр TIMx_CCER.
• (конфигурируйте Tl2FP2 в качестве триггера для контрол­
лера ведомого режима (ТRGI), записав в регистр TIMx_SMCR
значение TS=110.
• Tl2FP2 используется для запуска счетчика путем записи
SMS на «110 в регистр TIMx_SMCR (режим триггера).
Форма сигнала ОРМ задается записью в регистры сравнения
(с учетом тактовой частоты и прескалера счетчика).
• Величина tDELAY определяется
в регистр TIMx_CCR1.
280
значением, записанным
• Значение tPULSE определяется разностью между значени­
автоперезагрузки и значением сравнения (ТI Mx_ARR ТIMx_CCR +1).
• Допустим, пользователь хочет построить осциллограмму
с переходом от «О к «1 при совпадении сравнений и переходом
от «1 к «О при достижении счетчиком значения автосброса. Для
этого необходимо включить режим ШИМ 2, записав в регистр
ем
Т1Мх_ССМR1 значение ОС1М=111. Пользователь может допол­
записав
преднагрузки,
регистры
включить
нительно
ARPE в регистр TIMx_CR1.
ОС1РЕ=1 в регистр Т1Мх_ССМR1 и
В этом случае необходимо записать значение сравнения в ре­
гистр
Т1Мх_ССR1,
регистр
в
автоперезагрузки
значение
ТIMx_ARR, сформировать обновление установкой бита UG и до­
ждаться события внешнего триггера на Т12. В данном примере
в СС1Р записывается «О».
В нашем примере биты
DIR и CMS в регистре TIMx_CR1
должны иметь низкий уровень.
пользователю
Если
нужен
один
только
импульс
(режим
Single), то в бит ОРМ регистра Т1Мх_СR1 следует записать «1,
чтобы остановить счетчик при следующем событии обновления
(когда счетчик перейдет от значения автозагрузки обратно к О).
Если бит ОРМ в регистре TIMx_CR1 установлен в «О», то выбран
режим Repetitive.
Частный случай: Быстрое включение ОСх:
В одноимпульсном режиме обнаружение фронта импульса
на входе Тlх устанавливает бит CEN, который включает счетчик.
Затем сравнение счетчика со значением сравнения приводит
к
переключению
несколько
тактов,
выхода.
что
Но
для
операций
требуется
минимальную
задержку
этих
ограничивает
tDELAY min, которую мы можем получить.
Для
вывода
пользователь
осциллограммы
может
установить
с
задержкой
минимальной
бит
OCxFE
в
регистре
ТIMx_CCMRx. Тогда OCxRef (и ОСх) принудительно устанавлива­
ется в ответ на стимул, без учета сравнения. Его новый уровень
281
будет таким же, как если бы произошло сравнение. OCxFE дей­
ствует только в том случае, если канал сконфигурирован в режи­
ме PWM1 или PWM2.
Очистка сигнала OCxREF по внешнему событию
Сигнал OCxREF для данного канала может быть переведен
в низкий уровень путем подачи высокого уровня на вход ETRF
(бит разрешения ОСхСЕ соответствующего регистра TIMx_CCMRx
установлен в «1»). Сигнал OCxREF остается низким до наступле­
ния следующего события обновления UEV.
Эта функция может использоваться только в режимах срав­
нения выходов и ШИМ и не работает в принудительном режиме.
Например, сигнал ETR может быть подключен к выходу ком­
паратора, который будет использоваться для работы с током.
В этом случае
ETR должен быть сконфигурирован следующим
образом:
1. Внешний прескалер триггера должен быть выключен: би­
ты ETPS [1:0) в регистре TIMx_SMCR очищаются до 00.
2. Режим внешней синхронизации 2 должен быть отключен:
бит ЕСЕ в регистре TIM1_SMCR очищается до О.
3. Полярность внешнего триггера (ЕТР) и фильтр внешнего
триггера (ETF) могут быть сконфигурированы в соответствии
с потребностями приложения.
На рис.
7.33
показано поведение сигнала
OCxREF, когда
на входе ETRF появляется высокий уровень, для обоих значений
бита разрешения ОСхСЕ. В данном примере таймер TIMx запро­
граммирован в режиме ШИМ.
282
counter (CNT)
EТRF
OCxREF
(OCxCEsO)
OCxREF
(ОСхСЕ:1)
OCREF_СLЯ
Ьecomes hlgh
1
OCREF_СLЯ
slill high
Рисунок 7.33 - Очистка TIMx OCxREF
РЕЖИМ ИНТЕРФЕЙСА ЭНКОДЕРА
Для выбора режима работы интерфейса кодера запишите
в регистр
TIMx_SMCR SMS=«001, если счетчик считает только
Т12, SMS=010, если только по фронтам Т11,
SMS=011,
и
если по фронтам Т11 и Т12.
по
фронтам
Выбор полярности Т11 и Т12 осуществляется программиро­
ванием битов СС1Р и СС2Р в регистре TIMx_CCER. При необхо­
димости запрограммируйте и входной фильтр.
Два входа Т11 и Т12 используются для подключения к ин­
крементальному энкодеру. Счетчик тактируется каждым допу­
стимым переходом на входе Tl1FP1 или Tl2FP2 (Т11 и Т12 по­
сле фильтрации и выбора полярности входа, Tl1FP1=Tl1, если
не фильтруется и не инвертируется, Tl2FP2=Tl2, если не филь­
труется и не инвертируется) при условии, что он включен (бит
CEN в регистре TIMx_CR1 записан в «1). Последовательность
переходов двух входов оценивается и формирует счетные им­
пульсы, а также сигнал направления. В зависимости от того,
в какой
последовательности
счетчик ведет отсчеты
-
вверх
или вниз, бит DIR в регистре Т1Мх_СR1 соответствующим обра­
зом изменяется аппаратно. Бит
DIR вычисляется при
каждом
переходе по любому входу (Т11 или Т12), независимо от того,
283
считает ли счетчик только по Т11, только по Т12 или и по Т11,
и по Т12.
Режим интерфейса энкодера работает просто как внешний
тактовый генератор с выбором направления. Это означает, что
счетчик просто ведет непрерывный счет от О до значения автопе­
резагрузки
в
регистре
TIMx_ARR
(от О до
ARR
или
от
ARR
до О в зависимости от направления). Поэтому перед запуском
пользователь должен
сконфигурировать ТIMx_ARR.
этом
При
функции захвата, сравнения, прескалера, триггерного выхода
продолжают работать в штатном режиме. В этом режиме счетчик
изменяется автоматически в зависимости от скорости и направ­
ления вращения инкрементального датчика, и его содержимое,
таким образом, всегда представляет положение датчика. Направ­
ление счета соответствует направлению вращения подключенно­
го датчика. В таблице приведены возможные комбинации при
условии, что Т11 и Т12 не переключаются одновременно.
Level оп opposite
signal (Т11 FP1 for
Т\2, Tl2FP2 for Т11)
Rlslng
Counting оп
Т11 only
High
Low
Countingon
Т12 only
Counting оп
Т11 andTl2
Activeedge
Таблица 7.1 -
ТI1 FP1 signal
Tl2FP2 slgnal
Falling
Falllng
Rlslng
Down
Up
NoCount
No Count
Up
Down
NoCount
No Count
High
No Count
NoCount
Up
Down
Low
No Count
NoCount
Down
Up
High
Down
Up
Up
Down
Low
Up
Down
Down
Up
Направление счета в зависимости от сигналов эн­
кодера
Внешний инкрементальный энкодер может быть подключен
непосредственно к MCU без внешней интерфейсной логики. Од­
нако для преобразования дифференциальных выходов энкоде­
ра в цифровые сигналы обычно используются компараторы. Это
значительно повышает помехоустойчивость. Третий выход энко-
284
дера, указывающий на положение механического нуля, может
быть подключен к входу внешнего прерывания и инициировать
сброс счетчика.
На рис. 7.34 приведен пример работы счетчика, показыва­
ющий формирование сигнала счета и управление направлени­
ем. На рисунке также показано, как компенсируется дрожание
входного сигнала, когда выбираются оба фронта. Это может
произойти, если датчик расположен близко к одной из точек
переключения. В данном примере предполагается следующая
конфигурация:
• СС15= '01»
(регистр
TIMx_CCMR1, Tl1FP1
отображен
(регистр
TIMx_CCMR2, Tl2FP2
отображен
на Т11);
• СС25= '01»
на Т12);
• СС1Р = «О», CC1NP = «О», IC1F =«0000» (регистр TIMx_CCER,
Tl1FP1 неинвертирован, Tl1FP1=T11);
• СС2Р = «О», CC2NP = «О», IC2F =«0000» (регистр TIMx_CCER,
Tl2FP2 неинвертирован, Tl2FP2=Tl2);
• SMS= «011» (регистр TIMx_SMCR, оба входа активны как
на нарастающем, так и на спадающем фронтах);
• CEN = 1 (регистр TIMx_CR1, счетчик включен).
lorward
jilter
Ьackward
jitter
forward
Т11
Т12
Coonter
Рисунок 7.34 - Пример работы счетчика в режиме интерфейса
энкодера
285
На рис. 7.35 приведен пример поведения счетчика при ин­
вертированной полярности
Tl1FP1 (та же конфигурация, что
и выше, за исключением СС1Р=1).
Jitter
lorward
ьackward
lorward
ТI1
ТI2
Coonter
Рисунок 7.35 -
Пример режима работы интерфейса энкодера
с инвертированной полярностью Tl1FP1
Таймер, сконфигурированный в режиме интерфейса с энко­
дером, предоставляет информацию о текущем положении дат­
чика. Пользователь может получить динамическую информацию
(скорость, ускорение, замедление), измерив период между дву­
мя событиями энкодера с помощью второго таймера, сконфигу­
рированного в режиме захвата. Для этой цели может быть ис­
пользован
выход
энкодера,
указывающий
на
механический
ноль. В зависимости от времени, прошедшего между двумя со­
бытиями, счетчик может считываться и в обычные моменты вре­
мени. Для этого необходимо зафиксировать значение счетчика
в третьем входном регистре захвата, если таковой имеется (то­
гда сигнал захвата должен быть периодическим и может генери­
роваться другим таймером). При наличии такой возможности
можно также считывать его значение через ОМА-запрос, форми­
руемый часами реального времени.
286
Вход таймера Функция XOR
Бит Tl1S в регистре ТIM1_CR2 позволяет подключить вход­
1 к выходу ХОR-гейта, объединяющего три
входных контакта Т1Мх_СН1 - Т1Мх_СН3.
Выход XOR может быть использован со всеми входными
ной фильтр канала
функциями таймера, такими как триггер или захват входа.
Таймеры и синхронизация с внешним триггером
Таймеры
TIMx
могут быть синхронизированы с внешним
триггером в нескольких режимах: Режим сброса, режим строби­
рования и режим триггера.
Ведомый режим: Режим сброса
Счетчик и его прескалер могут быть повторно инициализи­
рованы в ответ на событие на триггерном входе. Кроме того, ес­
ли бит URS из регистра TIMx_CRl имеет низкий уровень, то ге­
нерируется событие обновления
обновление
всех
UEV. После этого происходит
предварительно
регистров
загруженных
{ТIMx_ARR, TIMx_CCRx). В следующем примере счетчик очищает­
ся в ответ на нарастающий фронт импульса на входе Tll:
• Настройте канал 1 на обнаружение нарастающих фронтов
Tll. Настройте длительность входного фильтра (в данном
примере фильтр не нужен, поэтому оставляем IC1F=0000). Прес­
на
калер захвата не используется для триггера, поэтому пользова­
телю нет необходимости его настраивать. Биты CC1S выбирают
только источник захвата входного сигнала, CC1S = 01 в регистре
Т1Мх_ССМR1. Запись СС1Р=О в регистр
подтвердить
полярность
(и
позволяет
TIMx_CCER
обнаружить только
нарастающие
фронты).
точника
входного
сигнала,
Tll в
TS=101
Выберите
записав
записав
сброса,
режим
в
таймер
• Переведите
SMS=100 в регистр ТIMx_SMCR.
качестве ис­
в
регистр
TIMx_SMCR.
• Запуск счетчика осуществляется записью CEN=l в регистр
Т1Мх_СR1.
287
Счетчик начинает отсчет по внутреннему тактовому генера­
тору и ведет себя нормально до нарастания фронта импульса
ТI1. Когда ТI1 поднимается, счетчик очищается и начинает от­
счет с О. Тем временем устанавливается флаг триггера (бит ТIF
в регистре TIMx_SR) и может быть послан запрос прерывания
или запрос DMA, если он разрешен (в зависимости от битов TIE
и TDE в регистре TIMx_DIER).
На рис. 7.36 показано такое поведение, когда регистр авто­
перезагрузки
TIMx_ARR=0x36. Задержка
между нарастающим
фронтом импульса на ТI1 и фактическим сбросом счетчика обу­
словлена работой схемы ресинхронизации на входе ТI1.
Т11
UG
Counter clock = СК_СNТ = CK_PSC
uUUUl
______лrui_rtJl
Counter reglster
~~~~~~~~~~J~-~-~~,~----~~~~~~~J~
ТIF
Рисунок 7.36 - Схема управления в режиме сброса
ВЕДОМЫЙ РЕЖИМ: РЕЖИМ GATED
Счетчик может быть включен в зависимости от уровня вы­
бранного входа.
В следующем примере upcouпter считает только при низком
уровне на входе ТI1:
• Настройте канал 1 на обнаружение низкого уровня на ТI1.
Настроить длительность входного фильтра (в данном примере
фильтр не нужен, поэтому оставляем IC1F=0000). Прескалер за­
хвата не используется для триггера, поэтому пользователю нет
необходимости его настраивать. Биты CC1S выбирают только ис-
288
точник входного захвата, CC1S=01 в регистре Т1Мх_ССМR1. За­
пись СС1Р=1
в регистр
TIMx_CCER
подтверждает полярность
(и определяет только низкий уровень).
• Переведите таймер в режим стробирования, записав
SMS=101 в регистр TIMx_SMCR. Выберите Т11 в качестве источ­
ника входного сигнала, записав TS=101 в регистр ТIMx_SMCR.
• Включите счетчик, записав CEN=1 в регистр TIMx_CR1
(в режиме стробирования счетчик не запускается, если CEN=0,
каким бы ни был уровень входного сигнала триггера).
Счетчик начинает отсчет по внутреннему тактовому генера­
тору, пока Т11 имеет низкий уровень, и останавливается, как
только Т11 становится высоким. Флаг
TIF в регистре TIMx_SR
устанавливается как при запуске, так и при остановке счетчика.
Задержка
между нарастающим фронтом
импульса на Т11
и фактической остановкой счетчика обусловлена работой схемы
ресинхронизации на входе Т11.
ТI1
CNT_EN
Counter clock = СК_СNТ = CK_PSC
Counter register
JUUlГl ~-----1JLГLГUl
30 31 32 33
''---''-----'''---''---'~-------'L-''--''---''--''--
TIF
WriteTIF:O~
Рисунок 7.37 -
Схема управления в режиме стробирования
ВЕДОМЫЙ РЕЖИМ: РЕЖИМ ТРИГГЕРА
Счетчик может запускаться в ответ на событие на выбран­
ном входе.
В следующем примере счетчик запускается в ответ на нарас­
тающий фронт импульса на входе Т12:
289
• Настройте канал 2 на обнаружение нарастающих фронтов
на ТI2. Настройте длительность входного фильтра (в данном
примере фильтр не нужен, поэтому оставляем IC2F=0000). Прес­
калер захвата не используется для триггера, поэтому пользова­
телю нет необходимости его настраивать. Биты СС25 выбирают
только
источник
входного
захвата,
СС25=01
Т1Мх_ССМR1. Запись СС2Р=1 в регистр
в
регистре
TIMx_CCER позволяет
подтвердить полярность (и обнаружить только низкий уровень).
• Переведите
таймер
в
режим
триггера,
записав
5М5=110 в регистр TIMx_5MCR. Выберите ТI2 в качестве источ­
ника входного сигнала, записав Т5=110 в регистр TIMx_5MCR.
При возникновении нарастающего фронта импульса на ТI2
счетчик начинает отсчет по внутреннему тактовому генератору
и устанавливается флаг TIF.
Задержка между нарастающим фронтом импульса на ТI2
и фактическим запуском счетчика обусловлена работой схемы
ресинхронизации на входе ТI2.
Т12
CNТ_EN
Counterclock:CK_CNТ = CK_PSC _ _ _ _ _ _ _ _ _ _mnnл
Counter register_ _ _ _ _34
_ _ _ _ _ _.,._зs_,~36~~37~,38~
ТIF
Рисунок 7.38 - Схема управления в режиме триггера
ВЕДОМЫЙ РЕЖИМ: РЕЖИМ ВНЕШНЕЙ
СИНХРОНИЗАЦИИ 2 + РЕЖИМ ТРИГГЕРА
Режим внешнего тактового генератора 2 может быть исполь­
зован в дополнение к другому ведомому режиму (кроме режима
внешнего тактового генератора
1 и режима энкодера). В этом
290
случае сигнал ETR используется в качестве входа внешнего так­
тового генератора, а в качестве входа триггера может быть вы­
бран другой вход при работе в режиме сброса, стробирования
или триггера. Рекомендуется не выбирать ETR в качестве TRGI
через биты TS регистра TIMx_SMCR.
В следующем примере инкрементирование счетчика проис­
ходит по каждому нарастающему фронту сигнала ETR, как толь­
ко наступает нарастающий фронт Tll:
1. (конфигурируйте входную цепь внешнего триггера, запрограммировав регистр TIMx_SMCR следующим образом:
- ETF = 0000: фильтр отсутствует;
- ETPS = 00: прескалер отключен;
- ЕТР = О: обнаружение нарастающих фронтов на ETR
и ECE=l для включения режима внешнего тактового генерато­
ра 2.
2. Настройте канал 1 следующим образом, чтобы обнару­
жить нарастающие фронты на ТI:
- IC1F = 0000: фильтр отсутствует;
- Прескалер захвата не используется для триггера и не требует настройки;
- CC1S = 01 в регистре TIMx_CCMR1 для выбора только ис­
точника захвата входного сигнала;
-
СС1Р = О в регистре TIMx_CCER для подтверждения по­
лярности (и обнаружения только нарастающего фронта).
3. Переведите таймер в режим триггера, записав
SMS=110 в регистр ТIMx_SMCR. Выберите Т11 в качестве источ­
ника входного сигнала, записав TS=101 в регистр TIMx_SMCR.
Нарастающий фронт импульса Т11 включает счетчик и уста­
навливает флаг ТIF. Далее счетчик считает по нарастающему
фронту ETR.
Задержка между нарастающим фронтом сигнала ETR и фак­
тическим сбросом счетчика обусловлена работой схемы ресин­
хронизации на входе ETRP.
291
Т11
CEN/CNT_EN
ЕТR
п
Counter register
34
х - 35
---------~~
Counterclock = CK_CNT = CK_PSC _ _ _ _ _ _ _ __
ГL
х~
TIF
Рисунок 7.39 - Схема управления в режиме внешнего тактового
генератора 2 + режим триггера
СИНХРОНИЗАЦИЯ ПО ТАЙМЕРУ
Таймеры TIMx связаны между собой для синхронизации или
объединения в цепочку.
Если один таймер сконфигурирован
в режиме Master, он может сбрасывать, запускать, останавливать
или тактировать счетчик другого таймера, сконфигурированного
в режиме Slave.
На рис.
6.40 представлен обзор блоков выбора триггера
и выбора режима ведущего устройства.
Примечание: часы ведомого таймера должны быть включены
до получения событий от ведущего таймера и не должны изме­
няться «на лету» во время получения триггеров от ведущего тай­
мера. Использование одного таймера в качестве прескалера для
другого таймера
292
TIM2
TIM1
l-
мrs
UEV_,.
Prescaler
н
мaster
mode
Counler
1
conlrol
RGO
~}
1
s s
Slave
CK_PSC
mode
с------+[
Prescaler
control
1
Coun1er
lnpul
trigger
selection
Рисунок 7.40 -
Пример таймера «ведущий/ведомый»
1 на ра­
2 (см. Рис. 6.40). Для
Например, пользователь может настроить таймер
боту в качестве прескалера для таймера
этого:
• Настройте таймер 1 в режиме ведущего таким образом,
чтобы он выдавал периодический сигнал триггера по каждому
UEV. Если в регистре ТIM1_CR2 записать
MMS=010, то при генерации события обновления на TRGO1 бу­
событию обновления
дет выдаваться нарастающий фронт сигнала.
• Для подключения выхода TRGO1 таймера 1 к таймеру
2 таймер 2 должен быть сконфигурирован в ведомом режиме
с использованием ITR0 в качестве внутреннего триггера. Выбор
этого режима осуществляется с помощью битов TS регистра
ТIM2_SMCR (запись TS=000).
• Затем переводим контроллер ведомого режима в режим
внешнего тактового генератора 1 (запись SMS=111 врегистр
TIM2_SMCR). В результате таймер 2 будет тактироваться по на­
растающему фронту периодического сигнала триггера таймера
1 (который соответствует переполнению счетчика таймера 1).
• Наконец, оба таймера должны быть включены установкой
соответствующих битов CEN (регистр TIMx_CR1).
Примечание: Если ОСх выбран на таймере 1 в качестве вы­
хода триггера (MMS=1xx), то его нарастающий фронт использу­
ется для тактирования счетчика таймера 2.
293
Использование одного таймера для включения другого тай­
мера.
В
данном
примере
мы
управляем
включением
таймера
2 с помощью выходного сравнения 1 таймера 1. Подключения
см. на рис. 7.40 Таймер 2 считает на разделенном внутреннем
тактовом генераторе только в том случае, если OC1REF таймера
1 находится на высоком уровне. Тактовые частоты обоих счетчи­
ков делятся на 3 с помощью прескалера, сравниваемого
с CK_INT (fCK_CNT = fCK_INT/3).
• (конфигурируйте ведущий режим таймера 1 таким обра­
зом, чтобы его сигнал Output compare 1 Refereпce (OC1REF) пе­
редавался в качестве выхода триггера (ММ5=100 в регистре
TIM1_CR2).
• Настройте форму сигнала OC1REF таймера 1 (регистр
TIM1_CCMR1).
• (конфигурируйте таймер 2 так, чтобы он получал входной
триггер от таймера 1 (ТS=ООО в регистре TIM2_SMCR).
• (конфигурируйте таймер 2 в режим стробирования
(SMS=101 в регистре TIM2_SMCR).
• Включите таймер 2, записав «1 в бит CEN (регистр
TIM2_CR1).
• Запустите таймер 1, записав «1 в бит CEN (регистр
TIM1_CR1).
Примечание: тактовый генератор счетчика 2 не синхронизи­
руется со счетчиком 1, этот режим влияет только на сигнал раз­
решения счетчика таймера 2.
294
CK_INТ
TIMER1-0C1REF - - - ~
TIMER2-CNТ _ _ЭО4_5_ _ _~Х
3046
~-----=ЭО48с=.=-_ __
Рисунок 7.41 - Управление таймером 2 с помощью OC1REF
В примере на рис. 7.41 счетчик и прескалер таймера
2 не инициализируются перед запуском. Поэтому они начинают
отсчет от своего текущего значения. Можно начать отсчет с за­
данного значения, сбросив оба таймера перед запуском таймера
1. Затем можно записать любое значение в счетчиках таймеров.
Таймеры могут быть легко сброшены программно с помощью би­
та UG в регистрах TIMx_EGR.
В следующем примере мы синхронизируем таймер 1 и тай­
мер 2. Таймер 1 является ведущим и стартует с О. Таймер 2 яв­
ляется ведомым и стартует с ОхЕ7. Коэффициент прескалера
одинаков для обоих таймеров. Таймер
2 останавливается при
в бит CEN регистра
отключении таймера 1 записью «О
TIM1_CR1:
• (конфигурируйте ведущий режим таймера 1 таким обра­
зом, чтобы его сигнал Output compare 1 Reference (OC1REF) пе­
редавался в качестве выхода триггера (ММ5=100 в регистре
TIM1_CR2).
• Настройте форму сигнала OC1REF таймера 1 (регистр
TIM1_CCMR1).
• (конфигурируйте таймер 2 так, чтобы он получал входной
триггер от таймера 1 (ТS=ООО в регистре TIM2_SMCR).
• (конфигурировать таймер 2 в режим стробирования
(SMS=101 в регистре TIM2_SMCR).
295
• Сброс таймера 1 осуществляется записью «1 в бит UG (ре­
• Сброс таймера 2 осуществляется записью
«1 в бит UG (регистр ТIM2_EGR).
• Инициализируйте таймер 2 значением ОхЕ7, записав
«ОхЕ7» в счетчик таймера 2 (ТIM2_CNTL).
• Включите таймер 2, записав «1 в бит CEN (регистр
гистр ТIM1_EGR).
ТIM2_CR1).
• Запустите
таймер
1,
записав
«1
в
бит
CEN
(регистр
«О
в
бит
CEN
(регистр
ТIM1_CR1).
• Остановите
TIM1_CR1).
таймер
1,
записав
CK_INТ ЛJLl..JLlJ1_U1JlЛЛЛЛJU1Л.ГLulЛJl
TIMER1-CEN=CNТ_EN - - - - - - - - ~
TIMER1-CNТ _INIT
TIMER1-CNТ _ 7 ~ 5 ~ ~ - ~ - ~ 0 0_ _ _~,~0~1___,,_ _~0=2_ _
TIMER2-CNТ -~A=B-~'CiiJ.~--~E~7_ _r:::и::=x~_~E=9_ _
TIMER2-CNТ_INIT
--~
TIMER2 - - - - ~
wrileCNТ
TIMER2-TIF - - - - - - - - - ~
Write TIF=0 t __________.
Рисунок 7.42 - Гейтирование таймера 2 с включением таймера 1
ИСПОЛЬЗОВАНИЕ ОДНОГО ТАЙМЕРА ДЛЯ
ЗАПУСКА ДРУГОГО ТАЙМЕРА
В данном примере мы устанавливаем разрешение таймера
2 по событию обновления таймера 1. Подключения см. на рис.
7.40. Таймер 2 начинает отсчет от своего текущего значения (ко­
торое может быть ненулевым) на разделенном внутреннем так-
296
товом генераторе, как только событие обновления будет сфор­
мировано таймером 1. Когда таймер 2 получает сигнал запуска,
его бит CEN автоматически устанавливается, и счетчик считает
до тех пор, пока мы не запишем «О в бит
CEN в регистре
TIM2_CR1. Обе тактовые частоты счетчика делятся на 3 с помо­
щью прескалера по сравнению с CK_INT (fCK_CNT = fCK_INT/3).
• Настройте ведущий режим таймера 1 на передачу события
обновления
в
качестве
триггерного
выхода
(UEV)
(MMS=010 в регистре TIM1_CR2).
• Настройте период таймера 1 (регистры TIM1_ARR).
•Сконфигурируйте таймер 2 так, чтобы он получал входной
триггер от таймера 1 (ТS=ООО в регистре TIM2_SMCR).
•Сконфигурируйте
2
таймер
в
(SMS=110 в регистре TIM2_SMCR).
• Запустите таймер 1, записав «1
TIM1_CR1).
в
режим
триггера
бит
(регистр
CEN
CK_INТ _JUUUUUUU1ЛЛJ1ГUl.ЛJ1JUUUUlЛ
TIMER1•UEV _ _ _ _ _ _ _ ___.
TIMER2-CNТ - - - - - ~ 4 5 ~_ _ ___,,__,48"'--.J~-4~7___,~48~
TIMER2-CEN=CNТ_EN
_ _ _ _ _ _ _ _ ___,
TIMER2-TIF _ _ _ _ _ _ _ _ __,
WrileTIF=O
/
Рисунок 7.43 - Срабатывание таймера 2 при обновлении тайме­
ра 1
Как и в предыдущем примере, пользователь может инициа­
лизировать оба счетчика перед началом счета. На рис. 7.44 по­
казано поведение при той же конфигурации, что и на рис. 7.43,
297
но
в
режиме
триггера
вместо
режима
стробирования
(SMS=110 в регистре TIM2_SMCR).
CK_INТ
TIMER1-CEN=CNТ_EN - - - ~ - - - - - - '
ТIMER1•CNТ_INIТ
TIMER1•CNТ ____.7.:..5---'"--------=ОО'--------'~-----=О-'-1----''----'02=---
ТIMER2-CNТ _INIТ
ТIMER2
--~
_ _ _ ___.
wrileCNТ
ТIMER 2-TIF
---------~
WrlteTIF-0/
Рисунок 7.44 - Срабатывание таймера 2 при включении тайме­
ра 1
СИНХРОННЫЙ ЗАПУСК 2 ТАЙМЕРОВ В ОТВЕТ
НА ВНЕШНИЙ ТРИГГЕР
В данном примере мы устанавливаем разрешение таймера
1 при повышении напряжения на его входе Т11, а разрешение
таймера 2 - при повышении напряжения на входе таймера 1.
Подключения см. на рис. 7.40. Для обеспечения согласования
счетчиков таймер 1 должен быть сконфигурирован в режиме
Master/SLave (ведомый по отношению к Т11, ведущий по отноше­
нию к таймеру 2):
• Настройте ведущий режим таймера 1 на передачу его сиг­
нала Епаьtе в качестве выхода триггера (MMS=001 в регистре
TIM1_CR2).
• Настройте ведомый режим таймера 1 на получение вход­
ного триггера от Т11 (ТS=100 в регистре TIM1_SMCR).
298
триггера
режим
в
1
таймер
• (конфигурируйте
(SMS=110 в регистре TIM1_SMCR).
• (конфигурируйте таймер 1 в режиме Master/Slave, записав
MSM=1 (регистр TIM1_SMCR).
• (конфигурируйте таймер 2 так, чтобы он получал входной
триггер от таймера 1 (ТS=ООО в регистре TIM2_SMCR).
триггера
режим
в
2
таймер
• (конфигурируйте
(SMS=110 в регистре ТIM2_SMCR).
При возникновении нарастающего фронта импульса на Т11
(таймер 1) оба счетчика начинают синхронно считать по внутрен­
нему тактовому генератору, и оба флага Т1 F устанавливаются.
Примечание: В данном примере оба таймера инициализиру­
ются перед запуском (установкой соответствующих битов
UG).
Оба счетчика стартуют с О, но вы можете легко вставить смеще­
ние
между
ними,
записав
в
любой
из
регистров
счетчика
(ТIMx_CNT}. Видно, что в режиме «ведущий/ведомый» в таймер
1 вставляется задержка между CNT_EN и CK_PSC.
CK.JNT
ТIМЕR1-Т11
------~
TIMER1•CEN..CNT_EN - - - - - - - ~
TIMER 1-СК_РSС _ _ _ _ _ _ _ _ ___.
ТIMER1-CNТ - - - - - ~ 0 0 - - - - ~ ~
TIMER1-TIF - - - - - - - ~
ТIMER2-CEN=CNТ_EN - - - - - - - - ~
TIMER2-CK_PSC - - - - - - - - - ~
TIMER2-TIF - - - - - - - - ~
Рисунок 7.45 - Запуск таймеров 1 и 2 с помощью входа Т11 тай­
мера 1
299
Режим отладки
Когда микроконтроллер переходит в режим отладки (ядро
остановлено), счетчик ТIМх либо продолжает ра­
Cortex®-M3 -
ботать нормально, либо останавливается, в зависимости от кон­
фигурационного бита DBG_ТIMx_STOP в модуле DBGMCU. Более
подробная информация приведена в разделе: Поддержка отлад­
ки таймеров, сторожевого таймера, bxCAN и I2С.
РЕГИСТРЫ TIMX
32-разрядные периферийные регистры должны записывать­
ся словами (32 бита). Все остальные периферийные регистры за­
писываются полусловами (16 бит) или словами (32 бита). Доступ
на чтение может осуществляться байтами
(8 бит), полусловами
(16 бит) или словами (32 бита).
Регистр управления TIMx 1 (TIMx_CR1)
Смещение адреса: ОхОО
Сброшенное значение: ОхОООО
15
14
12
13
11
10
СКD(1:01
...-
CMS
ААРЕ
DIR
ОРМ
URS
UDtS
CEN
я
Таблица 7.2 -
Биты
15:10
Регистр управления ТIМх 1 (ТIМх_СR1)
Зарезервированы,
должны
быть
сохранены
в значении сброса.
Биты
9:8 CKD: деление тактового генератора Это битовое
поле указывает коэффициент деления между тактовой частотой
таймера (CK_INT) и тактовой частотой дискретизации, использу­
емой цифровыми фильтрами (ETR, Tlx),
300
00: tDTS = tCK_INT
01: tDTS = 2 х tCK INT
10: tDTS = 4 х tCK_INT
11:Зарезервировано
Бит 7 ARPE: разрешение автоматической предварительной
загрузки
О: Регистр TIMx_ARR не буферизован
1: Регистр TIMx_ARR буферизован
Биты 6:5 CMS: Выбор режима выравнивания по центру:
00: Режим выравнивания по краям. Счетчик ведет счет вверх
или вниз в зависимости от бита направления (DIR).
01: Режим 1 с выравниванием по центру. Счетчик ведет по­
переменный счет вверх и вниз. Флаги прерывания выходного
сравнения
каналов,
сконфигурированных
в
выход
(CCxS=00 в регистре ТIMx_CCMRx), устанавливаются только при
обратном отсчете счетчика.
10: Режим выравнивания по центру 2. Счетчик ведет попе­
ременный счет вверх и вниз. Флаги прерывания выходного
сравнения
каналов,
сконфигурированных
в
выход
(CCxS=00 в регистре ТIMx_CCMRx), устанавливаются только при
обратном отсчете счетчика.
11: Режим выравнивания по центру 3. Счетчик ведет попере­
менный счет вверх и вниз. Флаги прерывания выходного срав­
нения каналов, сконфигурированных в выход (CCxS=00 в реги­
стре ТIMx_CCMRx), устанавливаются как при увеличении, так
и при уменьшении счета. Примечание: Переход из режима вы­
равнивания по краям
в режим выравнивания по центру запре­
щен, пока счетчик включен (CEN=1)
Бит 4 DIR: Направление
О: Счетчик используется в качестве повышающего счетчика
1: Счетчик используется в качестве понижающего счетчика
Примечание: Этот бит считывается только в том случае, если
таймер сконфигурирован
в режиме
выравнивания
по центру
или в режиме кодирования. Бит 3 ОРМ: Одноимпульсный режим
О: Счетчик не останавливается по событию обновления 1: Счет-
301
чик прекращает отсчет при следующем событии обновления
(сброс бита CEN).
Бит 2 URS: Источник запроса на обновление Этот бит уста­
навливается и очищается программно для выбора источников
событий UEV. О: Любое из следующих событий генерирует пре­
рывание обновления или запрос ОМА, если оно разрешено.
Этими событиями могут быть:
- Переполнение/недополнение счетчика
- Установка бита UG
- Генерация обновлений через контроллер ведомого режима 1: Только переполнение/недополнение счетчика генерирует
прерывание обновления или запрос ОМА, если оно разрешено.
Бит 1 UDIS: отключение обновления Этот бит устанавливает­
ся и очищается программно для включения/выключения генера­
ции событий UEV.
О: UEV включено. Событие Update (UEV) генерируется одним
из следующих событий:
- Переполнение/недополнение счетчика
- Установка бита UG
- Формирование обновлений через контроллер ведомого
режима Буферизованные регистры затем загружаются значения­
ми предварительной загрузки.
1: UEV отключен. Событие Update не генерируется, теневые
регистры сохраняют свое значение (ARR, PSC, CCRx). Однако
счетчик
и
прескалер
переинициализируются,
если
установлен
бит UG или получен аппаратный сброс от контроллера ведомого
режима.
Бит О CEN: Счетчик включен
О: Счетчик выключен
1: Счетчик включен
Примечание: Внешний тактовый генератор, режим строби­
рования и режим энкодера могут работать только в том слу­
чае, если бит CEN был предварительно установлен программ­
но. Однако в режиме триггера бит CEN может быть установ­
лен автоматически аппаратно. В одноимпульсном режиме CEN
302
очищается автоматически при наступлении события обновле­
ния.
Реrистр управления TIMx 2 (Т1Мх_СR2)
Смещение адреса: Ох04
,~
,..
,з
12
11
10
........
Таблица 7.3 -
Регистр управления ТIМх 2 (ТIМх_СR2)
Биты 15:8 Зарезервированы, должны быть сохранены в зна­
чении сброса.
Бит 7 Tl1S: Выбор ТI1 О: вывод ТIМх_СН1 подключен к вхо­
ду ТI11: Выводы ТIМх_СН1, СН2 и СН3 подключены к входу ТI1
(комбинация
XOR) См. также
раздел: Интерфейс с датчиками
Холла
Биты 6:4 MMS [2:0]: Выбор режима мастера Эти биты позво­
ляют выбрать информацию, которая в режиме ведущего будет
передаваться ведомым таймерам для синхронизации
(TRGO).
Комбинация выглядит следующим образом:
ООО: Сброс
-
бит UG из регистра
TIMx_EGR используется
в качестве выхода триггера (ТRGO). Если сброс формируется
входом триггера (контроллер ведомого режима сконфигуриро­
ван
в
режиме
сброса),
то
сигнал
на
TRGO задерживается
по сравнению с реальным сбросом.
001: Enable -
сигнал разрешения счетчика,
CNT_EN, ис­
пользуется в качестве выхода триггера (ТRGO). Он полезен для
одновременного запуска нескольких таймеров или для управле­
ния окном, в котором включен ведомый таймер. Сигнал разре-
303
шения счетчика формируется логическим ИЛИ между управляю­
щим битом
в
CEN и входом триггера, если он сконфигурирован
режиме стробирования.
управляется
Когда
сигнал
на
входом триггера,
включения
счетчика
TRGO действует задержка,
за исключением случаев, когда выбран режим ведущий/ведо­
мый
(см.
Update -
описание бита
MSM
в регистре
TIMx_SMCR). 010:
Событие обновления выбрано в качестве выхода триг­
гера (ТRGO). Например, ведущий таймер может быть использо­
ван в качестве прескалера для ведомого таймера.
011: Соmраге Pulse -
триггерный выход посылает положи­
тельный импульс, когда флаг CC11F должен быть установлен (да­
же если он уже был высоким), как только произошел захват или
совпадение сравнения. (ТRGO)
100: Сравнение
сигнал
OC1REF используется как выход
сигнал
OC2REF используется как выход
сигнал
OC3REF используется как выход
сигнал
OC4REF используется как выход
триггера (ТRGO)
101: Сравнение
триггера (ТRGO)
110: Сравнение
триггера (ТRGO)
111: Сравнение
триггера (ТRGO)
Примечание:
тактовая
синхронизация
ведомого
таймера
и АЦП должна быть включена до получения событий от ведуще­
го таймера и не должна изменяться «на лету» во время получе­
ния триггеров от ведущего таймера.
Бит 3 CCDS: выбор DMA захвата/сопоставления
О: Запрос ССх DMA отправляется при возникновении собы­
тия ССх
1: Запросы ССх DMA посылаются при наступлении события
обновления
Биты
2:0 Зарезервировано, должно сохраняться значение
сброса.
304
Регистр управления ведомым режимом TIMx (TIMx_SMCR)
Смещение адреса: Ох08
12
15
14
13
ЕТР
ЕСЕ
ЕТР5[1 :О]
11
5
10
EТFfЗ.OJ
USM
TS(2:0J
г---+--+-------т--+--г---т---т----+--+------,г-'---'-г------!
Таблица 7.4 -
Res.
SMSL2·0J
г---т-~,---i
Регистр управления ведомым режимом TIMx
(ТI Mx_SMCR)
Бит 15 ЕТР: полярность внешнего триггера Этот бит выбира­
ет, используется ли ETR или ETR для триггерных операций
О:
ETR неинвертирован, активен по высокому уровню или
нарастающему фронту
1: ETR инвертирован, активен по низкому уровню или по па­
дающему фронту
Бит
14 ЕСЕ:
Разрешение
внешнего тактового генератора
Этот бит включает режим внешнего тактового генератора 2.
О: Режим внешнего тактового генератора 2 отключен
1: Включен режим внешнего тактового генератора
2. Счетчик тактируется по любому активному фронту сигнала
ETRF.
1: Установка бита ЕСЕ имеет тот же эффект, что и выбор ре­
жима внешнего тактового генератора 1 при подключении TRGI
к ETRF (SMS=111 и TS=111).
2: Возможно одновременное использование режима внеш­
него тактового генератора 2 со следующими ведомыми режима­
ми: режим сброса, режим стробирования и режим триггера. Тем
не менее, в этом случае TRGI не должен быть подключен к ETRF
(биты TS не должны быть равны 111).
3: Если одновременно включены режимы внешнего тактово-
305
го генератора 1 и внешнего тактового генератора 2, то входом
внешнего тактового генератора является ETRF.
Биты
13:12 ETPS:
прескалер внешнего триггера
Частота
ETRP внешнего триггерного сигнала должна составлять не более
1/4 частоты CK_INT. Для снижения частоты ETRP может быть
включен прескалер. Это полезно при подаче быстрых внешних
тактовых импульсов.
00: Прескалер ВЫКЛ.
01: Частота ETRP делится на 2
10: Частота ETRP, деленная на 4
11: Частота ETRP, деленная на 8
Биты
вое
поле
11:8 ЕТF [3:0]: Фильтр внешнего триггера Это бито­
определяет
частоту
дискретизации
сигнала
ETRP
и длину цифрового фильтра, применяемого к ETRP. Цифровой
фильтр состоит из счетчика событий, в котором для подтвер­
ждения перехода на выходе необходимо
N последовательных
событий:
0000: Фильтр отсутствует, выборка производится на fDTS
0001: fSAMPLING=fCK_INT, N=2
0010: fSAMPLING=fCK_INT, N=4
0011: fSAMPLING=fCK_INT, N=8 2
0100: fSAMPLING=fDTS/2, N=б
0101: fSAMPLING=fDTS/2, N=B
0110: fSAMPLING=fDTS/4, N=6 2
0111: fSAMPLING=fDTS/4, N=B
1000: fSAMPLING=fDTS/8, N=б
1001: fSAMPLING=fDTS/8, N=B
1010: fSAMPLING=fDTS/16, N=S
1011: fSAMPLING=fDTS/16, N=б
1100: fSAMPLING=fDTS/16, N=B
1101: fSAMPLING=fDTS/32, N=S
1110: fSAMPLING=fDTS/32, N=б
1111: fSAMPLING=fDTS/32, N=B
Бит 7 MSM: Режим «ведущий/ведомый»
О: Никаких действий
306
1: Воздействие события на вход триггера (ТRGI) задержива­
ется, чтобы обеспечить идеальную синхронизация между теку­
щим таймером и его ведомыми (через TRGO). Это удобно, если
требуется
синхронизировать
несколько таймеров
по
одному
внешнему событию.
Биты 6:4 TS: выбор триггера В этом битовом поле выбирает­
ся вход триггера, который будет использоваться для синхрони­
зации счетчика.
ООО: Внутренний триггер О (ITR0).
001: Внутренний триггер 1 (ITR1).
010: Внутренний триггер 2 (ITR2).
011: Внутренний триггер 3 (ITR3).
100: Детектор фронта импульсов Т11 (Т11F_ED)
101: Вход фильтрованного таймера 1 (Т11FР1)
110: Вход фильтрованного таймера 2 (Т12FР2)
111: Вход внешнего триггера (ETRF)
Более подробную информацию о значении ITRx для каждо­
го таймера см. в таблице 6.5: Внутреннее подключение триггера
TIMx.
Примечание: Эти биты должны быть изменены только тогда,
когда они не используются (например, при SMS=000), чтобы из­
бежать неправильного определения фронта импульса при пере­
ходе. Бит 3 Зарезервирован, должен быть сохранен в значении
сброса.
Биты 2:0 SMS: Выбор ведомого режима
При
выборе
внешних сигналов активный фронт сигнала
триггера (ТRGI) связан с полярностью, выбранной на внешнем
входе (см. регистр управления
входом
и описание регистра
управления.
ООО: режим ведомого отключен - если CEN = «1, то прескалер
тактируется непосредственно внутренним тактовым генератором.
001:
Режим
энкодера
1 -
счетчик
считает
по фронту Tl2FP1 в зависимости от уровня Tl1FP2.
307
вверх/вниз
010:
Режим
энкодера
2 -
счетчик
считает
вверх/вниз
по фронту Tl1FP2 в зависимости от уровня Т12FР1.
011:
Режим
энкодера
по обоим фронтам
Tl1FP1
3 -
счетчик
считает
вверх/вниз
и Т12FР2 в зависимости от уровня
другого входа.
100: Режим сброса - нарастающий фронт выбранного входа
(TRGI) переинициализирует счетчик и формирует об­
триггера
новление регистров.
101: Режим Gated -
тактовый генератор счетчика включает­
ся, когда на входе триггера (ТRGI) высокий уровень. Счетчик
останавливается (но не сбрасывается), как только триггер стано­
вится низким. Управляется как запуск, так и остановка счетчика.
счетчик запускается по нарастающе­
110: Режим триггера -
му фронту импульса триггера TRGI (но не сбрасывается). Управ­
ляется только запуск счетчика.
111:
Режим
синхронизации
внешней
1 -
нарастающие
фронты выбранного триггера (ТRGI) тактируют счетчик. Приме­
чание: режим стробирования не должен использоваться, если
в качестве входа триггера выбран
Tl1F _ED (TS=100). Действи­
тельно, Tl1F _ED выдает 1 импульс на каждый переход на Т11F,
в то время как в режиме
gated проверяется уровень сигнала
триггера. Часы ведомого таймера должны быть включены до по­
лучения событий от ведущего таймера и не должны изменяться
«на лету» во время получения триггеров от ведущего таймера.
ITR1 (ТS = 001)
ITR2 (TS = 010)
ТIМ2
TIM1
TIMB
ТIМЭ
TIM4
ТIМЭ
TIM1
TIM2
TIMS
ТIМ4
ТIМ4
TIM1
TIM2
ТIМЭ
TIMB
ТIMS
TIM2
ТIМЗ
TIM4
TIMB
SlaveTJM
IТR0 (ТS
= ООО)
IТRЭ (ТS = 011)
Таблица 7.5 - Подключение внутреннего триггера TI Мх (l)
308
(1). Если таймер в изделии отсутствует, то соответствующий
триггер ITRx недоступен.
Регистр
разрешения
прерываний
TIMx
DMA/lnterrupt
(ТIMx_DIER)
Смещение адреса: ОхОС
15
14
Res
TDE
13
Res
12
11
10
CC4DE CC3DE CC2DE CC1DE
UDE
Res,
11Е
Res
СС41Е
ССЭIЕ
СС21Е
CCtlE
UIE
Таблица 7.6 - Регистр разрешения прерываний TIMx DMA/
lnterrupt (ТIMx_DIER)
Бит
15
Зарезервировано, должно
сохраняться
значение
сброса.
Бит 14 TDE: разрешение триггерного ОМА-запроса О: Триггер­
ный DМА-запрос отключен. 1: Триггерный DМАзапрос включен.
Бит 13 Зарезервировано, всегда читается как О
Бит 12 CC4DE: Capture/Compare 4 DMA request еnаЫе О: СС4
DMA request disaЫed. 1: Запрос СС4 DMA разрешен.
Бит 11 CC3DE: Capture/Compare 3 DMA request еnаЫе О: СС3
DMA request disaЫed. 1: Запрос СС3 DMA разрешен.
Бит 10 CC2DE: Capture/Compare 2 DMA request еnаЫе О: СС2
DMA request disaЫed. 1: Запрос СС2 DMA разрешен.
Бит 9 CC1DE: Capture/Compare 1 DMA request еnаЫе О: СС1
DMA request disaЫed. 1: Запрос DMA в СС1 разрешен.
Бит 8 UDE: Update DMA request еnаЫе О: Update DMA
request disaЫed. 1: Запрос обновления DMA включен.
Бит 7 Зарезервирован, должен быть сохранен в значении
сброса.
309
Бит 6 TIE: разрешение прерывания триггера
О: прерывание триггера отключено.
1: Прерывание триггера включено.
Бит
5 Зарезервирован, должен быть сохранен в значении
сброса.
Бит 4 СС41Е: Capture/Compare 4 interrupt enable О: СС4
interrupt disabled. 1: Прерывание СС4 разрешено.
Бит 3 СС31Е: Capture/Compare 3 interrupt enable О: СС3
interrupt disabled. 1: Прерывание СС3 разрешено.
Бит 2 СС21Е: Capture/Compare 2 interrupt enable О: СС2
interrupt disabled. 1: Прерывание СС2 разрешено.
Бит 1 СС11Е: разрешение прерывания Capture/Compare 1
О: прерывание СС1 отключено.
1: Прерывание СС1 разрешено.
Бит О UIE: Update interrupt enable
О: Update interrupt disabled.
1: Прерывание обновления разрешено.
Регистр состояния TIMx (TIMx_SR)
Смещение адреса: Ох10
15
14
13
12
n::_wO
10
11
СС.ЮF ССЗОF
Rеsемк:1
rc_YIIO
CC20F CC10F
n::_wO
ТIF
Reserved
rc_wO
Res
n::_wO
CC-41F
CCЗIF
CC21F
CC1tF
UIF
n::_wO
rc_WO
rc_WO
rc_wO
rc_wO
Регистр состояния ТIМх (ПMx_SR)
Таблица 7.7 -
Бит 15:13 Зарезервирован, должен быть сохранен в значе­
нии сброса.
Бит
12 CC40F:
флаг
превышения
4 см. описание CC1OF
310
захвата/сопоставления
Бит
11 CC30F:
флаг
избыточного
захвата/сопоставления
превышения
захвата/сопоставления
превышения
захвата/сопоставления
3 см. описание CC10F
Бит
10 CC20F:
флаг
2 см. описание CC10F
Бит
9 CC10F:
флаг
1 Этот флаг устанавливается аппаратно только в том случае, ес­
ли соответствующий канал сконфигурирован в режиме захвата
входного
сигнала.
Он
снимается
программно
путем
записи
в
регистре
в «О».
О: Перехват не обнаружен.
1:
Значение
счетчика
было
зафиксировано
Т1Мх_ССR1, когда флаг CC11F уже был установлен
Биты 8:7 Зарезеревирован, должны быть сохранены в зна­
чении сброса.
Бит 6 TIF: Флаг триггерного прерывания Этот флаг устанав­
ливается аппаратно по событию триггера (активный фронт, об­
наруженный на входе TRGI, когда контроллер ведомого режима
включен во всех режимах, кроме режима
gated, оба фронта
в случае выбора режима gated). Сбрасывается программно.
О: Событие триггера не произошло.
1: Ожидается прерывание триггера.
Бит
5 Зарезервирован, должен быть сохранен в значении
сброса.
Бит 4 CC41F: Флаг прерывания Capture/Compare 4 см. описа­
ние CC11F
Бит 3 CC31F: Флаг прерывания Capture/Compare 3 см. описа­
ние CC11F
Бит 2 CC21F: Флаг прерывания захвата/сопоставления 2 см.
описание CC11F
Бит 1 CC11F: Флаг прерывания захвата/сопоставления 1 Если
канал СС1 сконфигурирован как выходной: Этот флаг устанавли­
вается аппаратно, когда счетчик совпадает со значением срав­
нения,
за
некоторым
исключением
в
режиме
выравнивания
по центру (см. биты CMS в описании регистра Т1Мх_СR1). Сбра­
сывается он программно. О: Нет соответствия.
311
1: Содержимое
счетчика ТIMx_CNT совпало с содержимым регистра TIMx_CCR1.
Если канал СС1 сконфигурирован как входной: Этот бит устанав­
ливается аппаратно при захвате. Он очищается программно или
чтением
регистра
TIMx_CCR1.
О:
Захвата
входного
сигнала
не произошло. 1: Значение счетчика зафиксировано в регистре
TIMx_CCR1 (на IC1 обнаружен фронт импульса, соответствующий
выбранной полярности).
Бит О UIF: Флаг прерывания обновления
- Этот бит устанавливается аппаратно по событию обновле­
ния. Он очищается программно.
О: Обновление не произошло.
1: Ожидается прерывание обновления. Этот бит устанавли­
вается аппаратно при обновлении регистров:
-
При переполнении или недополнении, а также при нали­
чии UDIS=O в регистре TIMx_CR1.
-
При повторной инициализации CNT программным спосо­
бом
с
помощью бита UG в регистре TIMx_EGR, если
URS=O и UDIS=O в регистре TIMx_CR1.
- При повторной инициализации CNT по событию триггера
(см.
описание
регистра
управления
синхронизацией),
если
URS=O и UDIS=O в регистре TIMx_CR1.
Регистр генерации событий TIMx (ТIMx_EGR)
Смещение адреса: Ох14
15
14
13
12
11
,о
6
5
3
2
Таблица 7.8 - Регистр генерации событий TIMx (ТIMx_EGR)
312
О
Биты 15:7 Зарезервированы, должны быть сохранены в зна­
чении сброса.
Бит 6 TG: Генерация триггера Этот бит устанавливается про­
граммно для генерации события и автоматически сбрасывается
аппаратно.
О: Никаких действий
1: В регистре ТIMx_SR установлен флаг ТIF.
Если флаг установлен, то может произойти соответствующее
прерывание или передача DMA.
Бит
5 Зарезервирован, должен быть сохранен в значении
сброса.
Бит 4
CC4G: Захват/сопоставление 4 поколения см. описа­
ние CClG
Бит 3 CC3G: Захват/сопоставление
3 поколения см. описа­
ние CClG
Бит
2 CC2G: генерация захвата/сравнения 2 см. описа­
ние CClG
Бит
1 CC1G: Захват/сопоставление 1 поколения
Этот бит
устанавливается программно для генерации события и автома­
тически сбрасывается аппаратно.
О: Никаких действий
1: На канале 1 генерируется событие захвата/сравнения: Ес­
ли канал CCl сконфигурирован как выходной: Флаг CCllF уста­
новлен, соответствующее прерывание или DМА-запрос отправ­
ляется, если они разрешены. Если канал
CCl сконфигурирован
как входной: Текущее значение счетчика фиксируется в регистре
TIMx_CCRl. Флаг CCllF устанавливается, посылается соответ­
ствующее прерывание или DМА-запрос, если он разрешен. Флаг
CClOF устанавливается, если флаг CCllF уже был высоким.
Бит О UG: генерация обновления Этот бит может быть уста­
новлен программно, он автоматически очищается аппаратно.
О: Никаких действий
1: Переинициализирует счетчик и
генерирует обновление
регистров. Обратите внимание, что счетчик прескалера также
очищается (в любом случае на коэффициент прескалера это
313
не влияет). Счетчик очищается, если выбран режим выравнива­
ния по центру или если DIR=O (пересчет вверх), иначе он прини­
мает значение автоперезагрузки (TIMx_ARR), если DIR=l (пере­
счет вниз).
Регистр
захвата/сопоставления
режима
TIMx
1 (Т1Мх_ССМR1)
Смещение адреса: Ох18
Каналы могут использоваться как на входе (режим захвата),
так и на выходе (режим сравнения). Направление канала задает­
ся конфигурацией соответствующих битов CCxS. Все остальные
биты этого регистра имеют различную функцию в режиме ввода
и в режиме вывода. Для данного бита ОСхх описывает его функ­
цию, когда канал сконфигурирован в выходном режиме, ICxx -
когда канал сконфигурирован во входном режиме. Следует учи­
тывать, что один и тот же бит может иметь разное значение для
входного и выходного каскада.
15
14
13
0С2М(2<>]
ОС2СЕ
IC2fl3:0J
12'
11
10
ОС2РЕ
OC2FE
IC2PSCJ1 :О)
ОС1СЕ
CC2S{1:0J
ОС1М(2:О]
IC1F)3:0J
0С1РЕ
0C1FE
IC1PSCJ1 :О)
CC1S{1:0J
Таблица 7.9 - Регистр режима захвата/сопоставления TIMx
1 (Т1Мх_ССМR1)
Режим сравнения выходов
Бит 15 ОС2СЕ: Разрешение очистки выходного сравнения 2
Биты 14:12 ОС2М (2:0]: Режим выходного сравнения 2
Бит 11 ОС2РЕ: Разрешение преднагрузки выходного сравне­
ния 2
Бит 10 OC2FE: Разрешение быстрого выходного сравнения 2
314
Биты 9:8 CC2S [1:0]: Выбор захвата/сопоставления 2
Это битовое поле определяет направление канала (вход/вы­
ход), а также используемый вход.
00: Канал СС2 сконфигурирован как выходной
01: Канал СС2 сконфигурирован как входной, IC2 отображен
на Т12
10: Канал СС2 сконфигурирован как входной, IC2 отображен
на Т11
11: Канал СС2 сконфигурирован как входной, IC2 сопостав­
лен с TRC. Этот режим работает только в том случае, если через
бит TS (регистр ТIMx_SMCR) выбран вход внутреннего триггера.
Примечание: Биты CC2S доступны для записи только при вы­
ключенном канале (СС2Е = О в TIMx_CCER).
Бит 7 ОС1СЕ: Выходное сравнение 1 разрешено ОС1СЕ: Раз­
решение выходного сравнения 1
О: На OC1Ref не влияет вход ETRF
1: OC1Ref очищается, как только на входе ETRF обнаружива­
ется высокий уровень.
Биты
6:4 ОС1М: режим выходного сравнения 1 Эти биты
определяют поведение выходного опорного сигнала OC1REF,
на основе которого формируются ОС1 и OC1N. OC1REF является
активным высоким уровнем, а активный уровень ОС1 и OC1N
зависит от битов СС1Р и CC1NP. ООО: Frozen - Сравнение выход­
ного регистра сравнения Т1Мх_ССR1 со счетчиком TIMx_CNT
не оказывает влияния на выходы. (этот режим используется для
формирования базы синхронизации).
001: Установка канала 1 в активный уровень при совпаде­
нии. Сигнал OC1REF принудительно переводится в высокий уро­
вень, когда счетчик ТIMx_CNT совпадает с регистром захвата/
сравнения 1 (TIMx_CCR1). 010: Установка канала 1 в неактивный
уровень при совпадении. Сигнал
OC1REF принудительно пере­
водится в низкий уровень, когда счетчик ТIMx_CNT совпадает
с регистром захвата/сопоставления 1 (TIMx_CCR1).
011:
Toggle
TIMx - CNT=TIMx- CCR1.
OC1REF
315
переключается,
когда
100: Force inactive level - OC1REF принудительно переклю­
чается на низкий уровень. 101: Принудительный активный уро­
OC1REF принудительно переводится в высокий уровень.
110: Режим ШИМ 1 - При нарастающем счете канал 1 акти­
вен до тех пор, пока TIMx_CNT <TIMx_CCR1, иначе неактивен.
В режиме понижающего счета канал 1 неактивен (OC1REF=«0)
до тех пор, пока TIMx_CNT> TIMx_CCR1 иначе активен
(OC1REF=1).
111: Режим ШИМ 2 - При пересчете вверх канал 1 неакти­
вень -
вен до тех пор, пока ТIMx_CNTТIMx_CCR1, иначе неактивен.
Примечание: В режиме ШИМ 1 или 2 уровень OCREF изменя­
ется только при изменении результата сравнения или при пере­
ключении
режима сравнения
выходов из
режима «заморозки»
в режим «ШИМ».
Бит 3 ОС1РЕ: разрешение предварительной нагрузки выход­
ного сравнения 1
О: Регистр предварительной загрузки на
TIMx_CCR1 отклю­
чен. Запись в Т1Мх_ССR1 может производиться в любое время,
новое значение учитывается немедленно.
1: Регистр предварительной загрузки на Т1Мх_ССR1
вклю­
чен. Доступ к регистру предварительной нагрузки осуществляет­
ся операциями чтения/записи. Значение предварительной на­
грузки TIMx_CCR1 загружается в активный регистр при каждом
событии обновления.
Примечание:
1. Эти биты не могут быть изменены до тех пор, пока запро­
LOCK 3 (биты LOCK в регистре
уровень
граммирован
TIMx_BDTR) и СС15=00 (канал сконфигурирован в выход).
2: Режим ШИМ может быть использован без валидации ре­
гистра предварительной нагрузки только в одноимnульсном ре­
жиме (бит ОРМ установлен в регистре TIMx_CR1). В противном
случае поведение не гарантируется.
Бит
2 OC1FE: быстрое
разрешение выходного сравнения
1 Этот бит используется для ускорения влияния события на вхо­
де триггера на выход СС.
316
О: СС1 ведет себя нормально в зависимости от значений
счетчика и CCR1 даже при включенном триггере. Минимальная
задержка активации выхода СС1 при возникновении фронта им­
пульса на входе триггера составляет 5 тактов.
1: Активный фронт импульса на входе триггера действует
как совпадение сравнения на выходе СС1. Затем ОС устанавли­
вается на уровень сравнения независимо от результата сравне­
ния. Задержка на выборку входа триггера и активацию выхода
СС1 сокращается до 3 тактов. OCFE действует только в том слу­
чае, если канал сконфигурирован в режиме ШИМ1 или ШИМ2.
Биты 1:0 CC1S: Выбор захвата/сопоставления 1 Это битовое
поле определяет направление канала (вход/выход), а также ис­
пользуемый вход.
00: Канал СС1 сконфигурирован как выходной.
01: Канал СС1 сконфигурирован как входной, 1(1 отобража­
ется на Т11.
10: Канал СС1 сконфигурирован как входной, 1(1 отобража­
ется на Т12.
11: Канал СС1 сконфигурирован как входной, 1(1 сопостав­
лен с TRC. Этот режим работает только в том случае, если че­
рез бит TS (регистр TIMx_SMCR) выбран вход внутреннего триг­
гера.
Примечание: Биты CC1S доступны для записи только при вы­
ключенном канале (СС1Е = О в TIMx_CCER).
Режим захвата входного сигнала
Биты 15:12 IC2F: фильтр входного захвата 2
Биты 11:10 IC2PSC [1:0]: Входной прескалер захвата 2
Биты 9:8 CC2S: Выбор захвата/сопоставления 2
Это битовое поле определяет направление канала (вход/вы­
ход), а также используемый вход.
00: Канал СС2 сконфигурирован как выходной.
01: Канал СС2 сконфигурирован как входной, 1(2 отобража­
ется на Т12.
317
10: Канал СС2 сконфигурирован как входной, IC2 отобража­
ется на Т11.
11: Канал СС2 сконфигурирован как входной, IC2 сопостав­
лен с TRC. Этот режим работает только в том случае, если через
бит TS (регистр TIMx_SMCR) выбран вход внутреннего триггера.
Примечание: Биты СС25 доступны для записи только при вы­
ключенном канале (СС2Е = О в TIMx_CCER).
Биты 7:4 IC1F: фильтр входного захвата 1
Это битовое поле определяет частоту дискретизации входа
Т11 и длину цифрового фильтра, применяемого к Т11. Цифровой
фильтр представляет собой счетчик событий, в котором для под­
тверждения перехода на выходе необходимо N последователь­
ных событий:
0000: Фильтр отсутствует, выборка производится на fDTS
0001: fSAMPLING=fCK_INT, N=2
0010: fSAMPLING=fCK_INT, N=4
0011: fSAMPLING=fCK_INT, N=8
0100: fSAMPLING=fDTS/2, N=б
0101: fSAMPLING=fDTS/2, N=8
0110: fSAMPLING=fDTS/4, N=б
0111: fSAMPLING=fDTS/4, N=8
1000: fSAMPLING=fDTS/8, N=б
1001: fSAMPLING=fDTS/8, N=8
1010: fSAMPLING=fDTS/16, N=S
1011: fSAMPLING=fDTS/16, N=б
1100: fSAMPLING=fDTS/16, N=8
1101: fSAMPLING=fDTS/32, N=S
1110: fSAMPLING=fDTS/32, N=б
1111: fSAMPLING=fDTS/32, N=8
Биты 3:2 IC1PSC: прескалер входного захвата 1
Это битовое поле определяет коэффициент прескалера, дей­
ствующего на вход СС1 (IC1). Прескалер сбрасывается, как толь­
ко СС1Е=О (регистр TIMx_CCER).
00: прескалер отсутствует, захват производится каждый раз
при обнаружении фронта импульса на входе захвата
318
01: захват производится раз в 2 события
10: захват осуществляется раз в 4 события
11: захват осуществляется раз в 8 событий
Биты 1:0 CC1S: Выбор захвата/сопоставления 1
Это битовое поле определяет направление канала (вход/вы­
ход), а также используемый вход.
00: Канал СС1 сконфигурирован как выходной
01: Канал СС1 сконфигурирован как входной, IC1 отображен
на Т11;
10: Канал СС1 сконфигурирован как входной, IC1 отображен
на Т12;
11: Канал СС1 сконфигурирован как входной, IC1 сопостав­
лен с TRC. Этот режим работает только в том случае, если через
бит TS (регистр TIMx_SMCR) выбран вход внутреннего триггера.
Примечание: Биты CC1S доступны для записи только при вы­
ключенном канале (СС1Е = О в TIMx_CCER).
Реrистр
режима
TIMx
захвата/сопоставления
2 (Т1Мх_ССМR2)
Смещение адреса: Ох1С
См. приведенное выше описание регистра CCMR1.
Режим сравнения выходов
~,
15
"'
1◄
13
12
IC4F(3,QJ
1 rw
1 rw I
11
10
J ос.
ос•
РЕ
FE
ОС4М(2:ОJ
~1
CC4S(t:OJ
rw
rw
1 rw
ОСЗМ!~ОJ
ICЗF)З,OJ
IC4PSC(l:OJ
,w 1 ,w
rw
1 rw 1 "' 1 rw
осз
РЕ
I
осз
FE
ссэsс,,01
IC31'9ql,QJ
rw
1 1W
rw
I
м
Таблица 7.10 - Регистр режима захвата/сопос,авления TIMx
2 (Т1Мх_ССМR2)
319
Режим сравнения выходов
Бит 15 ОС4СЕ: Разрешение очистки выходного сравнения
4 Бит 14:12 ОС4М: Режим выходного сравнения 4.
Бит 11 ОС4РЕ: Разрешение преднагрузки выходного сравне­
ния 4 Бит 10 OC4FE: Разрешение быстрого выходного сравне­
ния 4
Биты 9:8 CC4S: Выбор захвата/сопоставления 4 Это битовое
поле определяет направление канала (вход/выход), а также ис­
пользуемый вход. 00:
Канал СС4 сконфигурирован как выходной 01:
Канал СС4 сконфигурирован как входной,
IC4 отображен
на Т1410:
Канал СС4 сконфигурирован как входной,
1(4 отображен
на Т13 11:
Канал СС4 сконфигурирован как входной,
IC4 сопоставлен
с TRC. Этот режим работает только в том случае, если через бит
TS (регистр TIMx_SMCR) выбран вход внутреннего триггера.
Примечание: Биты СС45 доступны для записи только при выключенном канале (СС4Е = О в TIMx_CCER).
Бит 7 ОС3СЕ: Разрешение очистки выходного сравнения 3
Биты 6:4 ОС3М: Режим выходного сравнения 3
Бит 3 ОС3РЕ: Разрешение преднагрузки выходного сравне­
ния 3
Биты 1:0 CC3S: Выбор захвата/сопоставления 3
Это битовое поле определяет направление канала (вход/вы­
ход), а также используемый вход.
00: Канал СС3 сконфигурирован как выходной
01: Канал СС3 сконфигурирован как входной, IC3 отображен
на Т13
10: Канал СС3 сконфигурирован как входной, IC3 отображен
на Т14
11: Канал СС3 сконфигурирован как входной, IC3 отобража­
ется на TRC. Этот режим работает только в том случае, если через
бит TS (регистр TIMx_SMCR) выбран вход внутреннего триггера.
320
Примечание: Биты СС35 доступны для записи только при вы­
ключенном канале (СС3Е = О в TIMx_CCER).
Режим захвата входного сигнала
Биты 15:12 IC4F: фильтр входного захвата 4
Биты 11:10 IC4PSC: входной прескалер захвата 4
Биты 9:8 CC4S: Выбор захвата/сопоставления 4
Это битовое поле определяет направление канала (вход/вы­
ход), а также используемый вход.
00: Канал СС4 сконфигурирован как выходной
01: Канал СС4 сконфигурирован как входной, 1(4 отображен
на Т14
10: Канал СС4 сконфигурирован как входной, 1(4 отображен
на Т13
11: Канал СС4 сконфигурирован как входной, IC4 сопостав­
лен с TRC. Этот режим работает только в том случае, если через
бит Т5 (регистр TIMx_5MCR) выбран вход внутреннего триггера.
Примечание: Биты СС45 доступны для записи только при вы-
ключенном канале (СС4Е = О в TIMx_CCER).
Биты 7:4 IC3F: фильтр входного захвата 3
Биты 3:2 IC3PSC: входной прескалер захвата 3
Биты 1:0 CC3S: Выбор захвата/сопоставления 3
Это битовое поле определяет направление канала (вход/вы­
ход), а также используемый вход.
00: Канал СС3 сконфигурирован как выходной
01: Канал СС3 сконфигурирован как входной, IC3 отображен
на Т13
10: Канал СС3 сконфигурирован как входной, IC3 отображен
на Т14
11: Канал СС3 сконфигурирован как входной, 1(3 сопостав­
лен с TRC. Этот режим работает только в том случае, если через
бит Т5 (регистр TIMx_5MCR) выбран вход внутреннего триггера.
Примечание: Биты СС35 доступны для записи только при вы­
ключенном канале (СС3Е = О в TIMx_CCER).
321
разрешения
Регистр
TIMx
захвата/сопоставления
(TIMx_CCER)
Смещение адреса: Ох20
14
15
13
12
СС4Р
СС4Е
11
Таблица 7.11 -
10
Reserved
ссзР
СС2Р
ссзе
СС2Е
СС1Р
i СС1Е
rw
! rw !
Re"""9<1
ReS&Ned
Регистр разрешения захвата/сопоставления
TIMx (ТIMx_CCER)
Биты
15:14
Зарезервированы,
должны
быть
сохранены
в значении сброса.
Бит 13 СС4Р: полярность выхода Capture/Compare 4 см. опи­
СС1Р Бит 12 СС4Е: разрешение выхода Capture/
Compare 4 смотрите описание СС1Е.
Бит 12 СС4Е: разрешение выхода
Capture/Compare 4 смотрите описание СС1Е
Биты 11:10 Зарезервированы, должны быть сохранены
сание
в значении сброса.
Бит 9 СС3Р: полярность выхода Capture/Compare 3 смотрите
описание СС1Р
Бит 8 СС3Е: разрешение выхода Capture/Compare 3 смотри­
те описание СС1Е
Биты 7:6 Зарезервированы, должны быть сохранены в зна­
чении сброса.
Бит
S СС2Р:
Полярность
выхода
захвата/сопоставления
2 смотрите описание СС1Р
Бит 4 СС2Е: разрешение выхода Capture/Compare 2 смотри­
те описание СС1Е
Биты 3:2 Зарезервированы, должны быть сохранены в зна­
чении сброса.
322
Бит 1 СС1Р: полярность выхода Capture/Compare 1
Канал СС1 сконфигурирован как выходной:
О: активный высокий уровень 0(1.
1: Активный низкий уровень ОС1.
Канал СС1 сконфигурирован как входной:
Этот бит выбирает, используется ли
IC1 или IC1 для опера­
ций триггера или захвата.
О: неинвертированный: захват осуществляется по нарастаю­
щему фронту сигнала IC1.
При использовании в качестве внешнего триггера 1(1 явля­
ется неинвертированным.
1: инвертированный: захват осуществляется по спадающему
IC1. При использовании в качестве внешнего
триггера 1(1 инвертируется.
Бит О СС1Е: разрешение выхода Capture/Compare 1
фронту сигнала
Канал СС1 сконфигурирован как выходной:
О: 0ff - ОС1 не активен.
1: Вкл -
сигнал ОС1 выводится на соответствующий выход­
ной вывод.
Канал СС1 сконфигурирован как входной:
Этот бит определяет, может ли быть произведен захват зна­
чения
счетчика
во
входной
1 (Т1Мх_ССR1) или нет.
О: Захват отключен.
1: Захват включен.
323
регистр
захвата/сравнения
ОСх output state
ССхЕЫt
о
Output DisaЫed (ОСх=О, OCx_EN=0)
1
OCx=OCxREF + Polarity, OCx_EN=1
Таблица 7.12 -
Бит управления выходом для стандартных кана­
лов ОСх
Примечание:
Состояние
внешних
выводов
ввода-вывода,
подключенных к стандартным каналам ОСх, зависит от состоя­
ния канала ОСх и регистров GPIO и AFIO.
Счетчик TIMx (TIMx_CNT)
Смещение адреса: Ох24
tS
14
13
12
1t
10
CNТ(15:0I
Таблица 7.13- Счетчик TIMx (TIMx_CNT)
Биты 15:0 CNT [15:0): Значение счетчика
Прескалер TIMx (TIMx_PSC)
324
14
15
13
12
11
10
Таблица 7.14- Прескалер ТIМх (TIMx_PSC)
Смещение адреса: Ох28
Биты 15:0 PSC [15:0]: Значение прескалера
CK_CNT равна fCK_PSC / (PSC
[15:0] +1). PSC содержит значение, загружаемое в активный ре­
Тактовая частота счетчика
гистр прескалера при каждом событии обновления (в том числе
при сбросе счетчика через бит UG регистра TIMx_EGR или через
контроллер триггера, если он сконфигурирован в «режиме сбро­
са»).
Регистр автоперезагрузки TIMx (TIMx_ARR)
Смещение адреса: Ох2С
15
14
13
12
Таблица 7.15 -
Биты
11
10
8
Регистр автоперезагрузки TIMx (ТIMx_ARR)
15:0 ARR [15:0]: Значение прескалера ARR -
ние, загружаемое в реальный регистр автозагрузки.
325
значе­
См. раздел 15.3.1: Более подробную информацию об обнов­
лении и поведении ARR см. в разделе: Тime-base unit. Счетчик
блокируется, пока значение автозагрузки равно нулю.
Регистр захвата/сопоставления TIMx 1 (TIMx_CCR1)
15
14
13
12
11
Таблица 7.16 -
10
Регистр захвата/сопоставления TIMx
1 (TIMx_CCR1)
Смещение адреса: Ох34
Биты 15:0 CCR1 [15:0]: Значение Capture/Compare 1
Если канал СС1 сконфиrурирован как выходной:
CCR1 - значение, загружаемое в регистр захвата/сопостав­
ления 1 (значение предварительной загрузки). Оно загружается
постоянно, если в регистре TIMx_CCMR1 (бит ОС1РЕ) не выбрана
функция предварительной загрузки. В противном случае значе­
ние предварительной загрузки копируется в активный регистр
захвата/сопоставления 1 при наступлении события обновления.
Активный
регистр захвата/сопоставления содержит значение,
которое будет сравниваться со счетчиком TIMx_CNT и сигнали­
зироваться на выходе ОС1.
Если канал СС1 сконфиrурирован как входной:
CCR1 -
это значение счетчика, переданное по последнему
событию захвата входа
1 (IC1). Регистр Т1Мх_ССR1 доступен
только для чтения и не может быть запрограммирован.
Регистр захвата/сопоставления TIMx 2 (T1Mx_CCR2)
326
Смещение адреса: Ох38
15
14
13
12
11
Таблица 7.17 -
7
8
10
Регистр захвата/сопоставления ТIМх
2 (Т1Мх_ССR2)
Биты 15:0 CCR2 [15:0]:
Значение захвата/сопоставления 2
Если канал СС2 сконфиrурирован как выходной:
CCR2 -
значение, загружаемое в регистр захвата/сравнения
2 (значение предварительной загрузки). Оно загружается посто­
янно, если в регистре Т1Мх_ССМR2 (бит ОС2РЕ) не выбрана
функция предварительной загрузки. В противном случае значе­
ние предварительной загрузки копируется в активный регистр
захвата/сопоставления 2 при наступлении события обновления.
Активный
регистр захвата/сопоставления
содержит значение,
которое будет сравниваться со счетчиком TIMx_CNT и сигнали­
зироваться на выходе ОС2.
Если канал СС2 сконфиrурирован как входной:
CCR2 -
это значение счетчика, переданное по последнему
событию захвата входа
2 (IC2).
Регистр
TIMx_CCR2
только для чтения и не может быть запрограммирован.
Регистр захвата/сопоставления TIMx 3 (Т1Мх_ССR3)
Смещение адреса: Ох3С
327
доступен
15
14
13
12
10
11
Таблица 7.18 -
Регистр захвата/сопоставления TIMx
3 (TIMx_CCR3)
Биты 1S:0 CCR3 [1S:0]: Значение захвата/сопоставления
Если канал СС3 сконфиrурирован как выходной:
CCR3 - значение, загружаемое в регистр захвата/сопостав­
ления 3 (значение предварительной загрузки). Оно загружается
постоянно, если в регистре TIMx_CCMR3 (бит ОС3РЕ) не выбрана
функция предварительной загрузки. В противном случае значе­
ние предварительной загрузки копируется в активный регистр
захвата/сопоставления 3 при наступлении события обновления.
Активный
регистр захвата/сопоставления содержит значение,
которое будет сравниваться со счетчиком TIMx_CNT и сигнали­
зироваться на выходе ОС3.
Если канал СС3 сконфиrурирован как входной:
CCR3 -
это значение счетчика, переданное по последнему
событию захвата
входа
3 (IC3).
Регистр
TIMx_CCR3
только для чтения и не может быть запрограммирован.
Регистр захвата/сопоставления TIMx 4 (T1Mx_CCR4)
Смещение адреса: Ох40
328
доступен
15
14
13
12
11
10
Таблица 7.19 - Регистр захвата/сопоставления TIMx
4 (Т1Мх_ССR4)
Биты 15:0 CCR4 [15:0): Значение захвата/сопоставления
1. если канал СС4 сконфигурирован как выходной (биты
CC4S): CCR4 -
это значение, загружаемое в регистр фактиче­
ского захвата/сопоставления
грузки).
Оно
загружается
4 (значение предварительной за­
постоянно,
если
в
регистре
TIMx_CCMR4 (бит ОС4РЕ) не выбрана функция предваритель­
ной загрузки. В противном случае значение предварительной
загрузки
копируется
в
активный
регистр
захвата/сравнения
4 при наступлении события обновления. Активный регистр за­
хвата/сопоставления содержит значение, которое будет срав­
ниваться со счетчиком TIMx_CNT и сигнализироваться на выхо­
де ОС4.
2. если канал СС4 сконфигурирован как входной (биты CC4S
в регистре TIMx_CCMR4): CCR4 -
это значение счетчика, пере­
данное по последнему событию захвата входа 4 (IC4). Регистр
TIMx_CCR4 доступен только для чтения и не может быть запро­
граммирован.
Регистр управления TIMx DMA (TIMx_DCR)
Смещение адреса: Ох48
329
15
14
13
12
11
10
DSЦ40J
1
Reaorved
Reaorvвd
Таблица 7.20 - Регистр управления ТIМх ОМА (ПМх_ОСR)
Биты
15:13
Зарезервированы,
должны
быть
сохранены
в значении сброса.
Биты 12:8 DBL (4:0]: Длина ОМА-партии Этот 5-битный век­
тор определяет количество ОМА-передач (таймер распознает
пакетную передачу, когда
по адресу ТIMx_OMAR происходит
чтение или запись).
00000: 1 передача,
00001: 2 перевода,
00010: 3 перевода,
10001: 18 переводов.
Биты 7:5 Зарезервированы, должны быть сохранены в зна­
чении сброса.
Биты 4:0 DBA (4:0]: Базовый адрес ОМА Этот 5-битный век­
тор определяет базовый адрес для ОМА-передач (когда доступ
на чтение/запись осуществляется через адрес ТIMx_OMAR). ОВА
определяется
как смещение,
начинающееся
с адреса
T1Mx_CR1.
Пример:
00000: TIMx_CR1,
00001: TIMx_CR2,
00010: ТIMx_SMCR,
Пример: Рассмотрим следующий трансфер:
OBL = 7 перечислений & ОВА = TIMx_CR1.
330
регистра
В этом случае передача осуществляется в/из
7 регистров,
начиная с адреса ТIMx_CRl.
Адрес TIMx DMA для полной передачи (TIMx_DMAR)
Смещение адреса: Ох4С
14
15
13
12
10
11
Таблица 7.21 - Адрес TIMx ОМА для полной передачи
(TIMx_OMAR)
Биты 15:0 DMAB [15:0): Регистр ОМА для пакетного досту­
па
операции
При
ществляется
(адрес
ТIMx_CRl)
TIMx_CRl адрес
ОМА,
или
чтения
к
доступ
+
записи
(ОВА
+
в
регистр
расположенному
регистру,
индекс
в
по
осу­
адресу
х 4 где адрес
1, ОВА - базовый
ОМА)
адрес регистра управления
сконфигурированный
OMAR
регистре
ТIMx_OCR,
ин­
декс ОМА автоматически управляется передачей ОМА и нахо­
дится
в
диапазоне
от
О
до
OBL (OBL
сконфигурирован
в TIMx_OCR).
Пример использования функции DMA burst
В данном примере для обновления содержимого регистров
CCRx (х = 2, 3, 4) используется функция таймера ОМА burst, при
этом ОМА передает в регистры CCRx полслова.
Это делается на следующих этапах:
331
1. Настройте соответствующий канал ОМА следующим образом:
- Периферийный адрес канала ОМА
- это адрес регистра OMAR - Адрес памяти канала ОМА
- это адрес буфера в оперативной памяти, содержащего
данные, которые должны быть переданы по ОМА в регистры
CCRx.
- Количество передаваемых данных = 3 (см. примечание
ниже).
- Круговой режим отключен.
2. (конфигурируйте регистр OCR, изменив битовые поля
ОВА и OBL следующим образом: OBL = 3 передачи, ОВА = ОхЕ.
3. Включите ОМА-запрос на обновление TIMx (установите
бит UOE в регистре OIER).
4. Включить TIMx
5. Включить канал ОМА
Примечание: Данный пример относится к случаю, когда каж­
дый регистр CCRx обновляется один раз. Если же каждый ре­
гистр CCRx будет обновляться, например, дважды, то количество
передаваемых данных должно быть равно 6. Рассмотрим при­
мер, когда в оперативной памяти имеется буфер, содержащий
данные1, данные2, данные 3, данные4, данныеS и данныеб. Дан­
ные передаются в регистры CCRx следующим образом: по пер­
вому ОМА-запросу обновления данные1 передаются в
CCR2,
данные2 - в CCR3, данные3 - в CCR4, а по второму ОМА-запро­
су обновления данные4 передаются в CCR2, данныеS и данныеб - в CCR4.
КАРТА РЕГИСТРОВ TIMX
332
в CCR3
cкo
(1:0J
пм._сR1
Re&flr'lled
о,оо
R1,-sвt value
TIMx_CR2
Riн.erved
>---
Rese1value
~ 11 ·01
и
ммs
i=
12:01
f---------------,--,--,---,-----;o
6
&~ § ~
~
t,
Rеsемк:1
1
a:i
О ~-o_l_o о _
i тs12 О/
TIMx_SMCR
Ох08
~cмsa:::tvi![? z
OJо о о о о о о о о-,
1
SМS[2:0J
ooooocz:ooo
r-- - i---·-rTIMx_DIER
о,ос
Reset volue
nмx_SR
0,с10
-
ReSfltvnl1 нt
TIMx_EGR
0,:14
ТIМх_ССМR1
a,mpa,e
°"""''
mode
Ux18
Resot votue
··-
w
u
8
ОС2М
12:01
~ ~ CC2S ~ ОС1М
8 8 11:01 8 l21JJ
о о о ! о о о о о о о о о о о о о
f - - - -+ - - - - - - - - - - - - - - - +-'--'--•
Т1Мх_ССМR1
lriput capture
mode
IC2F(3:0]
Reserved
:;~
CC2S
11 01
J1 :0J
ol о
f---+-"-•-"'-"-'_'ue--+- - - - - - - - - - - - - - - + - •+ •--'----o--'! -•+-o+--Т!Мх_ССМR2
w w
•-•••~••
Ох1С
о о о о о о jо о о
8 ~ 11:0} 8~ осзм
12:01
а.
Oulput
""""'""
mode
RosetVed
I.L
CC4S
• • Т. i.
и,_
Reset value
TtMx_CCMR2
lnput CIЦ)lure
mode
IC1F(3.0I
IC4F[3:0J
Reserved
~
(1 :0J
CC4S
(1 :01
IC3F(З; QJ
Resotvalue
Н] "'1
TIМx_CCER
""20
о
Таблица 7.22 -
Карта регистров TIMx
333
о
" w
u
u
u u
f--0
О
i
: l; 1
, : j":
,,
1
!
!
Offset
Reg ister
~:
1
TIMx_CNT
Ох24
RttSet vnlve
TIMx_PSC
Ох28
~
~ ~
~
о
·..
Ох2С
Rosctvt:11\Je
;
:
о
о
о
о
о
о
о
~оТо~оl о
....,..,
·-
о,:ю
~
.'
, '
" "
с
CNT{15:0J
о
Reset value
TIМ11_ARR
,
о
о
о
о
о
о·:,·,
о
о
о
о
PSC{15:0J
о
о
о
о
0 10
о
ARR(15:0]
1
1
, 1, 1 1 1 1 1 1 1 1 1 ' i ' 1 f
Reserved
TIMx_CCR1
CCR1(15·0j
Reserved
о,3'
>----
Т1Мх_ССR2
Ох38
Resвtwlue
TIM.11_CCRЗ
ОхЗС
•l•!•~•
Resetvalue
--·Resetvalue
T1Mx_CCR4
Ох~О
1 ..........
.,...
··-
. ..
·-
о
о
о
о
о
о
о
о
о
о
о
Resel value
Ох.С
Resetvalue
Таблица 7.22 -
oJoJ o ojoj oi
о
о
о
о
о
о
о
о
о !
1
1
-г.г-Т<Т•ГоГ•П~~
о ~. о I о__о ~~~~ о . о~о~ о ~о о о ~ ;
CCR3(15.0I
·~ - -~· •
1
CCR<\1~0I
·-
о о ~.'i"l_o~ 1 • ~ о ~ 1о _о ~ о ~
]
DВL(40j
Res,М>d
nмx_DMAR
о
CCR2(15:0]
._
TIMx._OCR
Ох48
о
о
-
о
о
о
о
DВА(4 Oj
о
о
о
о
oj
о
о
о
о
о
DМАВ(15:О]
1
' о
о
о
о
о
о
о
о
о
о
о
Карта регистров TIMx. Продолжение
ПРИМЕРЫ РАБОТЫ С TIMX
334
ПРОЕКТ ПО ЗАПУСКУ PWM НА ТАЙМЕРАХ TIM2
И TIM3 ДЛЯ ЗАПУСКА И РЕГУЛИРОВАНИЯ
ПОДСВЕТКИ ПЛАТЫ BLUE PILL, А ТАКЖЕ
РЕГУЛИРОВАНИЯ ЯРКОСТИ ДИСПЛЕЯ SТ7789V3
#incLude "stm32f10x.h"
#define SYSCLOCK 72000000U
#define TIM_EnablelT_UPDATE(ТIMx)
SET_BIT(ТIMx->DIER,
ТIM_DIER_UIE)
#define
TIM_EnableCounter(TIMx)
TI М_CR1_CEN)
#define TIM_DisableCounter(ТIMx)
SET_BIT(ТIMx->CR1,
CLEAR_BIT(ТIMx->CR1,
ТIM_CR1_CEN)
#define
TIM_CC_EnableChanneL(ТIMx,
SET_BIT(ТIMx->CCER, ChanneLs);
_Ю uint32_t tmpreg;
_ю uint32_t SysTick_CNT = О;
_IO uint8_t tim2_count = О;
_forceinLine void deLay LIO uint32_t tck)
{
whiLe (tck) {
tck - -;}
}
void deLay_ms (uint32_t ms)
{
MODIFY_REG(SysTick>VAL,SysTick_VAL_CURRENT_Msk,SYSCLOCK / 1000 - 1);
SysTick_CNT = ms;
whiLe(SysTick_CNT) {}
}
void SysTick_lnit (void)
335
ChanneLs)
{
MODIFY_REG (SysTick-> LOAD, SysTick_LOAD_RELOAD _Msk,
SYSCLOCK / 1000 - 1);
CLEAR_BIT(SysTick->VAL, SysTick_VAL_ CURRENT_Msk);
SysTick_CТRL_CLKSOURCE_Msk
SET_BIT(SysTick->CТRL,
SysTick_CТRL_ENABLE_Msk I SysTick_CТRL_TICКINT_Msk);
}
void SetRCC_CLockTo72 (void)
{
RCC-> CR 1= RCC_CR_HSEON;
whiLe (READ_BIT (RCC-> CR, RCC_CR_HSERDY == RESET)) {}
FLASH-> ACR &= -FLASH_ACR_PRFTBE;
FLASH-> ACR 1= FLASH_ACR_PRFTBE;
FLASH-> ACR &= -FLASH_ACR_LATENCY;
FLASH-> ACR 1= FLASH_ACR_LATENCY_2;
RCC-> CFGR &= -RCC_CFGR_HPRE;
RCC-> CFGR 1= RCC_CFGR_HPRE_DIV1;
RCC-> CFGR &= -RCC_CFGR_PPRE2;
RCC-> CFGR 1= RCC_CFGR_PPRE2_DIV1;
RCC-> CFGR &= -RCC_CFGR_PPRE1;
RCC-> CFGR 1= RCC_CFGR_PPRE1_DIV2;
RCC-> CFGR &= (uint32_t) ((uint32_t) - (RCC_CFGR_PLLSRC 1
RCC_CFGR_PLL.XТPRE I RCC_CFGR_PLLMULL));
RCC-> CFGR 1= (uint32_t) (RCC_CFGR_PLLSRC_HSE
RCC_CFGR_PLLMULL9);
RCC-> CR 1= RCC_CR_PLLON; // Включаем ФАПЧ (PLL)
whiLe
(READ_BIT
(RCC->
CR,
RCC_CR_PLLRDY)!=
(RCC_CR_PLLRDY)) {}
RCC-> CFGR &= -RCC_CFGR_SW;
RCC-> CFGR 1= RCC_CFGR_SW_PLL;
whiLe
(READ_BIT
(RCC->
CFGR,
RCC_CFGR_SWS)!=
RCC_CFGR_SWS_PLL) {}
}
336
static void TIM2_1nit (void)
{
uint32_t tmpcrl, tmpcr2, tmpccer, tmpccmr2;
SET_BIT(RCC->APB1ENR, RCC_APB1ENR_Т1 M2EN);
AFIO->MAPR 1= AFIO_MAPR_ТIM2_REMAP;
tmpcrl = READ_REG(ТIM2->CR1);
CLEAR_BIT(tmpcrl,
ТIM_CR1_DIR
TIM CR1 CMS
ТIM_CR1_CKD);
WRITE_REG(ТIM2->CR1, tmpcrl);
//Set the auto-reload value
WRITE_REG(ТIM2->ARR, 65535);
//Set the prescaler value
WRITE_REG(ТIM2->PSC, О);
//Generate an update event to reload the Prescaler
//and the repetition counter value (if applicaЫe) immediately
SET_BIT(ТIM2->EGR, TIM_EGR_UG);
//DisaЫe auto-reload
CLEAR_BIT(ТIM2->CR1, ТIM_CR1_ARPE);
//Set clock source internal
CLEAR_BIT(ТIM2->SMCR, TIM_SMCR_SMS I TIM_SMCR_ECE);
//СН3 AND СН4 ЕnаЫе Preload
SET_BIT(ТIM2->CCMR2,
TIM - CCMR2 - ОС4РЕ
ТIM_CCMR2_0C3PE);
//DisaЫe
the Channel 3 and 4: Reset the СС3Е and СС4Е
Bits
CLEAR_BIT(ТIM2->CCER, TIM_CCER_CC4E I TIM_CCER_CC3E);
//Get the ТIМ2 CCER register value
tmpccer = READ_REG(ТIM2->CCER);
//Get the ТIМ2 CR2 register value
tmpcr2 = READ_REG(ТIM2->CR2);
//Get the TIM2 CCMR2 register value
tmpccmr2 = READ_REG(ТIM2->CCMR2);
//Reset Capture/Compare selection Bits
CLEAR_BIT(tmpccmr2, TIM_CCMR2_CC4S I TIM_CCMR2_CC3S);
//Select the Output Compare Mode
337
ТIM_CCMR2_OC4M
MODIFY_REG(tmpccmr2,
ТIM_CCMR2_OC3M, \
TIM_CCMR2_OC4M_2 1TIM_CCMR2_OC4M_1 I \
TIM_CCMR2_OC3M_2 I TIM_CCMR2_OC3M_1);
//Set the Output Compare PoLarity
CLEAR_BIT(tmpccer, TIM_CCER_CC4P I ТIM_CCER_CC3P);
//Set the Output State
CLEAR_BIT(tmpccer, TIM_CCER_CC4E I TIM_CCER_CC3E);
//Write to TIM2 CR2
WRITE_REG(ТIM2->CR2, tmpcr2);
//Write to TIM2 CCMR2
WRITE_REG(ТIM2->CCMR2, tmpccmr2);
//Set the Capture Compare Registers vaLue
WRITE_REG(ТIM2->CCR3, О);
WRITE_REG(ТIM2->CCR4, О);
//Write to TIM2 CCER
WRITE_REG(ТIM2->CCER, tmpccer);
//ТIМ2 ОС Disable Fast
CLEAR_BIT
CCMR2,
TIM_CCMR2_OC4FE
(ТIМ2->
TIM_CCMR2_OC3FE);
//Disable Master Mode SeLection
CLEAR_BIT(ТIM2->CR2, TIM_CR2_MMS);
//Disable Master/SLave mode
CLEAR_BIT(ТIM2->SMCR, TIM_SMCR_MSM);
//Set GPIO
SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPBEN);
MODI FY_REG(GPIOB->CRH,
GPIO_CRH_CNF11_0
GPIO_CRH_CNF10_0
GPIO_CRH_MODE11_0
1
GPIO_CRH_MODE10_0,\
GPIO_CRH_CNF11_1
GPIO_CRH_CNF10_1
1
GPIO_CRH_MODE11_1 I GPIO_CRH_MODE10_1);
}
// ·------------------------------------------------------static void TIM3_1nit (void)
338
{
uint32_t tmpcr1, tmpcr2, tmpccer, tmpccmr1, tmpccmr2; //
определение переменных
SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);
tmpcr1 = READ_REG(ТIM3->CR1);
ТIM_CR1_CMS
CLEAR_BIT(tmpcr1,
TIM_CR1_DIR
Т1 М_ CR1_ CKD);
WRITE_REG(ТIM3->CR1, tmpcr1);
//Set the auto-reLoad value
WRITE_REG(ТIM3->ARR, 65535);
//Set the prescaler value
WRITE_REG(ТIM3->PSC, О);
//Generate an update event to reload the Prescaler
//and the repetition counter value (if appLicaЫe) immediately
SET_BIT(ТIM3->EGR, TIM_EGR_UG);
//DisaЫe auto-reload
CLEAR_BIT(ТIM3->CR1, TIM_CR1_ARPE);
//Set clock source internaL
CLEAR_BIT(TIM3->SMCR, TIM_SMCR_SMS I TIM_SMCR_ECE);
//СН1, СН2, СН3 AND СН4 ЕnаЫе Preload
SET_BIT(ТIM3->CCMR1,
ТIM_CCMR1_0C2PE
ТIM_CCMR1_0C1PE);
SET_BIT(ТIM3->CCMR2,
TIM_CCMR2_0C4PE
ТIM_CCMR2_0C3PE);
//DisaЫe
the ChanneL 1, 2, 3 and 4: Reset the СС3Е and
СС4Е Bits
CLEAR_BIT(ТIM3->CCER, ТIM_CCER_CC4E I ТIM_CCER_CC3E 1\
ТIM_CCER_CC2E I ТIM_CCER_CC1E);
//Get the TIM3 CCER register value
tmpccer = READ_REG(ТIM3->CCER);
//Get the TIM3 CR2 register value
tmpcr2 = READ_REG(ТIM3->CR2);
//Get the TIM3 CCMR1 register value
tmpccmr1 = READ_REG(ТIM3->CCMR1);
//Get the TIM3 CCMR2 register value
339
tmpccmr2 = READ_REG(ТIM3->CCMR2);
//Reset Capture/Compare selection Bits
CLEAR_BIT(tmpccmr1, TIM_CCMR1_CC2S I ТIM_CCMR1_CC1S);
CLEAR_BIT(tmpccmr2, TIM_CCMR2_CC4S I TIM_CCMR2_CC3S);
//Select the Output Compare Mode
Т1 М_ CCMR1_0C2M
MODIFY_REG(tmpccmr1,
TIM_CCMR1_0C1M, \
ТIM_CCMR1_0C2M_2 1ТIM_CCMR1_0C2M_1 I \
ТIM_CCMR1_0C1M_2 1 TIM_CCMR1_0C1M_1);
ТIM_CCMR2_0C4M
MODIFY_REG(tmpccmr2,
TIM_CCMR2_0C3M, \
ТIM_CCMR2_0C4M_2 1ТIM_CCMR2_0C4M_1 I \
ТIM_CCMR2_0C3M_2 1 TIM_CCMR2_0C3M_1);
//Set the Output Compare Polarity
ТIM_CCER_CC3P
CLEAR_BIT(tmpccer, ТIM_CCER_CC4P
ТIM_CCER_CC2P I ТIM_CCER_CC1P);
//Set the Output State
CLEAR_BIT(tmpccer, TIM_CCER_CC4E
ТIM_CCER_CC3E
ТIM_CCER_CC2E I ТIM_CCER_CC1E);
//Write to ТIМ2 CR2
WRITE_REG(ТIM3->CR2, tmpcr2);
//Write to TIM2 CCMR1
WRITE_REG(ТIM3->CCMR1, tmpccmr1);
//Write to TIM2 CCMR2
WRITE_REG(ТIM3->CCMR2, tmpccmr2);
//Set the Capture Compare Registers value
WRITE_REG(ТIM3->CCR1, О);
WRITE_REG(ТIM3->CCR2, О);
WRITE_REG(ТIM3->CCR3, О);
WRITE_REG(ТIM3->CCR4, О);
//Write to TIM2 CCER
WRITE_REG(ТIM3->CCER, tmpccer);
//ТIМ2 ОС DisaЫe Fast
ТIM_CCMR1_0C2FE
CLEAR_BIT(ТIM3->CCMR1,
ТIM_CCMR1_0C1FE );
340
CLEAR_BIT(ТIM3->CCMR2,
TIM_CCMR2_OC4FE
TIM_CCMR2_OC3FE );
//DisaЫe Master Mode Selection
CLEAR_BIT(ТIM3->CR2, TIM_CR2_MMS);
//DisaЫe Master/Slave mode
CLEAR_BIT(TIM3->SMCR, TIM_SMCR_MSM);
//Set GPIO
SET_BIT(RCC->APB2ENR,
RCC_APB2ENR_IOPBEN
RCC_APB2ENR_IOPAEN);
MODIFY_REG(GPIOA->CRL,
GPIO_CRL_CNF7_О
1
GPIO_CRL_CNF6_0 1 GPIO_CRL_MODE7_О I GPIO_CRL_MODE6_0,\
GPIO_CRL_CNF7 _1 1 GPIO_CRL_CNF6_1 1 GPIO_CRL_MODE7 _1 1
GPIO_CRL_MODE6_1);
MODIFY_REG(GPIOB->CRL,
GPIO_CRL_CNF1_0
GPIO_CRL_CNF0_0 I GPIO_CRL_MODE1_0 1 GPIO_CRL_MODE0_0,\
GPIO_CRL_CNF1_1 1 GPIO_CRL_CNF0_1 1 GPIO_CRL_MODE1_1 1
GPIO_CRL_MODE0_1);
}
int main (void)
{
uint32_t i;
SET_BIT(RCC->APB2ENR, RCC_APB2ENR_AFIOEN);
//Delay after an RCC peripheral clock enaЫing
delay(1);
//NOJТAG: JТAG-DP DisaЫed and SW-DP EnaЫed
CLEAR_B IT(AFI O->MAPR,AFIO_MAPR _SWJ _CFG);
SET_BIT(AFIO->MAPR, AFIO_MAPR_SWJ_CFG_JТAGDISABLE);
SetRCC_CLockTo720;
SysTick_lnit0;
TIM2_1nit0;
341
TIM_ CC_EnaЫeChannel(ТIM2,
Т1 М_ CCER_СС4Е
ТIM_CCER_CC3E);
ТIM3_Init0;
ТIM_CC_EnaЫeChannel(ТIM3, ТIM_CCER_CC3E );
TIM_EnaЫeCounter(ТIM2);
TIM_EnaЫeCounter(ТIM3);
while (1) {
for (i=0; i <393934; i++) {
if (i <65536) WRITE_REG (ТIМ2-> CCR3, i); //РВ10 -
подсветка
в углах платы
else if ((i> 65535) && (i <131072)) WRITE_REG (ТIМ2->
CCR3,131071-i);
else if ((i> 131071) && (i <196608)) WRITE_REG (ТIМ2->
CCR4,i-131072); //РВ11 - подсветка имени платы в центре
else if ((i> 196607) && (i <262144)) WRITE_REG (ТIМ2->
CCR4,262143-i);
else if ((i> 262143) && (i <327680)) WRITE_REG (ТIМ3->
CCR3,i-262144);//PB0 - подсветка дисплея ST7789V3
else if ((i> 327679) && (i <393216)) WRITE_REG (ТIМ3->
CCR3,393215-i);
delay (200);}}
}
void SysTick_HandLer (void)
{
if(SysTick_CNT > О)
SysТick_ CNT--;
}
Комментарий к коду:
В начале программы используют известные для нас блоки
кода для установки задержек. Далее две достаточных больших
342
функций с инициализацией работы таймеров
ствии с описанием текущей главы №7 -
2 и 3 в соответ­
переписывать что зна­
чит смысла нет, внимательно можно отследить по регистрам.
Основной алгоритм как обычно записан в теле бесконечно
оператора while. Здесь подробнее.
Подробный
по
комментарий
циклу
for,
установленному
в операторе while:
Этот цикл 'fог' генерирует 3 разных РWМ-сигнала с изменя­
(duty cycle) на трёх выводах микрокон­
троллера, используя таймеры TIM2 и ТIМ3. Вот как это работает:
ющейся скважностью
1. Общая логика
Цикл выполняет 393934 итераций, в каждой из которых:
- В зависимости от текущего значения Т обновляется ре­
гистр сравнения ('CCR') одного из таймеров.
- Добавляется задержка 'delay (200) ' для замедления из­
менения сигнала.
2. Разбивка на участки
Цикл делится на 6 фаз, каждая длиной **65536 итераций**
(всего 6 х 65536 = 393216 итераций):
Фаза 1: 'i = 0 ... 65535'
-
Канал: 'ТIМ2-> CCR3' (вывод РВ10).
Действие: Линейное увеличение скважности от О до 65535.
Эффект: Плавное нарастание РWМ-сигнала, т.е. увеличе-
ние яркости стоек платы в углах платы
Фаза 2: 'i = 65536 ... 131071'
- Канал: 'ТIМ2-> CCR3' (РВ10).
скважности
уменьшение
Линейное
- Действие:
ОТ 65535 ДО 0 ('131071 - i').
- Эффект: Плавное затухание РWМ-сигнала, т.е. уменьше­
ние яркости
343
Фаза 3: 'i = 131072 ... 196607'
- Канал: TIM2-> CCR4' (вывод РВ11).
- Действие:
Линейное
увеличение
скважности
от О до 65535 Ci - 131072') - подсветка имени платы в центре
Фаза 4: 'i = 196608 ... 262143'
- Канал: 'TIM2-> CCR4' (РВ11).
уменьшение
- Действие:
Линейное
от 65535 до О ('262143 - i').
скважности
Фаза 5: 'i = 262144... 327679'
- Канал: 'TIM3-> CCR3' (вывод РВО).
- Действие:
Линейное
увеличение
скважности
от О до 65535 ('i - 262144') - подсветка дисплея ST7789V3
#### **Фаза 6: 'i = 327680 ... 393215'**
- Канал: TIM3-> CCR3' (РВО).
- Действие:
Линейное
ОТ 65535 ДО 0 ('393215 - i').
уменьшение
скважности
3. Как это выглядит на практике?
- На выводах РВ10, РВ11 и РВО будут появляться 3 независимых РWМ-сигнала:
1. Сначала нарастает и спадает сигнал на РВ10.
2. Затем то же самое повторяется на РВ11.
3. Наконец, аналогичный процесс на РВО.
- Задержка 'delay(200)' замедляет изменение скважности,
делая эффект видимым.
4. Почему именно 65536?
- Значение 65536 - это максимальное число для 16-битно­
го таймера ('2л16').
-
Изменяя 'CCR' от О до 65535, мы покрываем весь диапа­
зон duty cycle (0%.. 100%).
344
5. Пример для одной фазы
Допустим, 'i = 50000' (фаза 1):
- Условие 'i <65536' верно.
- 'TIM2-> CCR3 = 50000' (PWM заполнение -76%).
- Сигнал на РВ10 будет высоким 76% времени.
При 'i = 70000' (фаза 2):
- Условие· (i> 65535) && (i <131072) • верно.
- TIM2-> CCR3 = 131071 - 70000 = 61071' (PWM -93%).
- Сигнал на РВ10 начинает спадать.
6. Где это может применяться?
- Плавное управление RGВ-светодиодом (3 канала PWM).
- Демонстрация работы таймеров.
- Тестирование РWМ-выходов.
- Там где необходимы независимые ШИМ-сигналы.
Важно!
1. Задержка 'deLay (200) • критична -
без неё изменения бу­
дут слишком быстрыми.
2. Частота PW* зависит от настроек таймеров (регистры
'ARR', 'PSC).
3. Для работы кода таймеры TIM2 и TIM3 должны быть
предварительно настроены в режиме PWM.
Этот код создаёт красивый эффект «бегущей волны» по трём
выводам, используя лишь таймеры и простую логику.
ПРОЕКТ ПО ПРИМЕНЕНИЮ И TIM2 ДЛЯ РАБОТЫ
ПРЕЦЕЗИОННОГО ДАТЧИК ТЕМПЕРАТУРЫ
NSТ1001
Для
правильной
работы
необходимо
замкнуть
джампер
с именем РВ14, а на более новых платах на этом же месте
но с маркировкой РВ5_1, собственно линия подключения к МК
345
это PBS. Джамперы на этих используемых линиях, согласно схе­
мы платы, отключить. Остальные джамперы на линии должны
быть отключены, т.к. могут вносить искажения в цифровое зна­
чение сигнала с датчика.
#incLude "stm32f10x.h"
#incLude <stdio.h>
#define SYSCLOCK 72000000U
_ю uint32_t tmpreg;
_ю uint32_t SysTick_CNT = О;
_Ю uint8_t tim2_count = О;
voLatiLe uint16_t puLse_count = О;// Счетчик импульсов в па­
кете
voLatiLe uint32_t Last_capture = О;// Последнее значение за­
хвата
voLatiLe uint32_t time_between_puLses = О; // Время между
импульсами
voLatiLe uint8_t packet_ready =О;// Флаг готовности пакета
voLatiLe uint8_t measurement_done = О; // Флаг завершения
измерения
_forceinLine void deLay LIO uint32_t tck)
{
whiLe (tck) {
tck -- ;}
}
void deLay_ms (uint32_t ms)
{
MODIFY_REG(SysTick>VAL,SysTick_VAL_CURRENT_Msk,SYSCLOCK / 1000 - 1);
SysTick_CNT = ms;
346
while(SysTick_ CNT) {}
}
void SysTick_lnit(void)
{
MODI FY_REG (SysTick-> LOAD, SysTick_LOAD_RELOAD _Msk,
SYSCLOCK / 1000 - 1);
CLEAR_BIT(SysТick->VAL, SysTick_VAL_CURRENT_Msk);
SET_BIT (SysTick-> CTRL, SysTick_CTRL_CLKSOURCE_Msk
SysTick_CTRL_ENABLE_Msk I SysTick_CTRL_TICKINT_Msk);
}
// Инициализация GPIO для PBS (ТIМ3_СН2)
void GPIO_lnit (void) {
RCC_APB2ENR_IOPBEN
1=
APB2ENR
RCC->
RCC_APB2ENR_IOPAEN I RCC_APB2ENR_AFIOEN; // Включаем так­
тирование GPIOB
AFIO->MAPR 1= AFIO_MAPR_ТIM3_REMAP;
// Настройка PBS как вход (ТIМ3_СН2)
GPIOB->CRL &= GPIO_CRL_MODES_0j/ Очищаем настройки
для PBS
GPIOB->CRL &= GPIO_CRL_MODE5_1;
GPIOB-> CRL 1= GPIO_CRL_CNFS_0;// PBS: вход с плавающим
состо-янием (CNF = 01, MODE = 00)
GPIOB->CRL &= GPIO_CRL_CNF5_1;
// USARП настройка: настройка вывода на передачу
AFIO->MAPR 1= AFIO_MAPR_USARП_REMAP;
// Настройка РВ7 (RX) как вход с подтяжкой
GPIOB->CRL &= -(GPIO_CRL_CNF7 1 GPIO_CRL_MODE7); //
Сброс битов
GPIOB-> CRL 1= GPIO_CRL_CNF7_О;// Вход с подтяжкой
GPIOB-> ODR 1= GPIO_ODR_ODR7; // Включение подтяжки
вверх
347
// Настройка РВб (ТХ) как альтернативная функция (pushpuLL)
GPIOB->CRL &= -(GPIO_CRL_CNFб I GPIO_CRL_MODEб); //
Сброс битов
GPIOB-> CRL 1= GPIO_CRL_CNF6_1 I GPIO_CRL_MODE6; // Аль­
терна-тивная функция, 50 МГц
// Настройка USARТ1 регистрами
RCC->APB2ENR 1= RCC_APB2ENR_USARТ1EN; // USARТ1
Clock ON
USARТ1->BRR = 0x1D4C; // Baudrate for 9600 and 72Mhz-RCC
USARТ1->
CR1 1= USART_CR1_UE I USART_CR1_ТE 1
USART_CR1_RE;
// USARТ1 ON, ТХ ON, RX ON
}
// Инициализация ТIМ3 для захвата импульсов на
кана-
ле СН2
void TIM3_1nit (void)
{
// Включение тактирования TIM3 и GPIOB
RCC-> APB1ENR 1= RCC_APB1ENR_TIM3EN;
RCC->
APB2ENR
RCC_APB2ENR_IOPBEN
1=
RCC_APB2ENR_AFIOEN;
// Настройка ремаппинга TIM3: TIM3_REMAP [1:0] = 10 (ча­
стичный ремаппинг)
AFIO-> MAPR &= -AFIO_MAPR_TIM3_REMAP; // Сброс битов
ремап-пинга
AFIO-> MAPR 1= AFIO_MAPR_TIM3_REMAP_1; // Установка ча­
стич-ного ремаппинга
// Настройка PBS как вход с плавающим состоянием
GPIOB->CRL &= -(GPIO_CRL_CNFS I GPIO_CRL_MODES);
GPIOB->CRL 1= GPIO_CRL_CNF5_1;
348
// Настройка фильтрации (8 тактов)
TIM3->CCMR1 &= - ТIM_CCMR1_1C2F; // Очистка битов IC2F
TIM3->CCMR11= (Ох5 « 12);//Установка IC2F = Ох5 (8 тактов)
// Настройка TIM3 для захвата по каналу 2
TIM3-> CCMR1 1= ТIM_CCMR1_CC25_0; // Канал СС2 сконфи­
гуриро-ван как входной, IC2 отображается на Т12
TIM3-> CCER 1= ТIM_CCER_CC2E; // Включение захвата на ка­
нале 2
TIM3-> DIER 1= TIM_DIER_CC21E; //Включение прерывания
по захвату канала 2
TIM3->CR1 1= TIM_CR1_CEN; // Включение таймера
// Настройка прерывания TIM3
NVIC_EnablelRQ(ТIM3_1RQn);
//_enable_irq О;
}
void TIM2_1nit (void)
{
// Включение тактирования TIM2
RCC->APB1ENR 1= RCC_APB1ENR_TIM2EN;
// Настройка TIM2
TIM2-> PSC = 7200 - 1; // Предделитель (72 МГц/ 7200 =
10 кГц)
TIM2-> ARR = 520 - 1; // Автоперезагрузка (10 кГц •
0.053 с= 530)
TIM2->DIER 1= ТIM_DIER_UIE; // Включение прерывания по
переполнению
TIM2->CR11= TIM_CR1_CEN; // Включение таймера
// Настройка прерывания TIM2
NVIC_EnablelRQ(ТIM2_1RQn);
}
349
// Вывод строки на USART2
void USART1_SendChar (char ch)
{
while (!(USARТ1->SR & USART_SR_ТХЕ));
USARТ1->DR = ch;
}
void USART1_SendString (char *str)
{
while (*str) {
USARТ1_SendChar (*str++);}
}
void TIM3_1RQHandLer 0
{
// Обработка захвата импульса
if (ТIM3->SR & TIM_SR_CC2IF) {
TIM3-> SR &= - TIM_SR_CC2IF; // Очистка флага
puLse_count++; // Увеличение счетчика импульсов}
}
// Обработчик прерывания TIM2 (завершение измерения)
void TIM2_1RQHandLer (void)
{
if (ТIM2->SR & TIM_SR_UIF) { // Проверка флага перепол­
нения
TIM2->SR &= - TIM_SR_UIF; // Очистка флага
measurement_done = 1; // Установка флага завершения из­
ме-рения
TIM2-> CR1 &= - TIM_CR1_CEN; // Остановка таймера TIM2}
}
// Вычисление значения Temp по формуле
fioat CaLcuLateTemp (uint32_t puLses)
{
350
return (putses * 0.0625f) - 50.062Sf;
}
int main (void)
{
SET_BIT(RCC->APB2ENR, RCC_APB2ENR_AFIOEN);
//Detay after ап RCC peripherat ctock enaьting
detay(1);
GPIO_lnitO;
SysTick_lnitO;
TIM3_1nitO; // Инициализация TIM3
TIM2_1nit0;
white (1) {
if (measurement_done) {
// Если измерение завершено
// Вычисление значения Temp
ftoat temp = CatcutateTemp (putse_count);
// Отправка значения Temp на USART2
char buffer[SO];
snprintf(buffer, sizeof(buffer), "Temp: %.2f C\r\n", temp);
USARТ1_Send5tring (buffer);
// Сброс счетчика и флага
putse_count = О;
measurement_done = О;
// Перезапуск TIM2 для нового измерения
TIM2->CNT = О;
TIM2-> CR1 1= TIM_CR1_CEN;}}
}
void SysTick_HandLer (void)
351
{
if(SysTick_CNT > О)
SysTick_CNT--;
}
Комментарий к проекту:
В программе используется два таймера, один таймер (ТIМ3)
осуществляет захват (режим Capture) и счет импульсов темпера­
туры пришедших с датчик NST01, а другой таймер (ТIМ2) опре­
деляет период в 53мС, в котором происходит захват и счет им­
пульсов. Значения температуры выводятся через USARТ1 МК.
Для постоянства в измерениях возможно понадобиться подстро­
ить значения периода измерения в 53мС, т.к. согласно докумен­
тации данное значение это типовое и есть диапазон отклонений
согласно таблице ниже:
Timing Characterlstics
SутЬо/
f.'m
Т,р
Ма\
Un1t
Single Frame Perlod
Ttt111ne
32
5D
70
ms
Conversion Period
Tcow
lб
24
35
ms
Communication Period
т
....
lб
26
35
ms
Sigle Pulse Period
т,
5
8
11
µs
Sigle Pulse Period logical High
Т,
4
б
8.3
µs
Sigle Pulse Period logical low
Т,
1.3
2
3
µs
Pa,oml lcrs
Digital Output Code
1
Digital Output Frequency
88
3201
125
189
KHz
Таблица 7.23 - Временные характеристики датчика NSТ1001
352
М2
1 s:400ms
:.. m•
42.~2:,
"
42.2836 ms
г
+ЗОmI
+40ma
+SOms
лт
10.399042 ms
Nt•lling
1.265 k
,_
1.264 k
fm;a
120.192 kHt.
122..549 kHz
f mt•n
121 .573 kHt.
T , 1d
30.989 ns
+20ms
. . . m,
'1в ё1
Nri1in9
Co111me11t hE>re
••
Рисунок 7.41 -
На рисунке
\!jJ
Временная диаграмма работы NSТ1001
7.41 подробно показана временная диаграмма
работы датчика температуры. В течении lОмС с небольшим бы­
ло получено
датчика
29
1265
импульсов, что соответствует температуре
градусов в комнате где я работал. Около
42
мс
до и после импульсов, это время работы датчика, т.е. преобразо­
вание температуры согласно таблице
7.23. Видно, что имеются
достаточно большие временные «ворота» у датчика. Рекомен­
дую использовать усреднение данных, хотя бы первых 10 значе­
ний, для большей точности, а лучше естественно больше значе­
ний обрабатывать.
ПРОЕКТ ПО ПРИМЕНЕНИЮ DMA И TIM2 ДЛЯ
РАБОТЫ PWM НА WS2812B
Данный проект состоит из нескольких файлов, поэтому сейчас рассмотрим листинг файла
main. с:
#include <stdint.h>
#include "stm32f10x.h"
#include "ws2812b.h"
#include «ws2812b_config. h»
353
#define WS2812B_OUTPUT_Pдx
1
//Какой вывод будем использовать для вывода на ленту
i
Значения Вывод STM32
О
РАО
1
2
3
РА1
РА2
РА3
*/
int main (void)
{
ws2812b_initQ;
while(1)
{
for (uint8_t i=0; i <WS2812B_NUM_LEDS; i++) //перебор для
каждого из хх светодиодов {
ws2812b_set (i, 255, 255, 255); //вывод белого свечения}
ws2812b_send Q;}
}
Комментарий к проекту:
Выбран вывод РА1 для работы и именно на него нужно под­
ключить
комплектную
перемычку
DuPont
и
вторым
концом
на DIN1.
Рассмотрим листинг файла конфигурации ws2812b_config. h:
#ifndef _WS2812B_CONF_H_
#define _WS2812B_CONF_Н_
#incLude <stdint. h>
#define WS2812B_NUM_LEDS 36 //Количество светодиодов
в плате
//Период следования бит в тиках таймера, должно быть око­
ло 1.25мкс
#define WS2812B_TIMER_AAR
354
Ох005А
//Передача логического нуля около О.4мкс
(WS2812B_ТIMER_AAR / 3)
#define WS2812B_0_VAL
//Передача логической единицы около О.85мкс
((WS2812B_ТIMER_AAR / 3) * 2)
#define WS2812B_1_VAL
//Сигнал RESET(RET), должен быть более 50мкс
#define WS2812B_TIMER_RET
(WS2812B_ТIMER_AAR * 45)
//Раскомментировать, если нужно nроинвертировать выход­
ной сигнал
// #define WS2812B_OUTPUT_INVERSE
#endif
Рассмотрим листинг файла ws2812b. h:
#ifndef _WS2812B_H_
#define _WS2812B_H
#include <stdint.h>
//Инициализация настроек RGВ-светодиода ws2812b
void ws2812b_init(void);
//Очистить буфер для светиков; Устанавливает всем светоди­
одам значения в О;
//R=0, G=0, В=О;
void ws2812b_buff_clear(void);
//Установить
RGВ-светодиода
номер
PINx=0 ..WS2812B_NUM_LEDS-1
//г=О .. 255, g=0 .. 255, Ь=О .. 255
//Возвращаемые значения
// О - выполнено успешно
// 1 - неверное значение PINx
int ws2812b_set(int pixn, uint8_t г, uint8_t g, uint8_t Ь);
355
pixn,
//Загрузить подготовленный буфрер в ленту.
//Возвращает 1 если предыдущая операция обмена данны­
ми еще не завершена
int ws2812b_send(void);
//Возвращает 1 если предыдущая операция обмена данными с светодиодной лентой
//завершена успешно
int ws2812b_is_ready(void);
#endif
Рассмотрим листинг файла ws2812b. с:
#if (WS2812B_OUTPUT_PAx==0)
#eLif (WS2812B_OUTPUT_PAx==1)
#define GPIO_CRL_CNFx
#define GPIO_CRL_CNFx_1
#define GPIO_CRL_MODEx_1
#define GPIO_CRL_MODEx_0
#define ТIM_CCER_CCxE
#define ТIM_CCER_CCxP
GPIO_CRL_CNF1
GPIO_CRL_CNF1_1
GPIO_CRL_MODE1_1
GPIO_CRL_MODE1_0
ТIM_CCER_CC2E
TIM_CCER_CC2P
#define CCMRx CCMR1
#define ТIM_CCMRy_OCxM TIM_CCMR1_OC2M
#define TIM_CCMRy_OCxM_2 ТIM_CCMR1_OC2M_2
#define ТIM_CCMRy_OCxM_1 ТIM_CCMR1_OC2M_1
#define TIM_CCMRy_OCxPE TIM_CCMR1_OC2PE
#define TIM_DIER_CCxDE TIM_DIER_CC2DE
#define CCRx CCR2
#define DMA1_Channetx DMA1_Channet7
#define DMA1_Channetx_lRQn DMA1_Channet7_IRQn
#define
DMA1_Channetx_lRQHandter
DMA1_Channet7 _IRQHandter
356
#define DMA_CCRx_EN DMA_CCR7 _EN
#define DMA_CCRx_TCIE DMA_CCR7 _TCIE
#define DMA_IFCR_CTEIFx DMA_IFCR_GEIF7
#define DMA_IFCR_CHTIFx DMA_IFCR_CHTIF7
#define DMA_IFCR_CTCIFx DMA_IFCR_GCIF7
#define DMA_IFCR_CGIFx DMA_IFCR_CGIF7
/Расчитываем длину буфера
#define DATA_LEN ((WS2812B_NUM_LEDS • 24) + 2) //Для МК
BluePill хватит ОЗУ только на около 830 светодиодов 2812
static uint8_t Led_array[DATA_LEN];
static int tlag_rdy = О;
static void bus_retcode (void);
void ws2812b_init (void)
{
tlag_rdy = О;
//Разрешаем такирование nереферии
RCC-> APB2ENR 1= RCC_APB2ENR_IOPAEN; //Включаем такти­
рование порта GPIOA
RCC->APB1ENR 1= RCC_APB1ENR_TIM2EN; //таймера TIM2
RCC->AHBENR 1= RCC_AHBENR_DMA1EN; //и DMA1
1••••••••• Настраиваем Рд1 •••••••••;
//РА1 freq=10Mhz, AF output Push-pull
GPIOA->CRL &= -(GPIO_CRL_CNFx);
GPIOA->CRL 1= GPIO_CRL_CNFx_1
GPIO_CRL_MODEx_0;
GPIO_CRL_MODEx_1
r•••••••• Настойка таймера TIM2 •••••••••;
//Разрешаем таймеру управлять выводом Рд1
TIM2->CCER 1= TIM_CCER_CCxE;
357
//Разрешаем
#ifdef WS2812B_OUTPUT_INVERSE
TIM2->CCER 1= ТIM_CCER_CCxP; //Вывод инверсный
#eLse
TIM2->CCER &=-(ТIМ_ССЕR_ССхР);//Вывод не инверсный
#endif
TIM2-> CCMRx &= - (TIM_CCMRy_OCxM); //сбрасываем все
биты ОСхМ
//устанавливаем выход в неактивное состояние
TIM2->CCMRx 1= ТIM_CCMRy_OCxM_2;
TIM2->CCMRx &= ~(ТIM_CCMRy_OCxM_2);
TIM2-> CCMRx 1= ТIM_CCMRy_OCxM_2 1TIM_CCMRy_OCxM_1 1
TIM_CCMRy_OCxPE; //режим ШИМ-а
TIM2-> CR1 1= TIM_CR1_ARPE; //Регистры таймера с буфери­
зацией
TIM2->DIER 1= TIM_DIER_CCxDE; //Разрешить запрос DMA
//Настраиваем канал DMA
DMA1_ChanneLx->CPAR = (uint32_t)(& TIM2->CCRx); //Куда пи­
шем
DMA1_ChanneLx->CMAR = (uint32_t)(Led_array); //откуда берем
DMA1_ChanneLx-> CCR = DMA_CCR7 _PSIZE_0 //регистр пере­
ферии 16 бит
1DMA_CCR7 _MINC //режим инкремента указателя памяти
1DMA_CCR7 _DIR; //направление передачи из памяти в пери­
ферию
//Разрешаем обработку прерываний
NVIC_EnablelRQ (ТIM2_1RQn); //от таймера
NVIC_EnablelRQ (DMA1_ChanneLx_lRQn); //от DMA
ws2812b_buff_cLearQ;
358
bus_retcodeQ; //сбрасываем шину
}
void ws2812b_buff_cLear (void)
{
int i;
for(i = 0;i<WS2812B_NUM_LEDS-2; i++)
Led_array(i] = WS2812B_0_VAL;
Led_array[DATA_LEN-2] = О;
Led_array[DATA_LEN-1] = О;
}
int ws2812b_set (int pixn, uint8_t r, uint8_t g, uint8_t Ь)
{
int offset = pixn*24;
int i;
uint8_t tmp;
if(pixn > (WS2812B_NUM_LEDS - 1))
return 1;
//Зеленый цвет
tmp = g;
for (i=0; i <8; i++) {
if(tmp & Ох80)
Led_array(offset + i] = WS2812B_1_VAL;
else
Led_array(offset + i] = WS2812B_0_VAL;
tmp «=1;}
//Красный цвет
tmp = r;
for (i=0; i <8; i++) {
if(tmp & Ох80)
359
led_array[offset + i + 8] = WS2812B_l_VAL;
else
led_array[offset + i + 8] = WS2812B_0_VAL;
tmp «=1;}
//Синий цвет
tmp = Ь;
for (i=0; i <8; i++) {
if(tmp & Ох80)
led_array[offset + i + 16] = WS2812B_l_VAL;
else
led_array[offset + i + 16] = WS2812B_0_VAL;
tmp «=1;}
return О;
}
int ws2812b_send (void)
{
if(flag_rdy) //Если сейчас ни чего не передается
{
//Устанавливаем флаг занятости интерфейса
flag_rdy = О;
//Настраиваем передачу данных
DMAl_Channelx-> CCR &= - (DMA_CCR7 _EN); //Отключаем
канал DMA
DMAl_Channelx-> CNDTR = sizeof (led_array); //Устанавлива­
ем коли-чество данных
//Таймер будет считать до WS2812B_TIMER_AAR, и
//при данной частоте тактирования таймера
//получается период ШИМ-сигнала, равный 1.25мкс
TIM2->ARR = WS2812B_TIMER_AAR;
TIM2->CCRx = ОхОООО; //Устанавливаем ШИМ-регистр тайме360
ра в ноль
TIM2->CNT = О; //Очищаем счетный регистр
TIM2->CR11= TIM_CR1_CEN; //Запускаем таймер
//Так как значение ШИМ установили в ноль, то на шине бу­
дет установлен неактивный уровень до момента запуска DMA
DMA1->IFCR = DMA_IFCR_CTEIFx I DMA_IFCR_CHTIFx
1 DMA_IFCR_CТCIFx I DMA_IFCR_CGIFx; //Очищаем все флаги
прерываний DMA
DMA1_Channelx-> CCR 1= DMA_CCRx_TCIE; //прерывание за­
вершения передачи
//Включаем
канал
тем
DMA,
самым
начинаем
передачу
данных
DMA1_Channelx-> CCR 1= DMA_CCRx_EN;
return О;}
else {
return 1;}
}
int ws2812b_is_ready (void)
{
return flag_rdy;
}
static void bus_retcode (void)
{
TIM2->CR1 &= -(ТIM_CR1_CEN); //останавливаем таймер
TIM2->ARR = WS2812B_ТIMER_RET; //Устанавливаем период
немного больше SОмкс
ТIM2->CNT = О; //Очищаем счетный регистр
TIM2->CCRx = ОхОООО; //значение ШИМ-а ноль
TIM2->SR &= -(ТIM_SR_UIF); //сбрасываем флаг прерывания
TIM2->DIER 1= TIM_DIER_UIE; //прерывание по обновлению
361
TIM2->CR11= TIM_CR1_CEN; //Начинаем считать.
}
//Прерывание от ОМА
//Сюда заходим после завершения передачи данных
void DMA1_ChanneLx_lRQHandLer (void)
{
OMA1_Channetx-> CCR &= - (OMA_CCRx_EN); //Отключаем
канал ОМА
IFCR = OMA_IFCR_CТEIFx I OMA_IFCR_CHTIFx 1
OMA_IFCR_CTCIFx I OMA_IFCR_CGIFx;
ОМА1->
//Сбрасываем все флаги прерываний. Так как последние
2 элемента массива равны нулю, то сейчас предпоследнее зна­
чение уже загружено в теневой регистр сравнения и на шине
установлено неактивное состояние. Задача заключается в удер­
жании шины в этом состоянии в течение SОмкс или более перед
установкой флага готовности интерфейса.
bus_retcodeO;
}
//прерывание от таймера
//Сюда попадаем после завершения формирования сигнала
RET шины ws2812b
void TIM2_1RQHandLer (void)
{
TIM2->SR = О; //Сбрасываем все флаги прерываний
//Мы завершили формирование сигнала RET на шине и те­
перь можно
сделать все завершающие операции
и установить
флаг готовности интерфейса к следующей передаче данных.
TIM2-> CR1 &= - (ТIM_CR1_CEN); //останавливаем таймер
TIM2-> OIER &= - (ТIM_OIER_UIE); //запрещаем прерывание
таймера
flag_rdy = 1;
362
}
Комментарий к коду видео:
Предлагаю посмотреть своё видео по данной программе,
так как код программы довольно большой. Имя видео:
STMJ2. CMS/S #12. ПрактическаR настройка Т/М2 и ОМА длR
PWM WS28128. Практика
Его можно найти как на моем канале на YouTube, так
и на Rutube или VK Видео.
ПРОЕКТ ПО ПРИМЕНЕНИЮ TIM2 ДЛЯ РАБОТЫ
С СЕМИСЕГМЕНТНЫМ ИНДИКАТОРОМ
Для правильной работы необходимо замкнуть все джампе­
ры под семисегментным индикатором и обратить внимание что­
бы по этим цепям в остальных местах джамперы были сняты со­
гласно схемы платы BLue Кit.
#incLude "stm32f10x.h"
uint8_t tim2_count = О;
uint8_t n_count=0;
void segchar (uint8_t seg);
void Ledprint(uint16_t number);
uint8_t R1=0,R2=0,R3=0,R4=0;
uint16_t i,num_gL = О;
void segchar (uint8_t seg);
#define SYSCLOCK 72000000U
#define TIM_EnaьtelT_UPDATE (ТIМх) TIMx-> DIER 1=
TIM_DIER_UIE
#define TIM_EnaьteCounter (ТIМх) TIMx->
CR1
1=
TIM_CR1_CEN
#define TIM_DisaьteCounter (ТIМх) TIMx-> CR1 &=TIM_CR1_CEN
363
// Макросы для удобства работы с выводами
#define SEG1_PIN_RESET GPIOB->ODR 1= (1 « 5) // РВ5
#define SEG1_PIN_SET GPIOB->ODR &= -(1 « 5) // РВ5
#define SEG2_PIN_RESET GPIOB->ODR 1= (1 « 4) // РВ4
#define SEG2_PIN_SET GPIOB->ODR &= -(1 « 4) // РВ4
#define SEG3_PIN_RESET GPIOA->ODR 1= (1 « 15) // РА15
#define SEG3_PIN_SET
GPIOA->ODR &= -(1 « 15) // РА15
#define SEG4_PIN_RESET GPIOA->ODR 1= (1 « 12) // РА12
#define SEG4_PIN_SET
GPIOA->ODR &= -(1 « 12) // РА12
#define SA_SET GPIOB->ODR 1= (1 « 12) // РВ12
#define SA_RESET GPIOB->ODR &= -(1 « 12) // РВ12
#define SB_SET GPIOB->ODR 1= (1 « 13) // РВ13
#define SB_RESET GPIOB->ODR &= - (1 « 13)// РВ13
#define SC_SET GPIOB->ODR 1= (1 « 14) // РВ14
#define SC_RESET GPIOB->ODR &= - (1 « 14)// РВ14
#define SD_SET GPIOB->ODR 1= (1 « 15) // РВ15
#define SD_RESET GPIOB->ODR &= -(1 « 15) // РВ15
#define SE_SET GPIOA->ODR 1= (1 « 8) // РА8
#define SE_RESET GPIOA->ODR &= - (1 « 8) // РА8
#define SF_SET GPIOA->ODR 1= (1 « 9) // РА9
#define SF_RESET GPIOA->ODR &= -(1 « 9) // РА9
#define SG_SET GPIOA->ODR 1= (1 « 10) // РА10
#define SG_RESET GPIOA->ODR &= -(1 « 10) // РВ10
#define SDP_SET GPIOA->ODR 1= (1 « 11) // РА11
364
#define SDP_RESET GPIOA->ODR &= - (1 « 11)// РВ11
uint32_t SysТick_CNT = О;
void deLay LIO uint32_t tck)
{
while (tck) {
tck - -;}
}
void deLay_ms (uint32_t ms)
{
MODIFY_REG (SysTick-> VAL, SysTick_VAL_CURRENT_Msk,
SYSCLOCK/ 1000 - 1);
SysTick_CNT = ms;
while (SysTick_CNT) {}}
void RCC_Delnit (void) {
RCC->CR 1= RCC_CR_HSION;
while(READ_BIT(RCC->CR, RCC_CR_HSIRDY == RESET)) {}
MODIFY_REG(RCC->CR, RCC_CR_HSITRIM, 0x80U);
CLEAR_REG(RCC->CFGR);
while (READ_BIT(RCC->CFGR, RCC_CFGR_SWS) != RESET) {}
RCC->CR &=- RCC_CR_PLLON;
while (READ_BIT(RCC->CR, RCC_CR_PLLRDY) != RESET) {}
RCC->CR &=- (RCC_CR_HSEON I RCC_CR_CSSON);
while (READ_BIT(RCC->CR, RCC_CR_HSERDY) != RESET) {}
RCC->CR &=- RCC_CR_HSEBYP;
//Reset all CSR flags
RCC->CSR 1= RCC_CSR_RMVF;
}
void SetSysCLockTo72 (void)
{
RCC-> CR 1= RCC_CR_HSEON;
while (READ_BIT (RCC-> CR, RCC_CR_HSERDY == RESET)) {}
365
FLASH-> ACR &= ~FLASH_ACR_PRFTBE;
FLASH-> ACR 1= FLASH_ACR_PRFTBE;
FLASH-> ACR &= -FLASH_ACR_LATENCY;
FLASH-> ACR 1= FLASH_ACR_LATENCY_2;
RCC-> CFGR &= ~RCC_CFGR_HPRE;
RCC-> CFGR 1= RCC_CFGR_HPRE_DIV1;
RCC-> CFGR &= -RCC_CFGR_PPRE2;
RCC-> CFGR 1= RCC_CFGR_PPRE2_DIV1;
RCC-> CFGR &= -RCC_CFGR_PPRE1;
RCC-> CFGR 1= RCC_CFGR_PPRE1_DIV2;
RCC-> CFGR &= (uint32_t) ((uint32_t) - (RCC_CFGR_PLLSRC 1
RCC_CFGR_PLLXTPRE I RCC_CFGR_PLLMULL));
RCC-> CFGR 1= (uint32_t) (RCC_CFGR_PLLSRC_HSE
RCC_CFGR_PLLMULL9);
RCC-> CR 1= RCC_CR_PLLON; // Включаем ФАПЧ {PLL)
while
(READ_BIT
(RCC->
CR,
RCC_CR_PLLRDY)!=
(RCC_CR_PLLRDY)) {}
RCC-> CFGR &= ~RCC_CFGR_SW;
RCC-> CFGR 1= RCC_CFGR_SW_PLL;
while
(READ_BIT
(RCC->
CFGR,
RCC_CFGR_SWS)!=
RCC_CFGR_SWS_PLL) {}
}
// Инициализация GPIO
void GPIO_lnit (void)
{
// Включаем тактирование портов GPIOA и GPIOB
RCC->APB2ENR
1=
RCC_APB2ENR_IOPAEN
RCC_APB2ENR_IOPBEN IRCC_APB2ENR_AFIOEN;
// Настройка выводов Seg1-Seg4 как выходы
GPIOA-> CRH &= - (GPIO_CRH_CNF12 1 GPIO_CRH_MODE12 1
GPIO_CRH_CNF15 1GPIO_CRH_MODE15);
GPIOA->
CRH
1=
(GPIO_CRH_MODE12_1
GPIO_CRH_MODE15_1);
366
CRH
GPIOA->
GPIO_CRH_MODE15_0);
(GPIO _CRH_MODE12_0
&=
GPIOB-> CRL &= - (GPIO_CRL_CNF4 1 GPIO_CRL_MODE4 1
GPIO_CRL_CNFS I GPIO_CRL_MODES);
GPIOB-> CRL 1= (GPIO_CRL_MODE4_1 1 GPIO_CRL_MODE5_1);
1
(GPIO_CRL_MODE4_0
&=
CRL
GPIOB->
GPIO_CRL_MODES_0);
// Настройка выводов сегментов A-G и DP как выходы
GPIOB-> CRH &= - (GPIO_CRH_CNF12 1 GPIO_CRH_MODE12 1
GPIO_CRH_CNF13 1 GPIO_CRH_MODE13 1 GPIO_CRH_CNF14 1
GPIO_CRH_MODE14 I GPIO_CRH_CNF15 1 GPIO_CRH_MODE15);
(GPIO_CRH_MODE12_0
1=
CRH
GPIOB->
GPIO_CRH_MODE14_0
1
GPIO_CRH_MODE13_0
GPIO_CRH_MODE15_0);
GPIOA-> CRH &= - (GPIO_CRH_CNF8 1 GPIO_CRH_MODE8 1
GPIO_CRH_CNF9 1 GPIO_CRH_MODE9 1 GPIO_CRH_CNF10 1
GPIO_CRH_MODE10 1 GPIO_CRH_CNF11 I GPIO_CRH_MODE11);
GPIOA-> CRH 1= (GPIO_CRH_MODE8_0 1 GPIO_CRH_MODE9_0 1
GPIO_CRH_MODE10_0 1 GPIO_CRH_MODE11_0);
//NOJТAG: JТAG-DP DisaЫed and SW-DP EnaЫed
CLEAR_BIT(AFIO->MAPR,AFIO_MAPR_SWJ _CFG);
SET_BIT(AFIO->MAPR, AFIO _MAPR_SWJ_ CFG_JТAGDISABLE);
}
void segchar (uint8_t seg)
{
switch (seg) {
case 1:
SA_RESET;SB _SET;SC_SET;SD _RESET;SE_RESET;SF_RESET;SG_RESE
т·
'
break;
367
case 2:
SA_SET;SB_SET;SC_RESET;SD_SET;SE_SET;SF_RESET;SG_SET;
break;
case 3:
SA_SET;SB _SET;SC_SET;SD_SET;SE_RESET;SF_RESET;SG_SET;
break;
case 4:
SA_RESET ;SB_SET ;SC_SET;SD_RESET ;SE_RESET;SF_SET ;SG_SET;
break;
case 5:
SA_SET;SB_RESET;SC_SET;SD_SET;SE_RESET;SF_SET;SG_SET;
break;
case 6:
SA_SET;SB_RESET;SC_SET;SD _SET;SE_SET;SF_SET;SG_SET;
break;
case 7:
SA_SET;SB _SET;SC_SET;SD_RESET;SE_RESET;SF_RESET;SG_RESET;
break;
case 8:
SA_SET ;SB_SET ;SC_SET ;SD_SET ;SE_SET;SF_SET ;SG_SET;
break;
case 9:
SA_SET;SB_SET;SC_SET;SD_SET;SE_RESET;SF_SET;SG_SET;
break;
case О:
SA_SET;SB_SET;SC_SET;SD_SET;SE_SET;SF_SET;SG_RESET;
break;}
}
void Ledprint (uint16_t number)
{
num_gt=number;
R1 = number%10;
R2 = number%100/10;
R3 = number%1000/100;
368
R4 = number/1000;
}
void SysTick_lnit (void)
{
MODIFY_REG(SysTick>LOAD,SysTick_LOAD_RELOAD_Msk,SYSCLOCK / 1000 - 1);
SysTick->VAL &=- SysTick_VAL_CURRENT_Msk;
SET_BIT(SysTick->CTRL,
SysTick_CTRL_CLKSOURCE_Msk
SysTick_CTRL_ENABLE_Msk I SysTick_CTRL_TICКINT_Msk);
}
void TIM2_1nit (void)
{
RCC->APB1ENR 1= RCC_APB1ENR_TIM2EN;
NVIC_EnaЫelRQ(ТIM2_1RQn);
TIM2->PSC = 3599;
TIM2->ARR = 50;
}
void SysTick_HandLer (void)
{
if(SysTick_CNT > О) SysTick_CNT--;
}
void TIM2_1RQHandLer (void)
{
if (READ_BIT (ТIМ2-> SR, TIM_SR_UIF)) {
TIM2->SR &=- TIM_SR_UIF;
if (tim2_count==0) {
SEG1_PIN_SET;
SEG2_PIN_RESET;
SEG3_PIN_RESET;
SEG4_PIN_RESET;
369
segchar (R1);}
if (tim2_count==1) {
SEG1_PIN_RESET;
SEG2_PIN_SET;
SEG3_PIN_RESET;
SEG4_PIN_RESET;
segchar (R2);}
if (tim2_count==2) {
SEG1_PIN_RESET;
SEG2_PIN_RESET;
SEG3_PIN_SET;
SEG4_PIN_RESET;
segchar (R3);}
if (tim2_count==3) {
SEG1_PIN_RESET;
SEG2_PI N_RESET;
SEG3_PIN_RESET;
SEG4_PIN_SET;
segchar (R4);}
tim2_count++;
if (tim2_count> 3) tim2_count=O;}
}
int main (void)
{
RCC_DelnitO;
SetSysCLockTo720;
GPIO_lnitO;
SysTick_lnitO;
TIM2_1nit0;
TIM_EnablelT_UPDATE(ТIM2);
370
TIM_EnaьteCounter(ТIM2);
whiLe (1) {
for (i=0; i <10000;i++) {
Ledprint(i);
deLay_ms (100);}}
}
Комментарий к коду видео:
Предлагаю посмотреть своё видео по данной программе так
как код программы довольно таки большой, а именно:
STM32. CMSIS #7. Динамическая индикация
Разница будет только в схеме подключения. В виду того что
на синих светодиодах напряжение падения выше чем на инди­
каторах других цветов, на установленном семисегментном дис­
плее это напряжение составляет 3.2- 3.3В. Поэкспериментиро­
вав заранее, я сделал схемотехнический лайфхак и отказался
от установки транзисторов, резисторов для данной схемы с об­
щим катодом. Работоспособность и надежность такого подклю­
чения подтвердилась длительной и надежной работой установ­
ленного индикатора, а также выводов МК. В видео и здесь будет
отличаться нумерация подключения выводов МК, бизнес логика
работа одинаковы.
Это видео можно найти как на моем канале на YouTube, так
и на Rutube или VK Видео.
371
ГЛАВА 8.1 ИНТЕРФЕЙС
УСТРОЙСТВА УНИВЕРСАЛЬНОЙ
ПОСЛЕДОВАТЕЛЬНОЙ ШИНЫ USB
Периферия USB реализует интерфейс между полноскорост­
ной шиной USB2.0 и шиной АРВ1. Поддерживаются функции
USB suspend/resume, позволяющие останавливать часы устрой­
ства для снижения энергопотребления.
Основные характеристики USB:
• Совместимость с полноскоростным (fuLL-speed) интерфей­
сом USB версии 2.0;
• Настраиваемое
количество
конечных
точек
(endpoints)
от 1 до 8;
• Генерация/проверка циклической избыточной проверки
(CRC), кодирование/декодирование с инверсией без возврата
к нулю (NRZI) и битовая зашита;
• Поддержка изохронных передач;
• Поддержка оконечных точек с двойной буферизацией
и изохронной передачей данных;
• Операции приостановки/возобновления работы USB;
• Формирование синхроимпульсов с кадровой блокировкой.
Внимание! В устройствах низкой, средней, высокой и ХLплотности USB и CAN совместно используют выделенную 512байтную память SRAfvt для передачи и приема данных, поэтому
их одновременное использование невозможно (доступ к общей
памяти осуществляется только через CAN и USB). USB и CAN мо­
гут использоваться в одном и том же приложении, но не одно­
временно.
372
ФУНКЦИОНАЛЬНОЕОПИСАНИЕUSВ
На рис.
8.1
показана блок-схема
периферийного устрой­
ства USB.
0 USB clock (48 MHz)
0 PCLK1
USB
registers & logic
Suspend
timer
Packet
buffer
interface
Packet
buffer
memory
mapper
АРВ 1 wrapper
АРВ1 interface
PCLK1
Рисунок 8.1 -
APB1 _bus
IRQsto NVIC
Блок-схема периферийного устройства USB
Периферийное устройство USB обеспечивает USВ-совмести­
мое соединение между главным компьютером и функцией, реа­
лизуемой микроконтроллером. Передача данных между хост-
373
компьютером и системной памятью происходит через выделен­
ную буферную память пакетов, доступ к которой осуществляется
непосредственно периферийным устройством USB. Размер этой
выделенной буферной памяти должен соответствовать количе­
ству используемых
конечных точек
и
максимальному
размеру
пакета. Размер выделенной памяти составляет
512 байт, при
этом может использоваться до 16 однонаправленных или 8 дву­
направленных конечных точек. Периферийное устройство USB
взаимодействует с хостом USB, обнаруживая пакеты маркера,
выполняя передачу/прием данных и обработку квитирующих
пакетов в соответствии с требованиями стандарта USB. Форма­
тирование транзакций, включая генерацию и проверку CRC, вы­
полняется аппаратными средствами.
С каждой конечной точкой связан блок описания буфера,
указывающий, где-находится область памяти, связанная с конеч­
ной точкой, каков ее размер и сколько байт необходимо пере­
дать. Когда USВ-периферийное устройство распознает маркер
для корректной пары функция/конечная точка, происходит пе­
редача соответствующих данных (если это необходимо и если
конечная точка сконфигурирована). Данные, буферизованные
периферийным устройством
USB, загружаются во внутренний
16-битный регистр, и осуществляется доступ к памяти выделен­
ного буфера. После передачи всех данных, если это необходи­
мо, генерируется или ожидается соответствующий квитирующий
пакет по USB в зависимости от направления передачи.
По окончании транзакции генерируется прерывание, специ­
фичное для конечной точки, считываются регистры состояния и/
или используются различные подпрограммы реакции на преры­
вание. Микроконтроллер может определить:
• обслуживаемая конечная точка
• тип прошедшей транзакции, наличие ошибок (таких как
засорение битов, формат, CRC, протокол, отсутствие АСК, over/
uпderruп).
Особая поддержка изохронных передач и массовых передач
с высокой пропускной способностью обеспечивается за счет ис-
374
пользования двойного буфера, что позволяет всегда иметь сво­
бодный буфер для периферийного устройства USB, в то время
как микроконтроллер использует другой буфер.
При
в
режим
необходимости
устройство
может быть
пониженного энергопотребления
переведено
{режим
SUSPEND)
путем записи в регистр управления. В это время исключается
рассеивание статической энергии, а тактовая частота
USB мо­
жет быть замедлена или остановлена. Обнаружение активности
на
USВ-входах
асинхронно
в
режиме
пробуждает
пониженного
устройство.
энергопотребления
Специальный
источник
прерываний может быть подключен непосредственно к линии
пробуждения, что позволит системе немедленно возобновить
нормальную генерацию тактовых импульсов и/или поддержи­
вать прямой запуск/останов тактовых импульсов.
ОПИСАНИЕ БЛОКОВ USB
Периферия USB реализует все функции, связанные с интер­
фейсом USB, которые включают в себя следующие блоки:
• Блок последовательного интерфейса {SeriaL lnterface
Engine, SIE): В функции этого блока входят: распознавание шаб­
лонов синхронизации, набивка битов, генерация и проверка
CRC, проверка/генерация PID и оценка рукопожатия. Он должен
взаимодействовать с приемопередатчиками USB и использовать
для локального хранения данных виртуальные буферы, предо­
ставляемые интерфейсом пакетного буфера. Этот блок также ге­
нерирует сигналы в соответствии с событиями, происходящими
на периферии USB, такими как Start of Frame {SOF), USB_Reset,
ошибки данных и т.д., и событиями, связанными с конечной точ­
кой, такими как окончание передачи или правильный прием па­
кета; эти сигналы затем используются для генерации прерыва­
ний.
• Таймер: этот блок генерирует тактовый импульс с блоки­
ровкой начала кадра и обнаруживает глобальную приостановку
{от хоста), когда трафик не поступает в течение 3 мс.
375
• Интерфейс пакетных буферов: Этот блок гибко управляет
локальной памятью, реализующей набор буферов, как для пере­
дачи, так и для приема. Он может выбирать нужный буфер в со­
ответствии с запросами, поступающими от SIE, и размещать их
в адресах памяти, на которые указывают регистры конечных то­
чек. Он увеличивает адрес после каждого переданного слова
до конца
пакета, отслеживая
количество
переданных байтов
и не допуская превышения максимальной емкости буфера.
• Регистры, связанные с конечными точками: Каждая конеч­
ная точка имеет соответствующий регистр, содержащий инфор­
мацию о типе конечной точки и ее текущем состоянии. Для мо­
нонаправленных/однобуферных конечных точек один регистр
может быть использован для реализации двух разных конечных
точек. Количество регистров равно
8, что позволяет использо­
вать до 16 мононаправленных/однобуферных или до 7 двухбу­
ферных конечных точек (а) в любой комбинации.
Например, периферийное устройство USB может быть запро­
граммировано на 4 конечные точки с двойным буфером и 8 ко­
нечных точек с однобуферным/мононаправленным буфером.
• Управляющие регистры: Это регистры, содержащие инфор­
USB и используемые для
принудительного управления некоторыми событиями USB, таки­
мацию о состоянии всей периферии
ми как возобновление и выключение питания.
• Регистры
прерываний: Они содержат маски прерываний
и запись событий. Они могут быть использованы для запроса
причины прерывания, статуса прерывания или для сброса стату­
са
ожидающего
прерывания.
Периферийное устройство
USB
подключается к шине АРВ1 через интерфейс АРВ1, содержащий
следующие блоки:
• Память пакетов: Это локальная память, которая физически
содержит пакетные буферы. Она может использоваться интер­
фейсом
Packet Buffer, который создает структуру данных и мо­
жет быть доступен непосредственно прикладному программно­
му
обеспечению.
Размер
памяти
Packet Memory
512 байт, структурированных как 256 слов по 16 бит.
376
составляет
• Арбитр: Этот блок принимает запросы к памяти, поступа­
от шины АРВ1 и от интерфейса USB. Он разрешает
ющие
конфликты, отдавая приоритет обращениям к АРВ1 и всегда
резервируя половину пропускной способности памяти для вы­
полнения всех USВ-передач. Эта схема временного дуплекса
реализует виртуальную двухпортовую
SRAM, которая позволя­
ет осуществлять доступ к памяти во время выполнения USВ­
транзакции.
В этой схеме также допускаются
многословные
передачи АРВ1 любой длины.
• Устройство сопоставления регистров: Этот блок собирает
различные
байтовые
и
битовые
регистры
периферийного
устройства
USB в структурированный набор слов шириной
16 бит, адресуемый АРВ1. • АРВ1 Wrapper: Он обеспечивает ин­
терфейс к АРВ1 для памяти и регистров. Он также отображает
всю периферию USB в адресное пространство АРВ1.
• Маппер прерываний: Этот блок используется для выбора
возможных событий USB, которые могут генерировать прерыва­
ния, и сопоставления их трем различным линиям NVIC:
- Низкоприоритетное прерывание USB (канал 20): срабаты­
вает при любых событиях USB (корректная передача, сброс USB
и
т.д.).
Перед
обслуживанием
прерывания
микропрограмма
должна проверить его источник.
- Высокоприоритетное прерывание USB (канал 19): сраба­
тывает только при корректном событии передачи данных для
изохронной и двухбуферной групповой передачи, чтобы до­
стичь максимально возможной скорости передачи данных.
- Прерывание пробуждения USB (канал 42): Срабатывает
по событию пробуждения из режима USB Suspend.
Соображения по программированию
В следующих разделах описаны предполагаемые взаимо­
действия между периферийным устройством USB и прикладной
программой,
чтобы
облегчить
разработку
граммного обеспечения.
377
прикладного
про­
Общее программирование USВ-устройств
В этой части описаны основные задачи, которые необходи­
мо решить прикладному программному обеспечению для полу­
чения USВ-совместимого поведения. Рассмотрены действия, свя­
занные с наиболее общими событиями USB, а также параграфы,
посвященные особым случаям конечных точек с двойной буфе­
ризацией и изохронные передачи. Кроме сброса системы, дей­
ствия
всегда инициируются
периферийным устройством
USB
по одному из событий USB, описанных ниже.
СИСТЕМА И СБРОС ПРИ ВКЛЮЧЕНИИ ПИТАНИЯ
При сбросе системы и включении питания первой операци­
ей, которую должно выполнить прикладное программное обес­
печение, является подача всех необходимых тактовых сигналов
на периферийное устройство USB и последующее снятие сигна­
ла сброса, чтобы получить доступ к его регистрам. Далее описа­
на вся последовательность инициализации.
На
первом
этапе
прикладное
программное
обеспечение
должно активировать регистровый макроячеечный тактовый ге­
нератор и снять сигнал сброса макроячейки, используя соответ­
ствующие управляющие биты, предоставляемые логикой управ­
ления тактовыми генераторами устройства.
После этого аналоговая часть устройства, связанная с USВ­
трансивером, должна быть включена с помощью бита
PDWN
в регистре CNTR, который требует специального обращения. Этот
бит предназначен для включения внутренних источников напря­
жения, питающих порт приемопередатчика. Данная схема имеет
определенное время запуска
(tSTARTUP, указанное в техниче­
ском описании), в течение которого поведение USВ-трансивера
не определено. Поэтому после установки бита PDWN в регистре
CNTR необходимо выждать это время, прежде чем снять условие
сброса с USВ-части (сбросив бит FRES в регистре CNTR). Очистка
регистра ISTR устраняет ложное ожидающее прерывание до того,
как будет разрешена любая другая операция макроячейки.
378
Структура и использование пакетных буферов
Каждая двунаправленная конечная точка может принимать
или передавать данные от/к хосту. Полученные данные хранят­
ся в выделенном буфере памяти, предназначенном для этой
конечной точки, а в другом буфере памяти хранятся данные,
которые должны быть переданы этой конечной точкой. Доступ
к этой памяти осуществляется блоком интерфейса пакетного
буфера, который передает запрос на доступ к памяти и ожида­
ет его подтверждения. Поскольку к памяти пакетного буфера
должен обращаться и микроконтроллер, то конфликты доступа
разрешает арбитражная логика, использующая половину цикл
АРВ1 для доступа
ну
микроконтроллера, а
оставшуюся
полови­
- для доступа периферийных устройств USB. Таким обра­
зом, оба агента могут работать так, как если бы пакетная па­
мять была двухпортовой
SRAM,
не подозревая о конфликте,
даже когда микроконтроллер выполняет последовательный до­
ступ. Периферийная логика USB использует выделенный такто­
вый генератор. Частота этого выделенного тактового генерато­
ра, согласно требованиям стандарта
USB, составляет 48 МГц
и может отличаться от частоты тактового генератора, использу­
емого для интерфейса с шиной АРВ1. Возможны различные
конфигурации тактовых генераторов, при которых тактовая ча­
стота АРВ1 может быть выше или ниже периферийной часто­
ты USB.
Примечание: В связи с требованиями к скорости передачи
данных
USB и
интерфейсу пакетной памяти тактовая частота
АРВ1 должна быть больше 8 МГц, чтобы избежать проблем с об­
гоном/необгоном данных.
С каждой конечной точкой связаны два пакетных буфера
(обычно один на передачу, а другой на прием). Буферы могут рас­
полагаться в любом месте пакетной памяти, поскольку их распо­
ложение и размер задаются таблицей описания буферов, кото­
рая также находится в пакетной памяти по адресу, указанному
регистром USB_BTABLE. Каждая запись таблицы связана с реги­
стром конечной точки и состоит из четырех 16-битных слов, по-
379
этому адрес
начала таблицы
всегда должен
быть
выровнен
по границе 8 байт (младшие три бита регистра USB_BTABLE все­
гда «ООО»). Записи таблицы дескрипторов буферов описаны в со­
ответствующем разделе. Если конечная точка является однона­
правленной и не является ни изохронной, ни двухбуферной, то
требуется только один пакетный буфер (тот, который относится
к
поддерживаемому
направлению
передачи).
Другие
места
в таблице, относящиеся к неподдерживаемым направлениям пе­
редачи или неиспользуемым конечным точкам, доступны пользо­
вателю. Изохронные и двухбуферные массовые конечные точки
имеют специальную обработку пакетных буферов. Взаимосвязь
между записями таблицы описания буферов и областями буфе­
ров пакетов подробно описана на рис. 8.2:
380
0001_ 1110 (1 Е) COUNTЗ_ТХ_ 1
0001_1100 (1С)
ADDRЗ_ТX_1
_r
0001_1010 (1А) СОUNТЗ_ТХ_О
0001_ 1000 {18)
ADDRЗ тх_о
0001_0110 (16) COUNT2_RX_1
0001_0100 (14) ADDR2_RX_1
_г
Bufferfor
double-buflered
IN EndpoJnt З
'
Вuffer for
double-Ьuffered
ОUТ Endpoint 2
0001_0010 (12) COUNT2_RX_0
'
0001_0000 (10) ADDR2 АХ О
0000_1110 (ОЕ) COUNT1_RX
0000_1100 (ОС)
ADDR1_RX
0000_1010 (ОА)
COUNT1_ТX
0000_1000 (08)
ADDR1 ТХ
0000_011 О (06)
COUNТ0_RX
0000_0100 (04)
ADDR0_RX
0000_0010 (02)
СОUNТО_ТХ
0000_0000 (00)
ADDR0 ТХ
_г
~
Transrnission
bufferfor
вingle-buffered
Endpoint 1
'
Reception buller
for
Endpoint0
Tranвmission
Ьulferfor
Endpointo
Buffer description tаЫе locations
Packet buffers
Рисунок 8.2 - Области буферов пакетов с примерами располо­
жения таблиц описания буферов
Каждый пакетный буфер используется либо при приеме, ли­
бо при передаче, начиная с нижнего. Периферийное устройство
USB никогда не изменяет содержимое ячеек памяти, соседних
с выделенными буферами памяти; при получении пакета, длина
которого превышает длину выделенного буфера (условие пре­
вышения буфера), данные будут скопированы в память только
до последней доступной ячейки.
381
Инициализация конечной точки
Первым шагом инициализации конечной точки является за­
пись
соответствующих
значений
в
регистры
ADDRп_RX, чтобы периферийное устройство
ADDRп_ТХ/
USB обнаружило,
что данные для передачи уже доступны, а данные для
могут
быть
буферизированы.
Биты
ЕР_ТУРЕ
в
приема
регистре
USB_EPпR должны быть установлены в соответствии с типом ко­
нечной точки, в конечном итоге с помощью бита ЕР _КIND можно
включить любую специальную необходимую функцию. На сто­
роне передачи оконечная точка должна быть разрешена с помо­
щью битов SТАТ_ТХ регистра
USB_EPпR и инициализирована
COUNTп_ТХ. Для приема необходимо установить биты STAT_RX
для разрешения приема и записать в COUNTп_RX выделенный
размер буфера с помощью полей BL_SIZE и NUM_BLOCK. Одно­
направленные
конечные
точки,
за
исключением
изохронных
и двухбуферных массовых, должны инициализировать только
биты и регистры, относящиеся к поддерживаемому направле­
нию.
Если передача и/или прием данных разрешены, то регистр
USB_EPnR и местоположения ADDRn_ТX/ADDRn_RX, СОUNТп_ТХ/
COUNTп_RX
(соответственно)
не
должны
модифицироваться
прикладным программным обеспечением, поскольку аппарату­
ра может изменять их значение «на лету». После завершения
операции передачи данных, о чем сообщает событие прерыва­
ния СТR, к ним можно снова обратиться для повторного включе­
ния новой операции.
IN-пакеты (передача данных)
При получении маркерного пакета IN, если полученный ад­
рес совпадает с конфигурированным и действительным адресом
конечной точки, периферийное устройство USB обращается к со­
держимому мест ADDRп_ТX и COUNTn_TX внутри записи таблицы
буферных дескрипторов, относящейся к адресуемой конечной
точке. Содержимое этих мест хранится в его внутренних 16-бит­
ных регистрах ADDR и COUNT (программно недоступны). Вновь
382
происходит обращение к пакетной памяти для чтения первого
передаваемого слова (см. раздел «Структура и использование па­
кетных буферов») и начинается отправка PID DATA0 или DATA1
в соответствии с битом USB_EPпR DTOG_TX. По завершении PID
первый байт из слова, считанного из буферной памяти, загружа­
ется в выходной сдвиговый регистр для передачи по шине USB.
После передачи последнего байта данных происходит отправка
вычисленного CRC. Если адресованная конечная точка не являет­
ся валидной, то вместо пакета данных передается пакет квитиро­
вания NAK или STALL, в соответствии с битами STAT_TX регистра
USB_EPпR. Внутренний регистр
ADDR используется в качестве
указателя на текущее место в буферной памяти, а COUNT - для
подсчета количества оставшихся байтов, которые необходимо
передать. Каждое слово, считанное из буферной памяти пакетов,
передается по шине USB, начиная с младшего байта. Буферная
память передачи считывается, начиная с адреса, на который ука­
зывает ADDRп_ТX, для COUNTп_TX/2 слов. Если передаваемый
пакет состоит из нечетного числа байт, то будет использована
только младшая половина последнего слова, к которому был по­
лучен доступ. При получении хостом квитанции АСК регистр
USB_EPпR обновляется следующим образом: Переключается бит
DTOG_ТХ, конечная точка становится недействительной путем
установки SТАТ_ТХ=10 (NAK) и устанавливается бит СТR_ТХ. При­
кладное программное обеспечение должно сначала определить
конечную точку, которая запрашивает внимание микроконтрол­
лера, просмотрев биты EP_ID и DIR в регистре USB_ISTR. Обслу­
живание события CTR_TX начинается со сброса бита прерывания,
затем
прикладное программное обеспечение
подготавливает
очередной буфер, заполненный данными для передачи, обнов­
ляет место в таблице СОUNТп_ТХ с количеством байт, которые бу­
дут переданы при следующей передаче, и, наконец, устанавлива­
ет STAT_ТХ в '11 (VALID), чтобы снова разрешить передачу. Если
биты STAT_TX равны '10 (NAK), то любой INзапрос, адресованный
этой конечной точке, будет NAKed, что указывает на состояние
контроля потока: USB-xocт будет повторять транзакцию до тех
383
пор, пока она не завершится успешно. Выполнение последова­
тельности операций в указанном порядке обязательно, чтобы
не потерять уведомление о второй INтранзакции, адресованной
той же конечной точке, следующей сразу за той, которая вызвала
прерывание CTR.
Пакеты OUT и SEТUP (прием данных)
Эти два
ством
маркера обрабатываются периферийным устрой­
USB примерно одинаково; различия в работе с пакетами
SETUP подробно описаны в следующем параграфе, посвящен­
ном передаче управления. При получении PID OUT/SETUP, если
адрес совпадает с действительной конечной точкой, периферий­
ное устройство USB обращается к содержимому мест ADDRn_RX
и COUNTn_RX внутри записи таблицы дескрипторов буфера, от­
носящейся
к
адресуемой
конечной
точке.
Содержимое
ADDRn_RX сохраняется непосредственно в его внутреннем реги­
стре ADDR. Теперь COUNT сбрасывается, а значения битовых по­
BL_SIZE и NUM_BLOCK, считанные из содержимого
лей
COUNTn_RX, используются для инициализации BUF_COUNT,
внутреннего
16-битного
счетчика,
который
используется для
проверки условия выхода буфера за границы (все эти внутрен­
ние регистры программно недоступны). Принятые впоследствии
периферийным устройством
USB байты данных упаковываются
в слова (первый принятый байт сохраняется как младший знача­
щий) и затем передаются в пакет буфера, начиная с адреса, со­
держащегося
во
внутреннем
регистре
ADDR,
при
этом
BUF _COUNT декрементируется, а COUNT инкрементируется при
передаче каждого байта. При обнаружении конца пакета
DATA
проверяется корректность принятого CRC и только в случае от­
сутствия ошибок при приеме обратно передающему хосту от­
правляется квитирующий пакет АСК.
В случае неправильного CRC или других видов ошибок (на­
рушения битового стафа, ошибки кадра и т.д.) байты данных
продолжают копироваться в буфер памяти пакетов, по крайней
мере, до момента обнаружения ошибки, но пакет АСК не от-
384
правляется, а в регистре USB_ISTR устанавливается бит ERR. Од­
нако
никаких программных действий
в этом случае обычно
не требуется: периферийное устройство USB восстанавливается
после ошибок приема и остается готовым к приходу следующей
транзакции. Если адресованная конечная точка не является ва­
лидной, то вместо АСК, согласно битам
USB_EPпR,
посылается
пакет
STAT_RX в регистре
квитирования NAK или STALL,
а в буферы памяти приема данные не записываются.
Запись в буфер памяти приема производится, начиная с ад­
реса, содержащегося в ADDRп_RX, на количество байт, соответ­
ствующее длине принятого пакета данных с учетом
CRC (т.е.
длина полезной нагрузки данных +2), или до последнего выде­
ленного участка памяти, определяемого BL_SIZE и NUM_BLOCK,
в зависимости от того, что наступит раньше. Таким образом, пе­
риферийное устройство
USB
никогда
не записывает данные
за пределы выделенной области буфера приемной памяти. Если
длина полезной нагрузки пакета данных (фактическое количе­
ство байт, используемых приложением) превышает выделенный
буфер, периферийное устройство USB обнаруживает состояние
превышения буфера. В этом случае вместо обычного АСК посы­
лается квитирование STALL для уведомления хоста о проблеме,
прерывание не генерируется, а транзакция считается несостояв­
шейся.
При
корректном завершении транзакции
путем отправки
квитирующего пакета АСК внутренний регистр COUNT копирует­
ся обратно в место COUNTп_RX внутри записи таблицы описания
буферов, оставляя незатронутыми поля
BL_SIZE и NUM_BLOCK,
которые обычно не требуют перезаписи, а регистр USB_EPпR об­
новляется следующим образом: Переключается бит
DTOG_RX,
конечная точка становится недействительной путем установки
STAT_RX = '10 (NAK) и устанавливается бит CTR_RX. Если тран­
закция завершилась неудачно из-за ошибок или выхода за пре­
делы буфера, то ни одно из перечисленных действий не выпол­
няется. Прикладное программное обеспечение должно сначала
определить
конечную
точку,
которая
385
запрашивает
внимание
микроконтроллера, изучив биты ЕР _ID и DI R в регистре
USB_ISTR. Для обслуживания события CTR_RX сначала опреде­
ляется тип транзакции (бит SETUP в регистре USB_EPnR); при­
кладное программное обеспечение должно сбросить бит флага
прерывания и получить количество принятых байт, считав место
COUNTn_RX в записи таблицы описания буфера, относящейся
к обрабатываемой конечной точке. После обработки принятых
данных прикладное программное обеспечение должно устано­
вить в USB_EPnR биты STAT_RX в значение '11 (Valid), разрешив
дальнейшие транзакции. Если биты STAT_RX равны '10 (NAK), то
любой запрос OUT, адресованный этой конечной точке, является
NAK, что указывает на состояние контроля потока: USB-xocт бу­
дет повторять транзакцию до тех пор, пока она
не завершится
успешно. Выполнение последовательности операций в указан­
ном
порядке
обязательно,
чтобы
не
потерять
уведомление
о второй транзакции OUT, адресованной той же конечной точке,
следующей сразу за той, которая вызвала прерывание CTR.
Передачи управления
Управляющие передачи состоят из транзакции SETUP, за ко­
торой следует ноль или более этапов данных, все одного направ­
ления, а затем этап состояния (передача нулевого байта в обрат­
ном направлении). Транзакции
SETUP обрабатываются только
управляющими конечными точками и очень похожи натранзак­
ции OUT (прием данных), за исключением того, что значения би­
тов DTOG_ТХ и DTOG_RX регистров адресуемых конечных точек
устанавливаются в 1 и О соответственно для инициализации пе­
редачи
управления,
а
STAT_TX
и
STAT_RX
устанавливаются
в '10 (NAK) для того, чтобы программное обеспечение могло ре­
шить, должны ли последующие транзакции быть IN или OUT в за­
SETUP. Конечная точка управления
должна проверять бит SETUP в регистре USB_EPnR при каждом
событии CTR_RX, чтобы отличить нормальную передачу транзак­
ций OUT от транзакций SETUP. USВ-устройство может определить
висимости от содержимого
количество и направление этапов передачи данных, интерпрети-
386
руя данные, переданные на этапе SETUP, и обязано остановить
транзакцию в случае возникновения ошибок. Для этого на всех
этапах передачи данных до последнего неиспользуемое направ­
ление должно быть установлено в STALL, чтобы, если хает слиш­
ком рано изменит направление передачи, он получил STALL в ка­
честве статуса этапа.
При включении последнего этапа передачи данных проти­
воположное направление должно быть установлено в NAK, что­
бы, если хает сразу же изменит направление передачи (для
выполнения этапа состояния), он остался ждать завершения
операции управления. Если операция управления завершится
успешно, то программа изменит
NAK на VALID, в противном
- на STALL. При этом, если статусная стадия будет яв­
ляться OUT, то должен быть установлен бит STATUS_OUT
(ЕР_КIND в регистре USB_EPnR), чтобы при выполнении статус­
случае
ной транзакции с ненулевыми данными генерировалась ошиб­
ка.
Когда
статусная
транзакция
обслуживается,
приложение
очищает бит
STATUS_OUT и устанавливает STAT_RX в VALID
(для приема новой команды), а STAT_ТХ в NAK (для задержки
возможной статусной стадии, следующей сразу за следующей
установкой).
Поскольку спецификация
USB гласит, что на пакет SETUP
нельзя отвечать квитированием, отличным от АСК, в итоге пре­
рывая ранее выданную команду, чтобы начать новую, логика
USB не позволяет управляющей конечной точке отвечать паке­
том NAK или STALL на маркер SETUP, полученный от хоста.
Если биты STAT_RX установлены в '01 (STALL) или '10 (NAK)
и получен маркер SETUP, USB принимает данные, выполняет
требуемую передачу данных и посылает ответный квитирующий
сигнал АСК. Если на этой конечной точке имеется ранее выдан­
ный запрос CТR_RX, еще не подтвержденный приложением (т.е.
бит CТR_RX все еще установлен в результате ранее завершенно­
го приема), USB отбрасывает транзакцию SETUP и не отвечает
ни одним пакетом квитирования независимо от его состояния,
имитируя ошибку приема и заставляя хает повторно отправить
387
маркер SETUP. Это делается для того, чтобы не потерять уведом­
ление о транзакции SETUP, адресованной той же конечной точке
сразу после транзакции, вызвавшей прерывание CTR_RX.
Конечные точки с двойной буферизацией
Все различные типы конечных точек, определенные стан­
дартом
USB, представляют собой
различные модели трафика
и описывают типичные требования к операциям передачи дан­
ных различного типа. Когда между хает-компьютером и USВ­
функцией
необходимо
передавать
большие
порции
данных,
наиболее подходящей моделью является тип конечной точки
bulk. Это связано с тем, что хост планирует массовые транзакции
таким образом, чтобы заполнить всю доступную полосу пропус­
кания в кадре, максимизируя фактическую скорость передачи
данных до тех пор, пока функция USB готова обработать адресо­
ванную ей массовую транзакцию. Если к моменту поступления
следующей транзакции USВ-функция все еще занята предыду­
щей, она отвечает на нее квитированием NAK, и хает-компьютер
снова выдает ту же транзакцию, пока USВ-функция не будет го­
това ее обработать, что снижает фактическую скорость передачи
данных за счет полосы пропускания, занятой повторными пере­
дачами. По этой причине для массовых конечных точек может
использоваться специальная функция, называемая «двойной бу­
феризацией».
При активации «двойной буферизации» последовательность
переключения данных используется для выбора буфера, кото­
рый будет использоваться периферийным устройством USB для
выполнения требуемой передачи данных, при этом используют­
ся области памяти пакетов «передача» и «прием» для управле­
ния заменой буферов при каждой успешной транзакции, чтобы
всегда иметь полный буфер для использования приложением,
в то время как периферийное устройство USB заполняет другой.
Например, во время транзакции OUT, направленной на оконеч­
ную точку с двойным буфером «прием», пока один буфер запол­
няется новыми данными, поступающими от USB-xocтa, другой
388
доступен для использования программным обеспечением мик­
роконтроллера (то же самое происходит с оконечной точкой
с двойным буфером «передача» и транзакцией IN).
Поскольку управление буфером с заменой требует исполь­
зования всех четырех мест таблицы описания буферов, разме­
щающих указатель адреса и длины выделенных буферов памя­
ти, регистры USB_EPпR, используемые для реализации оконеч­
ных точек массового обмена с двойной буферизацией, вынуж­
дены использоваться как однонаправленные. Поэтому только
одна пара битов STAT должна быть установлена в значение, от­
личное от '00 (DisaЫed): STAT_RX, если оконечная точка сдвой­
ной буферизацией разрешена для приема,
STAT_ТХ, если око­
нечная точка с двойной буферизацией разрешена для передачи.
В случае если необходимо, чтобы оконечные точки с двойной
буферизацией были включены как на прием, так и на передачу,
необходимо использовать два регистра USB_EPпR.
Для
использования
возможности
двойной
буферизации
и достижения максимально возможной скорости передачи дан­
ных необходимо модифицировать структуру управления пото­
ком конечных точек, описанную в предыдущих главах, чтобы
переключать статус конечной точки в NAK только при возникно­
вении конфликта буферов между периферийным устройством
USB и прикладным программным обеспечением, а не делать это
в конце каждой успешной транзакции. Буфер памяти, который
в
данный
момент
используется
периферийным
устройством
USB, определяется битом DTOG, связанным с направлением ко­
нечной точки: DTOG_RX (бит 14 регистра USB_EPпR) для массо­
вых точек с двойным буферизацией «прием» или DTOG_ТХ (бит
6 регистра USB_EPпR) для массовых точек с двойным буфериза­
цией «передача». Для реализации новой схемы управления по­
током периферийное устройство USB должно знать, какой пакет­
ный буфер используется прикладным программным обеспече­
нием в данный момент, чтобы быть в курсе любого конфликта.
Поскольку
в
регистре
USB_EPпR
имеется
два
бита
DTOG,
но только один из них используется периферийным устройством
389
USB для последовательности передачи данных и буферов (из-за
однонаправленного ограничения, требуемого функцией двой­
ной буферизации), второй может быть использован прикладным
программным обеспечением для индикации того, какой буфер
используется в данный момент. Этот новый флаг буфера называ­
SW_BUF. В следующей таблице поясняется соответствие
битами регистра USB_EPnR и определением DTOG/
SW_BUF для случаев оконечных точек массового обмена сдвой­
ется
между
ной буферизацией «передача» и «прием».
Buffer nвg
DTOG
SW_BUF
'Trвnsmlsslon' endpolnt
'Receptlon' endpolnt
DTOG_ТХ (USB_EPnRblt 6)
DTOG_RX (USB_EPnRblt 14)
USB_EPnR Ьit 14
USB_EPnR Ьit 6
Таблица 8.1 - Определение флага буфера с двойной буфериза­
цией
Буфер памяти, который в данный момент используется пери­
ферийным
устройством
USB,
определяется
флагом
буфера
DTOG, а буфер, используемый в данный момент прикладным
программным обеспечением, - флагом буфера SW_BUF. Взаи­
мосвязь между значением флага буфера и используемым пакет­
ным буфером в обоих случаях одинакова и приведена в следую­
щей таблице:
390
Endpolnt
Туре
Packet bufler used Ьу
Appllcatlon Software
Packet Ьuffer used Ьу USB
Perlpheral
DТOG
SW_BUF
о
1
ADDRn_ тх_о / COUNTn_тх_о ADDRn_TX_1 /COUNTn_TX_1
Buffer description tаЫе locations. Buffer description tаЫе locations.
1
о
ADDRn_тх_ 1 / COUNTn_ ТХ_ 1
Buffer description tаЫе locations
ADDRn_ тх_о / COUNTn_тх_о
Buffer description tаЫе locations.
о
о
None111
ADDRn_тх_о / COUNTn_тх_о
Buffer description tаЫе locations.
1
1
None 111
ADDRn_тх_о / COUNTn_тх_о
Buffer description tаЫе locations.
о
1
ADDRn_RX_0 / COUNTn_RX_0 ADDRn_RX_ 1 / COUNTn_RX_1
Buffer description tаЫе locations. Bufler description tаЫе locations.
1
о
ADDRn_RX_ 1 / COUNТn_RX_ 1
Buffer description tаЫе locations.
ADDRn_RX_0 / COUNТn_RX_0
Buffer description tаЫе locations.
о
о
None1 11
ADDRn_RX_0 / COUNТn_RX_O
Buffer description tаЫе locations.
1
1
None< 11
ADDRn_RX_ 1 / COUNТn_RX_1
Buffer description tаЫе locations.
IN
OUT
Таблица 8.2 -
Использование буферов памяти с двойной буфе­
ризацией
Конечная точка в состоянии NAK.
• Запись битового поля ЕР_ТУРЕ в '00 в регистре USB_EPnR
определяет конечную точку как bulk
• Установка бита ЕР_KIND в «1 (DBL_BUF), в том же регистре.
Прикладное программное обеспечение отвечает за инициа­
лизацию битов DTOG и SW_BUF в соответствии с первым исполь­
зуемым буфером, что должно быть сделано с учетом особого
свойства переключения, которым обладают эти два бита. Окон­
чание
первой
транзакции,
произошедшее
после
установки
DBL_BUF, запускает специальное управление потоком для мас­
совых точек с двойным буфером, которое используется для всех
остальных транзакций, адресованных этой конечной точке, пока
DBL_BUF не останется установленным. В конце каждой транзак­
ции устанавливается бит CTR_RX или CTR_TX регистра USB_EPnR
адресованной конечной точки, в зависимости от разрешенного
направления. Одновременно происходит аппаратное переклю-
391
чение затронутого бита DTOG в регистре USB_EPnR, что делает
замену буферов периферийных устройств USB полностью про­
граммно независимой. В отличие от обычных транзакций, при­
чем первой после установки DBL_BUF, на битовую пару STAT за­
вершение
транзакции
не
влияет,
и
ее
значение
остается
'11 (Vatid). Однако при получении маркерного пакета новой
транзакции фактическое состояние конечной точки маскируется
под '10 (NAK) при обнаружении конфликта буферов между пе­
риферийным
устройством
USB и прикладным программным
обеспечением (это состояние идентифицируется по совпадению
значений DTOG и SW_BUF, см. табл. 170). В ответ на уведомле­
ние о событии
CTR прикладное ПО снимает флаг прерывания
и начинает любую необходимую обработку завершенной тран­
закции. Когда использование буфера пакетов приложения за­
канчивается, программа переключает бит
в него
SW_BUF, записывая
«1», чтобы уведомить периферийное устройство USB
о наличии этого буфера. Таким образом, количество транзакций
с NАК-ом ограничивается только временем проработки данных
транзакции приложением: если время проработки меньше вре­
мени, необходимого для завершения транзакции на шине USB,
то повторных передач из-за управления потоком не будет, и ре­
альная скорость передачи будет ограничена только хост-ком­
пьютером.
Прикладное программное обеспечение всегда может отме­
нить специальное управление потоком, реализованное для око­
нечных точек с двойной буферизацией, записав в пару битов
STAT соответствующего регистра USB_EPnR явный статус, отлич­
ный от '11 (Vatid). В этом случае периферийное устройство USB
всегда будет использовать запрограммированное состояние ко­
нечной точки, независимо от состояния использования буфера.
Изохронные передачи (lsochronous transfers)
Стандарт
USB поддерживает полноскоростные периферий­
ные устройства, требующие фиксированной и точной частоты
производства/потребления данных, определяя такой трафик как
392
«изохронный». Типичными примерами таких данных являются:
аудиосэмплы, сжатые видеопотоки и вообще любые виды дис­
данных,
кретизированных
к
которым
предъявляются
жесткие
требования по точности частоты передачи. Если конечная точка
определена как «изохронная» на этапе перечисления, хост вы­
деляет
в
требуемую
кадре
полосу
в каждом кадре ровно один пакет
и
пропускания
передает
IN или OUT, в зависимости
от направления конечной точки. Чтобы ограничить требования
к пропускной способности, для изохронного трафика невозмож­
на повторная передача
неудачных транзакций; это приводит
к тому, что изохронная транзакция не имеет фазы квитирования
и после пакета данных не ожидается и не передается пакет АСК.
По этой же причине изохронные передачи не поддерживают по­
переключения
следовательность
данных
и
всегда
используют
PID DATA0 для начала любого пакета данных.
Изохронное поведение конечной точки выбирается установ­
кой битов ЕР_ТУРЕ в регистре USB_EPnR по адресу '10; посколь­
ку фаза квитирования отсутствует, единственными допустимыми
значениями
для
'00 (DisaЫed)
и
пар
битов
STAT_RX/STAT_ТХ
'11 (Valid), любые другие значения
являются
приводят
к результатам, не соответствующим стандарту USB. Изохронные
конечные точки реализуют двойную буферизацию для облегче­
ния
разработки
пользуя
области
прикладного программного обеспечения,
памяти
пакетов «передача»
и
ис­
«прием» для
управления заменой буферов при каждой успешной транзак­
ции, чтобы всегда иметь полный буфер для использования при­
ложением, в то время как периферийное устройство USB запол­
няет другой.
Буфер памяти, который в данный момент используется пе­
USB, определяется битом DTOG, от­
{DTOG_RX для изо­
конечных точек «прием», DTOG_ТХ для изохронных
риферийным устройством
носящимся к направлению конечной точки
хронных
конечных точек «передача», оба в соответствующем регистре
USB_EPnR) в соответствии с таблице ниже:
393
Endpolnt
DТOGЫt
туре
vвlue
Packet buffar used Ьу the
appllcatlon softwllre
Packet buffer used Ьу the
USB perlpheral
ADDRn_тх....о 'COUNTn_тх_о
ADDRn_тх_1 / COUNTn_ТХ_ 1
о
Ьulfer description tаЫе
Ьulfer description tаЬ1е
locations.
locations.
1
ADDRn_тх_ 1 / COUNTn_тх_ 1
Ьulfer descriplion tаЫе
locations.
ADDRn_тх_о / COUNTn_тх_о
Ьulfer description tаЫе
locations.
о
ADDRn_RX_0 / COUNТn_RX_0
Ьuffer description tаЫе
locations.
ADDRn_RX_1 /COUNTn_RX_1
Ьulfer description tаЫе
locatlons.
ADDRn_RX.... 1 / COUNТn_RX_ 1
1
Ьulfer descriplion tаЫе
ADDRn_RX_0 I COUNTn_RX_O
Ьulfer description tаЫе
locations.
IN
оuт
locations.
Таблица 8.3 - Использование буферов изохронной памяти
Как и в случае с двойными буферизованными конечными
точками,
регистры
USB_EPnR,
используемые для
реализации
изохронных конечных точек, вынуждены использоваться как од­
нонаправленные. Если требуется, чтобы изохронные конечные
точки были включены как на прием, так и на передачу, необхо­
димо использовать два регистра USB_EPnR.
Прикладное программное обеспечение отвечает за инициа­
лизацию бита DTOG в соответствии с первым используемым бу­
фером; это должно быть сделано с учетом особого свойства пе­
реключения, которым обладают эти два бита. В конце каждой
транзакции бит CTR_RX или СТR_ТХ регистра адресованной ко­
нечной точки USB_EPnR устанавливается, в зависимости от раз­
решенного направления. Одновременно происходит аппаратное
переключение затронутого бита
DTOG регистра USB_EPnR, что
делает замену буфера полностью программно независимой. Па­
ра битов STAT не зависит от завершения транзакции; поскольку
управление потоком при изохронной передаче невозможно из­
за отсутствия фазы квитирования, конечная точка всегда остается
'11 (Valid). Ошибки CRC или превышение буфера, возникающие
при изохронных передачах OUT, в любом случае рассматривают­
ся
как корректные транзакции
394
и
всегда
вызывают событие
CТR_RX. Однако ошибки CRC в любом случае приводят к установ­
ке бита ERR в регистре USB_ISTR для оповещения программного
обеспечения о возможном повреждении данных.
События приостановки/возобновления
Стандарт
USB определяет специальное состояние перифе­
рийных устройств, называемое SUSPEND, при котором средний
ток, потребляемый от шины USB, не должен превышать 2,5 мА.
Это требование имеет принципиальное значение для устройств
с питанием от шины, в то время как устройства с автономным
питанием не обязаны соблюдать это жесткое ограничение энер­
гопотребления. В режиме приостановки главный компьютер по­
сылает уведомление о запрете передачи трафика по шине USB
в течение более 3 мс: поскольку в нормальном режиме работы
пакет
SOF
устройство
должен
посылаться
каждые
мс,
периферийное
USB воспринимает отсутствие трех последователь­
ных пакетов SOF как запрос на приостановку от главного ком­
пьютера и устанавливает бит SUSP в «1 в регистре
USB_ISTR,
вызывая прерывание, если оно разрешено. После приостановки
работы устройства его нормальная работа может быть восста­
новлена
с
помощью
так
называемой
последовательности
RESUME, которая может быть запущена с хосткомпьютера или
непосредственно с самого периферийного устройства, но завер­
шается
всегда хает-компьютером. Приостановленное перифе­
рийное устройство USB должно быть в любом случае способно
обнаружить последовательность RESET, реагируя на это событие
как на обычный сброс USB.
Фактическая процедура приостановки работы периферий­
ного устройства USB зависит от устройства, так как в зависимо­
сти от его состава могут потребоваться различные действия для
снижения общего потребления.
Ниже приводится краткое описание типичной
процедуры
приостановки, посвященное связанным с USB аспектам работы
прикладного программного обеспечения, реагирующего на уве­
домление SUSP от периферийного устройства USB:
395
1. Установите бит FSUSP в регистре USB_CNTR в 1. Это дей­
ствие активизирует режим приостановки работы периферийного
устройства USB. Как только режим приостановки активизирует­
ся, проверка приема SOF отключается, чтобы избежать дальней­
шей выдачи прерываний
SUSP при приостановленной рабо­
те USB.
2. Устраните или уменьшите статическое энергопотребление
в блоках, отличных от периферийного устройства USB.
3. Установите бит LP_MODE в регистре USB_CNTR в 1, чтобы
снять статическое энергопотребление с аналоговых USВ-прие­
мопередатчиков, но сохранить их способность обнаруживать
возобновление активности.
4. Опционально отключите внешний генератор и PLL устрой­
ства, чтобы прекратить любую активность внутри устройства.
Если во время нахождения устройства в режиме SUSPEND
происходит событие
часов
и
USB, то для восстановления номинальных
поведения USB необходимо вызвать
нормального
процедуру
RESUME.
Особое внимание следует уделить тому,
чтобы этот процесс не занимал более
10 мс, если событием
пробуждения является последовательность сброса USB (по­
дробнее см. раздел «Спецификация универсальной последова­
тельной
шины»).
Начало
последовательности
возобновления
или сброса, когда периферийное устройство
лено,
асинхронно
очищает
бит
USB приостанов­
LP_MODE в регистре
USB_CNTR. Даже если это событие может вызвать прерывание
WKUP, использование подпрограммы реакции на прерывание
должно быть тщательно продумано из-за большой задержки,
связанной
меньшую
с
перезапуском
задержку
перед
ных часов, рекомендуется
системных
повторным
чтобы
иметь
номиналь­
помещать процедуру возобновле­
ния сразу после окончания процедуры
ее
часов;
включением
код выполнялся сразу после
приостановки, чтобы
перезапуска системных часов.
Для предотвращения пробуждения системы от ЕSD-разрядов
или любых других помех (выход из режима приостановки яв­
ляется асинхронным событием) во время приостановки вклю-
396
чается соответствующий аналоговый фильтр состояния линии
данных; ширина фильтра составляет около 70 нс.
Ниже приведен перечень действий, которые должна выпол­
нять процедура резюме:
1. Опционально
включите внешний генератор и/или
PLL
устройства.
2. Очистить бит FSUSP регистра USB_CNTR.
3. Если необходимо определить событие,
инициирующее
возобновление, можно воспользоваться битами
RXDP и RXDM
регистра USB_FNR в соответствии с табл. 7.4, где также перечис­
лены предполагаемые программные действия во всех случаях.
При необходимости конец последовательности возобновления
или сброса можно определить по состоянию вышеупомянутых
битов, проверив, когда они достигнут конфигурации «10», пред­
ставляющей состояние шины ldle; кроме того, в конце последо­
вательности сброса бит RESET в регистре USB_ISTR устанавлива­
ется в
1, выдавая прерывание, если оно разрешено, которое
должно обрабатываться обычным образом.
(RXDP,RXDM) statua
Wakeup event
Requlred resume software actlon
"00'
Root reset
·10·
None (noise on bus)
Go back in Suspend mode
"01"
Rootresume
None
"11"
Not allowed (noise on bus) Go back in Suspend mode
None
Таблица 8.4 - Обнаружение события возобновления
Выход
из
режима
приостановки
может
потребоваться
устройству в ответ на определенные события, не связанные на­
прямую с протоколом USB (например, движение мыши пробуж­
дает всю систему). В этом случае последовательность возобнов­
ления работы может быть запущена установкой бита
RESUME
в регистре USB_CNTR в 1 и сбросом его в О через интервал вре-
397
мени от
1 мс до 15 мс (этот интервал может быть рассчитан
ESOF, возникающих с периодом 1 мс
с помощью прерываний
при работе системных часов на номинальной частоте). После
сброса бита
RESUME последовательность возобновления будет
завершена
хост компьютером,
и
окончание
ее
можно
будет
вновь проконтролировать с помощью битов RXDP и RXDM реги­
стра USB_FNR.
Примечание: Бит RESUME в любом случае должен использо­
ваться только после перевода периферийного устройства
в
режим
бит
установив
приостановки,
в
FSUSP
USB
регистре
USB_CNTR в 1.
РЕГИСТРЫ USB
USB можно разделить на следую­
Периферийные регистры
щие группы:
• Общие регистры: Регистры прерываний и управления;
• Регистры конечных точек: Конфигурация и состояние ко­
нечной точки;
• Таблица дескрипторов
буферов: Расположение пакетной
памяти, используемой для размещения буферов данных.
Все адреса регистров выражены как смещения относитель­
но
базового
USB,
адреса
Ох4000
5(00
периферийных
регистров
за исключением адресов таблиц дескрипторов буферов,
которые
по
начинаются
USB_BTABLE.
В
связи
с
адресацию
по
по
границам
32-битных
заданному
ограничением
все
адреса
слов,
хотя
словам,
на
адресу,
общим
регистром
мостов
АРВ1
регистров
выровнены
ширина
составляет
их
16 бит. Такое же выравнивание адресов используется и для до­
ступа к местам буферной памяти пакетов, которые располага­
ются начиная с Ох4000 6000.
Доступ к периферийным регистрам может осуществляться
в виде полуслов (16-бит) или слов (32-бит).
Общие регистры
398
Эти регистры влияют на общее поведение периферийного
устройства
USB, определяя режим работы, обработку прерыва­
ний, адрес устройства и предоставляя доступ к текущему номеру
кадра, обновляемому хост-компьютером.
Регистр управления USB (USB_CNTR)
Смещение адреса: Ох40
Сброшенноезначение:Ох0003
15
1◄
12
13
СТАМ PМAO\IRM ERAM
11
10
КUРМ SUSPМ АЕSЕТМ
RESUME FSUSP LP_МОDЕ PDWN FRES
SOFM ESOFM
"-"""'
Таблица 8.5 -
Регистр управления USB (USB_CNTR)
Бит 15 СТRМ: маска прерывания корректной передачи
О: Прерывание корректной передачи (CTR) отключено.
1: Прерывание CTR разрешено, запрос на прерывание фор­
ми-руется
при
установке
соответствующего
бита
в
регистре
USB_ISTR.
Бит 14 PMAOVRM: маска прерывания по превышению/ниже­
нию области памяти пакетов
О: прерывание PMAOVR отключено.
1: Прерывание PMAOVR разрешено, запрос на прерывание
формируется, когда соответствующий бит в регистре USB_ISTR
установлено.
Бит 13 ERRM: маска прерывания ошибки
О: ERR Прерывание отключено.
1: ERR Прерывание разрешено, запрос на прерывание фор­
мируется, когда соответствующий бит в регистр USB_ISTR уста­
новлен.
Бит 12 WKUPM: Маска прерывания пробуждения
399
О: WKUP Прерывание отключено.
1: WKUP Прерывание разрешено, запрос на
прерывание
формируется, когда соответствующий бит в регистр
USB_ISTR
установлен.
Бит 11 SUSPM: Маска прерывания режима приостановки
О: Прерывание запроса режима приостановки (SUSP) отклю­
чено.
1: SUSP lпterrupt разрешен, запрос на прерывание форми­
руется
при
установке
соответствующего
бита
в
регистре
USB_ISTR.
Бит 10 RESEТM: маска прерывания сброса USB
О: прерывание сброса отключено.
1: RESET lпterrupt разрешен, запрос на прерывание форми­
руется, когда соответствующий бит в регистр USB_ISTR установ­
лен.
Бит 9 SOFM: маска прерывания начала кадра
О: прерывание SOF отключено.
1: SOF lпterrupt разрешен, запрос на прерывание формиру­
ется, когда соответствующий бит в Регистр USB_ISTR установлен.
Бит
8 ESOFM: маска прерывания по ожидаемому началу
кадра
О: Прерывание Expected Start of Frame (ESOF) отключено.
1: ESOF lпterrupt разрешен, запрос на прерывание формиру­
ется при установке соответствующего бита в регистре USB_ISTR.
Биты 7:S Зарезервировано.
Бит 4 RESUME: запрос на возобновление работы Микрокон­
троллер может установить этот бит для передачи хает-компьюте­
ру сигнала Resume. В соответствии со спецификациями USB он
должен быть активирован не менее чем на 1 мс и не более чем
на 15 мс, после чего хает-компьютер готов довести последова­
тельность возобновления до конца.
Бит
3 FSUSP:
Принудительная
приостановка
Программа
должна установить этот бит при получении прерывания
SUSP,
которое выдается при отсутствии трафика на периферийном
устройстве USB в течение 3 мс.
400
О: Нет эффекта.
1: Вход в режим приостановки.
Часы
и
статическая
мощность,
рассеиваемая аналоговым
приемопередатчиком, остаются неизменными.
Если энергопотребление в режиме приостановки является
обязательным условием (устройство с питанием от шины), при­
кладное
программное
обеспечение
должно
установить
бит
LP_MODE после FSUSP, как описано ниже.
Бит 2 LP_MODE: Режим низкого энергопотребления Этот
режим используется в тех случаях, когда ограничения по энер­
гопотреблению в режиме приостановки требуют исключения
рассеивания всей статической мощности, кроме той, которая
необходима для питания внешнего подтягивающего резистора.
В это состояние следует переходить, когда приложение готово
остановить все системные часы или снизить их частоту, чтобы
удовлетворить требованиям по энергопотреблению в режиме
приостановки
USB. Активность USB
в
режиме
приостановки
(событие WKUP) асинхронно сбрасывает этот бит (он также мо­
жет быть сброшен программно).
О: Режим низкого энергопотребления отсутствует.
1: Вход в режим пониженного энергопотребления.
Бит 1 PDWN: отключение питания
Этот бит используется для полного отключения всех аналого­
вых частей, связанных с USB, если по каким-либо причинам тре­
буется полностью отключить периферийное устройство USB. Ко­
гда этот бит установлен, периферийное устройство USB отключа­
ется от приемопередатчиков и не может быть использовано.
О: Выход из режима Power Down.
1: Вход в режим отключения питания.
Бит О FRES: Force USB Reset
О: Clear USB reset.
1: Принудительный сброс периферийного устройства USB,
аналогичный сигналу RESET на USB.
Адрес Периферийное устройство USB находится в состоя­
нии RESET до тех пор, пока программа не снимет этот бит. При
401
этом генерируется прерывание
«USB-RESET», если оно разре­
шено.
Регистр состояния прерываний USB (USB_ISTR)
Смещение адреса: Ох44
15
14
13
12
11
10
СТR
~~
ERR
WКUP
SUSP
RESEТ
SOF
ESOF
,
rc:_wO
rc_wO
rc_wO
rc_'IIIO
rc_wO
rc_wO
n:_wO
DIR
EP_ID(Э.O)
Таблица 8.6 - Регистр состояния прерываний USB (USB_ISTR)
Этот регистр содержит состояние всех источников прерыва­
ний, что позволяет прикладному программному обеспечению
определить, какие события вызвали запрос прерывания.
Верхняя часть этого регистра содержит единичные биты,
каждый из которых представляет определенное событие. Эти
биты устанавливаются аппаратурой при наступлении соответ­
ствующего
события;
если
соответствующий
бит
в
регистре
USB_CNTR установлен, то генерируется общий запрос на пре­
рывание. Подпрограмма прерывания, исследуя каждый бит, вы­
полнит все необходимые действия и, наконец, очистит обслу­
живаемые биты. Если ни один из них не очищен, прерывание
считается еще не завершенным, и на линии
прерывания снова
будет поддерживаться высокий уровень. Если одновременно
установлено несколько битов, то будет сгенерировано только
одно прерывание.
Для уменьшения задержки реакции на прерывание завер­
шение транзакции конечной точки может быть обработано по­
другому. Бит CTR устанавливается аппаратурой, как только ко­
нечная точка успешно завершает транзакцию, генерируя общий
запрос
прерывания, если соответствующий
402
бит в
USB_CNTR
установлен. Условие прерывания, предназначенное для конеч­
ной точки, активизируется независимо от бита CTRM в регистре
USB_CNTR. Оба условия прерывания остаются активными до тех
пор, пока программное обеспечение не снимет бит ожидания
в соответствующем регистре USB_EPnR (бит CTR фактически яв­
ляется битом только для чтения). Для прерываний, связанных
с конечными точками, программа может использовать биты на­
правления транзакции (DIR) и EP_ID, доступные только для чте­
ния, чтобы определить, какая конечная точка сделала последний
запрос на
прерывание
и вызвала
соответствующую процедуру
обслуживания прерывания.
Пользователь может выбрать относительный приоритет од­
новременно
ожидающих событий
USB_ISTR, указав
порядок
проверки битов USB_ISTR в процедуре обслуживания прерыва­
ний. Очищаются только биты, относящиеся к событиям, которые
обслуживаются. По окончании процедуры обслуживания будет
запрошено еще одно прерывание для обслуживания оставшихся
условий.
Чтобы избежать ложной очистки некоторых битов, рекомен­
дуется очищать их инструкцией загрузки, в которой все биты,
не подлежащие изменению, записываются в 1, а все биты, под­
лежащие очистке, записываются в «О (эти биты могут быть очи­
щены только программно). Следует избегать циклов чтения-мо­
дификации-записи, так как между операциями чтения и записи
аппаратно может быть установлен другой бит, и следующая за­
пись очистит его, прежде чем микропроцессор успеет обслужить
это событие.
Бит 15 СТR: корректная передача
Этот
бит
устанавливается
аппаратурой
для
индикации
успешного завершения транзакции конечной точкой; по битам
DIR и ЕР_ID программа может определить, какая конечная точ­
ка запросила прерывание. Этот бит доступен только для чте­
ния.
Бит 14 PMAOVR: превышение/недополнение области памяти
пакетов
403
Этот бит устанавливается, если микроконтроллер не смог
своевременно ответить на запрос USВ-памяти. Периферийное
устройство
USB обрабатывает это
событие следующим обра­
зом: При приеме не отправляется квитирующий пакет АСК, при
передаче в передаваемом потоке принудительно фиксируется
ошибка
Ьit-stuff;
в обоих случаях
транзакцию. Прерывание
хост повторно
выполняет
не должно возни­
PMAOVR никогда
кать во время нормальной работы. Поскольку неудачная тран­
закция повторяется хостом, прикладное программное обеспе­
чение имеет возможность ускорить работу устройства во время
обработки этого прерывания, чтобы быть готовым к следующе­
му
повторению
транзакции;
однако
этого
не
происходит
при
изохронной передаче (изохронная транзакция в любом случае
не повторяется), что приводит к потере данных в этом случае.
Этот бит доступен для чтения/записи, но записать можно толь­
ко «О, а запись «1 не имеет никакого эффекта.
Бит 13 ERR: ошибка
Этот флаг устанавливается, если произошла одна из перечис­
ленных ниже ошибок: NANS: No ANSwer. Истек тайм-аут на полу­
чение ответа от хоста. CRC: ошибка проверки циклической избы­
точности. Один из полученных CRC, либо в маркере, либо в дан­
ных, оказался неверным. BST: Bit Stuffing error. В любом месте
PID, данных и/или CRC была обнаружена ошибка битового запол­
нения. FVIO: Framing format Violation. Был получен нестандарт­
ный кадр (ЕОР не в нужном месте, неправильная последователь­
ность маркеров и т.д.). Программное обеспечение
USB обычно
может игнорировать ошибки, поскольку периферийное устрой­
ство
USB и хост ПК управляют повторной передачей в случае
ошибок совершенно прозрачно. Это прерывание может быть по­
лезно на этапе разработки программного обеспечения или для
контроля качества передачи данных по шине USB, чтобы преду­
предить
пользователя
о
возможных
проблемах
(например,
неплотный. разъем, слишком шумная среда, обрыв проводника
в кабеле USB и т.д.). Этот бит доступен для чтения/записи, но за­
писать можно только «О, а запись «1 не имеет никакого эффекта.
404
Бит 12 WKUP: Пробуждение
Этот бит устанавливается в 1, когда в режиме приостановки
обнаруживается
активность,
пробуждающая
периферийное
устройство USB. Это событие асинхронно очищает бит LP_MODE
в регистре
CTLR и активизирует линию USB_WAKEUP, которая
может быть использована для оповещения остальных частей
устройства (например, блока пробуждения) о начале процесса
возобновления работы. Этот бит доступен для чтения/записи,
но записать можно только «О, а запись «1 не имеет никакого эф­
фекта.
Бит 11 SUSP: Запрос режима приостановки
Этот бит устанавливается аппаратурой при отсутствии тра­
фика в течение 3 мс, что указывает на запрос режима приоста­
новки с шины USB. Проверка состояния приостановки включает­
ся сразу после любого сброса USB и отключается аппаратно при
активном режиме приостановки (FSUSP=1) до окончания после­
довательности возобновления. Этот бит доступен для чтения/за­
писи, но записывать можно только «О, а запись «1 не имеет ни­
какого эффекта.
Бит 10 RESET: Запрос на сброс USB
Устанавливается, когда периферийное устройство USB обна­
руживает на своих входах активный сигнал USB RESET. В ответ
на
RESET периферийное устройство USB
просто сбрасывает
свою внутреннюю машину состояния протокола, генерируя пре­
рывание, если бит разрешения
RESETM в регистре USB_CNTR
установлен. Прием и передача запрещены до тех пор, пока бит
RESET
не
будет
сброшен.
Все
конфигурационные
регистры
не сбрасываются: микроконтроллер должен явно очистить эти
регистры (это необходимо для того, чтобы обеспечить безопас­
ную доставку прерывания RESET и завершение любой транзак­
ции, непосредственно следующей за
RESET). Регистры адреса
функции и конечной точки сбрасываются по событию сброса
USB. Этот бит доступен для чтения/записи, но записать можно
только «О, а запись «1 не имеет никакого эффекта.
Бит 9 SOF: начало кадра
405
Этот бит сигнализирует о начале нового кадра
USB и уста­
навливается, когда по шине USB поступает пакет SOF. Подпро­
грамма обслуживания прерываний может отслеживать события
SOF, чтобы иметь возможность 1 мс для синхронизации с USВ­
хостом и безопасного чтения регистра USB_FNR, который обнов­
ляется при приеме пакета SOF (это может быть полезно для изо­
хронных приложений). Этот бит доступен для чтения/записи,
но записывать можно только «О, а запись «1 не имеет никакого
эффекта.
Бит 8 ESOF: ожидаемое начало кадра Этот бит устанавлива­
ется аппаратурой, когда ожидается, но не получен пакет SOF.
Хост посылает SОF-пакет каждые мс, но если
концентратор
не получает его должным образом, таймер приостановки выдает
это прерывание. Если генерируются три последовательных пре­
рывания
ESOF (т.е. потеряны три пакета SOF) без какоголибо
трафика между ними, генерируется прерывание SUSP. Этот бит
устанавливается даже в том случае, если пропажа SОF-пакетов
произошла в то время, когда таймер приостановки еще не за­
блокирован. Этот бит доступен для чтения/записи, но записать
можно только «О, а запись «1 не имеет никакого эффекта.
Биты 7:5 Зарезервировано.
Бит 4 DIR: направление транзакции Этот бит записывается
аппаратурой в соответствии с направлением успешной транзак­
ции, породившей запрос на прерывание. Если бит
в регистре
с
DIR=O, то
USB_EPnR устанавливается бит СТR_ТХ, связанный
конечной точкой
прерывания.
Прерывающаяся транзакция
имеет тип
IN (данные, передаваемые периферийным устрой­
ством USB на хост-компьютер). Если бит DIR=1, то в регистре
USB_EPnR устанавливается бит GR_RX или оба бита CTR_TX/
GR_RX, относящиеся к конечной точке прерывания. Прерываю­
щаяся транзакция имеет тип OUT (данные, полученные перифе­
рийным устройством USB от хост-компьютера) или ожидают об­
работки две ожидающие транзакции. Эта информация может
быть использована
прикладным
программным обеспечением
для доступа к битам USB_EPnR, связанным с триггерной транзак-
406
цией, поскольку она представляет направление, в котором ожи­
дается прерывание. Данный бит доступен только для чтения.
Биты 3:0 ЕР_ID [3:0]: Идентификатор конечной точки Эти би­
ты записываются аппаратурой в соответствии с номером конеч­
ной точки, которая сформировала запрос на прерывание. Если
ожидается несколько операций с конечными точками, то аппара­
тура записывает идентификатор конечной точки, относящийся
к конечной точке с наивысшим приоритетом, который определя­
ется следующим образом: Определяются два набора конечных то­
чек в порядке приоритета: Сначала рассматриваются изохронные
конечные точки и конечные точки с двойной буферизацией, а за­
тем остальные конечные точки. Если несколько конечных точек
из одного набора запрашивают прерывание, то биты ЕР _ID в реги­
стре
USB_ISTR назначаются в соответствии с регистром самой
младшей запрашивающей конечной точки: EPOR имеет наивыс­
ший приоритет, затем EP1R и так далее. Прикладное программное
обеспечение может назначить регистр каждой конечной точке
в соответствии с этой схемой приоритетов, чтобы упорядочить
совпадающие запросы конечных точек нужным образом. Эти би­
ты доступны только для чтения.
Регистр номера кадра USB (USB_FNR)
Смещение адреса: Ох48
1S
1.е
t3
1'2
RXDP
RXDM
LСК
LSOFl1:0J
11
10
FNL10:0I
Таблица 8.7 - Регистр номера кадра USB (USB_FNR)
Бит 15 RXDP: Состояние линии «прием данных + прием Этот
бит может использоваться для наблюдения за состоянием при-
407
нимаемых данных плюс линия данных порта upstream. Он мо­
жет быть использован при выполнении процедур завершения
приостановки для определения события пробуждения.
Бит 14 RXDM: Прием данных
-
состояние линии Этот бит
может использоваться для наблюдения за состоянием принима­
емых данных за минусом линии данных порта upstream. Он мо­
жет быть использован при выполнении процедур завершения
приостановки для определения события пробуждения.
Бит 13 LCK: Заблокировано Этот бит устанавливается аппа­
ратным обеспечением, если после завершения состояния сброса
USB или после завершения последовательности возобновления
USB было получено не менее двух последовательных пакетов
SOF. После блокировки кадровый таймер остается в этом состо­
янии до тех пор, пока не произойдет событие сброса USB или
приостановки USB.
Биты 12:11 LSOF [1:0): Потерянный SOF Эти биты записыва­
ются аппаратурой при генерации прерывания ESOF, подсчиты­
вая количество последовательных потерянных SОF-пакетов. При
приеме пакета SOF эти биты очищаются.
Биты 10:О FN [10:0): Номер кадра Это битовое поле содержит
11-битовый номер кадра, содержащийся в последнем получен­
ном пакете SOF. Номер кадра увеличивается для каждого кадра,
отправленного хостом, и это полезно при изохронной передаче.
Это битовое поле обновляется при генерации прерывания SOF.
Адрес USВ-устройства (USB_DADDR)
Смещение адреса: Ох4С
15
t4
13
12
1t
10
Re98М>d
Таблица 8.8 - Адрес USВ-устройства (USB_DADDR)
408
Биты 15:8 Зарезервировано
Бит 7 EF: функция включения Этот бит устанавливается про­
граммой для включения USВ-устройства. Адрес этого устройства
содержится в следующих битах ADD
[6:0]. Если этот бит имеет
значение «О, то никакие транзакции не обрабатываются, незави­
симо от настроек регистров USB_EPnR.
Биты 6:0 ADD [6:0]: Адрес устройства Эти биты содержат ад­
рес функции
USB, назначенный хост-компьютером в процессе
Endpoint Address (Ед)
в соответствующем регистре USB_EPnR должны совпадать с ин­
перечисления. Как это поле, так и поле
формацией, содержащейся в USВтокене, для того чтобы тран­
закция была обработана до нужной конечной точки.
Адрес буферной таблицы (USB_BTABLE)
Смещение адреса: 0xS0
15
1◄
13
12
11
-
10
Таблица 8.9 - Адрес буферной таблицы (USB_BTABLE)
Биты 15:3 BTABLE [15:3]: Таблица буферов Эти биты содер­
жат начальный адрес таблицы распределения буферов в выде­
ленной пакетной памяти. Эта таблица описывает расположение
и размер буфера каждой конечной точки и должна быть выров­
нена по границе 8 байт (3 младших бита всегда равны «О). В на­
чале каждой транзакции, адресованной данному устройству, пе­
риферийное устройство
USP считывает элемент этой таблицы,
относящийся к адресуемой конечной точке, чтобы получить на­
чальное местоположение ее буфера и его размер (см. раздел
«Структура и использование пакетных буферов»).
409
Биты 2:0 Зарезервированы, аппаратно принудительно уста­
новлены в О.
РЕГИСТРЫ, СПЕЦИФИЧНЫЕ ДЛЯ КОНЕЧНЫХ
ТОЧЕК
Количество этих регистров зависит от количества конечных
точек, на которые рассчитана периферия
USB. Периферийное
устройство USB поддерживает до 8 двунаправленных конечных
точек. Каждое USВ-устрой~тво должно поддерживать управляю­
щую конечную точку, адрес которой (биты Ед) должен быть уста­
новлен в О. Периферийное устройство USB ведет себя неопре­
деленным образом, если включено несколько конечных точек,
имеющих одинаковое значение номера конечной точки. Для
каждой конечной точки имеется регистр
USB_EPnR, в котором
хранится специфическая информация о конечной точке.
Регистр конечной точки USB n (USB_EPnR), n= [0 .. 7]
Смещение адреса: от ОхОО до Ох1С
15
14
СТR_
DТOG
RX
_АХ
п::_wО
t
13
12
SТАТ _Rlq1 ,О]
11
SElVP
10
ЕР
ТVРЕ{1 ,D)
nv
rw
ЕР_
КINO
rw
~;- от~_ SТАТ _ТХ{1 :О}
R:_wO
ЕА(ЭоОJ
t
Таблица 8.10 - Регистр конечной точки USB п (USB_EPnR), п=
[0 .. 7]
Они также сбрасываются при получении USB-cбpoca с шины
USB или принудительно через бит FRES в регистре CТLR, за ис­
ключением битов CТR_RX и СТR_ТХ, которые остаются неизмен­
ными, чтобы не пропустить уведомление о корректном пакете,
сразу последовавшем за событием USB-cбpoca. Каждая конеч-
410
ная точка имеет свой регистр USB_EPnR, где п -
идентификатор
конечной точки.
Следует избегать циклов чтения-модификации-записи этих
регистров, поскольку между операциями чтения и записи неко­
торые биты могут быть установлены аппаратурой, и следующая
запись изменит их до того, как процессор успеет обнаружить это
изменение. Для этого все биты, подверженные данной пробле­
ме,
имеют «неизменное» значение,
которое должно
использо­
ваться всегда, когда их модификация не требуется. Рекомендует­
ся модифицировать эти регистры инструкцией
load, в которой
все биты, которые могут быть изменены только аппаратурой, за­
писываются со своим «неизменным» значением.
Бит
15 CТR_RX: Корректная передача на прием Этот бит
устанавливается аппаратными средствами при успешном завер­
шении транзакции OUT/SETUP на данной конечной точке; про­
граммное обеспечение может только сбросить этот бит. Если бит
CTRM в регистре USB_CNTR установлен соответствующим обра­
зом, то вместе с прерыванием, связанным с конечной точкой, ге­
нерируется общее прерывание, которое всегда активизировано.
Тип произошедшей транзакции, OUT или SETUP, можно опреде­
лить по биту SETUP, описанному ниже. Транзакция, завершивша­
яся квитированием
NAK или STALL, не устанавливает этот бит,
так как фактически данные не передаются, как, например, в слу­
чае ошибок протокола или несоответствия переключения дан­
ных. Этот бит доступен для чтения/записи, но записать можно
только «О, запись 1 не имеет эффекта.
Бит 14 DTOG_RX: Data Toggle, для передачи данных на при­
ем Если конечная точка не является изохронной, то этот бит со­
держит
ожидаемое
значение
бита
переключения
данных
(0=DATA0, l=DATAl) для следующего принимаемого пакета дан­
ных. Аппаратные средства переключают этот бит, когда хосту
USB посылается квитирование АСК после приема пакета данных
с соответствующим значением PID данных; если конечная точка
определена как управляющая, то аппаратные средства очищают
этот бит при приеме
PID SETUP, адресованного этой конечной
411
точке. Если конечная точка использует функцию двойной буфе­
ризации, то этот бит также используется для поддержки замены
буферов пакетов. Если конечная точка является изохронной, то
этот бит используется только для поддержки замены буфера па­
кетов, так
как для
такого типа
конечных точек
переключение
данных не используется и передается только пакет DATA0. Аппа­
ратные средства переключают этот бит сразу после окончания
приема
пакета данных, поскольку при изохронной
передаче
не используется квитирование. Этот бит также может быть пере­
ключен
программным
обеспечением для
инициализации
его
значения (обязательно, если конечная точка не является управ­
ляющей) или для принудительного переключения данных/ис­
пользования пакетного буфера. Если прикладное программное
обеспечение записывает «О, значение DTOG_RX остается неиз­
менным, в то время как запись «1 приводит к переключению
значения бита. Этот бит доступен для чтения/записи, но пере­
ключить его можно только путем записи 1.
Биты
13:12 STAT_RX [1:0]: Биты состояния, для передачи
на прием Эти биты содержат информацию о состоянии конечной
точки, которая перечислена в табл. 7.11 Эти биты могут быть пе­
реключены программно для инициализации их значения. Если
прикладное программное обеспечение записывает «О», то зна­
чение остается неизменным, а при записи «1» значение бита пе­
реключается. Аппаратные средства устанавливают биты STAT_RX
в NAK, когда произошла корректная передача (CTR_RX=1), соот­
ветствующая транзакции
OUT или SETUP (только управление),
адресованной этой конечной точке, так что у программного
обеспечения есть время для обработки полученных данных пе­
ред квитированием новой транзакции Оконечные точки с двой­
ной буферизацией реализуют специальное управление потоком
транзакций,
которое
контролирует состояние
в
зависимости
от состояния доступности буфера. Если конечная точка опреде­
лена как lsochronous, то ее статус может быть только «VALID»
или
«DISABLED», так что аппаратные средства не могут изме­
нить статус конечной точки после успешной транзакции. Если
412
программа устанавливает биты
STAT_RX в состояние «STALL»
или «NAK» для изохронной конечной точки, то поведение пери­
ферийного устройства
для
чтения/записи,
но
USB не определено. Эти биты доступны
переключить
их
можно только запи­
сью «1».
Бит 11 SETUP: операция установки завершена
Этот бит доступен только для чтения и устанавливается ап­
паратурой, когда последней завершенной транзакцией является
SETUP. Этот бит изменяет свое значение только для управляю­
щих конечных точек. В случае успешной транзакции приема (со­
бытие CTR_RX) он должен быть проверен для определения типа
прошедшей транзакции. Для защиты программы обслуживания
прерываний от изменений битов SETUP, связанных с очередны­
ми входящими маркерами, этот бит остается «замороженным»,
пока бит CTR_RX равен 1; его состояние меняется, когда CТR_RX
равен О. Этот бит доступен только для чтения.
Биты 10:9 ЕР_ТУРЕ [1:0]: Тип конечной точки Эти биты опре­
деляют поведение данной конечной точки, как описано в табл.
7.12. Конечная точка О всегда должна быть управляющей, и каж­
дая функция USB должна иметь хотя бы одну управляющую ко­
нечную точку, имеющую адрес О, но при необходимости могут
быть и другие управляющие конечные точки. Только управляю­
щие конечные точки обрабатывают транзакции SETUP, которые
игнорируются конечными точками других типов. На транзакции
SETUP нельзя ответить NAK или STALL. Если конечная точка
управления определена как NAK, то при получении транзакции
SETUP периферийное устройство USB не будет отвечать на нее,
имитируя ошибку приема в направлении приема. Если управля­
ющая конечная точка определена как STALL в направлении при­
ема, то пакет SETUP все равно будет принят, переданы данные
и выдано прерывание CTR. Прием транзакций OUT обрабатыва­
ется обычным
образом, даже если
конечная точка является
управляющей. Конечные точки Bulk и interrupt имеют очень схо­
жее поведение и отличаются только специальной возможностью,
доступной с помощью конфигурационного бита ЕР _KIND.
413
Бит 8 ЕР _КIND: тип конечной точки Значение этого бита за­
висит от типа
конечной точки, сконфигурированного битами
ЕР_ТУРЕ. В табл. 7.13 приведены различные значения. DBL_BUF:
бит
Этот
устанавливается
программным
обеспечением
для
включения функции двойной буферизации для данной конеч­
ной точки массового обмена. Использование оконечных точек
с двойной буферизацией описано в разделе STATUS_OUT: Этот
бит устанавливается программным обеспечением для указания
на то,
что
ожидается
транзакция
выхода
из
состояния:
в
этом
случае на все транзакции OUT, содержащие более нулевого бай­
та данных, вместо ответа «АСК» выдается ответ «STALL». Этот
бит может быть использован для повышения устойчивости при­
ложения к ошибкам протокола при передаче управления, и его
использование предназначено только для управляющих конеч­
ных точек. Когда
STATUS_OUT сброшен, транзакции OUT могут
содержать любое количество байт, если это необходимо.
Бит 7 СТR_ТХ: Корректная передача для передачи Этот бит
устанавливается аппаратными средствами при успешном завер­
IN на данной конечной точке; программное
обеспечение может только сбросить этот бит. Если бит CTRM
в регистре USB_CNTR установлен соответствующим образом, то
шении транзакции
вместе с условием прерывания, связанным с конечной точкой,
генерируется общее условие прерывания, которое всегда акти­
Транзакция, завершившаяся квитированием NAK
STALL, не устанавливает этот бит, так как фактически дан­
визируется.
или
ные не передаются, как, например, в случае ошибок протокола
или несоответствия переключения данных. Этот бит доступен
для чтения/записи, но записать можно только «О».
Бит 6 DTOG_ТX: Data Toggle, для передачи данных Если ко­
нечная точка неизохронная, то этот бит содержит необходимое
значение бита переключения данных
(0=DATA0, 1=DATA1) для
передачи следующего пакета данных. Аппаратно этот бит пере­
ключается при получении квитирования АСК от USB-xocтa по­
сле передачи пакета данных. Если конечная точка определена
как управляющая, то при получении
414
SETUP PID, адресованного
этой конечной точке, аппаратные средства устанавливают этот
бит в 1. Если конечная точка использует функцию двойного бу­
фера, то этот бит также используется для поддержки замены
буферов пакетов. Если конечная точка является изохронной, то
этот бит используется для поддержки замены буфера пакетов,
поскольку для такого типа конечных точек не используется пе­
реключение данных и передается только пакет DATA0. Аппарат­
но этот бит переключается сразу после окончания передачи
пакета данных, так как при изохронной передаче не использу­
ется квитирование. Этот бит также может быть переключен
программным обеспечением для инициализации его значения
(обязательно, если конечная точка не является управляющей)
или для принудительного переключения данных/использования
буфера пакетов. Если прикладное программное обеспечение
записывает «О, то значение
DTOG_TX
остается
неизменным,
а при записи «1 значение бита переключается. Этот бит досту­
пен для чтения/записи, но переключить его можно только пу­
тем записи 1.
Биты
5:4
SТАТ_ТХ
[1:0]:
Биты
состояния, для
передачи
данных Эти биты содержат информацию о состоянии конеч­
ной точки, перечисленную в табл.
7.14. Эти биты могут быть
переключены программным обеспечением для инициализации
их значения. Если прикладное программное обеспечение за­
писывает «О», то значение остается неизменным, а при записи
«1» значение бита переключается. Аппаратные средства уста­
навливают биты STAT_ТХ в NAK, когда произошла корректная
передача (CTR_ТХ=1), соответствующая транзакции IN или
SETUP (только управление), адресованной данной конечной
точке.
Затем
она
ожидает,
пока
программное
обеспечение
подготовит следующий набор данных для передачи. Конечные
точки массового обмена с двойной буферизацией реализуют
специальное управление потоком транзакций, которое контро­
лирует состояние в зависимости от состояния доступности бу­
фера. Если конечная точка определена как
статус может быть только
lsochronous, то ее
«VALID» или «DISABLED». Поэтому
415
аппаратные средства не могут изменить статус конечной точ­
ки после успешной транзакции. Если программное обеспече­
ние
устанавливает биты STAT_ТХ в значения «STALL» или
«NAK» для изохронной конечной точки, то поведение перифе­
рийного устройства USB не определено. Эти биты доступны
для
чтения/записи,
но
переключить
их
можно только
запи­
сью «1».
Биты 3:0 ЕА [3:0]: Адрес конечной точки Программа должна
записать в это поле 4-битный адрес, используемый для иденти­
фикации транзакций, направленных на данную конечную точку.
Значение должно быть записано перед включением соответ­
ствующей конечной точки.
STAT_RX[1 :О]
00
01
Meanlng
DISABLED: all reception requests addressed to this endpoint are ignored.
SТALL: the endpoint is stalled and all reception requests result in а STALL
handshake.
10
NAK: the endpoint is naked and all receplion requests result in а NAK handshake.
11
VALID: lhis endpoinl is enaЫed for reception.
Таблица 8.11 -
Кодирование состояния приема
ЕР _ТУРЕ[1:О]
Meanlng
00
BULK
01
CONTROL
10
ISO
11
INTERRUPT
Таблица 8.12 -
Кодировка типа конечной точки
416
ЕР_ТУРЕ[1 :О]
ЕР _КIND Mнnlng
00
BULK
DBLBUF
01
CONТROL
STATUS_OUТ
10
ISO
Notused
11
INTERRUPТ
Notused
Таблица 8.13 - Значение вида конечной точки
SТАТ_ТХ[1 :О]
Mнnlng
00
DISABLED: all transmission requests addressed to this endpoint are ignored.
01
STALL: the endpoint is stalled and all transmission requests resun in а STALL
handshake.
10
NAK: the endpoint is naked and all transmission requests result in а NAK
handshake.
11
VAUD: this endpoint is enaЫed lor transmission.
Таблица 8.14 -
Кодировка состояния передачи
ТАБЛИЦА ДЕСКРИПТОРОВ БУФЕРОВ
Хотя таблица дескрипторов буферов находится внутри бу­
ферной памяти пакетов, ее записи можно рассматривать как до­
полнительные регистры, используемые для настройки располо­
жения и размера буферов пакетов, используемых для обмена
данными между макроячейкой
USB и STM32F10xxx. В связи
с общим ограничением моста АРВ на адресацию слов, доступ ко
всем ячейкам пакетной памяти осуществляется по 32-битным
выровненным адресам, а
мым
периферийным
не по реальным адресам, используе­
устройством
USB
USB_BTABLE и таблицы описания буферов.
417
для
регистров
На следующих страницах приводятся два адреса расположе­
ния: тот, который будет использоваться прикладным программ­
ным обеспечением при обращении к пакетной памяти, и локаль­
ный, связанный с доступом к периферийным устройствам
Для
получения
правильного
значения
адреса
USB.
памяти
STM32F10xxx, которое будет использоваться прикладным про­
граммным обеспечением при обращении к пакетной памяти,
фактический адрес ячейки памяти необходимо умножить на два.
Первая ячейка пакетной памяти расположена по адресу Ох4000
6000. Запись таблицы дескрипторов буфера, связанная с реги­
страми USB_EPnR, описана ниже.
Подробное описание пакетных буферов и использования
таблицы дескрипторов буферов можно найти в разделе Структу­
ра и использование пакетных буферов.
ДДРЕС БУФЕРА ПЕРЕДАЧИ N (USB_ADDRN_тX)
Смещение адреса: [USB_BTABLE] + п*16
Локальный адрес USB: [USB_BTABLE] + п*8
15
14
13
12
11
10
Таблица 8.15 - Адрес буфера передачи п (USB_ADDRn_ТХ)
Биты 15:1 ADDRn_ТX (15:1]: Адрес буфера передачи Эти би­
ты указывают на начальный адрес пакетного буфера, содержа­
щего данные, которые должны быть переданы конечной точкой,
связанной с регистром
USB_EPnR, при следующем обращении
к ней маркера IN.
Бит О: Должен быть всегда записан как «О, так как память
418
пакетов имеет ширину слова и все буферы пакетов должны быть
выровнены по словам.
СЧЕТЧИК БАЙТОВ ПЕРЕдАЧИ N
(USB_COUNTN_ТХ)
Смещение адреса: [USB_BTABLE] + п*16 +4
Локальный адрес USB: [USB_BTABLE] + п*8 +2
15
14
13
12
11
10
9
Аеимd
Таблица 8.16 - Счетчик байтов передачи п (USB_COUNTn_TX)
Биты 15:10 Эти биты не используются, так как размер паке­
та ограничен спецификациями USB 1023 байтами. Их значение
не учитывается периферийным устройством USB.
Биты 9:0 COUNTn_ТХ (9:0): Счетчик байтов передачи Эти би­
ты содержат количество байт, которые должны быть переданы
конечной точкой, связанной с регистром USB_EPnR, при следую­
щем адресованном ей маркере IN.
Примечание: Оконечные
точки
с двойной
буферизацией
и изохронным входом имеют два регистра USB_COUNTn_ТX:
с именами
USB_COUNTn_TX_1 и USB_COUNTn_ТX_0 со следую­
щим содержанием.
Примечание: Оконечные
и
изохронным входом
точки
с двойной
имеют два регистра
буферизацией
USB_COUNTn_TX:
с именами USB_COUNTn_ТX_1 и USB_COUNTn_TX_0 со следую­
щим содержанием.
419
31
15
зо
1•
-
29
13
28
27
26
24
25
22
23
21
20
19
17
18
16
.. .. "' .., .. "' .. .. "'
.. .. .. .. "'
"' "' "' "'
COUNTn_тх_ 119:0]
12
11
1D
"' 1
1
1
1
1
1
1
1
1
1
COUNТn_TJ(.0(9<1]
-wd
1
1
1
1
1
1
1W
Таблица 8.17 - Счетчик байтов передачи п (USB_COUNT0
(1) _Т)()
ДДРЕС БУФЕРА ПРИЕМА (USB_ADDRN_RX)
Смещение адреса: [USB_BTABLE] + п*16 +8
Локальный адрес USB: [USB_BTABLE] + п*8 +4
15
14
13
12
11
10
9
Таблица 8.18 - Адрес буфера приема п (USB_ADDRn_RX)
Биты 15:1 ADDRn_RX [15:1): Адрес буфера приема Эти биты
указывают на начальный адрес пакетного буфера, который бу­
дет содержать данные, полученные конечной точкой, связанной
с регистром USB_EPnR, при следующем обращении к ней марке­
ра OUT/SETUP.
Бит О:Этот бит всегда должен быть записан как «О», посколь­
ку память пакетов имеет размер в одно слово и все буферы па­
кетов должны быть выровнены по словам.
420
СЧЕТЧИК БАЙТОВ ПРИЕМА N (USB_COUNTN_RX)
Смещение адреса: [USB_BTABLE) + n*16 +12
Локальный адрес USB: [USB_BTABLE] + n*8 +6
15
14
ВLSIZE
13
12
11
10
COUNTn_RX{t:OJ
NUM_ВI.OCК{4<>J
Таблица 8.19 - Счетчик байтов приема n (USB_COUNTn_RX)
Это место в таблице используется для хранения двух раз­
личных значений, оба из которых необходимы при приеме па­
кетов. Старшие биты содержат определение размера выделен­
ного
буфера,
что
позволяет
обнаружить
его
переполнение,
а младшая часть этого места записывается обратно периферий­
ным устройством USB по окончании приема для получения фак­
тического количества принятых байт. В связи с ограничениями
на количество доступных бит размер буфера представляется
в виде количества выделенных блоков памяти, причем размер
блока может быть выбран для выбора компромисса между мел­
козернистостью/малым
буфером
и
крупнозернистостью/боль­
шим буфером. Размер выделяемого буфера является частью де­
скриптора конечной точки и обычно определяется в процессе
перечисления
в
соответствии
со
значением
ее
параметра
maxPacketSize (см. «Спецификацию универсальной последова­
тельной шины»).
Бит 15 BL_SIZE: размер блока
Этот бит выбирает размер блока памяти, используемого для
определения выделенной буферной области.
-
Если BL_SIZE=0, то блок памяти имеет размер 2 байта, что
является минимально допустимым размером блока в памяти ти-
421
word-wide. При таком размере блока размер выделяемого
па
буфера составляет от 2 до 62 байт.
-
Если
BL_SIZE=1, то блок памяти имеетразмер 32 байта,
что позволяет достичь максимальной длины пакета, определен­
ной спецификациями USB. При таком размере блока размер вы­
деляемого буфера варьируется от 32 до 1024 байт, что является
наибольшим размером пакета, допускаемым спецификациями
стандарта USB.
Биты 14:10 NUM_BLDCK [4:0]: Количество блоков
Эти биты определяют количество блоков памяти, выделен­
ных данному пакетному буферу. Фактический объем выделяе­
зависит
памяти
мой
от
значения
как
BL_SIZE,
показано
в табл. 177.
Биты 9:0 COUNTn_RX [9:0]: Счетчик принятых байтов
Эти биты содержат количество байт, принятых конечной точ­
связанной с
кой,
регистром
USB_EPnR,
во
время
последней
транзакции OUT/SETUP, адресованной ей.
с двойной
Примечание: Оконечные точки
и
изохронным
входом
имеют два
буферизацией
регистра
USB_COUNTn_TX:
с именами USB_COUNTn_TX_1 и USB_COUNTn_TX_0 со следую­
щим содержанием.
31
ЭО
ВLSIZE
28
27
28
2S
24
23
1-4
13
12
11
22
21
20
COUNТn_RX.~119 О)
NUM_ВLOCK_ 1\4,0}
1
15
29
10
BLSIZE
-•
COUNTn_RX_0(9:0)
Таблица 8.20 -
USB_COUNTn_RX
422
19
18
17
16
Valueof
NUM_BLOCK[4:0]
Мemory allocated
when BLSIZE..O
Memory alloc8t8cl
when BL_SIZEc1
0('00000)
Notallowed
32 Ьytes
1 ('00001)
2 Ьytes
64 Ьytes
2 ('00010)
4 Ьytes
96 Ьytes
3 ('00011)
6Ьytes
128 Ьytes
...
...
...
15 ('01111)
30 Ьytes
512 bytes
16 ('10000)
32 Ьytes
N/A
17('10001)
34 Ьytes
N/A
18('10010)
36 Ьytes
NIA
...
...
.. .
ЭО ('11110)
60 Ьytes
N/A
31 ('11111)
62 Ьytes
N/A
Таблица 8.21 - Определение выделенной буферной памяти
КАРТА РЕГИСТРОВ USB
423
В таблице ниже приведена карта регистров USB и значения
сброса.
Olfsel
0,,00
Reglster
USB_EPOR
"-lv;,t,11$
"'°"
USB_EP 1R
кeselW!lue
""""
о,ос
USB_EP2A
•~ue
U S B_EPЗR
~,,aue
0.10
USB_EP4R
v.aiue
меsе
Q,:14
USB_EP5R
,,.,,..,,vв1ue
0,18
О.1С
USB_EP6A
.....
USB_ EP7R
;;; l!i!IIOIii! I!. 1~llQ I11; 1!:з 1~loil!i:I~ 1~1t::I :о ~ ~ ~~ ~~m "' .... ''" " .., ..,H~l 0
щ ~\ SТАТ_ о. ЕР 11 ~ <!3~1 SТАТ
ТХ АХ
;z' а:'
i: ~ 1'"'1 ш ; ~ .....
~ 11,01
Ао,емхl
--
о
АХ
о
ох•с
010 1о I о I о I о
SТА'Т_
1о I о
ЕА/3:0I
~· ь "
010 'о
О
о
01010 , о I о I о I о
11 ~ ~ 1 STAT_
АХ
Ь 15
u
ih u
u 1u
u
u
u
х ~ STAT_ О.
а:, ' АХ
а:
8 11<>1
о
о
t; ь
u 'u
ЕР
u
8
$ ~: ..... 8
", а:'
"'()
1о I о 01010
о.
11-01
() ь
u u 1u
u
u1u
ЕА!Э"'I
u ,u
в ~ 1 STAT_
тх
о
о
~~ SТАТ_
:, ТУРЕ § ~
АХ
i:
"
ЕР
~
u
u 'u
u
ЕА{З:ОJ
{1:0j
~ 1
STAT_
"
u Iu
ЕА/3.0I
u 1U
о.
ЕР
SJ ~ ~ 1 STAT_
~~ STAT_
АХ
~ ТУРЕ " а!
11,01 V, {1:0) &'
f:( ) ~
u § 1~1
"
u
х
а:
u
u
u
i§
АХ
11<>1
()"
u
u
u
х
... STAT_ '!;
u 1u
u
A.,.NOd
ь ~
u
u
1
u
u
u 1U
ЕР
U
u
1u
u
u
u
"
u
I u
ЕА{Э-01
11<>1
u Iu
u
1
u
..., ~, s~1-
..... §
"'u
u
u
U I U
u
u I u
"х
~ ТУРЕ ~
' а:
11"1 ~ 11<>1
АХ
u 1u
u
U
ЕА/З.0I
s ~:~ fti ь 12" тх
х ~ STAT_ о.
~ 81
"
~ 1 STAT_
"~
~ а!
u 1u
ЕР
u Iu
"01010 0101010
!jj 11соI &1t; § 1~1
u
u
u iu
u
"
u
ЕА/3.01
11,01
u
u
1
u
u
u I u
А....-
US B_ CNТR
USB _ISТR
USB_FNR
" "i!: i!:" "~
~ а:
.....
,
USB_BTABLE
~-"'""
а::,
i!: "' ~ "'11! ii!"'
u
u 1u
!
u
u
u
.....
"'"'
1:
Reseмd
.. " "g LSOF
""
1101
u
1о
х
() i!:
-
w ~
u
u 1u
х
х
о
о
а:
u Iu
~ ~ :, "' ~ ~
а...-
-
1~1~1;~ 1: з
t; ~ а:" ~ ~ ~ ii! Ae,en,ed ~~~о. 1Е
А-
U S8_DADOR
vaue
o.so
О
~i
а!
"' тх
~ s' (1:0J ~~ ~~е
{1 :0J "', 1Е 12 11,01
~,,..,.
.,,.
о
х ~ STAT_
---
°""
0,44
о
ЕР
:, ТУРЕ
u"
nuse vaue
0,40
1о I о 01010 1О
~ ~ SТАТ_ о.
i §! 11,01 Ш 1101 11;z ~ R 1~1
-
u=
о
ЕА/3.0I
"'u
u"
u
"'[j! ii!"'
u
u1u
а:
Aeserved ёi
u
ЕР _ID(З:O)
u 1 u u u 1u
u1u
Ft(I00I
а:
о I о
Iх
х
'1'
'(Х
U
ВТАВLЕ(15:З]
111:1•1•
ADDf6<>1
EF
UIU
UIU
U
1-
010101010 01010 0101010101
Таблица 8.22 - Карта регистров USB и значения сброса
Далее тема по USB в книге продолжается.
424
UIU
ПРИМЕР РАБОТЫ С USB-CDC
ПРОЕКТ ПО ВЫВОДУ ИНФОРМАЦИИ ЧЕРЕЗ
UART ИНТЕРФЕЙСА USB
Исходники проекта, как и все другие исходники, приведе­
ны в:
https://github.com/nr-electronics/Mastering-STM32-on-yourown-2/tree/main/USB_COM_PORT_F103
Данный проект написан на другой библиотеке для ускоре­
ния создания примера работы с главой книги по USB, он также
проверен
и
необходимо
работоспособен.
комплектный
После
белый
программирования
кабель
Туре-С
МК
отключить
от платы BLue Kit и подключить непосредственно к разъему USB
Туре-С платки BluePiLL+. После это на вашем персональном ком­
пьютере,
в
диспетчере
устройств,
появиться
устройство
как
на рисунке ниже:
1 STMicroelectronics Virtual СОМ Port (СОМ )
Рисунок А -
Как должно выглядеть устройство в ПК
Номер СОМ-порта будет у всех читателей разным, поэтому
естественно его не привожу. Затем необходимо на ПК включить
терминальную программу и подключить на номер вашего порта,
то в нем появятся сообщения:
425
СОМ'IЗ 9600 Ьрs, 8N 1, без уrравл. ГIОТОКО/1
Hello V-✓orld from USB CDC
Hello World from USB СОС
Hello World from USB СОС
Hello World from USB СОС
Hello World from USB СОС
Hello World from USB СОС
Hello Warld from USB СОС
Hello World fram USB СОС
Рисунок Б -
Подтверждение работоспособности USB CDC
426
ГЛАВА 8.2 ПОЛНОСКОРОСТНОЙ
USB-ПOPT (OTG_FS)
Введение OTG_FS
OTG_FS - это контроллер с двойной ролью устройства (DRD),
поддерживающий функции как устройства, так и хоста и полно­
стью соответствующий дополнению On-The-Go Supplement к спе­
цификации USB 2.0. Он также может быть сконфигурирован как
контроллер только для хоста или только для устройства, что пол­
ностью соответствует спецификации
USB 2.0. В режиме хоста
OTG_FS поддерживает полноскоростную (FS, 12 Мбит/с) и низко­
скоростную (LS, 1,5 Мбит/с) передачу данных, а в режиме устрой­
ства - только полноскоростную (FS, 12 Мбит/с). OTG_FS поддер­
живает как HNP, так и SRP. Единственное внешнее устройство, ко­
торое требуется - это накачка заряда для VBUS в режиме хоста.
ОСНОВНЫЕ ВОЗМОЖНОСТИ OTG_FS
Основные функции можно разделить на три категории: об­
щие, функции режима хоста и функции режима устройства.
ОБЩИЕ ХАРАКТЕРИСТИКИ
Общие характеристики интерфейса OTG_FS следующие:
• Он сертифицирован по стандарту USB-IF в соответствии
со
спецификацией
Rev 2.0
• Он
универсальной
последовательной
шины
включает полную поддержку (РНУ) дополнительного
протокола On-The-Go (OTG), подробно описанного в специфика­
ции On-The-Go Supplement Rev 1.3.
427
-
Интегрированная
поддержка
А-В
идентификации
устройств (ID-линия)
- Интегрированная поддержка протоколов Host Negotiation
Protocol (HNP) и Session Request Protocol (SRP)
- Он позволяет хосту отключать VBUS для экономии заряда
батареи в приложениях OTG
- Поддерживается ОТG-мониторинг уровней VBUS с помо­
щью внутренних компараторов
-
Поддерживается
динамическое
переключение
ролей
«хает-периферия».
• Он программно конфигурируется для работы в качестве:
- Периферийное устройство USB FS с поддержкой SRP (Вустройство)
- USB FS/LS-xocт с поддержкой SRP (А-устройство)
- Полноскоростное двухролевое устройство USB On-The-Go
• Он поддерживает FS SOF и LS Keep-alives с
- Подключение SОF-импульса PAD (OTG_FS_SOF)
- Внутреннее подключение импульса SOF к таймеру2 (ТIМ2)
- Настраиваемый период кадрирования
- Конфигурируемое прерывание по окончанию кадра
• В нем реализованы такие функции энергосбережения, как
остановка системы при USB Suspend, отключение тактовых доме­
нов внутри цифрового ядра, управление питанием РНУ и DFIFO
• Он оснащен выделенной оперативной памятью объемом
1,25 Кбайт с расширенным управлением FIFO:
- Конфигурируемое разделение пространства оперативной
памяти на различные FIFO для гибкого и эффективного исполь­
зования оперативной памяти
- Каждый FIFO может содержать несколько пакетов
- Динамическое распределение памяти
- Конфигурируемые размеры FIFO, которые не являются коэффициентами 2, что позволяет использовать смежные области
памяти
• Он гарантирует максимальную пропускную способность
USB в течение одного кадра (1 мс) без вмешательства системы
428
ФУНКЦИИ РЕЖИМА ХОСТА
Основные
характеристики
и
требования
к
интерфейсу
OTG_FS в режиме хоста следующие:
• Внешний зарядовый насос для формирования напряжения
VBUS.
• До 8 хост-каналов (pipe): каждый канал динамически ре­
конфигурируется для выделения любого типа USВ-передачи.
• Встроенный аппаратный планировщик холдинга:
- До 8 запросов на прерывание плюс изохронная переда­
ча в периодической аппаратной очереди
- До 8 запросов
на
управление
и
массовую
передачу
в непериодической аппаратной очереди
• Управление
общим
RX FIFO, периодическим ТХ FIFO
FIFO для эффективного использования
оперативной памяти данных USB
и непериодическим ТХ
ВОЗМОЖНОСТИ ПЕРИФЕРИЙНОГО РЕЖИМА
Основные возможности интерфейса
OTG_FS в периферий­
ном режиме заключаются в следующем:
• 1 конечная точка двунаправленного управленияО
• 3 конечные точки IN (ЕР), конфигурируемые для поддерж­
ки массовых, прерывистых или изохронных передач
• 3 конечных точки OUT, конфигурируемые для поддержки
массовых, прерывистых или изохронных передач
• Управление общими Rx FIFO и Tx-OUT FIFO для эффектив­
ного использования оперативной памяти данных USB
• Управление
до
на каждый активный
4 выделенных Tx-lN FIFO (по одному
IN ЕР) для снижения нагрузки на прило­
жение
• Поддержка функции плавного отключения.
429
ФУНКЦИОНАЛЬНОЕ ОПИСАНИЕ OTG_FS
Cortex~ core
·-0 0TG_FS_DP
0TG
FS
РНУ
·-О 0TG_FS_DM
O0TG_FS_ID
-0 0TG_FS_VBUS
Universa1 serial bus
-0 0TG_FS _ S0F
1.25 Kbyte
USB data
FIF0s
Рисунок 8.3 -
Имя сигнала
OTG_FS_DP
Блок-схема полноскоростного OTG
Тип сигнала
Цифровой
Описание
Линия USB OTG D+
вхоа/выход
OTG_FS_DM
Цифровой
Линия D- USB OTG
вхойlвыход
OTG_FS_ID
Цифровой вход
OTG_FS_VBUS
Аналоговый вход
USBOTGVВUS
OTG_FS_SOF
Цифровой выход
USB OTG Star1 Of Frame (видимость)
USBOTG 1D
Таблица 8.23 - Входные/выходные контакты OTG_FS
430
ПОЛНОСКОРОСТНОЕ ЯДРО OTG
USB OTG FS получает тактовую частоту 48 МГц ±0,25%
и тактового генератора (RCC) через
внешний кварц. Тактовый генератор USB используется для
управления доменом 48 МГц на полной скорости (12 Мбит/с)
и должен быть включен перед конфигурированием ядра OTG FS.
от контроллера сброса
Центральный процессор осуществляет чтение и запись из/
в регистры ядра OTG FS через периферийную шину АНВ. О со­
бытиях
USB
прерывания
он
информируется
через
в
линию
Прерывания
Центральный процессор передает данные по
USB, записы­
OTG,
описанную
единственную
разделе
USB
OTG_FS.
вая 32-разрядные слова в специальные места OTG_FS (рush-ре­
гистры). Затем данные автоматически сохраняются
в
Tx-data
FIFO, сконфигурированных в ОЗУ данных USB. На каждую точку
входа (периферийный режим) или выхода (хост-режим) прихо­
дится по одному регистру Tx-FIFO push.
Центральный процессор получает данные от USB, считывая
32-разрядные слова из выделенных адресов OTG_FS (рор-реги­
стры). Затем данные автоматически извлекаются из общего Rx-
FIFO, сконфигурированного в 1,25 КБ ОЗУ данных USB.
На каждую конечную точку или входной канал приходится
по одному регистру Rx-FIFO.
Протокольный уровень USB управляется движком последо­
вательного интерфейса
(SIE) и сериализуется по USB модулем
полноскоростного/низкоскоростного приемопередатчика в со­
ставе физического уровня (РНУ) микросхемы.
ПОЛНОСКОРОСТНОЙ OTG РНУ
Встроенный полноскоростной OTG РНУ управляется ядром
OTG FS и передает сигналы управления и данных USB через
полноскоростное подмножество шины UTMI+ (UTMIFS). Он обес­
печивает физическую поддержку USВ-соединения.
431
Полноскоростной OTG РНУ включает в себя следующие ком­
поненты:
• Модуль приемопередатчика FS/LS используется как хо­
стом, так и устройством. Он непосредственно управляет переда­
чей и приемом по односторонним линиям USB.
• интегрированный подтягивающий резистор 1D, используе­
мый для выборки линии 1D для идентификации устройств д/В.
• Встроенные резисторы подтяжки и отвода DP/DM управля­
ются ядром OTG_FS в зависимости от текущей роли устройства.
В качестве периферийного устройства он включает подтягиваю­
щий резистор DP для подачи сигнала на полноскоростные пери­
ферийные соединения, как только VBUS принимает допустимый
уровень (B-session vatid). В режиме хоста подтягивающие рези­
сторы включены на обоих DP/DM. Подтягивающие и подтягивае­
мые резисторы динамически переключаются при изменении ро­
ли устройства через протокол согласования с хостом (HNP).
• Схема ECN с подтягивающим/опускающим резистором.
Подтяжка DP состоит из двух резисторов, управляемых отдельно
от OTG_FS в соответствии с Инженерным уведомлением об из­
менении резисторов, применяемым в USB Rev2.0. Динамическая
регулировка силы подтяжки DP позволяет улучшить подавление
шумов и качество сигнала Tx/Rx.
• Компараторы VBUS с гистерезисом используются для опре­
деления пороговых значений напряжения VBUS Vatid, А-В
Session Vatid и напряжения окончания сеанса. Они используются
для управления протоколом запроса сеанса (SRP), обнаружения
допустимых условий запуска и завершения сеанса, а также для
постоянного контроля напряжения питания VBUS во время рабо­
ты USB.
• Схема импульсного метода VBUS, используемая для заряд­
VBUS через резисторы во время SRP (слабый
ки/разрядки
драйв).
432
VDO
--
5B-voo
реrумтор
1+--
наnnаwения
IWD
SТМЗ2 MCU
EN
GPIO
GPIO+IRQ
STMPS2141STR
a..no.mn.
Пере,руз!(Q
распределения
5BPwr
f--------+
питания с
токат
vвus
Рд9
OSC_OUT
cn
<(
DМ
РА11
OSC_IN
-
DP
РА12
2
u
.Е
cn
(/)
1D
РА10
::,
~
""" ..,
а,
---
...L~
~
Рисунок 8.4 - Подключение устройства OTG А-В
Примечание для рисунка:
1. Внешний стабилизатор напряжения необходим только при
создании устройства с питанием от шины VBUS
2. STMPS2141STR необходим только в том случае, если при­
ложение должно поддерживать устройство с питанием от шины
VBUS. При наличии 5 В на плате приложения можно использо­
вать базовый выключатель питания.
ОБНАРУЖЕНИЕ ЛИНИИ ИДЕНТИФИКАЦИИ
Роль хоста или периферийного устройства (по умолчанию)
принимается в зависимости от состояния входного вывода 1D
(OTG_FS_ID). Состояние линии 1D определяется при подключении
USB в зависимости от того, какой стороной USB- кабель подклю­
чен к розетке micro-AB.
• Если к стороне В кабеля USB подключен провод с плаваю­
щим идентификатором, то встроенный подтягивающий резистор
обнаруживает высокий уровень идентификатора и подтвержда-
433
ет роль периферийного устройства по умолчанию. В такой кон­
OTG_FS соответствует стандартной FSM, описанной
On-The-Go
Specification Rev1.3, дополняющей USB2.0.
• Если к стороне А USВ-кабеля подключен заземленный
идентификатор, то OTG_FS выдает прерывание изменения состо­
яния линии идентификатора (бит CIDSCHG в OTG_FS_GINTSTS)
фигурации
в разделе 6.8.2: On-The-Go B-device» спецификации
для инициализации хает-программного обеспечения и автома­
тически переключается на роль хоста. В данной конфигурации
OTG_FS соответствует стандартной FSM, описанной в разделе
6.8.1: On-The-Go А-устройство спецификации On-The-Go
Specification Rev1.3 дополнения к USB2.0.
УСТРОЙСТВО ДВОЙНОЙ РОЛИ HNP
Бит HNP сараЫе в глобальном регистре конфигурации
USB
(бит HNPCAP в OTG_FS_ GUSBCFG) позволяет ядру OTG_FS дина­
мически менять свою роль с А- хоста на А-периферию и наобо­
рот, или с В-периферии на В-хает и наоборот в соответствии
с протоколом согласования с хостом
устройства
можно
считать
по
(HNP). Текущее состояние
суммарным
значениям
бита
Connector 1D Status в глобальном регистре управления и состоя­
ния OTG (бит CIDSTS в OTG_FS_GOTGCTL) и бита Current Mode
of Operation в глобальном регистре прерываний и состояния
(бит CMOD в OTG_FS_GINTSTS). Программная модель HNP по­
дробно описана в разделе: Модель программирования OTG_FS.
УСТРОЙСТВО ДВОЙНОЙ РОЛИ SRP
Бит SRP сараЫе в глобальном регистре конфигурации
USB
(бит SRPCAP в OTG_FS_GUSBCFG) позволяет ядру OTG_FS отклю­
чать генерацию VBUS для устройства А с целью экономии энер­
гии. Отметим, что устройство А всегда отвечает за подачу сигна­
ла VBUS, независимо от того, в роли хоста или периферийного
устройства выступает
OTG_FS. программная модель SRP А/В-
434
устройства подробно описана в разделе: Модель программиро­
вания OTG_FS.
ПЕРИФЕРИЙНОЕ УСТРОЙСТВО USB
В данном
разделе приводится функциональное описание
OTG_FS в режиме USВ-периферии. OTG_FS работает как перифе­
рийное устройство USB в следующих случаях:
• OTG B-Peripheral
- Состояние по умолчанию OTG В-устройства при подклю­
чении В-стороны USВ-кабеля
• OTG A-Peripheral
- Состояние устройства OTG А после того, как HNP переклю­
чит OTG_FS на роль периферийного устройства
• В-устройство
- Если линия 1D присутствует, функционирует и подключена
к стороне В USВ-кабеля, а бит НNР-сараЫе в регистре Global
USB Configuration (бит HNPCAP в OTG_FS_GUSBCFG) сброшен
(см. On-The-Go Rev1.3, п. 6.8.3).
• Только периферийное устройство (см. Рисунок 8.5: Подклю­
чение только периферийного устройства USВ)
-
Бит force device mode в глобальном регистре конфигура­
ции USB (FDMOD в OTG_FS_GUSBCFG) устанавливается в 1, за­
ставляя ядро OTG_FS работать только как периферийное устрой­
ство USB (см. On-The-Go Rev1.3, п. 6.8.3). В этом случае линия 1D
игнорируется, даже если она присутствует на разъеме USB.
Примечание: Для реализации устройства с питанием от ши­
ны в случае конфигурации B-device или peripheral-only необхо­
димо добавить внешний регулятор, формирующий питание мик­
росхемы VDD от VBUS.
435
Voo
5VtoV00
Volatge regulato,
STM32MCU
VBUS
РА9
OSC_IN
DM
РА11
DP
РА12
~
..
с
с
8
Vss
osc_ouт
Рисунок 8.5 - Подключение только периферийных
устройств USB
1. Используйте регулятор для создания устройства с питани­
ем от шины.
ПЕРИФЕРИЙНОЕ УСТРОЙСТВО
С ПОДДЕРЖКОЙ SRP
Бит SRP сараЫе в глобальном регистре конфигурации
USB
(бит SRPCAP в OTG_FS_GUSBCFG) позволяет OTG_FS поддержи­
вать протокол запроса сеанса (SRP). Таким образом, он позволя­
ет удаленному устройству А экономить электроэнергию, отклю­
чая VBUS на время приостановки сеанса USB.
Программная модель периферийного режима SRP подробно
описана в разделе «Протокол запроса сеанса В-устройства».
436
ПЕРИФЕРИЙНЫЕ СОСТОЯНИЯ
Состояние питания
Вход
VBUS определяет допустимое напряжение В-сессии,
USB разрешается пе­
рейти в состояние питания (см. USB2.0 раг9.1). После этого
OTG_FS автоматически подключает подтягивающий резистор DP
по которому периферийному устройству
для
сигнализации
полноскоростного
соединения
устройства
с хостом и генерирует прерывание запроса сессии (бит SRQINT
в OTG_FS_GINTSTS) для уведомления о состоянии питания.
Вход
также
VBUS
обеспечивает
подачу действительного
уровня VBUS от хоста во время работы USB. Если обнаруживает­
ся падение уровня VBUS ниже допустимого уровня В-сессии (на­
пример, из-за нарушения питания или отключения порта хоста),
OTG_FS автоматически отключается, и генерируется прерывание
«Обнаружен конец сессии» (бит SEDET в OTG_FS_GOTGINT), уве­
домляющее о выходе OTG_FS из состояния питания.
В состоянии питания OTG_FS ожидает получения сигнала
сброса от хоста. Никакие другие операции с USB не возможны.
При получении сигнала сброса генерируется прерывание «Об­
наружен сброс»
(USBRST в OTG_FS_GINTSTS). По завершении
сигнала сброса генерируется прерывание перечисления (бит
ENUMDNE в OTG_FS_GINTSTS), и OTG_FS переходит в состояние
DefauLt.
Мяrкое отключение
Выход из состояния питания может быть осуществлен про­
граммно с помощью функции плавного отключения. Подтягива­
ющий резистор DP снимается установкой бита плавного отклю­
чения
в
регистре
управления
устройством
(бит
SDIS в OTG_FS_DCTL), что вызывает прерывание обнаружения
отключения устройства на стороне хоста, даже если кабель USB
на самом деле не был извлечен из порта хоста.
Состояние по умолчанию
437
В состоянии Default OTG_FS ожидает получения команды
SET_ADDRESS от хоста.
Никакие другие операции с USB не возможны. Когда на USB
декодируется действительная команда SET_ADDRESS, приложе­
ние записывает соответствующий номер в поле адреса устрой­
ства
в
регистре
конфигурации
устройства
(бит
DAD в OTG_FS_DCFG). После этого OTG_FS переходит в состояние
адреса и готов отвечать на транзакции хоста по сконфигуриро­
ванному адресу USB.
Приостановленное состояние
Периферийное устройство OTG_FS постоянно следит за ак­
тивностью
USB.
После
прерывание
отсчета
3 мс
ранней
простоя
USB
выдается
приостановки
(бит
ESUSP в OTG_FS_GINTSTS), которое через 3 мс подтверждает­
ся,
если
необходимо,
прерыванием
приостановки
(бит
USBSUSP в OTG_FS_GINTSTS). После этого в регистре состоя­
ния устройства
автоматически
устанавливается
бит приоста­
новки устройства (бит SUSPSTS в OTG_FS_DSTS), и
OTG_FS пе­
реходит в состояние приостановки.
Выход из приостановленного состояния
может быть осу­
ществлен самим устройством. В этом случае приложение уста­
навливает бит сигнализации удаленного пробуждения в реги­
стре
управления
устройством
(бит
RWUSIG
в
OTG_FS_DCTL)
и очищает его через 1... 15 мс.
При обнаружении сигнала возобновления от хоста генери­
руется
прерывание
возобновления
(бит
WKUPINT
в OTG_FS_GINTSTS) и автоматически очищается бит приостанов­
ки устройства.
ПЕРИФЕРИЧЕСКИЕ КОНЕЧНЫЕ ТОЧКИ
Ядро OTG_FS инстанцирует (создает экземпляры) следующие
конечные точки USB:
• Конечная точка управления О:
438
- Двунаправленный и обрабатывает только управляющие
сообщения
-
Отдельный
набор
регистров
для
обработки
входящих
и исходящих транзакций
- Соответствующие регистры управления
(OTG_FS_DIEPCTL0/OTG_FS_DOEPCTL0), конфигурации пере­
дачи
(OTG_FS_DIEPTSIZ0/OTG_FS_DIEPTSIZ0) и состояния-преры­
вания
(OTG_FS_DIEPINTx/) OTG_FS_DOEPINT0). Доступный
битов
внутри
регистров
управления
и
размера
набор
передачи
несколько отличается от такового для других конечных точек
• 3 конечные точки IN:
- Каждый из них может быть настроен на поддержку изо­
хронного,
массового или прерывистого типа передачи данных
- Каждый из них имеет соответствующие регистры управ­
ления
(OTG_FS_DIEPCТLx),
конфигурации
передачи
(OTG_FS_DIEPTSIZx) и
состояния-прерывания (OTG_FS_DIEPINTx).
- Регистр общей маски прерываний конечных точек IN
устройства
(OTG_FS_DIEPMSK) предназначен для включения/выключе­
ния одного вида источника прерывания конечной точки на всех
конечных точках IN (включая ЕРО).
- Поддержка прерывания по незавершенной изохронной
передаче IN (бит IISOIXFR в OTG_FS_GINTSTS), которое подается
при наличии хотя бы одной конечной точки изохронного IN, пе­
редача по которой не завершена в текущем кадре. Это прерыва­
ние утверждается вместе с прерыванием конца периодического
кадра (OTG_FS_GINTSTS/EOPF).
• 3 конечные точки OUT:
- Каждый из них может быть настроен на поддержку изо­
хронного, массового или прерывистого типа передачи данных
439
-
Каждый из них имеет соответствующий регистр управле-
ния
передачи
конфигурации
(OTG_FS_DOEPCTLx),
состояния-прерывания
и
(OTG_FS_DOEPTSIZx)
(OTG_FS_DOEPINTx).
- Регистр маски общего прерывания конечных точек
устройства (OTG_FS_DOEPMSK) предназначен для включения/
выключения одноговида источника прерывания конечной точки
на всех конечных точках OUT (включая ЕРО).
-
Поддержка
прерывания по незавершенной изохронной
передаче OUT (бит INCOMPISOOUT в OTG_FS_GINTSTS), подава­
емого при наличии хотя бы одной конечной точки изохронного
OUT, передача по которой не завершена в текущем кадре. Это
прерывание утверждается вместе с прерыванием конца перио­
дического кадра (OTG_FS_GINTSTS/EOPF).
УПРАВЛЕНИЕ КОНЕЧНЫМИ ТОЧКАМИ
• Через
регистр
управления
конечными
точками
устрой­
ства
(DIEPCTLx/DOEPCTLx)
приложению
доступны
следующие
функции
управления конечными точками:
- Включение/выключение конечной точки
- Активация конечной точки в текущей конфигурации
- Программирование типа передачи данных по USB (изохронный, массовый, прерывание)
- Поддерживаемый программой размер пакета
- Программный номер Tx-FIFO, связанный с конечной точкой IN
- Программирование PID ожидаемых или передаваемых
данных0/dаtа1 (только для массовых/прерывистых сообщений)
-
Запрограммировать четный/нечетный кадр, в течение ко­
торого транзакция принимается
хронный)
440
или
передается (только изо­
- Опционально запрограммировать бит NAK так, чтобы он
всегда
отрицательно оповещал хост независимо от состояния FIFO
- Опционально запрограммируйте бит STALL, чтобы всегда
останавливать передачу маркеров хоста на эту конечную точку
- Опционально запрограммируйте режим SNOOP, чтобы ко­
нечная точка OUT не проверяла поле CRC принимаемых данных.
ПЕРЕдАЧА КОНЕЧНЫХ ТОЧЕК
Регистры
размера
(DIEPTSIZx/DOEPTSIZx)
вать
параметры
передачи
конечной
точки
позволяют приложению
размера
передачи
и
устройства
программиро­
считывать состояние
пе­
редачи. Программирование должно быть выполнено до уста­
новки бита разрешения конечной точки в регистре управления
конечной точкой. После включения конечной точки эти поля
доступны только для чтения, так как ядро OTG
FS обновляет их текущим состоянием передачи. Можно за­
программировать следующие параметры передачи:
• Размер передачи в байтах
• Количество пакетов, составляющих общий размер пере­
дачи
СОСТОЯНИЕ КОНЕЧНОЙ ТОЧКИ/ПРЕРЫВАНИЕ
Регистры прерываний конечных точек устройства (DIEPINTx/
DOPEPINTx) отображают состояние конечной точки относитель­
но событий, связанных с USB- и АНВ. Приложение должно счи­
тывать эти регистры, если установлен бит прерывания конечной
точки
OUT или бит прерывания конечной точки IN в регистре
прерываний ядра (бит OEPINT в OTG_FS_GINTSTS или бит IEPINT
в
OTG_FS_GINTSTS,
соответственно).
Прежде
чем
программа
сможет прочитать эти регистры, она должна сначала прочитать
регистр
прерывания
по
всем
конечным
точкам
устройства
(OTG_FS_DAINT), чтобы получить точный номер конечной точки
441
для регистра прерывания по конечным точкам-х. Приложение
должно сбросить соответствующий бит в этом регистре, чтобы
сбросить соответствующие биты в регистрах DAINT и GINTSTS.
Периферийное ядро обеспечивает следующие проверки со­
стояния и генерацию
прерываний:
• Прерывание Traпsfer completed, указывающее на то, что
передача данных была завершена как на стороне приложения
(АНВ), так и на стороне USB
• Этап настройки выполнен (только для выхода из системы
управления)
• Ассоциированный передающий FIFO наполовину или пол­
ностью пуст (в конечных точках)
• Квитирование NAK было передано хосту (только для изо­
хронного входа)
• Маркер IN получен, когда Tx-FIFO был пуст (только для
bulk-in/iпterrupt-in)
• Out token получен, когда конечная точка еще не была
включена
• Обнаружено состояние ошибки ВаЬЫе
• Отключение конечной точки при помощи приложения яв­
ляется эффективным
• NAK конечной точки по приложению действует (только
изохронный вход)
• Получено более 3 последовательных установочных паке­
тов (только control-out)
• Обнаружено состояние тайм-аута (только для входа в си­
стему управления)
• Изохронный исходящий пакет был сброшен, без генера­
ции прерывания.
442
usв-хост
В данном разделе приводится функциональное описание
OTG_FS в режиме USB- хоста. OTG_FS работает как USB-xocт
в следующих случаях:
• OTG A-host
- Состояние OTG А-устройства по умолчанию, когда подключена сторона А USВ-кабеля
• OTG B-host
- OTG В-устройства после переключения HNP на роль хоста
• А-устройство
- Если линия 1D присутствует, исправна и подключена к сто­
роне А USВ-кабеля, а в регистре глобальной конфигурации USB
сброшен бит HNP-capable (бит HNPCAP в OTG_FS_GUSBCFG).
На линиях DP/DM автоматически устанавливаются встроенные
подтягивающие резисторы.
• Только хост (см. рисунок: подключение только хоста USB).
- Бит force host mode в глобальном регистре конфигурации
USB (бит FHMOD в OTG_FS_GUSBCFG) заставляет ядро OTG_FS
работать только как USB- хост. В этом случае линия 1D игнориру­
ется, даже если она присутствует на разъеме USB. На линиях DP/
DM автоматически устанавливаются встроенные подтягивающие
резисторы.
Примечание: Генерация 5 В VBUS на кристалле не поддержи­
вается. Поэтому для управления линией VBUS 5 В необходимо
подключить к микросхеме
внешний
насос заряда
или,
если
5 В имеются на плате, базовый выключатель питания. Внешний
насос заряда может управляться с любого выхода GPIO. Это
необходимо для конфигураций OTG A-host, A-device и host-oпly.
Вход VBUS обеспечивает подачу действительных уровней VBUS
на зарядный насос во время работы USB, а выход перегрузки
по току зарядного насоса может быть подан на любой вывод
GPIO, сконфигурированный для генерации прерываний порта.
ISR прерывания по току должен своевременно отключать гене­
рацию VBUS.
443
sv
GPIO 1----E_N_.. STMPS2141STR
Current-limited
Overcurrent power distribution
GPIO+IRQ
switch 12!
VPwт
OSC_IN
osc_ouт
Рисунок 8.6 - Подключение только к USB-xocтy
Примечание:
STMPS2141STR необходим только в том слу­
чае, если приложение должно поддерживать устройство с пита­
нием от шины
VBUS. При наличии 5 В на плате приложения
можно использовать базовый выключатель питания.
хает с ПОДДЕРЖКОЙ SRP
Поддержка SRP доступна через бит SRP сараЫе в глобаль­
ном
регистре
конфигурации
USB
(бит
SRPCAP
в OTG_FS_GUSBCFG). При включенной функции SRP хост может
экономить электроэнергию, отключая питание
VBUS на время
приостановки сеанса USB.
Программная модель режима хоста SRP подробно описана
в разделе «Протокол запроса сеанса А-устройства».
СОСТОЯНИЯ USB-XOCТA
Питание порта хоста
Генерация
5 В VBUS на кристалле не поддерживается. По­
этому для управления линией VBUS 5 В необходимо подключить
444
внешний насос заряда или, если 5 В доступны на плате прило­
жения, базовый выключатель питания. Внешний насос заряда
может управляться с любого выхода GPIO. Если приложение ре­
шило подать питание на VBUS с помощью выбранного GPIO, оно
также должно установить бит питания порта в регистре управле­
ния и состояния хост-порта (бит PPWR в OTG_FS_HPRT).
VBUSvaLid
При включении HNP или SRP вывод VBUS sensing pin (РА9)
должен быть подключен к VBUS. Вход VBUS обеспечивает пода­
чу действительных уровней VBUS от зарядового насоса во время
работы USB. Любое непредвиденное падение напряжения VBUS
ниже допустимого порога VBUS (4,25 В) приводит к прерыванию
OTG, инициируемому битом обнаружения окончания сеанса (бит
SEDET в OTG_FS_GOTGINT). В этом случае приложение должно
снять питание с шины VBUS и очистить бит питания порта.
Если HNP и SRP отключены, то чувствительный вывод VBUS
(РА9) не должен быть подключен к VBUS. Этот вывод можно ис­
пользовать в качестве GPIO.
Флаг перегрузки по току насоса заряда также может быть
использован для предотвращения электрических повреждений.
Подключите выход флага перегрузки потоку от насоса заряда
к любому входу GPIO и настройте его на генерацию прерывания
порта по активному уровню.
ISR прерывания по току должен
оперативно отключить генерацию VBUS и сбросить бит питания
порта.
ОБНАРУЖЕНИЕ ХОСТОМ ПЕРИФЕРИЙНОГО
СОЕдИНЕНИЯ
Если включены SRP или HNP, то даже если USВ-периферия
или
В-устройства
могут быть подключены
в любой
момент,
OTG_FS не обнаружит подключения к шине до окончания зонди­
рования VBUS (VBUS более 4,75 В). Когда VBUS находится на до­
пустимом уровне и подключено удаленное В-устройство, ядро
445
OTG_FS выдает прерывание хост-порта, инициированное битом
«Устройство подключено» в регистре управления и состояния
хост-порта (бит PCDET в OTG_FS_HPRT).
Если HNP и SRP отключены, то периферийные устройства
USB или В-устройства обнаруживаются сразу же после их под­
ключения. Ядро OTG_FS выдает прерывание хост-порта, иниции­
рованное
битом
«Устройство
подключено»
в
бите
управле­
ния и состояния хост-порта (бит PCDET в OTG_FS_HPRT).
ОБНАРУЖЕНИЕ ХОСТОМ ОТКЛЮЧЕНИЯ
ПЕРИФЕРИЙНОГО УСТРОЙСТВА
Событие отключения периферийного устройства вызывает
прерывание
«обнаружено
отключение»
(бит
DISCINT
в OTG_FS_GINTSTS).
Перечисление хостов
После обнаружения подключения периферийного устрой­
ства хост должен начать процесс перечисления, посылая на но­
вое периферийное устройство команды сброса и конфигуриро­
вания USB.
Перед тем как начать управлять сбросом
USB, приложение
OTG, вызванного битом debounce done
(бит DBCDNE в OTG_FS_GOTGINT), который указывает на то, что
ожидает прерывания
шина снова стабильна после электрического демпфирования,
вызванного установкой подтягивающего резистора на
DP (FS)
или ОМ (LS).
Приложение
подает
сигнал
сброса
USB
(односторонний
ноль) по USB, удерживая бит сброса порта установленным в ре­
гистре
управления
и
состояния
в OTG_FS_HPRT) в течение минимум
хост-порта
(бит
PRST
10 мс и максимум 20 мс.
Счетчик времени и сброс бита сброса порта выполняются при­
ложением.
После завершения последовательности сброса
USB преры­
вание порта хоста инициируется битом изменения разрешения/
446
запрета порта (бит PENCHNG в OTG_FS_HPRT). Это информирует
приложение о том, что скорость перечисляемого периферийного
устройства может быть считана из поля скорости порта в реги­
управления
стре
и
порта
состояния
хоста
(бит
PSPD
в OTG_FS_HPRT) и что хост начинает передачу SOF (FS) или Кеер
alives (LS). Теперь хост готов завершить перечисление перифе­
рии, отправив команды конфигурирования периферии.
ПРИОСТАНОВКА РАБОТЫ ХОСТА
Приложение принимает решение о приостановке активно­
сти
USB,
устанавливая
бит
порта
приостановки
в
регистре
управления и состояния хост-порта (бит PSUSP в OTG_FS_HPRT).
Ядро OTG_FS прекращает посылку SOF и переходит в состояние
приостановки.
Выход из
ществлен
по
приостановленного
инициативе
состояния
удаленного
может быть осу­
устройства
(remote
wakeup). В этом случае при обнаружении сигнала удаленного
пробуждения генерируется прерывание удаленного пробужде­
ния (бит WKUPINT в OTG_FS_GINTSTS), происходит самоустанов­
ка бита возобновления порта в регистре управления и состояния
хост-порта (бит PRES в OTG_FS_HPRT), и сигнал возобновления
USB. Для выхода из приостанов­
ленного состояния и перезапуска SOF приложение должно уста­
автоматически передается по
новить время появления окна возобновления, а затем сбросить
бит возобновления порта.
При выходе из приостановленного состояния по инициативе
хоста приложение должно установить бит возобновления порта
для запуска сигнала возобновления на хост-порту, засечь время
окна возобновления и, наконец, сбросить бит возобновления
порта.
447
ВЕДУЩИЕ КАНАЛЫ
Ядро OTG_FS инстанцирует 8 хает-каналов. Каждый хает-ка­
нал поддерживает передачу данных по USB-xocтy
(USB pipe).
8 запросов
на передачу. Если от приложения ожидается более 8 запросов
на передачу, драйвер хает-контроллера (HCD) должен перерас­
Одновременно хост не может поддерживать более
пределять
каналы,
когда
они
становятся
доступными
после
предыдущего дежурства, то есть после получения прерываний
Transfer Completed и Channel Halted.
Каждый хост-канал может быть сконфигурирован для под­
держки входов/выходов и любых типов периодических/непе­
риодических транзакций. Каждый хост-канал использует соот­
ветствующие
регистры
управления
(HCCHARx), конфигурации
(HCINTx) с соот­
ветствующими регистрами маски (HCINTMSKx).
передачи (HCТSIZx) и состояния/прерывания
Управление каналом хоста
• Через регистр характеристик канала-х (HCCHARx) приложе­
нию доступны следующие элементы управления каналом хоста:
-
Включение/выключение канала
Программирование скорости
FS/LS целевого периферий-
ного устройства USB
-
Программирование
адреса
целевого
периферийного
устройства USB
-
Программирование номера конечной точки целевого пе­
риферийного устройства USB
- Программирование направления передачи IN/OUT
- Программирование типа передачи данных по USB (управление, массовая передача, прерывание, изохронная передача)
- Программирование максимального размера пакета (MPS)
- Запрограммировать периодическую передачу на выполнение в четных/нечетных кадрах
Передача канала хоста
448
Регистры размера передачи хост-канала (HCTSIZx) позволя­
ют программировать параметры размера передачи и считывать
состояние передачи. Программирование должно быть выполне­
но до установки бита разрешения канала в регистре характери­
стик канала хоста. После включения конечной точки поле под­
счета пакетов доступно только для чтения, так как ядро OTG FS
обновляет его в соответствии с текущим состоянием передачи.
• Можно запрограммировать следующие
параметры пере­
дачи:
- размер передачи в байтах
- количество пакетов, составляющих общий
размер пере-
дачи
-
исходные данные ПИД
Состояние/прерывание канала хоста
Регистр прерываний
по каналу хоста
(HCINTx)
указывает
на состояние конечной точки относительно событий, связанных
с USB- и АНВ. Приложение должно считывать эти регистры, если
установлен бит прерывания по каналам хоста в регистре преры­
ваний ядра (бит
грамма
сможет
HCINT в OTG_FS_GINTSTS). Прежде чем про­
прочитать
эти
прочитать регистр прерывания
регистры,
она
должна
всех каналов хоста
сначала
(HCAINT),
чтобы получить точный номер канала для регистра прерывания
канала-х хоста. Приложение должно сбросить соответствующий
бит в этом регистре, чтобы снять прерывание соответствующие
биты в регистрах HAI NT и GI NTSTS. Биты маски для каждого ис­
точника прерывания каждого канала также доступны в регистре
OTG_FS_HCINTMSK-x.
• Ядро хоста обеспечивает следующие проверки состояния
и генерацию прерываний:
-
Прерывание Transfer completed, указывающее на то, что
передача данных завершена как со стороны приложения (АНВ),
так и со стороны USB
- Канал остановлен из-за завершения передачи данных,
ошибки транзакции USB или команды отключения от приложения
449
- Ассоциированный передающий FIFO наполовину или полно-стью пуст (конечные точки IN)
- Получен ответ АСК
- Получен ответ NAK
- Получен ответ STALL
- Ошибка транзакции USB из-за сбоя CRC, тайм-аута, ошибки битового заполнения, ложного ЕОР
- Ошибка
- перерасход ГРП
- Ошибка переключения dдta
ПЛАНИРОВЩИК ХОСТА
В ядро хоста встроен аппаратный планировщик, способный
автономно перестраивать и управлять запросами USВ-транзак­
ций, отправляемыми приложением.
В
начале
каждого кадра
хает выполняет сначала периодические (изохронные и прерыва­
ния), а затем непериодические (управляющие и массовые) тран­
закции, чтобы обеспечить более высокий уровень приоритета,
предоставляемый спецификацией
USB изохронным и прерыви­
стым типам передачи.
Хает обрабатывает USВ-транзакции через очереди запросов
(периодические и непериодические). Каждая очередь запросов
может содержать до 8 записей. Каждая запись представляет со­
бой ожидающий запрос транзакции от приложения и содержит
номер канала IN или OUT, а также другую информацию для вы­
полнения транзакции на
USB. Порядок записи запросов в оче­
редь определяет последовательность
выполнения транзакций
на интерфейсе USB.
В начале каждого кадра хает обрабатывает сначала очередь
периодических запросов, а затем очередь непериодических за­
просов. Хает выдает прерывание по незавершенной периодиче­
ской передаче {бит IPXFR в OTG_FS_GINTSTS), если в конце теку­
щего кадра еще не завершена изохронная или прерывающаяся
транзакция, запланированная на текущий кадр. Ядро
450
OTG HS
полностью
отвечает за
управление
очередями
периодических
и непериодических запросов. Регистр состояния FIFO и очереди
периодической передачи
(HPTXSTS) и регистр состояния FIFO
и очереди непериодической передачи (HNPTXSTS) являются ре­
гистрами только для чтения, которые могут быть использованы
приложением для чтения состояния каждой очереди запросов.
Они содержат:
• Количество свободных записей, имеющихся в очереди пе­
риодических
(непериодических) запросов (не более 8)
• Свободное место, имеющееся в данный момент в периоди­
ческом (непериодическом) Tx-FIFO (out-transactions)
• маркер IN/OUT, номер канала хоста и другая информация
о состоянии.
Поскольку очереди запросов могут содержать не более 8 за­
писей каждая, приложение может заблаговременно планиро­
вать транзакции хоста относительно момента их физического
поступления в СБ для максимум
транзакций плюс
8 ожидающих периодических
8 ожидающих непериодических транзакций.
Чтобы отправить запрос на транзакцию в планировщик (оче­
редь) хоста, приложение должно проверить наличие хотя бы од­
ной записи в периодической (непериодической) очереди запро­
сов, прочитав биты PТXQSAV в регистре OTG_FS_HNPTXSTS или
биты NPTQXSAV в регистре OTG_FS_HNPТXSTS.
SOF trigger
451
STM32MCU
РА8
SOF pulse output, \о
extemal audio control
РА9
vвus
о· J
Рд11
TIM2
~
pulse
14--1,-------------в
SOFgen
----------------~
~2
~
РА 1О
ID
е
- - - - - - - - - - - - - - - -~
Vss
Рисунок 8.7 - Подключение SOF
Ядро OTG FS предоставляет средства для мониторинга, от­
слеживания и конфигурирования фреймов SOF в хосте и пери­
ферийном устройстве, а также функцию подключения выходно­
го импульса SOF.
Такие утилиты особенно полезны для адаптивных техноло­
гий генерации аудиосигнала, когда периферийное устройство
должно синхронизироваться с изохронным потоком, предостав­
ляемым ПК, или хост должен обрезать свою частоту кадров в со­
ответствии с требованиями периферийного устройства.
Принимающие SOF
В режиме хоста количество тактов РНУ, проходящих между
генерацией
двух последовательных маркеров SOF (FS) или
Keep-alive (LS), программируется в регистре кадрового интерва­
ла хоста (HFIR), что обеспечивает прикладной контроль над пе­
риодом формирования кадра SOF. Прерывание генерируется
при любом начале кадра (бит SOF в OTH_FS_GINTSTS). Номер
текущего кадра и время, оставшееся до следующего SOF, отсле­
живаются в регистре номера кадра хоста (HFNUM).
452
Импульсный сигнал SOF, формируемый на любом стартовом
маркере SOF и имеющий ширину 20 циклов HCLK, может быть
доступен
извне
на
выводе
OTG_FS_SOF с
помощью
бита
SOFOUTEN в глобальном регистре управления и конфигурации.
Импульс SOF также внутренне связан с входным триггером тай­
мера 2 {ТIМ2), так что функция захвата входного сигнала, функ­
ция сравнения выходных сигналов и таймер могут запускаться
импульсом SOF. Подключение TIM2 разрешается регистром.
Периферийные SOF
В режиме устройства прерывание начала кадра генерирует­
ся каждый раз, когда на
USB поступает маркер SOF (бит SOF
в OTH_FS_GINTSTS). Номер соответствующего кадра может быть
считан
FNSOF
из
регистра
состояния
устройства
(бит
OTG_FS_DSTS). Также формируется импульсный сигнал SOF
шириной 20 циклов HCLK, который может быть доступен извне
на разъеме OTG_FS_SOF с помощью бита разрешения выхода
SOF в глобальном регистре управления и конфигурации (бит
SOFOUТEN в OTG_FS_GCCFG). Импульсный сигнал SOF также
внутренне связан с входным триггером TIM2, так что функция
в
захвата входного сигнла, функция сравнения выходных сигна­
лов и таймер могут быть запущены импульсом SOF. Подключе­
ние TIM2 разрешено.
Прерывание окончания периодического кадра (GINTSTS/
EOPF) используется для уведомления приложения о том, что ис­
текло 80%, 85%, 90% или 95% временного интервала кадра
в зависимости от поля периодического интервала кадра в реги­
стре конфигурации устройства (бит PFIVL в OTG_FS_DCFG). Эта
функция может быть использована для определения того, что
весь изохронный трафик для данного кадра завершен.
Режимы OTG с низким энергопотреблением
В таблице
8.24 ниже определены режимы пониженного
энергопотребления STM32 и их совместимость с OTG.
453
Mode
USB compatlЫllty
Descrlption
Required when USB not in
suspend stale.
Run
MCU fully active
Sleep
USB suspend exit causes the device to exit Sleep mode.
Peripheral registers content is kept.
AvailaЫe while USB is in
Stop
USB suspend exit causes the device to exit Stop mode.
Peripheral registers content is kept< 1).
AvailaЫe while USB is in
suspend state.
suspend state.
Not compatiЫe with USB
applications.
Powered-down. The peripheral must Ье relnitiallzed al\er
Standby
exiting Standby mode.
Таблица 8.24 - Совместимость режимов пониженного энергопо­
требления STM32 с OTG
Примечание к таблице: В режиме Stop возможны различные
настройки. При этом возможны некоторые ограничения, см. Раз­
дел 4:Управление питанием (PWR), чтобы понять, какие ограниче­
ния (если таковые имеются) действуют при использовании OTG.
Энергопотребление
OTG
РНУ регулируется тремя битами
в общем регистре конфигурации ядра:
• Отключение питания РНУ (GCCFG/PWRDWN).
Он включает/выключает модуль полноскоростного приемо­
передатчика РНУ. Он должен быть предварительно установлен
для обеспечения работы USB.
• Разрешение считывания A-VBUS (GCCFG/VBUSASEN).
Включает/выключает компараторы VBUS, связанные с рабо­
той А-устройства. Он должен быть установлен
в
режиме А­
устройства (USB-xocтa) и во время работы HNP.
• Разрешение считывания B-VBUS (GCCFG/VBUSASEN).
Включает/выключает компараторы VBUS, связанные с рабо­
той В-устройства. Он должен быть установлен в режиме В-устрой­
ства (периферийного устройства USB) и во время работы HNP.
Методы снижения энергопотребления доступны в состоянии
приостановки
USB, когда сеанс USB еще не действителен или
устройство отключено.
• Остановка
тактового
генератора
РНУ
(бит
STPPCLK
в OTG_FS_PCGCCТL). При установке бита Stop РНУ cLock в реги454
стре управления тактовым генератором большая часть тактового
домена 48 МГц, входящего в состав полноскоростного ядра OTG,
отключается по тактовой частоте стробирования. Динамическое
энергопотребление, обусловленное активностью переключения
тактового генератора
USB, снижается даже в том случае, если
тактовый вход 48 МГц поддерживается приложением в рабочем
состоянии.
Большая
часть
приемопередатчика
также
отключается,
и только часть, отвечающая за обнаружение события асинхрон­
ного
возобновления
или
удаленного
пробуждения,
остается
в живых.
• Gate HCLK (бит GATEHCLK в OTG_FS_PCGCCTL)
При установке бита Gate HCLK в регистре управления такто­
вым генератором большая часть системного тактового домена
внутри ядра OTG_FS отключается с помощью тактового генера­
тора. Сохраняется только интерфейс чтения и записи регистров.
Динамическое энергопотребление, связанное с активностью пе­
реключения тактовых импульсов USB, снижается, даже если си­
стемные часы используются приложением для других целей.
• Остановка системы USB
Когда OTG_FS находится
в состоянии
приостановки
USB,
приложение может принять решение о резком снижении общего
энергопотребления путем полного отключения всех источников
тактовой частоты в системе. USB System Stop активируется сна­
чала установкой бита Stop РНУ clock, а затем конфигурировани­
ем режима глубокого сна системы в системном модуле управле­
ния питанием (PWR).
Ядро OTG_FS автоматически активизирует системные и USВ­
часы
путем асинхронного обнаружения сигналов удаленного
пробуждения (в качестве хоста) или возобновления (в качестве
устройства) на USB.
Для экономии динамической мощности тактирование USB
data FIFO осуществляется только при обращении к нему ядра
OTG_FS.
455
ДИНАМИЧЕСКОЕ ОБНОВЛЕНИЕ РЕГИСТРА
OTG_FS_HFIR
В ядре USB реализована возможность динамической обрез­
ки периода кадров SOF в режиме хоста, что позволяет синхро­
низировать внешнее устройство с кадрами SOF.
При изменении регистра OTG_FS_HFIR в текущем кадре SOF
коррекция периода
SOF применяется в следующем кадре, как
описано на рис. 8.8:
Old OTG_FS_HIFR value
= 400 periods
re~~§ _м
:
OTG_FS_~,:
OTG FS HIFR value
= 450 periods+HIFR write lotoncy
New OTG FS HIFR value
= 450 pёriods
__~n~-----~n~--~tL
~
1
Latency
1
___,__ _ _ ___,1'-----' ' - - - - - - - - - - ' - - - - - - - ' - - - 1
1
OTG_Fs_:i~~ -i-4_oo_ _ _....,...._
_.__I_4sо_ _ _ _ _~------т-
H№'I···
1
1+шм
1
Рисунок 8.8 - Динамическое обновление OTG_FS_HFIR
FIFO ДДННЫХ USB
Система USB оснащена 1,25 Кбайт выделенной оперативной
памяти со сложным механизмом управления FIFO. Модуль кон­
троллера пакетных FIFO в ядре OTG_FS организует пространство
ОЗУ в виде Tx-FIFO, в которые приложение заталкивает данные
для временного хранения перед передачей по USB, и в виде од­
ного Rx FIFO, в котором временно хранятся данные, полученные
от
USB, до их извлечения (popped) приложением. Количество
управляемых FIFO и их организация в оперативной памяти за­
висят от роли устройства. В периферийном режиме для каждой
активной оконечной точки
IN дополнительно организуется TxFIFO. Любой размер FIFO может быть программно сконфигури­
рован для более полного соответствия требованиям приложе­
ния.
456
АРХИТЕКТУРА ПЕРИФЕРИЙНОГО FIFO
Single data
FIFO
Dedicated Тх
IN endpoint Тх FIFO #n
DFIFO push access __.. FIFO #n contro
fromAHB
···-;;FiFO#~---- ]
DIEPTXF2(31:16]
• • • • packet • • • • •
DIEPTXFx[15:0J
+--МАСрор
DIEPTXF2[15:0J
IN endpoint Тх FIFO #1
DFIFO push access
from АНВ __..
Т
'1
n ro
Тк FIFO #1 packet.
DIEPTXF1 (31:16)
DIEPTXF1{15:0]
+--МАСро
IN endpoint Тх FIFO #О
DFIFO push access
from АНВ
______,..
Тх
ntro
l+---tt-- ................. Тк FIFO #О packet.
+--МАСро
GNPTXFSIZ[31:16)
GNPTXFSIZ[15:0)
Rx packets
--MACpush
GRXFSIZ[31 :16)
А1 = О
(Rxstart
address
fiкed to О)
Рисунок 8.9 - Сопоставление адресов FIFO в режиме устрой·
ства и сопоставление доступа к FIFO в режиме АНВ
ПЕРИФЕРИЙНЫЙ RX FIFO
В периферийном устройстве OTG используется один прием­
FIFO, в который поступают данные, направленные на все
точки OUT. Принятые пакеты складываются один
за другим до тех пор, пока в Rx-FIFO не освободится место. Ста­
ный
конечные
тус принятого пакета (содержащий номер назначения конечной
точки OUT, количество байт, PID данных и валидность принятых
данных) также сохраняется ядром поверх полезной нагрузки
данных. При отсутствии свободного места транзакции хоста за­
вершаются
NACK и на адресованную конечную точку поступа­
ет прерывание. Размер приемного FIFO конфигурируется в реги-
457
стре Receive FIFO Size (GRXFSIZ).
Архитектура с одним приемным FIFO позволяет периферий­
ному устройству USB более эффективно заполнять буфер
RAM
приема:
• Все конечные точки OUT используют один и тот же буфер
оперативной памяти (общий FIFO)
• Ядро OTG FS может заполнить приемный FIFO до предела
для любой последовательности маркеров OUT.
Приложение продолжает получать прерывание о не пустоте
Rx-FIFO (бит RXFLVL в OTG_FS_GINTSTS) до тех пор, пока суще­
ствует хотя бы один пакет, доступный для загрузки. Оно считыва­
ет информацию о пакете из регистра чтения и выгрузки статуса
приема (GRXSTSP) и, наконец, выгружает данные из приемного
FIFO, считывая их из рор-адреса, связанного с конечной точкой.
ПЕРИФЕРИЙНЫЕ ТХ FIFO
Ядро имеет выделенный
FIFO для каждой конечной точки
FIFO путем записи
в
регистр
размера
непериодической
передачи
FIFO
(OTG_FS_TX0FSIZ) для конечной точки IN0 и в регистры FIFOx
передачи конечной точки IN устройства (DIEPТXFx) для конеч­
ной точки INx.
Архитек,ура FIFO хоста
IN.
Приложение конфигурирует размеры
458
Single dala
FIFO
Any periodic channel
DFIFO push access from АНВ
Perlodic Т•
FIFO conlrol
(optional)
HPTXFSIZ[31 :16)
Perlodic Тх packets
-МАСрор
Any non-perlodic
channel DFIFO push access from АНВ
HPTXFSIZ(15:0]
Perlodic Т• packets
NPТXFSIZ(З 1: 16)
rlodic
conl
NPTXFSIZ[15:0]
-МАСрор
RXFSIZ[31 :16]
R• packets
Any channel DFIFO рор
access from АНВ + - -
Rx start address
fi•edtoO
--MACpus
-А1=0
Рисунок 8.10 - Сопоставление адресов FIFO в режиме хоста
и сопоставление доступа к АНВ FIFO
FIFO Rx хоста
Хает использует один приемный
FIFO для всех периодиче­
ских и непериодических транзакций. FIFO используется в каче­
стве буфера приема для хранения принятых данных (полезной
нагрузки принятого пакета) от USB до их передачи в системную
память. Пакеты, полученные от любой удаленной конечной точ­
ки IN, складываются один за другим до тех пор, пока не освобо­
дится свободное место. В FIFO также сохраняется статус каждого
принятого пакета с указанием назначения канала хоста, количе­
ства байт, PID данных и достоверности принятых данных. Раз­
мер приемного FIFO конфигурируется в регистре размера при­
емного FIFO (GRXFSIZ).
Архитектура с одним FIFO для приема данных делает запол­
нение буфера данных
приема высокоэффективным для USB-xocтa:
• Все каналы хоста, сконфигурированные в IN, используют
один и тот же буфер оперативной памяти (общий FIFO)
• Ядро OTG FS может заполнить FIFO приема до предела для
459
любой
последовательности
маркеров
IN,
управляемых
про­
граммным обеспечением хоста.
Приложение получает прерывание Rx FIFO not-empty до тех
пор, пока существует хотя бы один пакет, доступный для загруз­
ки. Оно считывает информацию о пакете из регистра чтения
и
выгрузки
статуса
приема
и,
наконец,
выгружает
данные
из FIFO приема.
Тх FIFO хоста
Хост использует один передающий FIFO для всех неперио­
дических (управляющих и массовых) транзакций OUT и один пе­
редающий FIFO для всех периодических (изохронных и преры­
ваний) транзакций OUT. FIFO используются в качестве буферов
передачи для хранения данных (полезной нагрузки пакета пе­
редачи), передаваемых по USB. Размер периодического (непе­
риодического) Тх FIFO конфигурируется в регистре host periodic
(nonperiodic) transmit FIFO size (HPTXFSIZ/HNPТXFSIZ).
Реализация двух Тх FIFO обусловлена более высоким прио­
ритетом периодического типа трафика по сравнению с USВ-кад­
ром. В начале каждого кадра встроенный планировщик хоста
обрабатывает сначала очередь периодических запросов, а за­
тем очередь непериодических запросов.
Архитектура с двумя передающими FIFO обеспечивает USBxocтy раздельную оптимизацию управления буфером данных
периодической и непериодической передачи:
• Все каналы хоста, настроенные на поддержку периодиче­
ских (непериодических) транзакций в направлении OUT, исполь­
зуют один и тот же буфер оперативной памяти (общие FIFO)
• Ядро OTG FS может заполнять периодический (непериоди­
FIFO до предела для любой последова­
тельности маркеров OUT, управляемых программным обеспече­
ческий) передающий
нием хоста
Ядро OTG_FS выдает периодическое прерывание Тх FIFO
empty (бит PTXFE в OTG_FS_GINTSTS) до тех пор, пока периоди­
ческий Tx-FIFO наполовину или полностью пуст, в зависимости
460
от значения бита уровня периодического Tx-FIFO empty в кон­
(бит
АНВ
регистре
фигурационном
PTXFELVL
в OTG_FS_GAHBCFG). Приложение может заблаговременно под­
талкивать данные
передачи, пока
место как
есть свободное
в периодическом Тх FIFO, так и в очереди периодических запро­
сов.
Регистр
и очереди
состояния
периодического
(HPTXSTS) хоста
передающего
FIFO
может быть считан, чтобы узнать,
сколько места доступно в обоих регистрах.
Ядро OTG_FS выдает непериодическое прерывание Тх FIFO
empty (бит NPTXFE в OTG_FS_GINTSTS) до тех пор, пока непе­
риодический Тх FIFO наполовину или полностью пуст в зависи­
мости от бита уровня непериодического Тх FIFO empty в кон­
TXFELVL
(бит
АНВ
регистре
фигурационном
в OTG_FS_GAHBCFG). Приложение может продвигать данные
передачи до тех пор, пока в непериодическом Тх FIFO и непе­
риодической очереди запросов есть свободное место. Регистр
состояния
непериодического
(HNPТXSTS) хоста
передающего
FIFO
и
очереди
может быть считан, чтобы узнать, сколько
места доступно в обоих регистрах.
РАСПРЕДЕЛЕНИЕ ОПЕРАТИВНОЙ ПАМЯТИ FIFO
Режим работы устройства
Распределение оперативной памяти приемного FIFO: прило­
жение
должно
выделить
оперативную
память
для
пакетов
SETUP: В приемном FIFO должно быть зарезервировано 10 мест
для приема пакетов SETUP на управляющей конечной точке. Яд­
ро
не
использует
эти
места,
зарезервированные
для
пакетов
SETUP, для записи каких-либо других данных. Одно место долж­
но быть зарезервировано для Global OUT NAK. Информация
о состоянии записывается в FIFO вместе с каждым принятым па­
кетом. Поэтому для приема пакетов должно быть выделено ме­
сто не менее (Размер наибольшего пакета/ 4) +1.
Если включено несколько изохронных конечных точек, то
для приема идущих друг за другом пакетов должно быть выде-
461
лено не менее двух
(Largest Packet Size / 4) +1 мест. Обычно
рекомендуется выделять два (Largest Packet Size / 4) +1 места,
чтобы во время передачи предыдущего пакета в центральный
процессор USB мог принять последующий пакет.
Вместе с последним пакетом для каждой конечной точки
в
FIFO также передается информация о состоянии
передачи.
Обычно рекомендуется использовать одно место для каждой ко­
нечной точки OUT.
Распределение оперативной памяти передающего FIFO: ми­
нимальный объем оперативной памяти, необходимый для пере­
дающего FIFO каждой конечной точки IN, равен максимальному
размеру пакета для данной конечной точки IN.
Примечание: Большее
количество
места, отведенное
под
FIFO конечной точки IN передачи, приводит к улучшению произ­
водительности USB.
РЕЖИМХОСТА
Распределение оперативной памяти FIFO приема
Информация о состоянии записывается в FIFO вместе с каж­
дым принятым пакетом. Поэтому для приема пакетов должно
быть выделено место не менее (Размер наибольшего пакета / 4)
+1. Если включено несколько изохронных каналов, то для прие­
ма
идущих друг за другом
пакетов должно быть выделено
не менее двух (Largest Packet Size / 4) +1 мест. Обычно рекомен­
дуется выделять два (Largest
Packet Size / 4) +1 места, чтобы во время передачи предыду­
щего пакета в центральный процессор USB мог принять после­
дующий пакет.
Вместе с последним пакетом в канале хоста в FIFO попадает
и информация о состоянии передачи. Поэтому для нее должно
быть выделено одно место.
462
Распределение оперативной памяти FIFO передачи
Минимальный объем оперативной памяти, требуемый для
FIFO непериодической передачи хоста, соответствует наиболь­
шему максимальному размеру пакета среди всех поддерживае­
мых непериодических каналов OUT.
Обычно
рекомендуется
отводить
два
места
под
Largest
Packet Sizes, чтобы во время передачи текущего пакета на USB
процессор мог получить следующий пакет.
Минимальный объем оперативной памяти, необходимый для
периодического передающего
FIFO хоста, равен наибольшему
максимальному размеру пакета из всех поддерживаемых перио­
дических каналов OUT. Если имеется хотя бы одна конечная точ­
ка lsochronous OUT, то пространство должно быть не менее чем
в два раза больше максимального размера пакета этого канала.
Примечание: Большее количество места, выделенное в непе­
риодическом FIFO передачи, приводит к улучшению производи­
тельности USB.
ПРОИЗВОДИТЕЛЬНОСТЬ СИСТЕМЫ USB
Наилучшая производительность USB и системы достигается
благодаря большим буферам оперативной памяти, высокой кон­
фигурируемости размеров FIFO, быстрому 32-разрядному досту­
пу к FIFO через регистры АНВ push/pop и, особенно, усовершен­
ствованному механизму управления
механизм позволяет
FIFO. Действительно, этот
OTG_FS оптимально заполнять доступное
пространство ОЗУ независимо от текущей последовательности
USB. Благодаря этим возможностям:
• Приложение получает хорошие возможности для калиб­
ровки своего вмешательства с целью оптимизации использова­
ния пропускной способности процессора:
-
Он может заранее накапливать большие объемы переда­
ваемых данных, чем при их эффективной передаче по USB
-
Преимуществом является большой запас времени на за­
грузку данных из единственного приемного FIFO
463
• Ядро USB Соге способно поддерживать полную рабочую
скорость, то есть обеспечивать максимальную пропускную спо­
собность на полной скорости с большим запасом автономности
по отношению к вмешательству приложений:
-
В его распоряжении имеется большой запас данных о пе­
редаче,
позволяющий
автономно
управлять
отправкой
данных
по USB
-
В буфере приема имеется много свободного места, что
позволяет
автономно
заполнять
его
данными,
поступающими
с USB
Поскольку ядро OTG_FS способно очень эффективно запол­
нять буфер оперативной памяти объемом 1,25 Кбайт, и посколь­
ку 1,25 Кбайт передаваемых/принимаемых данных более чем
достаточно для полного кадра, система USB способна выдержи­
вать максимальную скорость передачи данных в течение одного
кадра USB (1 мс) без вмешательства процессора.
ПРЕРЫВАНИЯ OTG_FS
Когда
контроллер
OTG_FS работает в одном режиме -
устройства или хоста, приложение не должно обращаться к ре­
гистрам из другого режима. При несанкционированном доступе
генерируется прерывание по несоответствию режимов работы,
которое отражается в регистре прерываний ядра (бит MMIS ре­
гистра OTG_FS_GINTSTS). При переходе ядра из одного режима
в другой регистры нового режима работы должны быть пере­
программированы так же, как и после сброса питания.
На рисунке 8.11 показана иерархия прерываний:
464
W,1keuplrncrrupt
OTG FS 'NКUP
(1)
GJoЬмifimnupt
г----е
OT~~-f'S
1
OR
г~•""'•--,,.,,.
,,.-,.,-,. 0"1'
ОТG AHВCFG
дHBcoo'1uu1alionrcgi51er
>---,-,,.--~~~--~-'т-~----,-,,----~~-• -·l...................................
~ - ~ - - - ;_
CМJ~:,~~:~s~;sie,_i
OTG GOTGINТ
OTG ;mem.,p1regi5.ter
(15"8ЕР)· 16
!*ЕР-1)0
OUT llf'dporlls
IN ~po,ru
OTG_DAINTMSK
DeV1C8,1lendpok\tslr'll«тUl)lrreЖ
'"
OfG_DдJNТ
~w:e•lendpolritainu!rl:uptiegister
:
:
:
g:g=g:;:=
1
Devlct1 JN-'OUT undpoinls cornrno,,
;
lnlerrupl mask reg;.te,
•
.................... 1 ..................... .
OTG_DIEPINТAI
....
OTG DOEP1NT.-
0eYJCe lN.'OUТ ~.-it8ffUP(
,..,
OTG_HPRТ
Ноsс port oonln:il Мd stгtut rtg,$161'
01'G_НAINТMSК
:
'
Ноs1 а11 dlмl'lels lrtжn!pt mask r89is1м
OTG НAINT
Нos1311CМмel8ln1e,щ>treg,ste,
, .............................. J ........................ ······:11 • 0
OTG HCTINTMSКJr
:
Нcnt<:hafY!eff-ln~,nмk~
OTG_НCTINTJI
1
~
,
~
•·r- ~-,нс..,
1,
~ cha-incJfs irlle,щ:it fllQl:ituf11
i
Рисунок 8.11 - Иерархия прерываний
Примечание: OTG_FS_WKUP становится активным (высокий
уровень),
когда
возникает
условие
возобновления
во время состояний Ll SLEEP или L2 SUSPEND.
465
работы
РЕГИСТРЫ УПРАВЛЕНИЯ И СОСТОЯНИЯ OTG_FS
Считывая данные из регистров управления и состояния (CSR)
и записывая их через ведомый интерфейс АНВ, приложение
управляет контроллером
OTG_FS.
Ширина этих регистров со­
ставляет 32 бита, а адреса выровнены по 32-битным блокам.
Доступ к регистрам
OTG_FS должен осуществляться по сло-
вам (32 бита).
КСО классифицируются следующим образом:
• Глобальные регистры ядра
• Регистры режима хоста
• Глобальные регистры хоста
• КСО порта хоста
• Регистры, специфичные для канала хоста
• Регистры режима работы устройства
• Глобальные регистры устройства
• Регистры, специфичные для конечных точек устройства
• Регистры питания и тактового генератора
• Регистры доступа к FIFO данных (DFIFO)
Только к глобальным регистрам ядра, регистрам питания
и синхронизации, регистрам доступа к FIFO данных, регистрам
управления и состояния хает-порта можно обращаться как в ре­
жиме
хоста, так
и
в
режиме устройства.
OTG_FS работает в одном из режимов -
Когда
контроллер
устройства или хоста,
приложение не должно обращаться к регистрам из другого ре­
жима. При несанкционированном доступе генерируется преры­
вание по несоответствию режимов, которое отражается в реги­
стре прерываний ядра (бит MMIS в регистре OTG_FS_GINTSTS).
При переходе ядра из одного режима в другой регистры нового
режима работы должны быть перепрограммированы так же, как
и после сброса питания.
Более подробнее о регистрах и значения битов можно по­
знакомиться начиная с раздела 28.16 (1].
466
ГЛАВА 9. ИНТЕРФЕЙС ПЕРЕДДЧИ
ДАННЫХ:САN
ВВЕДЕНИЕ BXCAN
Периферийное устройство Basic Extended CAN, получившее
название
Он
bxCAN, обеспечивает взаимодействие с сетью CAN.
CAN версий 2.ОА и В. Он был
поддерживает протоколы
разработан для
ством
эффективного
входящих сообщений
управления
при
большим
количе­
минимальной загрузке про­
цессора. Он также удовлетворяет требованиям к приоритету
передаваемых сообщений. Для приложений, критичных к без­
опасности,
функции
САN-контроллер
для
поддержки
предоставляет
все
опции
Time
CAN
аппаратные
Triggered
Communication.
ОСНОВНЫЕ ХАРАКТЕРИСТИКИ BXCAN
• Поддерживает протокол CAN версии 2.0 А, В Активный
• Скорость передачи данных до 1 Мбит/с
• Поддерживает опцию связи с временным триггером
Трансмиссия:
ТРИ ПОЧТОВЫХ ЯЩИКА ДЛЯ ПЕРЕДАЧИ
ДАННЫХ
• Настраиваемый приоритет передачи
• Временная метка на передаче SOF
Приемная:
• Два приемных FIFO с тремя каскадами
• Масштабируемые банки фильтров:
467
- 28 банков фильтров, разделяемых между CAN1 и CAN2
в устройствах линии связи;
- 14 банков фильтров в других устройствах STM32F10xxx;
• Функция списка идентификаторов
• Конфигурируемый выход за пределы FIFO
• Временная метка на приеме SOF
Опция связи по времени
• Отключение режима автоматической ретрансляции
• 16-разрядный таймер свободного хода
• Временная метка передается в двух последних байтах
данных
Управление
• Маскируемые прерывания
• Программно-эффективное сопоставление почтовых ящи­
ков в уникальном адресном пространстве
Dual CAN
• CAN1: Master bxCAN для управления связью между SLave
bxCAN и 512-байтной памятью SRAM
• CAN2: ведомый bxCAN, не имеющий прямого доступа к па­
мяти SRAM.
• Две ячейки bxCAN совместно используют 512-байтную па­
мять SRAM (см. рис. 8.2).
Примечание: В устройствах низкой, средней, высокой и ХL­
плотности
USB и CAN совместно используют выделенную 512-
байтную память SRAM для передачи и приема данных, поэтому
их одновременное использование невозможно (доступ к общей
памяти
и
SRAM осуществляется только через CAN и USB). USB
CAN могут использоваться в одном и том же приложении,
но не одновременно.
ОБЩЕЕ ОПИСАНИЕ BXCAN
В современных САN-приложениях количество узлов в сети
растет, и часто несколько сетей соединяются между собой через
шлюзы. Как правило, количество сообщений в системе (и, соот-
468
ветственно, сообщений, которые должны обрабатываться каж­
дым узлом) значительно увеличивается. В дополнение к при­
кладным сообщениям появились сообщения управления сетью
и диагностики.
• Для обработки каждого типа сообщений требуется усовер­
шенствованный механизм фильтрации.
Кроме того, прикладные задачи требуют больше процессор­
ного времени, поэтому ограничения реального времени, связан­
ные с приемом сообщений, должны быть уменьшены.
• Схема приема FIFO позволяет выделять процессор для вы­
полнения прикладных задач в течение длительного времени без
потери сообщений.
Стандартный протокол HLP (Higher Layer Protocol), основан­
ный на стандартных драйверах CAN, требует эффективного ин­
терфейса с контроллером CAN.
ф
"С
о
IICU
(.)
с
ф
Q)
"С
о
о
с:
z
<(
С\1
"С
AppliceUon
с:
с:
z
z
<(
CAN
ConlJOller
<(
(.)
(.)
CAN
CAN
R•
Тх
CAN
Low
CAN Buo
Рисунок 9.1 - Топология сети CAN
Активное ядро CAN 2.0В
Модуль bxCAN полностью автономно обрабатывает переда­
чу и прием САN-сообщений. Стандартные идентификаторы (11битные)
и
расширенные
идентификаторы
(29-битные)
стью поддерживаются аппаратно.
Регистры управления, состояния и конфигурации
469
полно­
Приложение использует эти регистры для:
• Настройка параметров CAN, например, скорости передачи
данных;
• Запросить передачу;
• Проведение приемов;
• Управление прерываниями;
• Получение диагностической информации.
Почтовые ящики Тх
Для установки сообщений в программе предусмотрены три
почтовых ящика передачи. Планировщик передачи решает, ка­
кой почтовый ящик должен быть передан первым.
Фильтры приемки
В bxCAN предусмотрено 28 масштабируемых/конфигурируе­
мых банков фильтров идентификаторов для отбора нужных про­
граммному обеспечению входящих сообщений и отбрасывания
остальных. В других устройствах имеется
14 масштабируемых/
конфигурируемых банков фильтров идентификаторов.
Приемный FIFO
Для хранения входящих сообщений аппаратно используют­
ся два приемных FIFO. В каждом FIFO может храниться три пол­
ных сообщения. Управление FIFO полностью осуществляется ап­
паратно.
470
-
CAN1 (Master) wlth 512 Ьytes SRAM
1Мaster Control
[JEJ~
1
1 Master Status
1
Тх Stalus
1
Ах FIFO О Status 1
с
Ах FIFO 1 Status 1
!!
lnterrupt Е nаЫе
ё!
Error Status
2
~
i
s
i
с
8
Bi111mlng
Filtor Masleг
1т=:1
"LJ
-Q-
1
1
1
1
Filte rМode
1
1
Filter FIFO Assign 1
Filler Scale
Fiher Activation
1
CAN2 (Slave)
~ 1Master Control
jI
с
Masler Status
IТх Status
~ 1Ах FIFO О Status
S IАх FIFO t Status
~ llnterrupl ЕnаЫе
~ 1Error Status
CAN 2 .0В Active Core
1BИТ!ming
Note: CAN 2 sl.att fille r ьank numЬer n 1s contlgur.ь&e Ьу wrtting to
the CAN2S8!5:0J Ьits fl а,е CAN_ FMA teQ15ter
Рисунок 9.2 - Блок-схема двойной CAN (устройства подключения)
РЕЖИМЫ РАБОТЫ BXCAN
bxCAN имеет три основных режима работы: инициализация,
нормальный и Sleep. После аппаратного сброса bxCAN перехо­
дит в режим Sleep для снижения энергопотребления, при этом
на CANTX действует внутренняя подтяжка. Программное обеспе­
чение запрашивает переход bxCAN в режим инициализации или
Sleep, устанавливая биты INRQ или SLEEP в регистре CAN_MCR.
471
После перехода в этот режим bxCAN подтверждает его установ­
кой битов
INAK или SLAK в регистре CAN_MSR, и внутренняя
INAK, ни SLAK не установлены,
подтяжка отключается. Если ни
bxCAN находится в нормальном режиме режим. Перед перехо­
дом в нормальный режим bxCAN всегда должен синхронизиро­
ваться по шине CAN. Для синхронизации
bxCAN ожидает, пока
шина CAN не станет холостой, что означает, что на CANRX было
отслежено 11 последовательных рецессивных битов.
РЕЖИМ ИНИЦИАЛИЗАЦИИ
Программная инициализация может быть выполнена, пока
аппаратура находится в режиме инициализации. Для перехода
в этот режим программа устанавливает бит INRQ в регистре
CAN_MCR и ждет, пока аппаратура не подтвердит запрос уста­
новкой бита INAK в регистре CAN_MSR. Для выхода из режима
инициализации программа очищает бит INRQ. bxCAN вышел
из режима инициализации после того, как бит INAK был очищен
аппаратно. В режиме инициализации все передачи сообщений
на шину CAN и с шины CAN остановлены, а состояние выхода
САNТХ шины CAN рецессивно (высокий уровень). Вход в режим
инициализации не изменяет ни один из конфигурационных ре­
гистров. Для инициализации САN-контроллера программа долж­
на установить регистры
Bit Timing (CAN_BTR) и CAN options
(CAN_MCR). Для инициализации регистров, связанных с банками
САN-фильтров (режим, масштаб, назначение FIFO, активация
и значения фильтров), необходимо установить бит FINIT
(CAN_FMR). Инициализация фильтров также может быть выпол­
нена вне режима инициализации.
Примечание: При
FINIT=1 прием сигнала CAN отключается.
Значения фильтров также могут быть изменены путем деактива­
ции соответствующих битов активации фильтров (в регистре
CAN_FA1R). Если банк фильтров не используется, то рекоменду­
ется оставить его неактивным (соответствующий бит FACT оста­
вить очищенным).
472
НОРМАЛЬНЫЙ РЕЖИМ
После завершения инициализации программное обеспече­
ние должно запросить у аппаратуры переход в нормальный ре­
жим, чтобы иметь возможность синхронизироваться по шине
CAN и начать прием и передачу. Запрос на переход в нормаль­
ный режим выдается путем сброса бита INRQ в регистре
CAN_MCR. Устройство bxCAN переходит в нормальный режим
и готово к участию в работе шины после синхронизации с пере­
дачей данных по шине
CAN. Для этого необходимо дождаться
появления последовательности из 11 последовательных рецес­
сивных битов (состояние
Bus ldle). Переход в нормальный ре­
жим подтверждается аппаратно путем сброса бита INAK в реги­
стре
CAN_MSR. Инициализация значений фильтра не зависит
от режима инициализации, но должна выполняться при неактив­
ном фильтре (соответствующий бит FACTx сброшен). Перед вхо­
дом в нормальный режим необходимо настроить шкалу фильтра
и конфигурацию режима.
СПЯЩИЙ РЕЖИМ (НИЗКОЕ
ЭНЕРГОПОТРЕБЛЕНИЕ)
Для снижения энергопотребления в
режим
пониженного
энергопотребления,
bxCAN
предусмотрен
называемый
Sleep
mode. Вход в этот режим осуществляется по программному за­
просу путем установки бита SLEEP в регистре CAN_MCR. В этом
режиме часы bxCAN останавливаются, однако программное
обеспечение по-прежнему может обращаться к почтовым ящи­
кам bxCAN. Если программа запрашивает вход в режим инициа­
лизации, устанавливая бит INRQ, когда bxCAN находится в состо­
янии Спящий режим, он также должен сбросить бит SLEEP.
Пробуждение bxCAN (выход из спящего режима) может быть
осуществлено либо программным сбросом бита SLEEP, либо при
обнаружении активности шины CAN. При обнаружении активно­
сти шины
CAN аппаратные средства автоматически выполняют
473
последовательность пробуждения, очищая бит SLEEP, если бит
AWUM в регистре CAN_MCR установлен. Если бит AWUM очищен,
то для выхода из спящего режима программному обеспечению
необходимо очистить бит SLEEP при возникновении прерыва­
ния пробуждения.
Примечание: Если прерывание пробуждения включено (бит
WKUIE установлен в регистре CAN_IER), то при обнаружении
активности шины CAN будет сгенерировано прерывание про­
буждения, даже если bxCAN автоматически выполнит последо­
вательность пробуждения. После сброса бита SLEEP выход
из
спящего
режима
осуществляется
после
синхронизации
bxCAN с шиной CAN, см. рис. 8.3. Выход из спящего режима
происходит после аппаратного сброса бита SLAK.
Reset
Normal
INRQ.ACK
SI.AК,,O
INAК :О
INRQ . SYNC . SLEEP
Рисунок 9.3 - Режимы работы bxCAN
(1). АСК = состояние ожидания, во время которого аппарат­
ное обеспечение подтверждает запрос установкой битов INAK
или SLAK в регистре CAN_MSR.
(2). SYNC = состояние, в котором bxCAN ожидает, пока шина
CAN не станет холостой, т.е. на CANRX не будет проконтролиро­
вано 11 последовательных рецессивных битов.
474
РЕЖИМ ТЕСТИРОВАНИЯ
Тестовый режим может быть выбран битами
SILM и LBKM
в регистре CAN_BTR. Эти биты должны быть сконфигурированы,
пока bxCAN находится в режиме инициализации. После выбора
тестового режима для перехода в нормальный режим необходи­
мо сбросить бит INRQ в регистре CAN_MCR. 24.5.1
БЕСШУМНЫЙ РЕЖИМ
Перевести bxCAN в бесшумный режим можно, установив бит
SILM в регистре CAN_BTR.
В бесшумном режиме bxCAN может принимать действитель­
ные кадры данных и действительные удаленные кадры, но посы­
лает на шину CAN только рецессивные биты и не может начать
передачу. Если
bxCAN необходимо передать доминантный бит
(бит АСК, флаг перегрузки, активный флаг ошибки), то он перена­
правляется внутрь, так что CAN Core отслеживает этот доминант­
ный бит, хотя шина CAN может остаются в рецессивном состоя­
нии. Тихий режим может использоваться для анализа трафика
на шине CAN, не влияя на него передачей доминантных битов
(биты подтверждения, кадры ошибок).
bxCAN
Тх
Rx
=1
••
u
1
'
САNТХ CANRX
Рисунок 9.4 -
bxCAN в бесшумном режиме
475
Режим обратного хода
Перевести bxCAN в режим Loop Back Mode можно установ­
кой бита LBKM в регистре CAN_BTR. В режиме Loop Back Mode
bxCAN рассматривает свои собственные переданные сообщения
как принятые и сохраняет их (если они прошли приемочную
фильтрацию) в почтовом ящике Receive.
bxCAN
Тх
Rx
САNТХ CANRX
Рисунок 9.5 -
bxCAN в режиме обратной связи
Этот режим предусмотрен для функций самотестирования.
Для обеспечения независимости от внешних событий САN-ядро
игнорирует ошибки квитирования (отсутствие доминирующего
бита
в слоте
квитирования
кадра данных/удаленного
кадра)
в режиме Loop Back Mode. В этом режиме bxCAN осуществляет
внутреннюю обратную связь с выхода Тх на вход Rx. Фактиче­
ское значение входного контакта CANRX не учитывается bxCAN.
Передаваемые
сообщения
можно
отслеживать
по
выводу
CANTX.
ОБРАТНЫЙ ХОД В СОЧЕТАНИИ С БЕСШУМНЫМ
РЕЖИМОМ
Loop Back и режим Silent,
установив биты LBKM и SILM в регистре CAN_BTR. Этот режим
Также можно совместить режим
может быть использован для «горячего самотестирования», то
476
bxCAN может быть протестирована, как в режиме Loop
Back, но без влияния на работающую САN-систему, подключен­
ную к выводам САNТХ и CANRX. В этом режиме вывод CANRX от­
ключается от bxCAN, а вывод CANTX удерживается в рецессив­
есть
ном состоянии.
bxCAN
lul
САNТХ CANRX
Рисунок 9.6 -
bxCAN в комбинированном режиме
РЕЖИМ ОТЛДДКИ
Когда микроконтроллер переходит в режим отладки (ядро
Согtех®-М3 остановлено), bxCAN продолжает работать нормаль­
но или останавливается, в зависимости от:
• бит DBG_CAN1_STOP для CAN1 или бит DBG_CAN2_STOP
DBG. Более подробную информацию см. в:
Поддержка отладки таймеров, сторожевого таймера, bxCAN
для CAN2 в модуле
и 12С.
• бит DBF в CAN_MCR.
ФУНКЦИОНАЛЬНОЕОПИСАНИЕВХСАN
Управление трансмиссией
Для того чтобы передать сообщение, программа должна вы­
брать один пустой почтовый ящик, установить идентификатор,
код длины данных (DLC) и данные, а затем запросить передачу,
477
установив соответствующий бит TXRQ в регистре CAN_ТlxR. После
выхода почтового ящика из пустого состояния программа больше
не имеет доступа на запись в регистры почтового ящика. Сразу по­
сле установки бита TXRQ почтовый ящик переходит в состояние
ожидания и ожидает, когда он станет почтовым ящиком с наивыс­
шим приоритетом, см. раздел «Приоритет передачи». Как только
почтовый ящик получит наивысший приоритет, он будет заплани­
рован на передачу. Передача сообщения запланированного поч­
тового ящика начнется (перейдет в состояние передачи), когда
шина CAN станет незанятой. После успешной передачи почтовый
ящик снова станет пустым. 06 успешной передаче аппаратура сиг­
нализирует установкой битов RQCP и ТХОК в регистре CAN_TSR.
При неудачной передаче причина указывается битом
в регистре
ALST
CAN_TSR в случае потери арбитража и/или битом
TERR в случае обнаружения ошибки передачи.
ПРИОРИТЕТ ПЕРЕДДЧИ
По идентификатору Когда ожидается передача более одного
почтового ящика, то Порядок передачи задается идентификато­
ром сообщения, хранящегося
с наименьшим значением
в
почтовом ящике. Сообщение
идентификатора
имеет наивысший
приоритет в соответствии с арбитражем протокола
CAN. Если
значения идентификаторов равны, то первым будет передано
сообщение с меньшим номером почтового ящика.
По очередности запросов на передачу
Почтовые ящики
как передающий
передачи могут быть сконфигурированы
FIFO путем установки бита TXFP в регистре
CAN_MCR. В этом режиме порядок приоритетов определяется
порядком запросов на передачу. Этот режим очень удобен для
сегментированной передачи.
Прервать
Запрос на передачу может быть прерван пользователем пу­
тем установки бита ABRQ в регистре CAN_TSR. В состоянии ожи-
478
дания или расписания почтовый ящик прерывается немедленно.
Запрос на прерывание, когда почтовый ящик находится в состо­
янии передачи, может иметь два результата. При успешной пе­
редаче почтовый ящик становится пустым, а в регистре CAN_TSR
устанавливается бит ТХОК. При неудачной передаче почтовый
ящик
становится
запланированным,
передача
прерывается
и становится пустым с очищенным битом ТХОК. Во всех случаях
почтовый ящик снова станет пустым, по крайней мере, по окон­
чании текущей передачи.
Режим неавтоматической ретрансляции
Этот режим реализован для того, чтобы выполнить требова­
ние стандарта
CAN о возможности связи с временным тригге­
ром. Для конфигурирования аппаратуры в этом режиме необхо­
димо установить бит NART в регистре CAN_MCR.
В этом режиме каждая передача начинается только один
раз. Если первая попытка не удалась из-за потери арбитража
или ошибки, аппаратура не будет автоматически возобновлять
передачу сообщения.
По окончании первой попытки передачи аппаратура считает
запрос выполненным
и устанавливает бит RQCP в регистре
CAN_TSR. Результат передачи индицируется в регистре CAN_TSR
битами ТХОК, ALST и TERR.
479
ABR0=1
ROCP-0
ТХОК-0
тме.о
CAN Bus~-IDLE
ТRANSMIТ
RQCP-0
Transmit failed • NART
ТХОК,,О
тме.о
RQCP.1
тхок.,
ПIЕ• 1
Рисунок 9.7 - Состояния почтового ящика передачи
РЕЖИМ СВЯЗИ ПО ВРЕМЕНИ
В этом режиме активизируется внутренний счетчик САN-ап­
паратуры, который используется для формирования значения
Time Stamp, хранящегося в регистрах CAN_RDTxR/CAN_TDTxR
соответственно (для почтовых ящиков Rx и Тх). Внутренний счет­
чик инкрементируется каждый бит времени CAN (см. Раздел
24.7.7). Внутренний счетчик фиксируется в точке выборки бита
Start Of Frame как при приеме, так и при передаче.
Работа на ресепшене (приеме)
Для приема САN-сообщений предусмотрены три почтовых
ящика, организованных в виде
FIFO. Для снижения нагрузки
на процессор, упрощения программного обеспечения и обеспе­
чения согласованности данных FIFO полностью управляется ап-
480
паратно. Приложение получает доступ к сообщениям, храня­
щимся в FIFO, через выходной почтовый ящик FIFO.
Действительное сообщение
Принятое сообщение считается действительным, если оно
было принято корректно в соответствии с протоколом CAN (нет
ошибок до предпоследнего бита поля
EOF) и успешно прошло
фильтрацию идентификаторов.
ЕМРТУ
FMP:0.00
FOVR=O
~~е:::~е
~~
~
PENDING_1
FМР•ОХ01
MailЬox
FOVR=O
Releasej
MailЬox
RFOM=1
1 Valid Message
'f
Received
PENDING_2
FMP.OX10
FOVR~o
Release
MailЬox
ii
Valid Message
Received
RFOM=1
------PENDING_Э
FMP.Oxt1
FOVR-0
Valid Message
~
~
MailЬox
RFOM=1
Valid Message
Received
Рисунок 9.8 -
Состояния FIFO приемника
Управление FIFO
481
Начиная с пустого состояния, в
FIFO сохраняется
первое
принятое правильное сообщение, которое становится pending_l.
Аппаратура сигнализирует об этом событии, устанавливая биты
FMP [1:0) в регистре CAN_RFR в значение 0lb. Сообщение стано­
вится доступным в выходном почтовом ящике FIFO. Программ­
ное
обеспечение
считывает
содержимое
почтового
ящика
и освобождает его, устанавливая бит RFOM в регистре CAN_RFR.
FIFO снова становится пустым. Если за это время было получено
новое валидное сообщение, то FIFO остается в состоянии
pending_l и новое сообщение становится доступным в выход­
ном почтовом ящике.
Если приложение не освобождает почтовый ящик, то следу­
ющее действительное сообщение будет сохранено в FIFO, кото­
рый переходит в состояние pending_2 (FMP [1:0) = 10Ь). Процесс
сохранения повторяется для следующего валидного сообщения,
FIFO в состояние pending_3 (FMP [1:0) = 11Ь). В этот
переводя
программа
момент
ящик, установив бит
должна
освободить
выходной
почтовый
RFOM, чтобы освободить почтовый ящик
для хранения следующего валидного сообщения. В противном
случае
следующее
принятое
валидное
сообщение
приведет
к потере сообщения.
Превышение
Если
FIFO находится в состоянии pending_3 (т.е. три почто­
вых ящика переполнены), то следующий прием валидного сооб­
щения приведет к переполнению и сообщение будет потеряно.
Аппаратный сигнализирует о превышении допустимого уровня,
CAN_RFR. Какое сообщение
будет потеряно, зависит от конфигурации FIFO:
• Если функция блокировки FIFO отключена (бит RFLM в ре­
гистре CAN_MCR сброшен), то последнее сообщение, хранящее­
ся в FIFO, будет перезаписано новым входящим сообщением.
устанавливая бит FOVR в регистре
В этом случае приложению всегда будут доступны последние со­
общения.
• Если функция блокировки FIFO включена (установлен бит
RFLM в регистре CAN_MCR), то самое последнее сообщение бу-
482
дет отброшено, и программе будут доступны три самых старых
сообщения в FIFO.
Прерывания, связанные с приемом
После сохранения сообщения в
FIFO происходит обновле­
ние битов FMP [1:0) и формируется запрос на прерывание, если
установлен бит FMPIE в регистре CAN_IER.
При заполнении FIFO (т.е. при сохранении третьего сообще­
ния) устанавливается бит FULL в регистре CAN_RFR и генериру­
ется прерывание, если установлен бит FFIE в регистре CAN_IER.
При
превышении установлен бит
FOVR
и сгенерировано
прерывание, если установлен бит FOVIE в регистре CAN_IER.
Фильтрация идентификаторов
В
протоколе
CAN идентификатор сообщения не связан
с адресом узла, а относится к содержанию сообщения. Следо­
вательно, передатчик транслирует свое сообщение всем прием­
никам.
При
получении
сообщения узел-приемник решает
в зависимости от значения идентификатора
общение
его
программному
-
обеспечению.
необходимо, то оно копируется в
-
нужно ли это со­
Если
сообщение
SRAM. Если нет, то сообще­
ние должно быть отброшено без вмешательства программного
обеспечения.
Для
выполнения
этого
требования контроллер bxCAN
28 конфигурируемых и масштаби­
руемых банков фильтров (27-0). В других устройствах кон­
троллер bxCAN предоставляет приложению 14 конфигурируе­
мых и масштабируемых банков фильтров (13-0) для получе­
предоставляет приложению
ния только тех сообщений, которые необходимы программному
обеспечению. Такая аппаратная фильтрация позволяет эконо­
мить ресурсы
процессора, которые в противном случае потре­
бовались
бы
для
фильтров
х
состоит
программной
из
двух
фильтрации.
32-
Каждый
разрядных
банк
регистров,
CAN_FxR0 и CAN_FxR1.
Масштабируемая ширина
Для оптимизации
и адаптации фильтров к потребностям
приложения каждый банк фильтров может быть масштабирован
483
независимо. В зависимости от масштаба фильтра банк фильтров
обеспечивает:
• Один 32-разрядный фильтр для битов STDID [10:0], EXТID
[17:0], IDE и RTR.
• Два 16-разрядных фильтра для битов STDID [10:0], RTR,
IDE и EXТID [17:15]. См. рисунок 8.9. Кроме того, фильтры могут
быть настроены в режиме маски или в режиме списка иденти­
фикаторов.
Режим маскирования
В режиме маски регистры идентификаторов связаны с реги­
страми масок, определяющими, какие биты идентификатора об­
рабатываются как «должны совпадать» или как «неважно».
Режим списка идентификаторов
В режиме списка идентификаторов регистры масок исполь­
зуются как регистры идентификаторов. Таким образом, вместо
определения идентификатора и маски указывается два иденти­
фикатора, что удваивает количество одиночных идентификато­
ров. Все биты входящего идентификатора должны совпадать
с битами, указанными в регистрах фильтра.
Настройка масштаба и режима работы банка фильтров
Конфигурирование банков фильтров осуществляется с помо­
щью соответствующего регистра CAN_FMR. Для конфигурирова­
ния банка фильтров его необходимо деактивировать, сбросив
бит FACT в регистре CAN_FAR. Масштаб фильтрации конфигури­
руется с помощью соответствующего бита FSCx в регистре
CAN_FS1R, см. рис. 8.9. Режим списка идентификаторов или мас­
ки идентификаторов для соответствующих регистров Mask/
ldentifier конфигурируется с помощью битов FBMx в регистре
CAN_FMR. Чтобы отфильтровать группу идентификаторов, на­
стройте регистры Mask/ldentifier в режиме маски. Для выбора
отдельных идентификаторов необходимо настроить регистры
Mask/ldentifier в
не
режиме списка
используемые приложением,
идентификаторов. Фильтры,
следует оставить отключенны­
ми. Каждый фильтр в банке фильтров нумеруется (так называе­
мый номер фильтра) от О до максимума, зависящего от режима
484
и масштаба каждого из банков фильтров . Конфигурация фильтра
приведена на рис. 8.9.
. Filter
: Num.
l!
~
EXID(4 ·0J
IOE mA
О
,
EXID(12.5J
EX.IO(◄:OJ
IDe
АТR
О
,
~ Two 32-Bit Fllters - ldentifier llst
1D
1D
CAN_F
CAN Fx
..
SТIC(20J
SТID!10. 3J
Mapping
u
~
EXID(12.5)
EXID(17 13J
Four 16-Blt Fllters - ldentifler llst
-
~
~
CAN_FxR1(7 OJ
CAN_FxR1 23;16
П
•
- - - - - - - - • - - • - •••••• - ••• - - -:· -
CAN_FxR21158J
CAN_FxR2j31:24]
CAN_FxA2[7·0J
CAN FxA2(23 16(
1
S'ТI0{10.3]
STtD(2~ATRIOEEXI0{171S}
1D
1D
CAN_FxR1(15.8J
CAN_FxA1 31 .24
IDI
1D
Mapping
n+1·
_
----------·······-···---~-- ~•?
,
n+Э
:к = tifter bank numЬer
ID=ldenmier
1 These blts are loca1ed in the CAN_FS1 А register
2 These bits аге located in the CAN_FM t А regis1er
Рисунок 9.9 -
Настройка шкалы банка фильтров -
организация
регистрации
Индекс соответствия фильтра
После поступления сообщения в
FIFO оно становится до­
ступным для приложения. Как правило, данные приложения ко­
пируются в места
SRAM. Чтобы скопировать данные в нужное
место, приложение должно идентифицировать их с помощью
идентификатора. Чтобы избежать этого и облегчить доступ к ме­
стам SRAM, САN-контроллер предоставляет индекс соответствия
фильтра.
485
Этот индекс хранится в почтовом ящике вместе с сообщени­
ем в соответствии с правилами приоритета фильтра. Таким об­
разом, каждое полученное сообщение имеет свой индекс соот­
ветствия фильтру.
Индекс Filter Match может быть использован двумя спосо­
бами:
• Сравните индекс Filter Match со списком ожидаемых зна­
чений.
• Используйте индекс Filter Match lпdex в качестве индекса
массива для доступа к месту назначения данных. Для немаски­
руемых фильтров
программа
больше
не должна сравнивать
идентификатор.
Если фильтр замаскирован, то программа сводит сравнение
только к замаскированным битам.
Значение индекса номера фильтра не учитывает состояние
активации банков фильтров. Кроме того, используются две неза­
висимые схемы нумерации, по одной для каждого FIFO. Пример
приведен на рис. 9.10.
486
Filter
Bank
FIFO0
о
1D List (32-Ьit)
Filter
Num.
о
Filter
Bank
FIFO1
2
1D Mask (16 - Ьit)
1D Mask (32-Ьit)
2
4
1D List (32-Ьit)
з
1D List (16-Ьit)
3
4
5
6
7
Deactivated
1D Mask (16-Ьit)
5
Deactivated
1D List (32-Ьit)
8
1D Mask ( 16-Ьit)
6
1D Mask (16-Ьit)
9
1D List (32- Ьit)
13
1D Mask (32-Ьit)
7
8
9
10
11
12
13
Рисунок 9.10 -
10
Deactivated
1D List ( 16-Ьit)
11
1D List (32-Ьit)
12
1D Mask (32-Ьit)
Filter
Num.
о
2
3
4
5
6
7
8
9
10
11
12
13
14
Пример нумерации фильтров
Правила приоритета фильтрации
В зависимости от комбинации фильтров может случиться
так, что идентификатор успешно пройдет через несколько филь­
тров. В этом случае значение совпадения фильтров, хранящееся
в почтовом ящике приема , выбирается в соответствии со следу­
ющими правилами приоритета:
• 32-битный фильтр имеет приоритет перед 16-битным;
• Для фильтров одинакового масштаба приоритет отдается
режиму «Список идентификаторов», а не «Идентификатор Ре­
жим маскирования;
• Для фильтров одинакового масштаба и режима приоритет
отдается по номеру фильтра (чем меньше номер, тем выше при­
оритет).
487
Example of 3 filter banks in 32-Ыt Unldentifled List mode and
the remalnlng in 32-Ыt ldentlfler Mask mode
Message Received
' - - - - - - - - -~
FMI
Filter numЬer stored in the
Filter Match lndex field
wilhin the CAN_RDTxR
register
MessaQe Discarded
Рисунок 9.11 -
Механизм фильтрации -
пример
Приведенный пример демонстрирует принцип фильтрации
в bxCAN. При приеме сообщения идентификатор сначала срав­
нивается с фильтрами, настроенными в режиме списка иденти­
фикаторов. При наличии совпадения сообщение сохраняется
в
в
соответствующем FIFO, а индекс совпавшего фильтра Filter Match lndex. Как показано в примере, идентификатор
совпадает с идентификатором №2, поэтому содержимое сооб­
щения и FMI 2 сохраняются в FIFO.
Если совпадения нет, то входящий идентификатор сравнива­
ется с фильтрами , настроенными в режиме маски.
Если идентификатор не совпадает ни с одним из идентифи ­
каторов , настроенных в фильтрах, то сообщение отбрасывается
аппаратными
средствами
без
вмешательства
граммного обеспечения.
488
в
работу
про­
Хранение сообщений
Интерфейс между программным и аппаратным обеспечени­
ем для сообщений CAN реализуется с помощью почтовых ящи­
ков. Почтовый ящик содержит всю информацию, относящуюся
к сообщению: идентификатор, данные, управление, статус и ин­
формацию о метке времени.
Передача почтового ящика
Программное обеспечение устанавливает сообщение для
передачи в пустой почтовый ящик передачи. Статус передачи
указывается аппаратно в регистре CAN_TSR.
Regls18r name
Olfset to transmlt mallЬox Ьеsе address
о
CAN_TlxR
4
CAN_ТDTxR
8
CAN_TDL.xR
12
CAN_TDHxR
Таблица 9.1 - Сопоставление почтовых ящиков передачи
Получение почтового ящика
Когда сообщение получено, оно доступно программному
обеспечению в выходном почтовом ящике FIFO. После того как
программа обработает сообщение (например, прочитает его),
она должна освободить выходной почтовый ящик FIFO с помо­
щью бита RFOM в регистре CAN_RFR, чтобы сделать доступным
следующее входящее сообщение. Индекс совпадения фильтров
хранится в поле MFMI регистра CAN_RDTxR. 16-битное значение
временной
метки
хранится
в
CAN_RDTxR.
489
поле
TIME (15:0]
регистра
ОНаеt to recelve mallЬox Ьаsе
Reglster name
adclrna (Ьytes)
о
CAN_RlxR
4
CAN_RDTxR
8
CAN_RDLxR
12
CAN_RDHxR
Таблица 9.2 - Сопоставление почтовых ящиков приема
When ТЕС or REC > 127
When 128 • 11 recessive blts occur:
Рисунок 9.12 - Диаграмма соаояния ошибок CAN
УПРАВЛЕНИЕ ОШИБКАМИ
Управление ошибками, описанное в протоколе CAN, полно­
аью выполняется аппаратно с помощью счетчика ошибок пере­
дачи (значение ТЕС, в региаре
490
CAN_ESR) и счетчика ошибок
приема (значение REC, в регистре CAN_ESR), которые увеличи­
ваются или уменьшаются в зависимости от состояния ошибки.
Подробную информацию об управлении ТЕС и
дарте
CAN. Оба
они
REC см. в стан­
могут быть прочитаны программно для
определения стабильности работы сети. Кроме того, аппаратура
CAN предоставляет подробную информацию о текущем состоя­
нии ошибки в регистре CAN_ESR. С помощью регистра CAN_IER
(бит ERRIE и т.д.) программное обеспечение может очень гибко
конфигурировать
генерацию
прерываний
при
обнаружении
ошибок.
Восстановление шины
Состояние Bus-Off достигается, когда ТЕС больше 255, на это
состояние указывает бит BOFF в регистре CAN_ESR. В состоянии
Bus-Off устройство bxCAN больше не может передавать и прини­
мать
сообщения.
В
зависимости
от бита
АВОМ
в
регистре
CAN_MCR bxCAN восстанавливается после Bus-Off (снова стано­
вится активной при ошибках) либо автоматически, либо по про­
граммному запросу. Но в обоих случаях bxCAN должна дождать­
ся как минимум последовательности восстановления, указанной
11 последовательных рецес­
CANRX). Если установлено
значение АВОМ, то после перехода в состояние Bus-Off устрой­
ство bxCAN автоматически запустит последовательность восста­
в стандарте CAN (128 повторений
сивных битов, контролируемых на
новления. Если АВОМ сброшен, то программа должна иниции­
ровать последовательность восстановления, запросив у
bxCAN
вход и выход из режима инициализации.
Примечание: В режиме инициализации
bxCAN не контроли­
рует сигнал CANRX, поэтому не может завершить последователь­
ность восстановления. Для восстановления bxCAN должен нахо­
диться в нормальном режиме.
Битовая синхронизация
Логика
битовой
синхронизации
контролирует последова­
тельную шину и выполняет выборку и настройку точки выборки,
синхронизируясь по фронту стартового бита и ресинхронизиру­
ясь по последующим фронтам.
491
Его работу можно объяснить, разделив номинальное бито­
вое время на три сегмента следующим образом:
• Сегмент синхронизации (SYNC_SEG): ожидается, что в этом
временном сегменте произойдет смена бита. Он имеет фиксиро­
ванную длину в один квант времени (1 х tq).
• Битовый сегмент 1 (В51): определяет местоположение точ­
ки выборки. Он включает в себя PROP_SEG и PHASE_SEG1 стан­
дарта
CAN.
Его длительность
программируется
в диапазоне
от 1 до 16 квантов времени, но может быть автоматически удли­
нена для компенсации положительных фазовых дрейфов, обу­
словленных различиями в частотах различных узлов сети.
• Битовый сегмент 2 (В52): определяет местоположение точ­
представляет собой PHASE_SEG2 стандарта
CAN. Его длительность программируется в диапазоне
от 1 до 8 квантов времени, но может быть и автоматически со­
ки
передачи. Он
кращена для компенсации отрицательных фазовых дрейфов.
Ширина скачка ресинхронизации (SJW) задает верхнюю гра­
ницу удлинения или укорочения битовых сегментов. Она про­
граммируется в диапазоне от 1 до 4 квантов времени.
Под действительным фронтом понимается первый за бито­
вое
время
переход
от доминантного
к
рецессивному
уровню
шины при условии, что сам контроллер не посылает рецессив­
ный бит. Если в В51 вместо SYNC_SEG обнаружен действитель­
ный фронт импульса, то В51 удлиняется на величину до SJW, так
что точка выборки задерживается. И наоборот, если в В52 вме­
сто SYNC_SEG обнаружен допустимый фронт импульса, то В52
укорачивается на величину до SJW, чтобы точка передачи была
сдвинута раньше. Для защиты от ошибок программирования
конфигурирование
регистра
Bit Timing (CAN_BTR)
возможно
только в режиме ожидания устройства.
Примечание: Подробное описание механизма синхрониза­
ции и ресинхронизации битов CAN приведено в стандарте 150
11898.
492
-
NOМINAL BIT TIME
,,
BIT SEGMENT 1 (851)
SYNC_SEGI
~
1_
1 х t.,
~
ВIТ SEGМENТ 2 (852)
·~
'вs,
1
SAМPLEPOINТ
1
.
'вs,
TRANSМIТ POINT
BaudRate : NominalBitТime
NominalBitТime :
1 х tq + 16 s 1 + 16 s 2
with:
16 s 1 : 1q х (ТS1[3:О] + 1),
tвs2: tq х (ТS2(2:О] + 1),
1q : (BRP(9:0] + 1) х lpcLК
where 1q refers to the Time quantum
lpcLк :
time period of the АРВ clock,
BRP(9:0], TS1 (З:О] and TS2[2:0) are defined in the CAN_BTR Register.
Рисунок 9.13 -
Временная синхронизация битов
493
lnter•Frame Sf)ace
Dзta Frame {Standard idenlffier)
lnter-Frame Space
or Overload Framв
- - -.......- - - - - - - - - - 4 4 + 8 • N - - - - - - - - - - Ack Field
CRCField
Ctd Fietd Оа1а Fie1d
ArЫtratlon Field
2
--~---16---.;,,+t,,>-7-
6
EOF
CRC
lnter-Frame Space
or Over1oad Ffame
Da1a Fr~ (Extended ldentifier)
64+8•N
lnter-Frame Space
ArЬitration FW:lld
Arbitralion Field
Ctfl Rekt
Data Field
a:w
~
а:с
"'-
tnter-Frame Space
_ _ _ _ _ _ _ _-_,~t1oad Frame
_ _ _ _ _ _ _R_e_m_o~F_rз_me
.......s_pa_ce
lnter•Fra,..me
"'~
Data Ftame or
Remotв Frame
lnter-Frame Space
or Overload Frame
Error Frame
Error
А;~
8
6
-
O <;N<;:;8
Flag Echo Error Delimi . , _ _
SOF • s,an О1 Frame
ldenttfier
1D
=
=
Remote Ttansmission Requeзt
IDE.., ldenlifter Extenslon Brt
RТR
Data Frame or
Aemole Frame
,о • Reserved Blt
DLC • Data Length Code
С АС • Cycllc Redundancy Code
Erтorflag: 6 dominant Ыts if node is error
End Ot Frame or
Error Dвlimiter or
Over1мd Dellmiler
Overload Frame
lnter-Frame Spae&
or Error Frame
Overload Overtoad
F i ~ Ec:r
aclive еlэе 6 recessive Ыts_
Suspend transmiйion: appOes to error
passhle nodes only.
EOF • End о1 Frame
АСК •
Acknowle<lge bit
Clrl • Conlrol
Рисунок 9.14 -
Кадры CAN
Прерывания bxCAN
Для
bxCAN выделено четыре вектора прерываний. Каждый
источник прерывания может быть независимо включен или вы­
ключен с помощью регистра CAN lnterrupt ЕпаЫе (CAN_IER).
494
CAN_IEA
ТRANSMIT
INТERRUPT
CAN_ТSR
·----,
;~,мео 1,
'
'
:,...,.;
&
FIFO0
: F
САН_ AF1A
STAТUS CНANGE
EAROR
INТERRUPT
:1wкu11.-----,-------,-----------1.,____·
CAN._MSR - - •
KI
:~~---------------,~
Рисунок 9.15 - Флаги событий и генерация прерываний
• Прерывание по передаче может быть сгенерировано сле­
дующими событиями:
- Передающий почтовый ящик О становится пустым, бит
RQCP0 в регистре CAN_TSR установлен.
- Передающий почтовый ящик 1 становится пустым, бит
RQCP1 в регистре CAN_TSR установлен.
- Передающий почтовый ящик 2 становится пустым, бит
RQCP2 в регистре CAN_TSR установлен.
• Прерывание FIFO О может быть сгенерировано по следую495
щим событиям:
- Прием нового сообщения, биты FMP0 в регистре
CAN_RF0R не равны '00».
- Состояние заполнения FIFO0, бит FULL0 в регистре
CAN_RF0R установлен.
- Состояние превышения FIFO0, установлен бит FOVR0
в регистре CAN_RF0R.
• Прерывание FIFO 1 может быть сгенерировано по следую­
щим событиям:
- Прием нового сообщения, биты FMP1 в регистре
CAN_RF1R не равны '00».
- Состояние заполнения FIFO1, бит FULL1 в регистре
CAN_RF1R установлен.
- Состояние превышения FIFO1, установлен бит FOVR1
в регистре CAN_RF1R.
• Прерывание по ошибкам и изменению состояния может
быть сгенерировано следующими событиями:
- Состояние ошибки, более подробную информацию о со­
стоянии ошибки смотрите в регистре CAN Еггог Status (CAN_ESR).
- Состояние пробуждения, SOF контролируется по сигналу
CAN Rx.
- Вход в спящий режим.
РЕГИСТРЫ CAN
Доступ к периферийным регистрам осуществляется по сло­
вам (32 бита).
Защита доступа к регистрам
Ошибочный
доступ
к
регистрам может привести
всей сети
определенным
конфигурационным
к временному нарушению работы
CAN. Поэтому регистр CAN_BTR может быть изменен
программно только в режиме инициализации САN-аппаратуры.
Хотя
передача
некорректных
данных
не
вызовет
проблем
на уровне сети CAN, она может серьезно нарушить работу при­
ложения.
Почтовый
ящик
может
496
быть
изменен
программно
только в том случае, если он находится в пустом состоянии. Из­
менять значения фильтров можно либо деактивировав соответ­
ствующие банки фильтров, либо установив бит
FINIT. Причем
изменение конфигурации фильтра (масштаб, режим и назначе­
ние
FIFO) в регистрах CAN_FMxR, CAN_FSxR и CAN_FFAR воз­
можно
только
при
установленном
режиме
инициализации
фильтра (FINIT=1) в регистре CAN_FMR.
Регистры управления и состояния CAN
Регистр управления ведущим устройством CAN (CAN_MCR)
Смещение адреса: ОхОО
Сброшенное значение: Ох0001 0002
30
31
29
••
27
26
25
24
23
22
21
20
10
18
17
14
1S
RESET
,.
13
12
11
16
~
R... мкf
о
10
АВОМ
ттсм
AWUM
NART
rw
RFLМ
,.,
ТХFР
fW
SI.EEP
,.,
INAQ
,.,
Таблица 9.3 - Регистр управления ведущим устройством CAN
(CAN_MCR)
Биты
31:17
Зарезервированы,
должны
быть
сохранены
в значении сброса.
Бит 16 DBF: Запрет отладки
О: CAN работает во время отладки
1: Прием/передача данных CAN заморожены во время от­
ладки. Доступ к FIFO приема/передачи по-прежнему возмо­
жен.
Бит
15 RESET: программный
сброс
ведущего устройства
bxCAN
О: Нормальная работа.
1: Принудительный сброс ведущего устройства bxCAN -> По­
сле сброса активируется спящий режим (биты FMP и Регистр
497
CAN_MCR инициализируется значениями сброса). Этот бит авто­
матически сбрасывается в О.
Биты 14:8 Зарезервированы, должны быть сохранены в зна­
чении сброса.
Бит
7 ПСМ:
режим
по
связи
времени
О:
Режим
связи
по времени отключен. 1: Режим связи с временным триггером
включен
Бит 6 АВОМ: автоматическое управление отключением ши­
ны Этот бит управляет поведением аппаратуры CAN при выходе
из состояния Bus-Off. О: Выход из состояния Bus-Off осуществля­
ется по запросу ПО после того, как будет отслежено 128 вхожде­
ний
11
рецессивных
битов
и
ПО предварительно установит
и сбросит бит INRQ регистра CAN_MCR. 1: Выход из состояния
Bus-Off осуществляется автоматически аппаратными средствами
после 128 вхождений 11 рецессивных битов.
Бит 5 AWUM: режим автоматического пробуждения Этот бит
управляет поведением аппаратуры CAN при приеме сообщений
в режиме Sleep. О: Выход из спящего режима осуществляется
по программному запросу путем сброса бита SLEEP регистра
CAN_MCR. 1: Выход из спящего режима осуществляется автома­
тически аппаратными средствами при обнаружении САN-сооб­
щения.
Бит
SLEEP
регистра
CAN_MCR
и
бит
SLAK
регистра
CAN_MSR очищаются аппаратно.
Бит 4 NART: Нет автоматической ретрансляции О: Аппарату­
ра CAN будет автоматически повторно передавать сообщение
до тех пор, пока оно не будет успешно передано в соответствии
со стандартом
CAN. 1: Сообщение будет передано только один
раз, независимо от результата передачи (успешно, ошибка или
потеря арбитража).
Бит 3 RFLM: режим блокировки
ный
FIFO приемника О: Прием­
FIFO не блокируется при переполнении. При заполнении
FIFO приема следующее входящее сообщение перезаписывает
1: Блокировка приемного FIFO от переполнения.
Как только FIFO приема заполнится, следующее входящее сооб­
предыдущее.
щение будет отброшено.
498
Бит 2 ТХFР: приоритет FIFO передачи Этот бит управляет по­
рядком
передачи
данных
при
одновременном
ожидании
нескольких почтовых ящиков. О: Приоритет определяется иден­
тификатором сообщения
1: Приоритет определяется очередно­
стью запросов (в хронологическом порядке)
Бит 1 SLEEP: запрос спящего режима Этот бит устанавлива­
ется программно для запроса аппаратуры CAN на переход в спя­
щий режим. Спящий режим будет введен, как только завершится
текущая САNактивность (передача или прием САN-кадра). Этот
бит очищается программно для выхода из режима
SLeep. Этот
бит очищается аппаратно, если бит AWUM установлен и в сигна­
ле CAN Rx обнаружен бит SOF. Этот бит устанавливается после
сброса -
CAN начинает работать в режиме SLeep.
Бит О INRQ: запрос инициализации
Программное обеспечение очищает этот бит для перевода
аппаратуры в нормальный режим. После того как в сигнале Rx
проконтролировано
11 последовательных рецессивных битов,
аппаратура CAN синхронизируется и готова к передаче и прие­
му. Аппаратные средства сигнализируют об этом событии, очи­
щая бит
INAK в регистре CAN_MSR. Программа устанавливает
этот бит для запроса аппаратуры CAN на вход в режим инициа­
лизации. После установки бита
INRQ аппаратура CAN ожидает
CAN (передачи или приема),
завершения текущей активности
прежде чем войти в режим инициализации. Аппаратное обеспе­
чение сигнализирует об этом событии установкой бита
в регистре CAN_MSR.
Регистр состояния ведущего устройства CAN (CAN_MSR)
Смещение адреса: Ох04
Сброшенное значение: ОхОООО ОСО2
499
INAK
~
~
~
~
V
~
~
~
~
~
~
ffl
U
ffl
WКUI
ERRI
SlAK
INAК
,c_w1
rc_w1
r
Ю
~
SLAKI
~-••
........
1$
14
13
12
11
10
RX
SАМР
RХМ
ТХМ
Rosened
Таблица 9.4 - Регистр состояния ведущего устройства CAN
(CAN_MSR)
Биты
31:12
Зарезервированы,
должны
быть
сохранены
в значении сброса.
Бит 11 RX: Сигнал CAN Rx Контролирует фактическое значе­
ние вывода CAN_RX.
Бит 10 SAMP: Последняя точка выборки Значение RX в по­
следней точке выборки (текущее значение принятого бита).
Бит 9 RXM: режим приема В настоящее время аппаратное
обеспечение CAN является приемником.
Бит 8 ТХМ: режим передачи В настоящее время аппаратное
обеспечение CAN является передатчиком. Биты
7:5 Зарезерви­
рованы, должны быть сохранены в значении сброса.
Бит 4 SLAКI: прерывание подтверждения сна
Когда SLKIE=1, этот бит устанавливается аппаратно, сигнали­
зируя о том, что bxCAN перешла в спящий режим. Когда этот бит
установлен, он
генерирует
прерывание
по
изменению состоя­
ния, если бит SLKIE в регистре
CAN_IER установлен. Этот бит
очищается программно или аппаратно при сбросе SLAK.
Примечание: Если SLКIE=0, то опрос по SLAКI невозможен.
В этом случае бит SLAK может быть опрошен.
Бит 3 WKUI: Прерывание при пробуждении
Этот бит устанавливается аппаратно для сигнализации о том,
что бит SOF был обнаружен, когда аппаратура CAN находилась
в режиме
steep. Установка этого бита генерирует прерывание
по изменению состояния, если установлен бит WKUIE в регистре
CAN_IER. Этот бит очищается программно.
500
Бит 2 ERRI: прерывание по ошибке
Этот бит устанавливается аппаратно, если при обнаружении
ошибки был установлен бит CAN_ESR и разрешено соответству­
ющее прерывание в регистре CAN_IER. Установка этого бита ге­
нерирует прерывание по изменению состояния, если бит ERRIE
в регистре CAN_IER установлен. Этот бит очищается программно.
Бит 1 SLAK: квитирование сна
Этот бит устанавливается аппаратно и указывает программ­
ному обеспечению, что аппаратура
CAN находится в спящем
режиме. Этот бит подтверждает запрос на переход в спящий
режим от программного обеспечения (установка бита
SLEEP
в
когда
регистре
CAN_MCR).
Этот бит очищается
аппаратно,
САN-аппаратура выходит из спящего режима (для синхрониза­
ции по шине CAN). Для синхронизации аппаратура должна от­
слеживать последовательность из
11 последовательных рецес­
сивных битов в сигнале CAN RX.
Примечание: Процесс выхода из режима
Sleep запускается
при сбросе бита SLEEP в регистре CAN_MCR. Подробную инфор­
мацию о сбросе бита SLEEP см. в разделе AWUM описания реги­
стра CAN_MCR
Бит О INAK: квитирование инициализации
Этот бит устанавливается аппаратно и указывает программ­
ному обеспечению, что аппаратура
CAN находится в режиме
инициализации. Этот бит подтверждает запрос на инициализа­
цию от программного обеспечения (установка бита INRQ в реги­
стре CAN_MCR). Этот бит очищается аппаратно, когда САN-аппа­
ратура выходит из режима инициализации (для синхронизации
по САN-шине). Для синхронизации аппаратура должна отслежи­
вать последовательность из 11 последовательных рецессивных
битов на сигнале CAN RX.
Регистр состояния передачи данных CAN (CAN_TSR)
Смещение адреса: Ох08
Значение сброса: 0xlC00 0000
501
31
:ю
29
LOW0
LOWI
,.
13
""~
28
ТМЕ2
12
27
ТМЕ1
11
ТERR
1
rc_w1
25
26
П.tЕО
"'
24
22
21
А81а0
CODEj1·0J
2
Re&enюd
20
,.
18
TEAR
2
ALSТ'2
к .. w1
rc .. w1
17
16
ТХОК
2
RQCP
2
rc_w1
rc_w1
тхок
RQCP
10
ALSТ1
rc_w1
тхок
1
RQCP
1
rc_w1
rc_w1
TERR
ABRO
о
,.
R...-
о
rc_w1
ALSTO
rc_w1
о
о
rc_w1
rc_w1
Таблица 9.5 - Регистр состояния передачи данных CAN (CAN_TSR)
Бит 31 LOW2: Флаг наименьшего приоритета для почтового
ящика 2
Этот бит устанавливается аппаратно, когда более одного
почтового ящика ожидают передачи, и почтовый ящик 2 имеет
наименьший приоритет.
Бит 30 LOW1: флаг наименьшего приоритета для почтового
ящика 1
Этот бит устанавливается аппаратно, когда более одного
почтового ящика ожидают передачи, и почтовый ящик 1 имеет
наименьший приоритет.
Бит 29 LOWO: флаг наименьшего приоритета для почтового
ящика О
Этот бит устанавливается аппаратно, когда более одного
почтового ящика ожидают передачи, и почтовый ящик О имеет
наименьший приоритет.
Примечание: Биты
LOW (2:0] устанавливаются в ноль, когда
ожидается только один почтовый ящик.
Бит 28 ТМЕ2: Transmit mailbox 2 empty
Этот бит устанавливается аппаратно, когда для почтового
ящика 2 не ожидается запроса на передачу.
Бит 27 ТМЕ1: Transmit mailbox 1 empty
Этот бит устанавливается аппаратно, когда для почтового
ящика 1 не ожидается запроса на передачу.
Бит 26 ТМЕО: Transmit mailbox О empty
Этот бит устанавливается аппаратно, когда для почтового
ящика О не ожидается запроса на передачу.
502
Биты 25:24 CODE [1:0): Код почтового ящика
Если хотя бы один передающий почтовый ящик свободен,
то значение кода равно номеру следующего свободного пере­
дающего
почтового
ящика.
Если
все
почтовые
передающие
ящики находятся в состоянии ожидания, то значение кода
рав­
но номеру передающего почтового ящика с наименьшим прио­
ритетом.
Бит 23 ABRQ2: запрос прерывания для почтового ящика 2
Устанавливается
программно
для
прерывания
запроса
на передачу для соответствующего почтового ящика. Очищается
аппаратно, когда почтовый ящик становится пустым. Установка
этого бита не имеет никакого эффекта, если почтовый ящик
не ожидает передачи.
Биты
22:20
Зарезервированы,
должны
быть
сохранены
в значении сброса.
Бит 19 TERR2: Ошибка передачи почтового ящика 2
Этот бит устанавливается, если предыдущий ТХ завершился
неудачно из-за ошибки.
Бит 18 ALST2: арбитраж потерян для почтового ящика 2 Э
тот бит устанавливается, если предыдущий ТХ не удался из­
за потери арбитража.
Бит 17 ТХОК2: Передача ОК почтового ящика 2
Аппаратное обеспечение обновляет этот бит после каждой
попытки передачи.
О: Предыдущая передача не удалась
1: Предыдущая передача прошла успешно Этот бит устанав­
ливается аппаратно при успешном завершении запроса
на
пе­
редачу по почтовому ящику 2.
Бит 16 RQCP2: Запрос завершен почтовый ящик2 У
станавливается аппаратно, когда был выполнен последний
запрос (передача или отбой). Снимается программной записью
«1»
или аппаратно по запросу передачи (ТXRQ2 установлен
в регистре CAN_TMID2R). Очистка этого бита снимает все биты
состояния (ТХОК2, ALSТ2 и TERR2) для почтового ящика 2.
Бит 15 ABRQ1: запрос прерывания для почтового ящика 1
503
Устанавливается
для
программно
прерывания
запроса
на передачу для соответствующего почтового ящика. Очищается
аппаратно, когда почтовый ящик становится пустым. Установка
этого бита не имеет никакого эффекта, если почтовый ящик
не ожидает передачи.
Биты
14:12
Зарезервированы,
должны
быть
сохранены
в значении сброса.
Бит 11 TERR1: ошибка передачи почтового ящика1
Этот бит устанавливается, если предыдущий ТХ завершился
неудачно из-за ошибки.
Бит 10 ALST1: Арбитраж потерян для почтового ящика1
Этот бит устанавливается, если предыдущий ТХ не удался
из-за потери арбитража.
Бит 9 ТХОК1: Передача ОК почтового ящика1
Аппаратное обеспечение обновляет этот бит после каждой
попытки передачи.
О: Предыдущая передача не удалась
1: Предыдущая передача прошла успешно
Этот бит устанавливается аппаратно при успешном заверше­
нии запроса на передачу по почтовому ящику 1.
Бит 8 RQCP1: Запрос завершен почтовый ящик1
Устанавливается аппаратно,
когда был
выполнен
послед­
ний запрос (передача или отбой). Снимается программной за­
писью
«1» или аппаратно по запросу передачи (TXRQ1 уста­
новлен в регистре CAN_Tl1R). Очистка этого бита снимает все
биты состояния (ТХОК1, ALSТ1 и
TERR1) для почтового ящи­
ка 1.
Бит
7 ABRQO: запрос прерывания для почтового ящикаО
Устанавливается программно для прерывания запроса на пере­
дачу для соответствующего почтового ящика. Очищается аппа­
ратно, когда почтовый ящик становится пустым. Установка этого
бита не имеет никакого эффекта, если почтовый ящик не ожида­
ет передачи. Биты 6:4 Зарезервированы, должны быть сохране­
ны в значении сброса.
Бит 3 TERRO: ошибка передачи почтового ящикаО
504
Этот бит устанавливается, если предыдущий ТХ завершился
неудачно из-за ошибки.
Бит 2 ALSTO: арбитраж потерян для почтового ящикаО
Этот бит устанавливается, если предыдущий ТХ не удался
из-за потери арбитража.
Бит 1 ТХОКО: Передача ОК почтового ящикаО
Аппаратное обеспечение обновляет этот бит после каждой
попытки передачи.
О: Предыдущая передача не удалась
1: Предыдущая передача прошла успешно
Этот бит устанавливается аппаратно при успешном заверше­
нии запроса на передачу по почтовому ящику 1.
Бит О RQCP0: Запрос завершен почтовый ящика
Устанавливается аппаратно,
когда был
выполнен
послед­
ний запрос (передача или отбой). Снимается программной за­
«1» или аппаратно по запросу передачи (ТXRQ0 уста­
CAN_TIOR). Очистка этого бита снимает все
биты состояния (ТХОКО, ALST0 и TERR0) для почтового ящи­
писью
новлен в регистре
ка О.
Регистр CAN receive FIFO О (CAN_RF0R)
Смещение адреса: ОхОС
31
30
29
28
27
26
15
14
13
12
11
10
25
24-
23
.....,,,..
22
21
RFOМO
20
19
18
17
16
FМРЩ:1 :О)
FOVRO FULLO
Res
Reserwd
r&
rc_w1
n:_wl
Таблица 9.6 - Регистр CAN receive FIFO О (CAN_RF0R)
Биты 31:6 Зарезервированы, должны быть сохранены в зна­
чении сброса.
Бит 5 RFOM0: выходной почтовый ящик
505
ReLease FIFO О Устанавливается программно для освобожде­
ния выходного почтового ящика FIFO. Выходной почтовый ящик
может быть освобожден только в том случае, если в FIFO ожида­
ет хотя бы одно сообщение. Установка этого бита при пустом
FIFO не имеет эффекта. Если в FIFO находится не менее двух со­
общений, то для доступа к следующему сообщению необходимо
освободить выходной почтовый ящик. Очищается аппаратно при
освобождении выходного почтового ящика.
Бит4 FOVR0: выход за пределы FIFO О
Этот бит устанавливается аппаратно, когда новое сообщение
было получено и прошло фильтр при заполненном
FIFO. Этот
бит очищается программно.
Бит 3 FULL0: FIFO О заполнен
Устанавливается аппаратно, когда в FIFO хранятся три сооб­
щения. Этот бит очищается программно.
Бит 2 Зарезервирован, должен быть сохранен в значении
сброса.
Биты 1:0 FMP0 [1:0]: Ожидающее сообщение FIFO О
Эти биты указывают на количество сообщений, ожидающих
приема в FIFO. FMP увеличивается каждый раз, когда аппарат­
ное
обеспечение
сохраняет
новое
сообщение
в
FIFO. FMP
уменьшается каждый раз, когда программа освобождает выход­
ной почтовый ящик, устанавливая бит RFOM0.
Регистр CAN receive FIFO 1 (CAN_RF1R)
Смещение адреса: Ох10
31
30
28
28
27
26
15
14
13
12
,,
10
25
·--
24
23
22
21
20
19
,в
17
Таблица 9.7 - Регистр CAN receive FIFO 1 (CAN_RF1R)
506
16
Биты 31:6 Зарезервированы, должны быть сохранены в зна­
чении сброса.
Бит 5 RFOM1: Выходной почтовый ящик Release FIFO 1
Устанавливается программно для освобождения выходного
почтового ящика
FIFO. Выходной
почтовый ящик может быть
освобожден только в том случае, если в FIFO ожидает хотя бы
одно сообщение. Установка этого бита при пустом FIFO не имеет
никакого эффекта. Если в
FIFO находится не менее двух сооб­
щений, то для доступа к следующему сообщению необходимо
освободить выходной почтовый ящик. Очищается аппаратно при
освобождении выходного почтового ящика.
Бит 4 FOVR1: выход за пределы FIFO 1
Этот бит устанавливается аппаратно, когда новое сообщение
было получено и прошло фильтр при заполненном
FIFO. Этот
бит очищается программно. Бит 3 FULL1: FIFO 1 заполнен Уста­
навливается аппаратно, когда в
FIFO хранятся три сообщения.
Этот бит очищается программно.
Бит 2 Зарезервирован, должен быть сохранен в значении
сброса.
Биты 1:0 FMP1 [1:0): Ожидающее сообщение FIFO 1
Эти биты указывают на количество сообщений, ожидающих
приема в FIFO1. FMP1 увеличивается каждый раз, когда аппара­
тура заносит новое сообщение в FIFO1. FMP уменьшается каж­
дый
раз,
когда
программа освобождает выходной
ящик, устанавливая бит RFOM1.
Регистр разрешения прерываний CAN (CAN_IER)
Смещение адреса: Ох14
507
почтовый
31
30
28
29
'Z1
28
25
23
24
.. .,
20
18
19
17
15
13
14
12
R-
11
10
LEC
ВОF
IE
IE
IE
EWG
IE
"'
,w
,w
"'
EPV
16
wк:• 1
1 s~1• 1
R•-
F<:N
Ае&
IEI
...
,.,
FF
FМР
F<:N
FF
IE1
IEO
IEO
FMP
IEO
ТМЕ
IE
Таблица 9.8 - Регистр разрешения прерываний CAN (CAN_IER)
Биты
31:18
Зарезервированы,
должны
быть
сохранены
в значении сброса.
Бит 17 SLКIE: разрешение прерывания сна О: Прерывание
отсутствует, если установлен бит SLAКI. 1: Прерывание генери­
руется при установленном бите SLAKI.
Бит 16 WKUIE: Разрешение прерывания при пробуждении О:
Прерывание отсутствует, если установлено значение
WKUI. 1:
Прерывание генерируется при установленном бите WKUI.
Бит 15 ERRIE: разрешение прерывания по ошибке О: Преры­
вание не генерируется при наличии ошибки в CAN_ESR. 1: Пре­
рывание
будет сгенерировано,
когда
в
CAN_ESR
возникнет
ошибка.
Биты
14:12
Зарезервированы,
должны
быть
сохранены
в значении сброса .
.Бит 11 LECIE: разрешение прерывания по коду последней
ошибки
О: Бит ERRI не будет установлен, если код ошибки в LEC [2:0]
установлен аппаратно при обнаружении ошибки.
1: Бит ERRI будет установлен, когда код ошибки в LEC [2:0]
будет установлен аппаратно при обнаружении ошибки.
Бит 10 BOFIE: разрешение прерывания по отключению шины
О: Бит ERRI не будет установлен, если установлен BOFF.
1: При установке BOFF бит ERRI будет установлен.
Бит 9 EPVIE: разрешение пассивного прерывания по ошибке
О: Бит ERRI не будет установлен, если установлен
ERRI будет установлен, если установлен EPVF.
508
EPVF. 1: Бит
Бит
8 EWGIE:
прерывания
разрешение
предупреждения
об ошибке
О: Бит ERRI не будет установлен, если установлен EWGF.
1: При установке EWGF бит ERRI будет установлен.
Бит 7 Зарезервировано, должно быть сохранено значение
сброса.
Бит 6 FOVIE1: разрешение прерывания по выходу за преде­
лы FIFO
О: Прерывание при установленном значении
FOVR отсут­
ствует.
1:
FOVR.
Генерация
прерывания
при
установленном
значении
Бит 5 FFIE1: разрешение прерывания по заполнению FIFO О:
Прерывание отсутствует, если установлен бит FULL. 1: Прерыва­
ние генерируется, когда установлен бит FULL.
Бит 4 FMPIE1: разрешение прерывания по ожиданию сооб­
щения FIFO О: Прерывание не генерируется, если состояние би­
тов FMP [1:0] не равно ООЬ. 1: Прерывание генерируется, когда
сост{)яние битов FMP [1:0] не равно ООЬ.
Бит 3 FOVIE0: FIFO overrun interrupt епаЫе
О: Прерывание не происходит, если установлен бит FOVR.
1: Прерывание генерируется при установленном бите FOVR
Бит 2 FFIE0: разрешение прерывания по заполнению FIFO О:
Прерывание отсутствует, если установлен бит FULL. 1: Прерыва­
ние генерируется, когда установлен бит FULL.
Бит 1 FMPIE0: разрешение прерывания по ожиданию сооб­
щения FIFO О: Прерывание не генерируется, если состояние би­
тов FMP [1:0] не равно ООЬ. 1: Прерывание генерируется, когда
состояние битов FMP [1:0] не равно ООЬ.
Бит О TMEIE: разрешение прерывания по пустому почтовому
ящику передачи
О: прерывание отсутствует, если установлен бит RQCPx.
1: Прерывание генерируется при
RQCPx. Примечание: Прерывания bxCAN.
509
установленном
бите
Регистр состояния ошибок CAN (CAN_ESR)
Смещение адреса: Ох18
Сброшенное значение: ОхОООО 0000
30
31
..
27
28
29
••
25
21
22
23
'
15
1
'
1
1◄
'
1
13
'
1
16
17
TEq7,0J
,
'
1
10
11
12
18
19
20
REC[7c0)
'
1
'
,
1
,
'
1
,
1
5
'
1
3
'
2
'
1
1
,
о
LEC12-0J
Res""""'
1
Таблица 9.9 -
,.. 1 ,.. l ··· I B~FF I EP,VF 1~· 1
Регистр состояния ошибок CAN (CAN_ESR
Биты 31:24 REC [7:0]: Счетчик ошибок приема
Реализующая часть механизма ограничения ошибок прото­
кола CAN. В случае ошибки при приеме этот счетчик увеличива­
ется на 1 или на 8 в зависимости от условия ошибки, определен­
ного стандартом CAN. После каждого успешного приема счетчик
декрементируется на 1 или сбрасывается на 120, если его значе­
ние было больше 128. Когда значение счетчика превышает 127,
САN-контроллер переходит в пассивное состояние по ошибкам.
Биты
23:16 ТЕС [7:0]: Младший байт 9-битного счетчика
ошибок передачи
Реализующая часть механизма ограничения отказов прото­
кола CAN.
Биты 1S:7 Зарезервированы, должны быть сохранены в зна­
чении сброса.
Биты 6:4 LEC [2:0]: Код последней ошибки
Это поле устанавливается аппаратно и содержит код, указы­
вающий
на
состояние
последней
ошибки,
обнаруженной
на шине CAN. Если сообщение было передано (прием или пере­
дача) без ошибок, то это поле будет очищено до «О».
Биты LEC [2:0] могут быть установлены программно в значе­
ние ОЫ11. Они обновляются аппаратно для индикации текуще­
го состояния связи.
510
ООО: Нет ошибки 001: Stuff Еггог 010: Ошибка формы
011: Ошибка квитирования
100: Ошибка рецессивного бита
101: Ошибка доминантного бита 110: Ошибка CRC
111: Устанавливается программно
Бит
3 Зарезервирован, должен быть сохранен в значении
сброса.
Бит 2 BOFF: флаг отключения шины
Этот бит устанавливается аппаратурой при переходе в со­
стояние отключения
шины. Переход в состояние отключения
шины происходит при переполнении ТЕС, превышающем
255,
см. раздел 24.7.6.
Бит 1 EPVF: флаг пассивной ошибки
Этот бит устанавливается аппаратно при достижении преде­
ла Еггог Passive (счетчик ошибок приема или счетчик ошибок пе­
редачи> 127).
Бит О EWGF: флаг предупреждения об ошибке
Этот бит устанавливается аппаратно при достижении преде­
ла предупреждения (счетчик ошибок приема или счетчик оши­
бок передачи~96).
Регистр синхронизации битов CAN (CAN_BTR)
Смещение адреса: Ох1С
Сброшенное значение: Ох0123 0000 Доступ к этому регистру
возможен только в том случае, если аппаратное обеспечение
CAN находится в режиме инициализации.
31
,о
SILM
LBKM
15
,.
29
28
27
26
24
23
SJW(1 О)
Res.
25
16
17
18
19
20
21
22
TS1[Э:0J
TS2{20)
"""""""
13
12
Ае,ем,d
11
10
,..
,..
1
,..
1
,.,
ВАР[90)
,.,
,..
,..
1
1
1
,.,
,.,
1
1
,.,
1
Таблица 9.10 - Регистр синхронизации битов CAN (CAN_BTR)
511
Бит 31 SILM: Тихий режим (отладка)
О: Нормальная работа
1: Бесшумный режим
Бит 30 LBKM: Режим обратного хода (отладка)
О: Режим обратного хода отключен
1: Режим обратного хода включен Биты 29:26 Зарезервиро­
ваны, должны быть сохранены в значении сброса.
Биты 2S:24 SJW [1:0]: Ширина скачка ресинхронизации
биты
Эти
определяют
максимальное
количество
квантов
времени, на которое аппаратуре CAN разрешается удлинять или
укорачивать бит для выполнения ресинхронизации. tRJW = tq х
(SJW [1:0) +1) Бит 23 Зарезервирован, должен быть сохранен
в значении сброса.
Биты 22:20 TS2 [2:0]: Временной сегмент 2
Эти биты определяют количество квантов времени в сегмен­
те времени 2. tBS2 = tq х (ТS2 [2:0) +1
Биты 19:16 TS1 [3:0]: Временной сегмент 1 Эти биты опре­
деляют
количество
квантов
времени
во
временном
сегменте
1 tBS1 = tq х (TS1 [3:0) +1).
Биты
15:10
Зарезервированы,
должны
быть
сохранены
в значении сброса.
Биты
9:0 BRP [9:0]: Прескалер скорости передачи данных
Эти биты определяют длительность кванта времени. tq =
(BRP
[9:0) +1) х tPCLK
РЕГИСТРЫ ПОЧТОВОГО ЯЩИКА CAN
В этой главе описываются регистры почтовых ящиков пере­
дачи и приема. Хранение сообщений для детального отображе­
ния регистров.
Почтовые ящики передачи и приема имеют одинаковые ре­
гистры, за исключением:
• Поле FMI в регистре CAN_RDTxR.
• Принимающий почтовый ящик всегда защищен
си.
512
от запи­
• Почтовый ящик передачи
в
пустом
состоянии,
разрешен для
соответствующий
бит
записи только
ТМЕ
в
регистре
CAN_TSR установлен.
Как показано на рис. 8.16, имеется три почтовых ящика ТХ
и два ящика
RX. Каждый почтовый ящик RX обеспечивает до­
ступ к FIFO трехуровневой глубины, причем доступ предоставля­
ется только к самому старому из принятых сообщений в FIFO.
Каждый почтовый ящик состоит из четырех регистров.
CAN_RIOR
CAN_Rl1R
CAN_TIOR
CAN_Tl1R
CAN_Tl2R
CAN_RDTOR
CAN_RDT1R
CAN_TDTOR
CAN_TDT1R
CAN_TDT2R
CAN_RLOR
CAN_RL1R
CAN_TDLOR
CAN TDL1R
CAN_TDL2R
CAN_RHOR
CAN_RH1R
CAN_TDHOR
CAN_TDН1R
CAN_TDH2R
FIFO0
FIFO1
Three Тх Mallboxes
Рисунок 9.16 - Регистры почтового ящика CAN
Регистр
идентификатора
почтового
ящика
CAN
ТХ
(CAN_TlxR) (х=О .. 2)
Смещение адреса: Ох180, Ох190, Ох1АО
Значение сброса: ОхХХХХ ХХХХ (кроме бита О, ТXRQ = О)
Все регистры ТХ защищены от записи, когда почтовый ящик
ожидает передачи (сброс ТМЕх). Этот регистр также реализует
управление запросом ТХ (бит О) - значение сброса О.
513
31
..
30
27
28
26
24
25
23
22
19
20
21
STID(1M)/EXID{28,18J
1W
1W
1W
,.,,
1W
15
14
13
12
11
10
rw
1W
18
1
1W
1
1W
1
rw
1
16
rw
1W
1W
1W
8
EXID[12,0J
,w
17
EXID[17'13J
1
rw
1
IDE
,w
1
,w
1
rw
1
,w
1
rw
1
,w
1
,w
I:R\ТХ:I
Таблица 9.11 - Регистр идентификатора почтового ящика CAN
ТХ (CAN_TlxR) (х=О"2)
Биты 31:21 STID [10:0] /EXID [28:18]: Стандартный иденти­
фикатор или расширенный идентификатор
Стандартный идентификатор или MSBs расширенного иден­
тификатора (в зависимости от значения бита IDE).
Биты
20:3 EXID [17:0]: Расширенный идентификатор LSBs
расширенного идентификатора.
Бит 2 IDE: расширение идентификатора
Этот бит определяет тип идентификатора сообщения в почтовом ящике.
О: Стандартный идентификатор.
1: Расширенный идентификатор.
Бит 1 RTR: запрос удаленной передачи О: кадр данных 1:
Удаленная рамка
Бит О ТXRQ: запрос на передачу почтового ящика Устанавли­
вается программно для запроса передачи для соответствующего
почтового ящика. Очищается аппаратно, когда почтовый ящик
становится пустым.
Регистр управления длиной и меткой времени данных поч­
тового ящика CAN (CAN_TDTxR) (х=О .. 2)
Все биты этого регистра защищены от записи, когда почто­
вый ящик не находится в пустом состоянии.
Смещение адреса: Ох184, Ох194, Ох1А4
514
Э1
зо
29
27
2В
26
,.
2S
23
TIME(15:0]
,.. 1 ,.. 1 ,.. 1 ,., 1
,.. 1 ,.. 1 ,.. 1 ,..
1S
11
12
13
14
"' 1 ... 1
РА
Resвrved
Таблица 9.12 -
10
22
21
20
,., 1 ,.. 1
А•-
,.
16
17
1В
"' 1
,.. 1 ,.. 1 ...
,..
,..
DLC(3;0J
1
1
,w
,w
1
Регистр управления длиной и меткой времени
данных почтового ящика CAN (CAN_TDTxR) (х=О .. 2)
Биты
31:16 TIME [15:0): Временная метка сообщения Это
поле содержит 16-разрядное значение таймера, захваченное
при передаче SOF.
Биты 15:9 Зарезервированы, должны быть сохранены в зна­
чении сброса.
Бит
только
8 TGT: глобальное время передачи Этот бит активен
тогда,
когда
аппаратура
Trigger Communication, бит ТТСМ
находится
регистра
в режиме Time
CAN_MCR установ­
лен.
О: Временная метка TIME [15:0) не передается.
1: Значение метки времени ТIМЕ [15:0) передается в двух
последних байтах данных 8-байтового сообщения: TIME [7:0)
в байте данных 7 и TIME [15:8) в байте данных 6, заменяя дан­
ные, записанные в регистр CAN_TDHxR [31:16) (DATA6 [7:0)
и DATA7 [7:0)). Для того чтобы эти два байта были переданы
по шине CAN, DLC должен быть запрограммирован как 8.
Биты 7:4 Зарезервированы, должны быть сохранены в зна­
чении сброса.
Биты 3:0 DLC [3:0): Код длины данных Это поле определяет
количество байтов данных, которые содержит кадр данных или
запрос
удаленного
кадра.
Сообщение
может
содержать
от О до 8 байт данных, в зависимости от значения поля DLC.
Низкий регистр данных почтового ящика CAN (CAN_TDL.xR)
(х=О .. 2)
515
Все биты этого регистра защищены от записи, когда почто­
вый ящик не находится в пустом состоянии.
Смещение адреса: Ох188, Ох198, Ох1А8
31
30
29
..
'Z7
..
24
25
23
22
21
rw
1
15
rw
14
1
,w
rw
13
12
1
rw
11
rw
,. 1
1
"' 1 rw 1 rw 1
,w
,.
16
17
ОАТА2\7'0)
rw
1
rw
,w
1
,w
rw
1
"' 1
,w
"' 1
,w
rw
,w
1
rw
ОАТАО)7с0)
OATA1f7c0)
rw
19
20
ОАТА3{7с0)
"' 1 rw 1 fW
"' 1
,w
1
,w
1
fW
1
fW
1
1
,w
Таблица 9.13 - Низкий регистр данных почтового ящика CAN
(CAN_TDL.xR) (х=О.. 2)
Биты 31:24 DATA3 [7:0): Байт данных 3 Байт данных 3 сооб­
щения.
Биты 23:16 DATA2 [7:0): Байт данных 2 Байт данных 2 сооб­
щения.
Биты 15:8 DATA1 [7:0): Байт данных 1 Байт данных 1 сооб­
щения.
Биты 7:0 DATA0 [7:0): Байт данных О Байт данных О сообще­
ния. Сообщение может содержать от О до 8 байт данных и начи­
нается с байта О.
Старший
регистр
данных
почтового
ящика
CAN
(CAN_TDHxR) (х=О"2)
Все биты этого регистра защищены от записи, когда почто­
вый ящик не находится в пустом состоянии.
Смещение адреса: Ох18С, Ох19С, Ох1АС
516
зо
31
'Z1
28
29
"' 1 "',.
"' 1 12"' 1 "'11 1
13
1S
DATA6(7:0J
n,
1
10
"' 1 rw
n,
rw
rw
1
,.
1
rw
"' 1 "' 1
"'
1
rw
,. 1 rw
1
1
n,
1
"' 1
,.
DATA4(7:0J
DATA5{7:0J
rw
16
17
18
"
20
21
22
23
24
2S
26
DATA7{7:DJ
"' 1 "' 1 "' 1 "' 1
1
rw
1
"' 1 "' 1 "' 1 "'
Таблица 9.14 - Старший регистр данных почтового ящика CAN
(CAN_TDHxR) (х=О .. 2)
Биты 31:24 DATA7 [7:0]: Байт данных 7 Байт данных 7 сооб­
щения. Примечание: Если TGT этого сообщения и ТТСМ активны,
то DATA7 и DАТАб будут заменены значением метки времени.
Биты 23:16 DATA6 [7:0]: Байт данных 6 Байт данных 6 сооб­
щения.
Биты 15:8 DATAS [7:0]: Байт данных 5 Байт данных 5 сооб­
щения.
Биты 7:0 DATA4 [7:0]: Байт данных 4 Байт данных 4 сообще­
ния.
Регистр идентификатора почтового ящика CAN receive FIFO
(CAN_RlxR) (х=О.. 1)
Смещение адреса: Ох1В0, Ох1СО
Все регистры RX защищены от записи.
зо
31
27
28
29
23
24
25
26
21
22
14
1S
11
12
13
18
19
20
3
10
ЕХI0{12:О]
'
1
'
1
'
1
'
1
'
'
1
'
16
17
EXID(t7:13}
STI0{10:0).IEXID[28: 181
1
'
1
'
'
1
'
1
'
1
'
1
2
1
IDE
RТR
'
1
,
о
Aes.
1
Таблица 9.15 - Регистр идентификатора почтового ящика CAN
receive FIFO (CAN_RlxR) (х=О .. 1)
517
1
Биты 31:21 STID [10:0] /EXID [28:18]: Стандартный иденти­
фикатор или расширенный идентификатор
Стандартный идентификатор или MSBs расширенного иден­
тификатора (в зависимости от значения бита IDE).
Биты
20:3 EXID [17:0]: Расширенный идентификатор LSBs
расширенного идентификатора.
Бит 2 IDE: расширение идентификатора Этот бит определяет
тип идентификатора сообщения в почтовом ящике.
О: Стандартный идентификатор.
1: Расширенный идентификатор.
Бит 1 RTR: запрос удаленной передачи
О: кадр данных
1: Удаленная рамка
Бит О Зарезервирован, должен быть сохранен в значении
сброса.
Реrистр управления длиной
почтовоrо ящика
CAN FIFO
и метки времени (CAN_RDTxR) (х=О .. 1)
Смещение адреса: Ох184, Ох1С4
ТIME(15:0J
'
15
1
'
14
1
'
1
13
'
1
12
'
11
Fl.tlf7,0)
' 1 ' 1 ' 1
,
1
'
1
'
'
10
,
1
'
1
1
'
1
' 1 '
'
-
' 1 ' 1
, 1 , 1 ,
1
'
1
'
DlCf3'0)
'
1
'
1
'
Таблица 9.16 - Регистр управления длиной почтового ящика
CAN FIFO и метки времени (CAN_RDTxR) (х=О.. 1)
Биты 31:16 TIME [15:0]: Временная метка сообщения
Это поле содержит 16-разрядное значение таймера, зафик­
сированное при обнаружении SOF.
Биты 15:8 FMI [7:0]: Индекс совпадения фильтров
Этот регистр содержит индекс фильтра, через который про-
518
шло сообщение, хранящееся в почтовом ящике.
Биты 7:4 Зарезервированы, должны быть сохранены в зна­
чении сброса.
Биты 3:0 DLC [3:0]: Код длины данных
Это поле определяет количество байтов данных в кадре дан­
ных (от О до 8). В случае удаленного запроса кадра оно равно О.
Низкий регистр данных почтового ящика CAN (CAN_RDLxR)
(х=О .. 1)
Все биты этого регистра защищены от записи, если почтовый ящик не находится в пустом состоянии.
Смещение адреса: Ох1В8, Ох1С8
Значение сброса: ОхХХХХ ХХХХ
Все регистры RX защищены от записи.
,
,.
:ю
31
1
,
1
14
15
,
27
28
DATA3[7:0J
1
'
1
12
13
'
11
,
1
1
,
1
,
1
,
1
z,
,
,
,
,
18
19
20
21
22
16
17
Мl'A2f7·0J
1
,
1
,
1
,
1
,
,
1
'
1
1
'
1
,
10
DATA,[7:0J
,
24
25
26
, 1 , 1 ,
1
,
1
1
,
1
,
DATA0(70J
1
, 1 ,
1
,
'
Таблица 9.17 - Низкий регистр данных почтового ящика CAN
(CAN_RDLxR) (х=О .. 1)
Биты 31:24 DATA3 (7:0]: Байт данных 3 Байт данных 3 сооб­
щения.
Биты 23:16 DATA2 (7:0]: Байт данных 2 Байт данных 2 сооб­
щения.
Биты 15:8 DATA1 [7:0]: Байт данных 1 Байт данных 1 сообще­
ния.
Биты 7:0 DATA0 (7:0]: Байт данных О Байт данных О сообще­
ния. Сообщение может содержать от О до 8 байт данных и начи­
нается с байта О.
519
Старший
реrистр
данных
почтовоrо
ящика
CAN
(CAN_RDHxR) (х=О.. 1)
Смещение адреса: Ох1ВС, Ох1СС
Значение сброса: ОхХХХХ ХХХХ
Все регистры RX защищены от записи.
31
28
30
, 1 , 1
14
15
27
28
28
25
24
22
23
20
21
'
13
'
1
12
'
11
' 1 ' 1 '
'
' 1 ' 1 '
' 1 '
10
1
'
1
'
1
'
1
1
'
1
r
' 1
,
16
17
18
,
1
,
'
1
'
1
r
1
'
1
'
DАТА4{7,О}
DATA5(7o0}
'
18
DATA6(7,0J
DATA7(7,0J
'
1
'
1
r
Таблица 9.18 - Старший регистр данных почтового ящика CAN
(CAN_RDHxR) (х=О.. 1)
Биты 31:24 DATA7 [7:0]: Байт данных 7
Байт данных 3 сообщения.
Биты 23:16 DATA6 [7:0]: Байт данных 6
Байт данных 2 сообщения.
Биты 15:8 DATAS [7:0]: Байт данных 5
Байт данных 1 сообщения.
Биты 7:0 DATA4 [7:0]: Байт данных 4
Байт данных О сообщения.
РЕГИСТРЫ ФИЛЬТРОВ CAN
Главный реrистр фильтра CAN (CAN_FMR)
Смещение адреса: Ох200
Сброшенное значение: Ох2А1С ОЕО1
Все биты этого регистра устанавливаются и очищаются про­
граммно.
520
31
эо
29
28
27
26
15
1◄
13
12
11
10
2◄
25
23
,..,._
22
21
18
19
20
16
17
FINIТ
.........
1
1" 1" 1" 1" 1" 1" 1
CAN2S8(5;0J
1
,.
-
А...,..,.
f----FINIТ
~
,w
Таблица 9.19 - Главный регистр фильтра CAN (CAN_FMR)
Биты
31:14
Зарезервированы,
должны
быть
сохранены
в значении сброса.
Биты
13:8 CAN2SB [5:0): Стартовый банк CAN2 Эти биты
устанавливаются
стартовый
банк
и
очищаются
для
программно.
интерфейса
определяют
Они
CAN2 (Slave)
в
диапазоне
от О до 27.
Примечание: Если
CAN25B [5:0) = 28d, то можно использо­
вать все фильтры для CAN1. Когда CAN25B [5:0) установлен в О,
фильтры для CAN1 не назначаются.
Биты 7:1 Зарезервированы, должны быть сохранены в значении сброса. Бит О FINIT: режим инициализации фильтра
Режим инициализации банков фильтров
О: Режим активных фильтров.
1: Режим инициализации фильтров.
Регистр режима фильтрации CAN (CAN_FM1R)
Смещение адреса: Ох204
Запись в этот регистр возможна только при установленном
режиме инициализации фильтра (FINIT=1) в регистре CAN_FMR.
521
1
31
эо
29
1
1
15
14
13
1
FВМ27
,.,
......,..
11
10
27
28
Reserved
12
26
FBM1S I FВМ14 FBMtЗ ) FВМ12 FВМ11 FBMIO
1
,..
..,
"'
1
,.,
,.,
Таблица 9.20 -
Биты
,..
25
FВМ25
"'9
FBM9
,w
..
FВМ2•
"'
23
22
21
20
19
18
17
16
FВМ23
FВМ22
FВМ21
FВМ2О
FВМ19
FВМ18
FBM17
FВМ16
,.,
,..
.....,..• ,.. .....
7
FBM7
6
..
"'5
,..
,..
,..
""
""
4
3
2
1
о
FBMS
FBlrrt4
FВМЗ
FBM2
FВМ1
FВМО
,w
,..
,..
,..
,..
,..
Регистр режима фильтрации CAN (CAN_FM1R)
31:28 Зарезервировано, должно быть сохранено зна­
чение сброса.
Биты
27:0 FBMx: Режим фильтра Режим работы регистров
фильтрах.
О: Два 32-разрядных регистра банка фильтров х находятся
в режиме маски идентификаторов.
1: Два 32-разрядных регистра банка фильтров х находятся
в режиме списка идентификаторов.
Примечание: Биты
27:14 доступны только в устройствах ли­
нии связи и зарезервированы в противном случае.
Регистр шкалы фильтра CAN (CAN_FS1R)
Сброшенное
Смещение адреса: Ох20С
значение:
ОхОООО
0000
Запись в этот регистр возможна только при установлен­
ном
режиме
фильтра
инициализации
(FINIT=1)
регистре
в
CAN_FMR.
31
1 эо
1
29
1 28
15
FSC15
"'
1
14
1
13
27
26
25
FSC27
FSC26
FSC25
11
10
,..
Аеsемкl
1
12
,..
,w
9
24
·=•
,..
23
22
FSC23
FSC22
,w
,w
7
6
•
21
IFSCl4 IFSC13] FSC12 FSC11 FSC10 FSC9 FSCII FSC7 FSC6 FSCS
,.. ,..
,.. ,..
,.. ,..
1
1 rw 1
,w
Таблица 9.21 -
,w
,w
20
..• ..
FSC21
19
18
17
..
,w
4
э
"'2
FSC4
FSC3
"'
,.,
,w
1
о
FSC2
FSC1
FSCO
"'
,w
rw
Регистр шкалы фильтра CAN (CAN_FS1R)
522
16
FSC20 FSC19 FSC18 FSC17 FSC16
Биты
31:28
Зарезервированы,
быть
должны
сохранены
в значении сброса.
Биты 27:0 FSCx: Конфигурация масштаба фильтра Эти биты
определяют конфигурацию шкалы фильтров 13-0.
О: Двойная 16-разрядная конфигурация шкалы
1: Одиночная 32-разрядная конфигурация шкалы
Примечание:
Биты 27:14 доступны только в устройствах линии связи и за­
резервированы в противном случае.
Регистр назначения FIFO фильтра CAN (CAN_FFA1R)
Смещение адреса: Ох214
Сброшенное значение: ОхОООО 0000
Запись в этот регистр возможна только при установленном
режиме инициализации фильтра (FINIT=1) в регистре CAN_FMR.
з,
1 30
1 29
1
••
Aeserved
15
1
14
1
13
1
12
26
2S
2З
22
21
20
19
18
17
16
FFA26
FFA25
FFA24
FFA23
FFA22
FFA21
FFA20
FFA19
FFA18
FFA17
FFA16
"'
"'10
"'
"'
,w
"'
FFAВ
,w
11
• •
I FFA14 I FFA13 I FFA12 FFA11 FFA10 FFAS
... "' ""
,w 1 ,w 1
1
FFA15
,w
,w
.
27
FFAZI
...
,w
,w
,w
6
s
•
з
2
"'1
"'
FFA7
FFA6
FFAS
FFM
FFAЗ
FFA2
FFA1
FFAO
,w
"'
rw
"'
"'
"'
"'
"'
1
о
Таблица 9.22 - Регистр назначения FIFO фильтра CAN
(CAN_FFA1R)
Биты
31:28
Зарезервированы,
должны
быть
сохранены
в значении сброса.
Биты 27:0 FFAx: Назначение FIFO фильтра для фильтрах Со­
общение, прошедшее через этот фильтр, будет сохранено в ука­
занном FIFO.
О: Фильтр назначен на FIFO О
1: Фильтр назначен на FIFO 1
27:14 доступны только в устройствах ли­
Примечание: Биты
нии связи и зарезервированы в противном случае.
523
Регистр активации САN-фильтра (CAN_FA1R)
Смещение адреса: Ох21С
31
1 зо
1 29
1
2В
Resetved
15
1 14
IЭ
1
'Е7
26
25
FАСТ27 FАСТ26 FACT25
1 12
"'11
23
24
22
21
20
19
18
17
rw
,w
,w
10
9
•
"'7
,w
rw
6
5
.
rw
,w
э
"'2
"'1
FдепslFАСТ141Fдст1эlFлст12 FACT11 FACT10 FАСТ9 FACTB FАСТ7 FACT6 FACTS FACT4 FАСТЭ FACr.! FACT1
,.,
1
,w
1
"' 1
,w
"'
,w
,.,
16
FACT24 !="АСТ23 FACT22 FACT21 FACT20 FACT19 FACT18 FACT17 FACT16
"'
,w
,.,
"'
"'
"'
,.,
rw
"'
о
FACTO
rw
Таблица 9.23 - Регистр активации САN-фильтра (CAN_FA1R)
Биты
31:28
Зарезервированы,
должны
быть
сохранены
в значении сброса.
Биты 27:0 FАСТх: Фильтр активен
Программа устанавливает этот бит для активации фильтра х.
Для модификации регистров фильтра х (CAN_FxR [0:7]) необхо­
димо очистить бит
FACTx или установить бит FINIT регистра
CAN FMR.
О: Фильтр х не активен
1: Фильтр х активен
Примечание: Биты 27:14 доступны только в устройствах ли­
нии связи и зарезервированы в противном случае.
Регистр i банка фильтров х (CAN_FiRx) (i=0 .. 27, х=1, 2)
Смещение адреса: Ох240 .. Ох31С
28 банков фильтров,
i=O ... 27, в других устройствах - 14 банков фильтров i = О ... 13.
Каждый банк фильтров i состоит из двух 32-разрядных реги­
стров CAN_FiR [2:1].
В устройствах линии связи имеется
524
......
31
30
29
28
V
FВ31
FВ30
FВ28
FВ28
FВ27
,.
,.
rw
1W
1W
13
12
11
10
FВ15
FВ1'
FВ1З
FB12
F811
FB10
25
FВ25
1W
•••
rw
""
......
23
22
21
20
18
18
17
,.
FВ23
F822
FВ21
FВ20
FB19
FВ18
FB17
FB16
""
""
""
"'
,w
"'
FВ8
FВ7
FВ8
1W
••• .. ,.,
~
"'
"'
FВО
1W
fW
rw
FВО
.
1W
1W
Таблица 9.24 - Регистр i банка фильтров х (CAN_FiRx) (i=0 .. 27,
х=1, 2)
Этот регистр может быть изменен только в том случае, если
бит FAGx регистра CAN_FAxR очищен или если бит FINIT реги­
стра CAN_FMR установлен.
Во всех конфигурациях:
Биты 31:0 FB [31:0): Биты фильтра
Идентификатор Каждый бит регистра задает уровень соответствующего бита ожидаемого идентификатора.
О: Доминирующий бит ожидается
1: Ожидается рецессивный бит
Маска
Каждый бит регистра определяет, должен ли бит ассоцииро­
ванного регистра идентификатора совпадать с соответствующим
битом ожидаемого идентификатора или нет.
О: Не важно, бит не используется для сравнения
1: Должно совпадать, бит входящего идентификатора дол­
жен иметь тот же уровень, который указан в соответствующем
регистре идентификатора фильтра.
Примечание: в зависимости от масштаба и режима работы
фильтра функции каждого регистра могут различаться. Регистр
маски/идентификатора в режиме маски имеет такое же отобра­
жение битов, как и в списке идентификаторов режим. Сопостав­
ление регистров и адреса банков фильтров приведены в карте
всех регистров.
525
Olfset
ОхООО
""""'
0,008
О.<ООС
OxOIO
Register
САН
-
;;; ~ !!ЩЩ,1~ ~lcil ::Э !:11«1~ ~1:01!:: ~~ :! l~I~ :: ~ ф CD ... "' "'
CAN_MSR
О:11018
ТМЕ\2<11 iir"
LOW\2.0) 1
0 1010 1 111 1 1 1010 10
CAN_RF1R
.,._
-
о 'о
н
010
u
u
u
u
u
u
u
u
u
о
-
1u
о
о
о
1 1о
iw ~~ ~ f
~ ~
,_ <
1rro 1rro
~
о
а;
ос
р
:; i
i!J"lr i!Т,!
"rr ._i'S ~ 1
Го• Го,!
u
,4-.о
Jo
w- -w w о 1п"'
в i; ~ ~ н [ ~ ~
о
о Iо
I о 1rr
u
u
u Iu
~
ы
R--...d
u
u
! ~ нi f
о
u 'u
u
u
wH
~ ~ ~ ~ ~
010
ТЕС{7с 0)
~
u
u
....
u
u
j :t >"
а. 3:
- g Ww
! ,,- ,ri,,-
о
T$2(2c0I
1_ о 11 1 о
тsчэ:01
BRPfl;OJ
О I о 11 t 1
101010 ,о
010
01010
О
R-
Ox17F
.....
..,..
R•-
о
- ~..-~
- n
--· J. 1
-REC{7cO)
ОхО2О-
0.180
~:;_<
is;
010 1 0 10
u 1u
;; '5
~;: g;;: ~
w
CAN_ESR
САН~ ВТR
i~ < lg~ 2
~
~о
N
.
......... н g;""
IJJ w w w '
CAN _IER
_.,._
u
;\
CAN_RFOA
·-
~
Т'Т 00
1:1 " -
о,
:> ..
~ ~ ~:о:"~
8 ~
..
; t;:
н< н rr ~ ,,,щi..
R__,..,
tт-ir
-
САН ТSR
о
t;
"'"'
о i!!
H~vall.НI
u1u
())с01С
~
rwмslvalue
НОИIУП-18
Ох014
-
MCR
_
. . . . . . .. . . . . . .
.
..... ' ' .' .' .' ' ' .
CAN_110R
1
CAN ТDТОR
..... '
CAН_ТDlOR
. ..
w rr 1!!
EXJO(t7:0J
$TID{10:0~'EXI0{28:18}
• 1х 1 • 1 "1 а
TIМE~S'Oj
•lxt•
х
I J. 1•
о t;: ~
•
' ' '
~ Ro,._, ~CI.ЗOI
•1•
'
'1.
о
"Jt.
Jt
. . . .. . .. .. . . . . . . .. . . . . . . . . . . . . .
DАТАЗ(7сОJ
OATA2{7:0J
1».ТА1(1:О)
0АТА7(7:О}
D.(1'A6{7:0!
DATA5(7c0J
DA1>.0{7cOJ
'
ОХ1ВС
.... .
CAN_ТDНOR
~,,
°"'"°
САН Т11R
rчrsetva!ul
xptpi:J't l •
,i,
'
.
' ... .
xptppt.pp.p •PIXP·
ST1DI. 10.o~'EXI0{28:18I
'
• 1.
' 1.
EXI0(17:0J
1
Х IХ
I Х I J: 1 Х111. 1 k
1t l Xl• I •
• 1.
.... .. .. ..
DA.TM[7:0)
.
• 1•
• 1•
.
~ ~
~ rr
~
• 1•
Таблица 9.25 - Карта регистров bxCAN и значения сброса
526
, 10
Offaet
0. 1D4
0,,188
RegiS'ter
;:;1~1g:1:e1:.l~l:'-Jli ::ll::11.;li;:l~l~l~I~ ~1~1~1~1::1:=1"' ., ... 1... 1"'1"' ..,INHo
.....,,,.. !:!.. ,.._
..
.
. .. . . .... .. .. . . .. . .. ' . ' ' ' . ' . .. . '
. . . ..
'
·- ' . ' . ' . ' ... 1.
. ' . .. . . .. ' .1°1~1~
. . ' . ' . ...' . .. ' ' ' .,.._
'
a--,~qЗooJ
.
' . . . . . ' . . . . .. . . .
.. .. . . .. .. .... . . .. .. . . . .
.
. . ' .... ....... . .... .. ....... .1~.1~11
TIMEl15.:.0J
CA.N_ TDT1R
DLC(З:OI
~
A-v-
XIXIJIIXIXJ-IXIX
CAN_TDL1R
DATA317,0)
OATA2(7:0J
DATA1f7;0J
DATA0{7:0J
DA'tA7{7:0J
DIOA6{7:DI
DATA5{7,0)
DATA◄ [7:0)
х pr 1• 1х 1 •
• 1•
н.-1valu8
0,1,С
САН
TDH1A
•р1х 1.11
'
""'"'
О.1А4
'1 '
snoi10:o)'EXI012a.1a1
CAN,,..ТZ2R
1 Yi1Ju8
J. 1хр11 lt
'
' ' '
EXJ0(17i1J
> u
'
1
~
ТIMElJ5 ;0J
САН ТDТ2А
•
r,esetvaliJie
01111,8
DATAЗf7;Q)
CAN_TDL.2R
°''"'
.....
DATA7!7:D]
CAN_RDТOR
Нмеt VilJIJII
CAN ROLOR
. . . . . . . . . . .. . . . . . . . . . . . . . .
DAJ'A3(7.0J
ОАТА2\701
'
'
DATA7(7:0)
'
. .. . . . . . . . '
'
' '
'
1
111xp:p1p 1x11tpc
DAТAO(HJJ
'
DATA-4{7.0J
ЕЩ17:ОJ
'
....
.... . '
'
ОАТА2(7:О]
'
'
Таблица 9.25 -
' ' ' '
.
• 1' 1• 1• ' 1• 1' 1J
·-
ОАТА6(7:ОI
DLC(Э:OJ
'7fiТiТ'x
. .... .
.. . . .. .
.
·-
' ' ' '
'
ООА1(7о0\
' ' ' ' ' ' ' ' '
0АТА7(7<>)
'
•1х1•1х1х1х111
..
' ' ' ' ' ' '
1~1~ 1!
F~Щ7:О}
•1х1111х 1 х1хр:р
ОАТА317,ОJ
ОLС(З,о)
:iТiТiТi"
МТА5{7, О)
ОАТА6(7. О}
'
.
D,,\TA1(7;0}
TIME[15:0J
CAN RDH1R
...
'
xptfJ: р1 pi: 1•1•
• 1• 1• 1• 1• 1•1• 1• ·1· 1·1• 1•1 ·1· 1· ·1·1·1·1·1·1·
САН RDL1R
"
'
S11D(10:0YEXID(28:18J
'
0)11~
011FF'
FМ{7с0)
J:1'I IXI J.1':1•1xp.
CAN~AOT1R
,-tYaJUe
EXJ0!.17::0)
ТlМе.!15:ОJ
.... . ' ' ' . '
Rosel Ya1u8
1
•1х111 1•1•1•1•1•
CAN_Rl1A
о.,сс
OATA4{7:0J
х
•1'
CAN АОНОR
Ох1СО
0.1С8
DATAS{7:0j
snD( 10:D;'EX10(28:18J
,
Ох1С4
ОАТА8(7 :ОJ
х
......... • 1• 1'1 ' 1' 1• 1• 1• ·1·1·1·1·1·1·1· ·1·1·1·1·1·1· . ' 1• 1• 1• '1 • 1' 11
tqtr.)I v.\k.le
011:IDC
DATAO(HJ)
1 vaiue
CAN RlDR
OJ.100
DATA1{7:0)
"pp:ptp:1.:p1
~•У-
САН ТОН2А
""'"'
•
ОАТА2(7,ОJ
' ' '
DATA0[7:0J
'
'
DATA5{7.0)
'
' ' ' ' '
'
' ' '
DATA◄ f7:0}
'
'
'
Карта регистров bxCAN и значения сброса. Про­
должение
527
Ollset
0'200
0"204
Register
-
;;1~1~1~1:;;1~1~1i1:::1~1"1~l~l~l~l~l~l:!l::?l~l::l~l"'i"'i,...l"'i"'i"'i"'INl-l 0
....._,
CAN FMR
,.,.,.
u Iu
CAN FU1R
K lt$0tvalue
UiUUU I UUIJUIJ
CAN_F91R
CAN_FFA.1R
CANJA1 R
·--·-'"'
u
·-
~·-
х
'
х
.
u
CAN~F1R1
CAN_F1R2
FВ{Зt О)
'
' ' ' '
x pp•;pr
pi. 1• р: р: 1• 1 х р. 1 • IJ, 1 • 1 r. 1Х р::
. . . . .. . ' ' ' . . .. . .
F8{31 :0j
х
х
х
'
х
х
х
FВ{31 :DI
х
' '
'
'
х
х
' '
• pt 1 1 р: р: 1 • 1 х р: р: 1 • р: 1 • 1 х 1"· 111 1 • 1 х 1 • р: 1 11 1 • 1 • 1 • 1 • 1 • 1 • 111 Р· pi: 1 Ч • IJt
F8(31 :0I
1fxl•l• I XIXI XJXI XI XI Xl • l•l•I XI XI Xl • l • l • l • l • l 1 l x
. . ' ' .' ' ' ' . . ' .
FВ{З1 :ОJ
х
CA.N_ROH1R
'
х
'
'
..... .'
OATA7(7:0J
х
'
'
'
ОАТА.6(7:ОJ
1
•~ue
• 1 х 1• 1х 1 • 1х1•1х1 11 1 х 1• 1 • 1• 1 • 1 •
х 1• 1 • J • 1 х 1• 1 х р. р: 1 х I х 1 • 1 • i,1. pr р1. 1 • 1 • 1 •
CAN_f27R2
...
х
FВ{З1:ОI
CAN_F77R1
A~tvall.Nt
10
·хр:р
CAN_FOR2
Н.8$8t .....-
Ox1DOO.w:IFF
u.u
1 01О 1 0 1О1 0 1 О 1 0 101 0 1 010 1 01010 1 О 1 010 1 ОIО 1 01О10 1 О 1 0 1 О101 О
CAN_FOR1
tVaJIМI
OxlCC
u1u
FACТl27 :0J
1
AM•rwd
0'23F
Ох:ЭIС
u
A 064!Мld
Ох:224 ,
ОжЗtВ
u 1u
1 0 1 0 1 0 101 0 1 0 1 0 101 0 1 0 1 0 101 0 1 0 1О1 0 1 О I ОIО 101 О 101 О 1 0 1 ОIО 1 010
""220
=•с
u
FFA(27;0J
......... 1
.---tva.lu,t
ОХ2,4В
u1v
R...,_,
0'218
0-2◄ '1
OIJOIUOOIOOOIQO
FSC[27;01
I0I 0 I 0 I O I 0 ]0IDI D I 0 I D I0I0J 0 I 0 I 0 1v
~·~""
""2<0
O U U U O U I OIJ
1
flOhrwd
"'aJW
""210
Ох21С
~
~SOl'Wtd
1
R...,_,
rnr:io4!I
01<21'
u
t
FBM(27:0J
1
~--rved
Ох208
Ох20С
CAN2SВ{5,0I
1
'
'
' ' '
х
'
'
х
х
' ' ' '
' '
1
' .
...
...
<><ТА5{7ОI
.
х
• 1•
' ' '
DATA◄ [7:01
1
х
'
х
'
х
' ' '
х
'
.
.
Rиll!rved
Таблица 9.25 - Карта регистров bxCAN и значения сброса . Про­
должение
ПРИМЕР РАБОТЫ с САN-интерфейсом. В разработке
528
сти
В данный момент,
в виду большой номенклатуры и стоимо­
САN-трансиверов,
необходимости
плат: приемника и передатчик
-
по
сути
наличия
двух
не определено на каком лучше
остановиться для разработки примеров в данном разделе. Как
будет выполнена вся необходимая подготовительная работа, за­
купка пример появится по этому адресу:
https://github.com/nr-eLectronics/Mastering-STM32-on-yourown-2/tree/main/
Будет выпущен бесплатный видеоконтент по нему.
529
БОНУСЫ
ПРОЕКТ ПО УВЕЛИЧЕНИЮ ЧИСЛА
ПОДКЛЮЧЕННЫК КНОПОК С ПРИМЕНЕНИЕМ
СДВИГОВОГО РЕГИСТРА 74HC165D
Для
правильной
работы
кнопок
необходимо
подключить
3 джампера на плате, расположенных в выделенном блоке
GPIO_lnput Другие джамперы на этих используемых линиях, со­
гласно схемы платы, отключить.
#include "stm32f10x.h"
#include <stdio.h>
#define Sysclock 72000000U
uint8_t data,x = О;
_IO uint16_t delay_count;
void SysTick_HandLer (void) //lms
{
if (delay_count>0)
{ delay_count--; }
}
void deLay_ms (uint16_t delay_temp)
{
delay_count=delay_temp;
while (delay_count) {}
}
// Макросы для управления выводами
#define СР _HIGH GPIOA->BSRR 1= GPIO_BSRR_B58 //РА8
#define СР _LOW GPIOA->BSRR 1= GPIO _BSRR_BR8
530
#define PL_HIGH GPIOA->BSRR 1= GPIO_BSRR_BS9 //РА9
#define PL_LOW GPIOA->BSRR 1= GPIO_BSRR_BR9
#define Q7 _HIGH GPIOA->BSRR 1= GPIO_BSRR_BS10 //РА10
#define Q7 _LOW GPIOA->BSRR 1= GPIO _BSRR_BR10
// Переменная для хранения состояния кнопок
uint8_t button_state2 = О;
// Инициализация GPIO
void GPIO_lnit(void} {
// Включение тактирования GPIOA
RCC_APB2ENR_IOPAEN
1=
RCC->APB2ENR
RCC_APB2ENR_AFIOEN I RCC_APB2ENR_USARТ1EN;
// Настройка РА8 (DS) как выход!
GPIOA-> CRH &= -GPIO_CRH_MODE8_0;//0: Выход, макси­
мальная частота 2 MHz;
GPIOA->CRH 1= GPIO_CRH_MODE8_1;//1: Выход, максималь­
ная частота 2 MHz;
GPIOA->CRH &= -GPIO_CRH_CNF8_0;//00: GeneraL purpose
output push-puLL - выход в режиме Push-puLL;
GPIOA->CRH &= -GPIO_CRH_CNF8_1;//00: GeneraL purpose
output push-puLL - выход в режиме Push-puLL;
// Настройка РА9 (DS) как выход!
GPIOA->CRH &= -GPIO_CRH_MODE9_0;//0: Выход, макси­
мальная частота 2 MHz;
GPIOA->CRH 1= GPIO_CRH_MODE9_1;//1: Выход, максималь­
ная частота 2 MHz;
GPIOA->CRH &= -GPIO_CRH_CNF9_0J/00: GeneraL purpose
output push-puLL - выход в режиме Push-puLL;
GPIOA->CRH &= -GPIO_CRH_CNF9_1;//00: GeneraL purpose
output push-puLL - выход в режиме Push-puLL;
531
// Настройка РА10 (DS) как вход!
GPIOA->CRH &= -GPIO_CRH_MODE10_0;//Bxoд (значение по­
сле сброса);
GPIOA->CRH &= -GPIO_CRH_MODE10_1;//Bxoд (значение по­
сле сброса);
GPIOA->CRH &= -GPIO_CRH_CNF10_0;//10: lnput with pullup / pull-down - вход с подтяжкой к питанию или к земле;
GPIOA->CRH 1= GPIO_CRH_CNF10_1; //10: lnput with pull-up /
pull-down - вход с подтяжкой к питанию или к земле;
// Настройка USАRТ1.Настройка вывода на передачу
GPIOA-> CRL &= -GPIO_CRL_CNF2; //
GPIOA-> CRL 1= GPIO_CRL_CNF2_1; //
GPIOA->CRL 1= GPIO_CRL_MODE2_0;
// настройка вывода на прием
GPIOA-> CRL &= -GPIO_CRL_CNF3; //
GPIOA-> CRL 1= GPIO_CRL_CNF3_0; //
GPIOA-> CRL &= -GPIO_CRL_MODE3_1;
// Настройка USARТ2 регистрами
RCC->APB1ENR 1= RCC_APB1ENR_USARТ2EN; // USART2
Clock ON
USARТ2-> BRR = ОхЕА6; // 9600 бод при тактовой частоте
36 МГц (АРВ1) 72Mhz-RCC
USART_CR1_TE
1= USART_CR1_UE
USARТ2->CR1
USART_CR1_RE;
//NOJТAG: JТAG-DP DisaЫed and SW-DP EnaЫed
CLEAR_BIT(AFIO->MAPR,AFIO_MAPR_SWJ_ CFG);
SET_BIT(AFIO->MAPR, AFIO_MAPR_SWJ_ CFG_JТAGDISABLE);
}
// Функция для чтения данных из 74НС165
uint8_t Read_74HC16S (void)
{
uint8_t button_state = О;
532
// Активируем загрузку данных в регистр (PL в низкий уро­
вень)
PL_LOW; // PL = О
PL_HIGH; // PL = 1
// Чтение 8 бит данных
for (int i = О; i <8; i++) {
button_state 1= ((GPIOA-> IDR & GPIO_IDR_IDR10)? 1: О) «i; //
Чтение бита
СР _HIGH; // СР = 1 (тактовый импульс)
СР _LOW; // СР = О}
button_state = -button_state;
return button_state;
}
// Отправка символа через UART
void UART_SendChar (char ch)
{
while (!(USARТ2->SR & USART_SR_TXE)); // Ждем, пока буфер
ТХ не освободится
USARТ2-> DR = ch; // Отправляем символ
}
// Отправка строки через UART
void UART_SendString (const char *str)
{
while (*str) {
UART_SendChar (*str++);}
}
int main (void)
{
// char data = О;
GPIO_lnitQ;
SysTick_Config(SystemCoreClock/1000); //запуск систика для
533
задержке к
while (1) {
uint8_t button_state = О;
button_state = Read_74HC165 О;
// Проверка состояния каждой кнопки
for (int i = О; i < 8; i++) {
if (button_state & (1 «i)) {
// Если кнопка нажата, отправляем информацию о кнопке
через UARТ2 интерфейса USB
char buffer[24];
snprintf (buffer, sizeof {buffer), «Button %d pressed\r\n\n»,
i +1);
UART_SendString {buffer);}}
delay_ms (100);}
}
Комментарий работы кода:
Этот код предназначен для **чтения состояния
8 кнопок**,
nодключённых к сдвиговому регистру **74НС165**, и отправки
информации о нажатых кнопках через **UART (USARТ2) •• в ви­
де текстовых сообщений. Разберём его работу по шагам:
1. Основные компоненты
- Микроконтроллер: STM32F10x.
- Периферия:
- GPIO (РА8, РА9, РА10) - для управления 74НС165.
- USART2 - для отправки данных в компьютер (например,
через USB-UART адаптер).
- SysTick* - для реализации задержек.
- Внешние устройства:
- 74HC165D - 8-битный сдвиговый регистр с параллельной
загрузкой (подключён к кнопкам).
534
2. Как работает код?
2.1. Инициализация (GPIO lnit)
Настройка GPIO:
- РА8 (CP/CLK) - выход (тактовый сигнал для 74НС165).
- РА9 (PL/SH/LD) - выход (сигнал загрузки данных в регистр).
-
РА10
(Q7) -
вход
(чтение
данных
последовательных
из 74НС165).
- USART2 (РА2-ТХ, PA3-RX) -
настройка UART для передачи
данных.
2. Настройка USARТ2:
- Скорость передачи: 9600 бод (при АРВ1 = 36 МГц).
- Включены передатчик ('ТЕ') и приёмник ('RE').
3. Отключение JТAG** (освобождает
GPIO) - иногда в книге это необходимо.
РА15,
РВ3,
РВ4 для
2.2. Чтение данных из 74НС165 ('Read 74НС165')
1. Загрузка данных:
- 'PL_LOW' ➔ 'PL_HIGH' - переводит регистр в режим па­
раллельной
загрузки
(состояние
кнопок
записывается
в
ре­
гистр).
2. Последовательное чтение 8 бит:
- В цикле 'fог (int i = О; i <8; i++) ·:
- Чтение бита с 'QT (РА10) и сохранение в 'button_state'.
- Генерация тактового импульса ('СР _HIGH' ➔ 'СР _LOW')
для сдвига данных.
3. Инверсия данных:
- 'button_state = -button_state' - если кнопки подключены
с подтяжкой к питанию (нажатие = 'О').
2.3. Отправка данных через UART ('UART SendString')
535
- Если кнопка нажата ('button_state & (1 « i)'), формируется
строка вида:
'"Button Х pressed\r\n"' и отправляется через USARТ2.
2.4. Главный цикл ('main')
1. Чтение состояния кнопок ('Read_74HC165').
2. Проверка каждой из 8 кнопок.
3. Если кнопка нажата - отправка сообщения через UART.
4. Задержка '100 мс' (для уменьшения количества повтор­
ных отправок).
3. Как это работает в железе?
Схема подключения 74НС165
74НС165:
- PL (РА9) - сигнал загрузки.
- СР (РА8) - тактовый сигнал.
- Q7 (РА10) - выход последовательных данных.
- Кнопки подключены к входам D0-D7 (через подтягивающие резисторы).
Логика работы:
1. При· нажатии
кнопки на входе регистра появляется ·о·
(или ·1 ·, в зависимости от схемы).
2. По сигналу 'PL_LOW' ➔ 'PL_HIGH' состояние кнопок загру­
жается в регистр.
3. По тактовым импульсам ·ер· данные сдвигаются и читают­
ся через 'QT.
4.
Микроконтроллер
отправляет информацию о
нажатых
кнопках в UART.
Подробнее о логике работы сдвигового регистра:
ИМС 74HC165D это сдвиговый регистр, преобразующий па­
раллельный сигнал в последовательный. На плате она работает
на частоте немного менее 44МГц.
Как она работает. Сначала мы подаем кратковременно низ-
536
кий сигнал, т.е. «О» на защелку сдвигового регистра
-
вывод
PL (№1). Данные о нажатых и не нажатых кнопках на выводах
D0-D7 поступают все сразу в регистр ИМС. Данные с вывода
D7 поступают на выходы Q7 и Q7инв и срабатывает тактовый
сигнал на выводе регистра СР. Затем данные с вывода D6 по­
ступают на выходы Q7 и Q7инв и срабатывает тактовый сигнал
на выводе регистра СР. И так до вывода D0. Для считывания
всех данных нужно подать 7 тактовых импульсов, т.к. данные
с D7 считываются сразу. И только потом продвигаются по так­
товым сигналам. Теперь снова срабатывает защелка и все на­
чинается с начала. Например: для двух соединённых регистров
нужно подать 15 тактовых сигналов.
4. Особенности кода
-
Инверсия
'button_state'
-
если
кнопки
подключены
с подтяжкой к питанию ('1' = не нажата, 'О' = нажата).
-
Задержка 'delay_ms (100) ' -
простая защита от «дребез­
га» кнопок и слишком частых отправок.
- Формирование строки через 'sпprintf' - удобный способ
создать сообщение для UART.
5. На мой взгляд возможные мои улучшения
1. Оптимизация работы UART (буферизация данных, DMA).
2. Подключение нескольких регистров 74НС165 (каскадиро­
вание).
Вывод:
Этот код превращает 8 кнопок, подключённых к 74НС165,
в последовательный интерфейс, экономя большое количество
выводо
GPIO
микроконтроллера,
о нажатиях в терминал ПК через
и
отправляет
информацию
UART разъема USB Туре-С.
До этой программы использовался обычно UART в программато­
ре
STLink V2.1 и соответствующий разъем программатора при
работе с платой BLue Кit.
537
ПРОЕКТ ПО УВЕЛИЧЕНИЮ ЧИСЛА
ПОДКЛЮЧЕННЫК СВЕТОДИОДОВ
С ПРИМЕНЕНИЕМ 74HCS9SD
Для
правильной
работы
кнопок необходимо
подключить
3 джампера на плате версии 1.01, и 4 джампера платы на вер­
1.02, расположенных в выделенном блоке GPIO_Output.
сии
Другие джамперы на этих используемых линиях, согласно схе­
мы платы, отключить.
#inctude "stm32f10x.h"
#define Sysctock 72000000U
uint8_t data = О;
_Ю uint16_t detay_count;
void SysTick_HandLer (void) //1ms
{
if (detay_count>0)
{ detay_count--; }
}
void deLay_ms (uint16_t detay_temp)
{
detay_count=detay_temp;
white (detay_count) {}
}
// Макросы для управления выводами
#define DATA_HIGH
GPIOA->BSRR 1= GPIO_BSRR_B512 //
РА12 (Data)
#define DATA_LOW GPIOA->BSRR 1= GPIO_BSRR_BR12
#define CLOCK_HIGH GPIOB->BSRR 1= GPIO_BSRR_B54 // РВ4
(Ctock)
#define CLOCK_LOW GPIOB->BSRR 1= GPIO_BSRR_BR4
538
#define LATCH_HIGH GPIOA->BSRR 1= GPIO_BSRR_BS15 //РА15
#define LATCH_LOW GPIOA->BSRR 1= GPIO_BSRR_BR15
// Функция для nобитной передачи данных (LSBFIRST)
void ShiftOut_LSBFIRST (uint8_t data)
{
for (int i = О; i < 8; i++) {
// Устанавливаем значение бита на выводе DATA
// if (data & (1 « i)) {//Проверяем младший бит (LSB) - меняем порядок начала свечения
if (data & (1 « (7 - i))) {
DATA_HIGH;
} else {
DATA_LOW;}
// Генерируем импульс на CLK (SH_CP)
CLOCK_HIGH;
CLOCK_LOW;}
// Генерируем импульс на LATCH (ST_CP)
LATCH_HIGH;
LATCH_LOW;
}
// Инициализация GPIO
void GPIO_lnit (void)
{
// Включение тактирования GPIOA и GPIOB
RCC_APB2ENR_IOPAEN
1=
RCC->APB2ENR
RCC_APB2ENR_IOPBEN IRCC_APB2ENR_AFIOEN;
// Настройка РА12 (DS) как выход
GPIOA->CRH &= -GPIO_CRH_MODE12_0j/0: Выход, макси­
мальная частота 2 MHz;
GPIOA->CRH 1= GPIO_CRH_MODE12_1;//1: Выход, максималь­
ная частота 2 MHz;
GPIOA->CRH &= -GPIO_CRH_CNF12_0j/00: General purpose
539
output push-pull - выход в режиме Push-pull;
GPIOA->CRH &= -GPIO_CRH_CNF12_1;//00: General purpose
output push-pull - выход в режиме Push-pull;
// Настройка РА15 (LATCH) как выход
GPIOA->CRH &= -GPIO_CRH_MODE15_0;//0: Выход, макси­
мальная частота 2 MHz;
GPIOA->CRH 1= GPIO_CRH_MODE15_1;//1: Выход, максималь­
ная частота 2 MHz;
GPIOA-> CRH &= -GPIO_CRH_CNF15_0;//00: General purpose
output push-pull - выход в режиме Push-pull;
GPIOA->CRH &= -GPIO_CRH_CNF15_1;//00: General purpose
output push-pull - выход в режиме Push-pull;
// Настройка РВ4 (CLK) как выход
GPIOB->CRL &= -GPIO_CRL_MODE4_0;//0: Выход, максималь­
ная частота 2 MHz;
GPIOB->CRL 1= GPIO_CRL_MODE4_1;//1: Выход, максималь­
ная частота 2 MHz;
GPIOB->CRL &= -GPIO_CRL_CNF4_0;//00: General purpose
output push-pull - выход в режиме Push-pull;
GPIOB->CRL &= -GPIO_CRL_CNF4_1;//00: General purpose
output push-pull - выход в режиме Push-pull;
//NOJТAG: JТAG-DP DisaЫed and SW-DP EnaЫed
CLEAR_BIT(AFIO->MAPR,AFIO_MAPR_SWJ_CFG);
SET_BIT (AFIO-> MAPR, AFIO_MAPR_SWJ_ CFG_JТAGDISABLE);
}
int main (void)
{
GPIO_lnit О;
SysTick_Config (SystemCoreClock/1000); //запуск систика для
задержке к
540
// Передаем байт Ох30 (В00110000) в режиме LSBFIRST
uint16_t i = О;
while (1) {
ShiftOut_LSBFIRST(i++);
delay_ms (100);}
}
Комментарий работы кода:
Этот код предназначен для управления сдвиговым реги­
стром
74HCS95D с помощью микроконтроллера STM32F103C.
Давайте разберём его работу пошагово:
1. Основные компоненты и назначение выводов
РА12
(DATA)
-
линия
данных
для
регистра
(DS
вход
74HCS95)
РВ4 (CLOCK) - тактовый сигнал (SH_CP вход 74HCS95)
РА15 (LATCH) - сигнал защёлки (ST_СР вход 7 4HCS95)
Код реализует последовательный интерфейс для управления
регистром, который затем может управлять множеством выхо­
дов (в нашем случае, светодиодами) с использованием всего
трёх пинов микроконтроллера.
2. Принцип работы сдвигового регистра
Данные передаются побитно (старший бит первый). Каждый
бит «задвигается» в регистр по возрастающему фронту тактово­
го сигнала. После передачи всех 8 бит, сигнал LATCH обновляет
выходные регистры.
3. Разбор ключевых функций
Функция ShiftOut_LSBFIRST Q:
- Перебирает все 8 бит переданного байта
- Для каждого бита:
а) Устанавливает DATA в HIGH или LOW
от значения бита
541
в
зависимости
(CLOCK_HIGH --+
импульс
6) Генерирует тактовый
CLOCK_LOW)
- После передачи всех битов генерирует импульс защёлки
(LATCH)
Функция GP/0_/nit О:
Настраивает GPIO:
а) Все используемые пины (РА12, РА15, РВ4) как выходы
Push-Pull
6) Отключает JТAG, чтобы освободить РА15 для использова­
ния
Функции задержки:
Используют системный таймер
(SysTick) для создания точ­
ных задержек.
4. Работа в главном цикле
while (1)
{
ShiftOut_LSBFIRST (i++);
delay_ms (100);
}
В бесконечном цикле передаётся текущее значение счётчи­
ка i.
После каждой передачи делается пауза 100 мс.
Счётчик i инкрементируется, что приводит к изменению пе­
редаваемых данных.
5. Пример работы
Допустим, i = 00110000 - кнопки нажаты в таком виде:
Биты
передаются
0--t0--t1--t1--+0--t0--t0--t0
Для каждого бита:
- Устанавливается DATA;
- Генерируется тактовый импульс.
542
в
порядке:
В конце -
импульс защёлки.
Несмотря на название LSBFIRST, код передаёт старший бит
первым (MSB first).
6. Практическое применение кода сдвига
-
Управление светодиодными матрицами;
Работа с семисегментными индикатора;
Расширение количества выходов микроконтроллера.
7. На мой взгляд возможные улучшения
-
Реализовать аппаратный SPI для более быстрой передачи;
Добавить буферизацию данных;
Реализовать поддержку каскада из нескольких регистров.
Итог: Этот код демонстрирует классический способ работы
со
сдвиговыми
регистрами,
который
широко
применяется
в еmЬеddеd-разработке для расширения возможностей микро­
контроллеров.
543
СПИСОК ЛИТЕРАТУРЫ
1. AN298 Migrate ARM Compiler 5 to ARM Compiler 6 V1.0 от
March 2017.
2. Книга Освоение STM32 самостоятельно #1. Николай Ру­
син. 2024
3. RM0008. Reference manual. STM32F101xx, STM32F102xx,
STM32F103xx, STM32F105xx and STM32F107xx advanced Arm®based 32-Ьit MCUs.
544
ЗАКЛЮЧЕНИЕ. ПОЛУЧЕНИЕ
ДОСТУПА К КОМЬЮНИТИ
ИЗУЧЕНИЯ STM32
Я создал Теlеgгаm-канал и группу в VK. По любым вопросам
развития моего канала на YouTube, получения новостей из раз­
личных областей, подписывайтесь и обращайтесь сюда :
- t.me/NR_electronics
- vk.com/nrelectronics
а также Теlеgгаm-канал непосредственно для информации
по материалам этой книги:
Рисунок В - QR-код канала для дополнительной информации
545
Николай Русин
Освоение STM32 самостоятельно #2
Создано в интеллектуальной издательской системе Ridero