Регистры FMAC STM32G4
Регистры FMAC STM32G4: размещение буферов X1, X2 и Y в локальной памяти, пороги заполнения, функция и её параметры, прерывания и DMA, насыщение и флаги ошибок.
FMAC выполняет фильтры FIR (свёртку) и IIR над 16-битными отсчётами q1.15 в своей памяти на 256 слов. В ней размещают три буфера: X1 — входные отсчёты, X2 — коэффициенты, Y — результаты; начало и размер каждого задают регистры X1BUFCFG, X2BUFCFG и YBUFCFG (RM0440, раздел 18.4).
Сначала функциями загрузки (FUNC = 1, 2, 3) заполняют буферы, затем запускают фильтр (FUNC = 8 — FIR, 9 — IIR) битом START. Отсчёты пишут в WDATA и читают из RDATA сами или через DMA; флаги X1FULL и YEMPTY управляют потоком, SAT, OVFL и UNFL сообщают об ошибках. FMAC тактируется битом FMACEN в RCC_AHB1ENR.
| Экземпляр | Базовый адрес | Есть у |
|---|---|---|
| FMAC | 0x4002 1400 | всех |
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| FMAC_X1BUFCFG | 0x00 | Буфер входных отсчётов X1 | 0x0000 0000 |
| FMAC_X2BUFCFG | 0x04 | Буфер коэффициентов X2 | 0x0000 0000 |
| FMAC_YBUFCFG | 0x08 | Буфер выходных отсчётов Y | 0x0000 0000 |
| FMAC_PARAM | 0x0C | Функция и её параметры P, Q, R | 0x0000 0000 |
| FMAC_CR | 0x10 | Прерывания, DMA, насыщение и сброс | 0x0000 0000 |
| FMAC_SR | 0x14 | Флаги буферов и ошибок | 0x0000 0001 |
| FMAC_WDATA | 0x18 | Запись данных | 0x0000 0000 |
| FMAC_RDATA | 0x1C | Чтение результата | 0x0000 0000 |
Конструктор значения
Выберите регистр и значения полей — конструктор покажет 32-битное значение и строку на C с макросами CMSIS. Поля, которые вы не меняете, берутся из значения после сброса.
Значение: 0x00000000
0000 0000 0000 0000 0000 0000 0000 0000
FMAC->X1BUFCFG = 0x00000000;FMAC_X1BUFCFG — буфер входных отсчётов X1
Смещение 0x00, адрес 0x4002 1400, 32 бит, после сброса 0x0000 0000. В коде: FMAC->X1BUFCFG.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | FULL_WM | — | |||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| X1_BUF_SIZE | X1_BASE | ||||||||||||||
- FULL_WM (биты 25:24) — Порог заполнения X1: флаг X1FULL, когда свободно меньше 1, 2, 4 или 8 мест.
- X1_BUF_SIZE (биты 15:8) — Размер буфера X1 в 16-битных словах.
- X1_BASE (биты 7:0) — Начало буфера X1 в локальной памяти FMAC (256 слов).
FMAC_X2BUFCFG — буфер коэффициентов X2
Смещение 0x04, адрес 0x4002 1404, 32 бит, после сброса 0x0000 0000. В коде: FMAC->X2BUFCFG.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| X2_BUF_SIZE | X2_BASE | ||||||||||||||
- X2_BUF_SIZE (биты 15:8) — Размер буфера X2 в 16-битных словах.
- X2_BASE (биты 7:0) — Начало буфера X2 в локальной памяти FMAC (256 слов).
FMAC_YBUFCFG — буфер выходных отсчётов Y
Смещение 0x08, адрес 0x4002 1408, 32 бит, после сброса 0x0000 0000. В коде: FMAC->YBUFCFG.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | EMPTY_WM | — | |||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Y_BUF_SIZE | Y_BASE | ||||||||||||||
- EMPTY_WM (биты 25:24) — Порог опустошения Y: флаг YEMPTY, когда отсчётов меньше 1, 2, 4 или 8.
- Y_BUF_SIZE (биты 15:8) — Размер буфера Y в 16-битных словах.
- Y_BASE (биты 7:0) — Начало буфера Y в локальной памяти FMAC (256 слов).
FMAC_PARAM — функция и её параметры P, Q, R
Смещение 0x0C, адрес 0x4002 140C, 32 бит, после сброса 0x0000 0000. В коде: FMAC->PARAM.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| START | FUNC | R | |||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Q | P | ||||||||||||||
- START (бит 31) — Запуск функции; сбрасывается по окончании (для фильтров — после остановки).
- FUNC (биты 30:24) — Функция: загрузка X1, X2 или Y, фильтр FIR (свёртка) или IIR.
- R (биты 23:16) — Параметр R: усиление — сдвиг результата на R бит влево.
- Q (биты 15:8) — Параметр Q: число коэффициентов A у IIR-фильтра.
- P (биты 7:0) — Параметр P: число коэффициентов B (для загрузки — число значений).
FMAC_CR — прерывания, DMA, насыщение и сброс
Смещение 0x10, адрес 0x4002 1410, 32 бит, после сброса 0x0000 0000. В коде: FMAC->CR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | RESET | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| CLIPEN | — | DMAWEN | DMAREN | — | SATIEN | UNFLIEN | OVFLIEN | WIEN | RIEN | ||||||
- RESET (бит 16) — Сброс FMAC: указатели буферов и флаги.
- CLIPEN (бит 15) — Ограничение результата вместо переполнения.
- DMAWEN (бит 9) — Запросы DMA на запись в X1.
- DMAREN (бит 8) — Запросы DMA на чтение из Y.
- SATIEN (бит 4) — Прерывание по насыщению.
- UNFLIEN (бит 3) — Прерывание по опустошению Y при чтении.
- OVFLIEN (бит 2) — Прерывание по переполнению X1 при записи.
- WIEN (бит 1) — Прерывание: в X1 есть место для записи.
- RIEN (бит 0) — Прерывание: в Y есть результат.
FMAC_SR — флаги буферов и ошибок
Смещение 0x14, адрес 0x4002 1414, 32 бит, после сброса 0x0000 0001. В коде: FMAC->SR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | SAT | UNFL | OVFL | — | X1FULL | YEMPTY | |||||||||
- SAT (бит 10) — Насыщение: результат вышел за пределы q1.15.
- UNFL (бит 9) — Чтение пустого буфера Y.
- OVFL (бит 8) — Запись в полный буфер X1.
- X1FULL (бит 1) — Буфер X1 заполнен до порога FULL_WM.
- YEMPTY (бит 0) — Буфер Y пуст до порога EMPTY_WM.
FMAC_WDATA — запись данных
Смещение 0x18, адрес 0x4002 1418, 32 бит, после сброса 0x0000 0000. В коде: FMAC->WDATA.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| WDATA | |||||||||||||||
- WDATA (биты 15:0) — Входной отсчёт или коэффициент (q1.15).
FMAC_RDATA — чтение результата
Смещение 0x1C, адрес 0x4002 141C, 32 бит, после сброса 0x0000 0000. В коде: FMAC->RDATA.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| RDATA | |||||||||||||||
- RDATA (биты 15:0) — Выходной отсчёт (q1.15).
Частые вопросы
Как настроить FIR-фильтр на 16 коэффициентов?
X2BUFCFG: X2_BASE = 0, X2_BUF_SIZE = 16; загрузите коэффициенты функцией FUNC = 2 с P = 16. X1BUFCFG: X1_BASE = 16, размер 16 + запас; YBUFCFG — после X1. Затем PARAM: FUNC = 8, P = 16, R = 0, START = 1, и подавайте отсчёты в WDATA.
Чем FMAC лучше расчёта на ядре?
Он работает параллельно с ядром и по DMA: ядро только запускает фильтр, а на каждый отсчёт уходит около P тактов FMAC вместо цикла умножений с накоплением в программе.
Источники
- STMicroelectronics. RM0440: Reference manual (Rev 9) — раздел 18.4: описание регистров, назначение полей и значения после сброса
- STMicroelectronics. cmsis-device-g4 v1.2.6: заголовки CMSIS stm32g431xx.h, stm32g441xx.h, stm32g471xx.h, stm32g473xx.h, stm32g474xx.h, stm32g483xx.h, stm32g484xx.h, stm32g491xx.h, stm32g4a1xx.h — структуры периферии, смещения, адреса экземпляров и макросы полей; лицензия Apache-2.0
Нашли ошибку в регистрах?
Другие регистры STM32G4
- Все регистры STM32G4Блоки периферии и заголовки CMSIS
- RCC — тактирование и сбросRCC_CR, RCC_ICSCR, RCC_CFGR, RCC_PLLCFGR, RCC_CIER, RCC_CIFR
- GPIO — порты ввода-выводаGPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, GPIOx_PUPDR, GPIOx_IDR, GPIOx_ODR
- SYSCFG — системная конфигурацияSYSCFG_MEMRMP, SYSCFG_CFGR1, SYSCFG_EXTICR1, SYSCFG_EXTICR2, SYSCFG_EXTICR3, SYSCFG_EXTICR4
- EXTI — внешние прерыванияEXTI_IMR1, EXTI_EMR1, EXTI_RTSR1, EXTI_FTSR1, EXTI_SWIER1, EXTI_PR1
- USART — последовательные порты USART и LPUARTUSART_CR1, USART_CR2, USART_CR3, USART_BRR, USART_GTPR, USART_RTOR
- SPI — интерфейсы SPI и I2SSPI_CR1, SPI_CR2, SPI_SR, SPI_DR, SPI_CRCPR, SPI_RXCRCR
- I2C — интерфейс I2CI2C_CR1, I2C_CR2, I2C_OAR1, I2C_OAR2, I2C_TIMINGR, I2C_TIMEOUTR
- TIM — таймерыTIMx_CR1, TIMx_CR2, TIMx_SMCR, TIMx_DIER, TIMx_SR, TIMx_EGR
- LPTIM — маломощный таймерLPTIM_ISR, LPTIM_ICR, LPTIM_IER, LPTIM_CFGR, LPTIM_CR, LPTIM_CMP
- DMA — прямой доступ к памятиDMA_ISR, DMA_IFCR, DMA_CCR, DMA_CNDTR, DMA_CPAR, DMA_CMAR
- АЦП — аналого-цифровые преобразователиADC_ISR, ADC_IER, ADC_CR, ADC_CFGR, ADC_CFGR2, ADC_SMPR1
- IWDG — независимый сторожевой таймерIWDG_KR, IWDG_PR, IWDG_RLR, IWDG_SR, IWDG_WINR
- WWDG — оконный сторожевой таймерWWDG_CR, WWDG_CFR, WWDG_SR
- CRC — вычислитель CRCCRC_DR, CRC_IDR, CRC_CR, CRC_INIT, CRC_POL
- DBGMCU — отладкаDBGMCU_IDCODE, DBGMCU_CR, DBGMCU_APB1FZR1, DBGMCU_APB1FZR2, DBGMCU_APB2FZR
- PWR — управление питаниемPWR_CR1, PWR_CR2, PWR_CR3, PWR_CR4, PWR_SR1, PWR_SR2
- FLASH — флеш-памятьFLASH_ACR, FLASH_PDKEYR, FLASH_KEYR, FLASH_OPTKEYR, FLASH_SR, FLASH_CR
- RTC — часы реального времени и вмешательствоRTC_TR, RTC_DR, RTC_SSR, RTC_ICSR, RTC_PRER, RTC_WUTR
- ЦАП — цифро-аналоговые преобразователиDAC_CR, DAC_SWTRIGR, DAC_DHR12R1, DAC_DHR12L1, DAC_DHR8R1, DAC_DHR12R2
- CORDIC — сопроцессор тригонометрии CORDICCORDIC_CSR, CORDIC_WDATA, CORDIC_RDATA