Модуль SPI у STM32 не имеет своего генератора: ведущий получает SCK, деля частоту своей шины APB на 2, 4, 8 … 256. Поэтому одна и та же настройка BR даёт разную частоту у разных модулей одного микроконтроллера, а точно попасть в нужную частоту можно не всегда — только в ближайшую ступень ниже.
Формула и делители
| BR[2:0] | Делитель | SPI1 STM32F103, PCLK2 = 72 МГц | SPI2 STM32F103, PCLK1 = 36 МГц |
|---|---|---|---|
| 000 | 2 | 36 МГц — выше предела | 18 МГц |
| 001 | 4 | 18 МГц | 9 МГц |
| 010 | 8 | 9 МГц | 4,5 МГц |
| 011 | 16 | 4,5 МГц | 2,25 МГц |
| 100 | 32 | 2,25 МГц | 1,125 МГц |
| 101 | 64 | 1,125 МГц | 562,5 кГц |
| 110 | 128 | 562,5 кГц | 281,25 кГц |
| 111 | 256 | 281,25 кГц | 140,625 кГц |
Калькулятор выбирает самый маленький делитель, при котором SCK не выше нужной частоты и не выше предела даташита, и показывает, на сколько процентов частота получилась ниже. Если нужна частота между ступенями, меняют не BR, а делитель шины APB или саму системную частоту — их подбирает калькулятор тактирования STM32.
Какая шина у какого SPI
| Линейка | APB2 | APB1 | Наибольшая частота шин |
|---|---|---|---|
| STM32F103 | SPI1 | SPI2, SPI3 | APB2 72 МГц, APB1 36 МГц |
| STM32F401 | SPI1, SPI4 | SPI2, SPI3 | 84 и 42 МГц |
| STM32F405, F407 | SPI1 | SPI2, SPI3 | 84 и 42 МГц |
| STM32F411 | SPI1, SPI4, SPI5 | SPI2, SPI3 | 100 и 50 МГц |
| STM32F427, F429 | SPI1, SPI4, SPI5, SPI6 | SPI2, SPI3 | 90 и 45 МГц |
| STM32F0, STM32G0 | одна шина PCLK для всех SPI | 48 и 64 МГц |
У STM32F0 и G0 обе шины тактируются одним PCLK, хотя бит включения SPI1 лежит в другом регистре RCC, чем у SPI2. Какие модули есть в конкретном корпусе, калькулятор берёт из атласа: у STM32F103C8 в корпусе LQFP48 — только SPI1 и SPI2, SPI3 появляется у моделей с 256 КБ флеш-памяти и больше.
Предел частоты
Справочное руководство разрешает ведущему и ведомому до fPCLK/2, но гарантированная частота записана в таблице SPI characteristics даташита, и она часто ниже. У STM32F0 и F1 это 18 МГц для всех модулей. У F4 предел зависит от модуля, роли и напряжения: быстрые модули на APB2 работают до 42–50 МГц при VDD от 2,7–3,0 В, модули на APB1 и любой модуль при питании от 1,7 В — до 21–25 МГц, а у F401, F411 и F429 ведомый, который сам передаёт данные, — до 38 МГц. У STM32G0 в Range 1 — до 32 МГц, а ведомый на передачу при питании ниже 2,7 В — 23 или 25 МГц. В Range 2 ядро и шина G0 работают не быстрее 16 МГц, а SPI нормирован до 8 МГц.
Ведомому делитель не нужен: такт задаёт ведущий, а калькулятор показывает, с какой частотой ведомый STM32 ещё гарантированно работает.
Режимы и размер кадра
Режим SPI — пара битов CPOL и CPHA в SPI_CR1: номер режима равен 2·CPOL + CPHA. CPOL задаёт уровень SCK в покое, CPHA — по какому перепаду захватываются данные: при CPHA = 0 по первому, при CPHA = 1 по второму. Подробнее о режимах и о том, как найти режим ведомой микросхемы, — в статье о режимах SPI; как выглядит кадр на линиях, рисует калькулятор кадра SPI.
У F1 и F4 кадр бывает 8 или 16 бит (бит DFF), у F0 и G0 — от 4 до 16 бит (поле DS[3:0] в SPI_CR2). У F0 и G0 есть FIFO, и при 8-битных кадрах нужно установить FRXTH: иначе RXNE сработает только после 16 принятых бит. Второе следствие FIFO — упаковка данных: если кадр не длиннее 8 бит, 16-битная запись в SPIx_DR отправляет сразу два кадра (сначала младший байт, потом старший), а 16-битное чтение забирает два принятых (RM0091, с. 780; RM0444, с. 1137). Поэтому к DR обращаются как к байту — *(__IO uint8_t *)&SPI1->DR, так же делает HAL. Сгенерированный код ставит FRXTH и пишет функцию обмена с байтовым доступом.
У ведущего в режиме «только приём» (RXONLY = 1) такт SCK начинается сразу после SPE = 1 и не останавливается, пока SPE не сбросят (RM0008, 25.3.4; RM0444, с. 1136), поэтому SPE включают, когда программа готова читать, и выключают во время последнего кадра.
Частые вопросы
Как посчитать частоту SPI STM32?
SCK = fPCLK / 2^(BR + 1), где BR — три бита BR[2:0] в SPI_CR1, а fPCLK — частота шины APB, на которой сидит модуль SPI. Делители — 2, 4, 8 … 256. У STM32F103 на 72 МГц SPI1 сидит на APB2 (72 МГц) и с BR = 001 даёт 18 МГц, а SPI2 — на APB1 (не больше 36 МГц) и при том же BR даёт 9 МГц.
Какая максимальная частота SPI у STM32F103?
По таблице SPI characteristics даташита — 18 МГц и для ведущего, и для ведомого. Справочное руководство разрешает до fPCLK/2, но у SPI1 при 72 МГц это 36 МГц, что выше гарантированного: нужен делитель 4 и больше.
Чем отличается размер кадра SPI у STM32F1/F4 и STM32F0/G0?
У F1 и F4 размер задаёт бит DFF в SPI_CR1: 8 или 16 бит. У F0 и G0 — поле DS[3:0] в SPI_CR2, от 4 до 16 бит, и есть FIFO на 32 бита; для кадров до 8 бит нужно установить FRXTH, иначе флаг RXNE ждёт 16 бит, а 8-битное чтение DR не сработает как ожидается.
Источники
- STMicroelectronics. RM0008 Rev 21 (STM32F101…F107) — 25.2.1 — восемь делителей ведущего, ведущий и ведомый до fPCLK/2; 25.5.1 — SPI_CR1: BR[2:0] 000 = fPCLK/2 … 111 = fPCLK/256, DFF (8 или 16 бит, менять при SPE = 0), CPOL, CPHA
- STMicroelectronics. RM0090 Rev 21 (STM32F405/407, F427/429), RM0368 Rev 6 (F401), RM0383 Rev 4 (F411) — 28.2.1 — те же делители и предел fPCLK/2; SPI_CR1 с битом DFF
- STMicroelectronics. RM0360 Rev 5 (STM32F030), RM0091 Rev 10 (F0x1/x2/x8), RM0444 Rev 6 (G0x1) — RM0091: с. 767 — до fPCLK/2, с. 815 — BR, с. 816 — FRXTH (RXNE при 1/4 FIFO для 8-битных чтений), с. 817 — DS[3:0]: 0011 = 4 бита … 1111 = 16 бит, 0000–0010 превращаются в 8 бит; с. 777 — порог FRXTH согласуют с размером чтения DR; с. 780 — упаковка данных (два кадра до 8 бит за одно 16-битное обращение к DR), непрерывный такт ведущего в режиме приёма. RM0444: с. 1124, 1136–1137, 1171–1173; RM0360: с. 637, 664, 666
- STMicroelectronics. Даташиты STM32F030 (DS9773), F051 (DocID022265), F072 (DS9826), F103 (DocID15060, DS5319, DS5792) — рабочее VDD: F030 — 2,4–3,6 В, F051, F072, F103 — 2,0–3,6 В; SPI characteristics: fSCK ведущего и ведомого до 18 МГц (DS9773 табл. 58, DocID022265 табл. 63, DS9826 табл. 68, DS5319 табл. 43, DocID15060 табл. 42, DS5792 табл. 53)
- STMicroelectronics. Даташиты STM32F401 (DS9716, DS10086), F405/F407 (DS8626), F411 (DS10314), F427/F429 (DS9405) — SPI dynamic characteristics: F401 — SPI1/4 42 МГц от 2,7 В, ведомый на передачу 38 МГц, остальные 21 МГц (табл. 61); F407 — SPI1 42 МГц, SPI1/2/3 от 1,7 В 21 МГц (табл. 55); F411 — 50 МГц от 3,0 В, 42 МГц от 2,7 В, ведущий только на передачу 50 МГц, ведомый на передачу 38 МГц, SPI2/3 25 МГц (табл. 60); F429 — SPI1/4/5/6 45 МГц, ведомый на передачу 38 МГц, от 1,7 В 22,5 МГц (табл. 63)
- STMicroelectronics. Даташиты STM32G031 (DS12992) и STM32G071 (DS12232) — SPI characteristics: в Range 1 до 32 МГц; ведомый на передачу при VDD ниже 2,7 В — 25 МГц у G031 (табл. 70) и 23 МГц у G071 (табл. 72); в Range 2 — 8 МГц
- STMicroelectronics. CMSIS device и драйверы HAL/LL STM32F0, F1, F4, G0 (GitHub) — биты включения RCC (SPI1, SPI4…SPI6 на APB2, SPI2 и SPI3 на APB1; у G0 — RCC_APBENR2 и RCC_APBENR1), SPI_BAUDRATEPRESCALER_2…256 = BR << 3, SPI_DATASIZE_xBIT = (x − 1) << 8 у F0/G0, LL_APB1_GRP2 для SPI1 у F0; тест проверяет каждое имя в коде; stm32f0xx_hal_spi.c и stm32g0xx_hal_spi.c обращаются к DR через *(__IO uint8_t *) для кадров до 8 бит
Где пригодится
- Как выбрать частоту SPI на STM32?Меньшая из трёх: STM32, ведомая микросхема, проводка; ступени BR
- Почему SPI на STM32F0 и STM32G0 отправляет 16 бит вместо 8?Упаковка данных в FIFO: к DR обращаются байтом, FRXTH = 1
- Почему на Nucleo-64 светодиод LD2 мигает, когда работает SPI?D13 = PA5 = LD2 = SPI1_SCK: светодиод видит такт SPI, а мигание LD2 ломает SPI
Встроить калькулятор на свой сайт
Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах
<iframe src="https://gaw.ru/embed/stm32-spi-prescaler/" title="Частота SPI STM32: делитель BR[2:0] и предел SCK" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/stm32-spi-prescaler/">Частота SPI STM32: делитель BR[2:0] и предел SCK</a> — GAW.ru</p>Автоподстройка высоты рамки
Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.
<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>Обновлено .
Нашли ошибку в расчёте?