Перейти к содержанию

Частота SPI STM32: делитель BR[2:0] и предел SCK

Выберите линейку и корпус из атласа, модуль SPI и нужную частоту — калькулятор найдёт делитель BR[2:0], при котором SCK ближе всего к нужной, но не выше её и не выше предела даташита для вашего режима и питания, покажет все восемь делителей, таблицу режимов SPI и код инициализации на регистрах CMSIS, HAL или LL.

Исходные данные

МГц

пусто — максимум 72 МГц

Роль
Направление
МГц

пусто — самая быстрая допустимая

В

Результат

SCK
9 МГц
BR[2:0] = 010, fPCLK / 8; на 10 % ниже 10 МГц
Шина модуля
APB2, 72 МГцмаксимум шины 72 МГц
Предел по даташиту
18 МГцведущий, полный дуплекс, VDD от 2 В; DS5319 Rev 20, табл. 43 (x8/xB); DocID15060, DS5792
Предел по RM
36 МГцfPCLK/2, RM0008 Rev 21
Кадр 8 бит
0,8889 мкстолько такты SCK, без пауз между кадрами

Все значения BR при fPCLK = 72 МГц

BR[2:0]ДелительSCKЗамечание
000/236 МГцвыше предела даташита
001/418 МГцвыше нужной
010/89 МГцвыбрано
011/164,5 МГц
100/322,25 МГц
101/641,125 МГц
110/1280,5625 МГц
111/2560,28125 МГц

Режимы SPI: CPOL и CPHA в SPI_CR1

РежимCPOLCPHASCK в покоеЗахватСдвиг
000низкийпо фронтупо спаду
101низкийпо спадупо фронту
210высокийпо спадупо фронту
311высокийпо фронтупо спаду

Размер кадра у STM32F103 (x4…xE) — бит DFF в SPI_CR1: 0 — 8 бит, 1 — 16 бит; менять его можно только при SPE = 0.

Код инициализации
/* SPI1 on APB2: fPCLK = 72 MHz, BR = 010 -> /8 -> SCK = 9 MHz, mode 0 */
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
SPI1->CR1 = 0;                       /* SPE = 0 while configuring */
SPI1->CR1 = SPI_CR1_MSTR
           | SPI_CR1_SSM
           | SPI_CR1_SSI
           | (2U << SPI_CR1_BR_Pos);
/* NSS is software (SSM = SSI = 1): drive CS from a GPIO */
SPI1->CR1 |= SPI_CR1_SPE;

uint8_t spi1_transfer(uint8_t data)
{
    while (!(SPI1->SR & SPI_SR_TXE)) ;
    SPI1->DR = data;
    while (!(SPI1->SR & SPI_SR_RXNE)) ;
    return SPI1->DR;
}

Выводы SCK, MISO, MOSI (и NSS у ведомого) настраивают отдельно — в режим альтернативной функции.

Расчёт выполнен по формулам и данным из источников, приведённых на этой странице, и не заменяет проверку: параметры компонентов у разных производителей и даже партий различаются. Перед применением сверяйте результат с документацией на конкретные детали.

Модуль SPI у STM32 не имеет своего генератора: ведущий получает SCK, деля частоту своей шины APB на 2, 4, 8 … 256. Поэтому одна и та же настройка BR даёт разную частоту у разных модулей одного микроконтроллера, а точно попасть в нужную частоту можно не всегда — только в ближайшую ступень ниже.

Формула и делители

fSCK=fPCLK2BR+1f_{SCK} = \frac{f_{PCLK}}{2^{BR+1}}

BR[2:0]ДелительSPI1 STM32F103, PCLK2 = 72 МГцSPI2 STM32F103, PCLK1 = 36 МГц
000236 МГц — выше предела18 МГц
001418 МГц9 МГц
01089 МГц4,5 МГц
011164,5 МГц2,25 МГц
100322,25 МГц1,125 МГц
101641,125 МГц562,5 кГц
110128562,5 кГц281,25 кГц
111256281,25 кГц140,625 кГц

Калькулятор выбирает самый маленький делитель, при котором SCK не выше нужной частоты и не выше предела даташита, и показывает, на сколько процентов частота получилась ниже. Если нужна частота между ступенями, меняют не BR, а делитель шины APB или саму системную частоту — их подбирает калькулятор тактирования STM32.

Какая шина у какого SPI

ЛинейкаAPB2APB1Наибольшая частота шин
STM32F103SPI1SPI2, SPI3APB2 72 МГц, APB1 36 МГц
STM32F401SPI1, SPI4SPI2, SPI384 и 42 МГц
STM32F405, F407SPI1SPI2, SPI384 и 42 МГц
STM32F411SPI1, SPI4, SPI5SPI2, SPI3100 и 50 МГц
STM32F427, F429SPI1, SPI4, SPI5, SPI6SPI2, SPI390 и 45 МГц
STM32F0, STM32G0одна шина PCLK для всех SPI48 и 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 не сработает как ожидается.

Источники

  1. 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
  2. STMicroelectronics. RM0090 Rev 21 (STM32F405/407, F427/429), RM0368 Rev 6 (F401), RM0383 Rev 4 (F411) — 28.2.1 — те же делители и предел fPCLK/2; SPI_CR1 с битом DFF
  3. 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
  4. 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)
  5. 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)
  6. STMicroelectronics. Даташиты STM32G031 (DS12992) и STM32G071 (DS12232) — SPI characteristics: в Range 1 до 32 МГц; ведомый на передачу при VDD ниже 2,7 В — 25 МГц у G031 (табл. 70) и 23 МГц у G071 (табл. 72); в Range 2 — 8 МГц
  7. 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 бит

Где пригодится

Встроить калькулятор на свой сайт

Скопируйте код и вставьте его в 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>

Обновлено .

Нашли ошибку в расчёте?