대충 21페이지에서 발견
| 3.8 CORDIC The CORDIC provides hardware acceleration of certain mathematical functions, notably trigonometric, commonly used in motor control, metering, signal processing and many other applications. It speeds up the calculation of these functions compared to a software implementation, allowing a lower operating frequency, or freeing up processor cycles in order to perform other tasks. Cordic features • 24-bit CORDIC rotation engine • Circular and Hyperbolic modes • Rotation and Vectoring modes • Functions: Sine, Cosine, Sinh, Cosh, Atan, Atan2, Atanh, Modulus, Square root, Natural logarithm • Programmable precision up to 20-bit • Fast convergence: 4 bits per clock cycle • Supports 16-bit and 32-bit fixed point input and output formats • Low latency AHB slave interface • Results can be read as soon as ready without polling or interrupt • DMA read and write channels |
| 3.9 Filter mathematical accelerator (FMAC) The filter mathematical accelerator unit performs arithmetic operations on vectors. It comprises a multiplier/accumulator (MAC) unit, together with address generation logic, which allows it to index vector elements held in local memory. The unit includes support for circular buffers on input and output, which allows digital filters to be implemented. Both finite and infinite impulse response filters can be realized. The unit allows frequent or lengthy filtering operations to be offloaded from the CPU, freeing up the processor for other tasks. In many cases it can accelerate such calculations compared to a software implementation, resulting in a speed-up of time critical tasks. FMAC features • 16 x 16-bit multiplier • 24+2-bit accumulator with addition and subtraction • 16-bit input and output data • 256 x 16-bit local memory • Up to three areas can be defined in memory for data buffers (two input, one output), defined by programmable base address pointers and associated size registers • Input and output sample buffers can be circular • Buffer “watermark” feature reduces overhead in interrupt mode • Filter functions: FIR, IIR (direct form 1) • AHB slave interface • DMA read and write data channels |
[링크 : https://www.st.com/resource/en/datasheet/stm32g473cb.pdf]
함수 3회 호출할 만큼 부하를 상쇄할 만큼 하드웨어 계산이 빠른거겠지?
| 1. Configure the CORDIC: LL_CORDIC_Config( CORDIC, LL_CORDIC_FUNCTION_COSINE, /* cosine function */ LL_CORDIC_PRECISION_6CYCLES, /* max precision for q1.31 cosine */ LL_CORDIC_SCALE_0, /* no scale */ LL_CORDIC_NBWRITE_1, /* One input data: angle. Second input data (modulus) is 1 af ter cordic reset */ LL_CORDIC_NBREAD_2, /* Two output data: cosine, then sine */ LL_CORDIC_INSIZE_32BITS, /* q1.31 format for input data */ LL_CORDIC_OUTSIZE_32BITS ); /* q1.31 format for output data */ If only this configuration is used, this step is done once at initialization. Otherwise, it must be repeated each time one of the above parameters changes. 2. Write the input argument(s): /* Write angle */ LL_CORDIC_WriteData(CORDIC, ANGLE_CORDIC); In this case, there is only one argument, the angle (defined as a constant value π/8). The other argument is the default modulus of 1, so does not need to be written. As soon as the expected number of arguments is written, the calculation starts. 3. Read the result(s): /* Read cosine */ cosOutput = (int32_t)LL_CORDIC_ReadData(CORDIC); /* Read sine */ sinOutput = (int32_t)LL_CORDIC_ReadData(CORDIC); |
| FMAC configuration The FMAC can be configured using the HAL driver from the STM32CubeG4 MCU Package. Before accessing any FMAC registers, the FMAC clock must be enabled: __HAL_RCC_FMAC_CLK_ENABLE(); An area of system memory must be reserved for the coefficients: /* Declare an array to hold the filter coefficients */ static int16_t aFilterCoeffB[51]; We must also declare a structure to contain the FMAC parameters: FMAC_HandleTypeDef hfmac; Now we can configure the FMAC using the HAL_FMAC_FilterConfig() function: FMAC_FilterConfigTypeDef sFmacConfig; /* declare a filter configuration structure */ sFmacConfig.CoeffBaseAddress = 0; /* Set the coefficient buffer base address */ sFmacConfig.CoeffBufferSize = 51; /* Set the coefficient buffer size to the number of coeffs */ sFmacConfig.InputBaseAddress = 51; /* Set the Input buffer base address to the next free address */ sFmacConfig.InputBufferSize = 100; /* Set the input buffer size greater than the number of coeffs */ sFmacConfig.InputThreshold = 0; /* Set the input watermark to zero since we are using DMA */ sFmacConfig.OutputBaseAddress = 151; /* Set the Output buffer base address to the next free address */ sFmacConfig.OutputBufferSize = 100; /* Set the output buffer size */ sFmacConfig.OutputThreshold = 0; /* Set the output watermark to zero since we are using DMA */ /* No A coefficients since FIR */ sFmacConfig.pCoeffA = NULL; sFmacConfig.CoeffASize = 0; sFmacConfig.pCoeffB = aFilterCoeffB; /* Pointer to the coefficients in memory */ sFmacConfig.CoeffBSize = 51; /* Number of coefficients */ sFmacConfig.Filter = FMAC_FUNC_CONVO_FIR; /* Select FIR filter function */ sFmacConfig.InputAccess = FMAC_BUFFER_ACCESS_DMA; /* Enable DMA input transfer */ sFmacConfig.OutputAccess = FMAC_BUFFER_ACCESS_DMA; /* Enable DMA output transfer */ sFmacConfig.Clip = FMAC_CLIP_ENABLED; /* Enable clipping of the output at 0x7FFF and 0x8000 */ sFmacConfig.P = 51; /* P parameter contains number of coefficients */ sFmacConfig.Q = FILTER_PARAM_Q_NOT_USED; /* Q parameter is not used */ sFmacConfig.R = 0; /* R parameter contains the post-shift value (none) */ if (HAL_FMAC_FilterConfig(&hfmac, &sFmacConfig) != HAL_OK) /* Configure the FMAC */ Error_Handler(); /* Configuration Error */ The HAL_FMAC_FilterConfig() function programs the configuration and control registers, and loads the coefficients into the FMAC local memory (X2 buffer). |
'embeded > Cortex-M4 STM' 카테고리의 다른 글
| STM32CubeProgrammer / uart / parity (0) | 2025.11.28 |
|---|---|
| stm32flash 0.5 0.7 버전과 stm32g473 (0) | 2025.11.28 |
| stm32g473 ADC calibration (0) | 2025.11.28 |
| stm32f411 black fill board (0) | 2025.11.22 |
| stm32g473 adc (0) | 2025.11.03 |
