157 lines
4.1 KiB
C
157 lines
4.1 KiB
C
|
/*
|
||
|
******************************************************************************
|
||
|
* @file driver_fft.c
|
||
|
* @author FreqChip Firmware Team
|
||
|
* @version V1.0.0
|
||
|
* @date 2022
|
||
|
* @brief FFT module driver.
|
||
|
* This file provides firmware functions to manage the
|
||
|
* FFT (Fast Fourier Transform) peripheral.
|
||
|
******************************************************************************
|
||
|
* @attention
|
||
|
*
|
||
|
* Copyright (c) 2022 FreqChip.
|
||
|
* All rights reserved.
|
||
|
******************************************************************************
|
||
|
*/
|
||
|
#include "fr30xx.h"
|
||
|
|
||
|
/************************************************************************************
|
||
|
* @fn fft_IRQHandler
|
||
|
*
|
||
|
* @brief fft interrupt handler
|
||
|
*
|
||
|
* @param hfft: FFT_HandleTypeDef.
|
||
|
*/
|
||
|
void fft_IRQHandler(FFT_HandleTypeDef *hfft)
|
||
|
{
|
||
|
int i;
|
||
|
/* clear int status */
|
||
|
__FFT_INT_STATUS_CLEAR();
|
||
|
|
||
|
/* Data OUT */
|
||
|
for (i = 0; i < hfft->BlockSize; i++)
|
||
|
hfft->DataOut[hfft->DataOutIndex++] = FFT->FFT_ACCESSRAM;
|
||
|
|
||
|
if (hfft->BlockCNT)
|
||
|
{
|
||
|
hfft->BlockCNT--;
|
||
|
|
||
|
/* Data IN */
|
||
|
for (i = 0; i < hfft->BlockSize; i++)
|
||
|
FFT->FFT_ACCESSRAM = hfft->DataIn[hfft->DataIndex++];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
__FFT_INT_DISALE();
|
||
|
hfft->FFT_Busy = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/************************************************************************************
|
||
|
* @fn FFT_init
|
||
|
*
|
||
|
* @brief initialize the FFT module.
|
||
|
*
|
||
|
* @param hfft: FFT_HandleTypeDef.
|
||
|
*/
|
||
|
void fft_init(FFT_HandleTypeDef *hfft)
|
||
|
{
|
||
|
/* FFT calculate Mod */
|
||
|
FFT->FFT_CTRL.Bits.MODE_SEL = hfft->FFT_Init.FFT_Cal_Mode;
|
||
|
/* FFT Samples number */
|
||
|
FFT->FFT_CTRL.Bits.NP_SEL = hfft->FFT_Init.FFT_Samples;
|
||
|
|
||
|
/* default DMA enable */
|
||
|
__FFT_DMA_ENABLE();
|
||
|
}
|
||
|
|
||
|
/************************************************************************************
|
||
|
* @fn FFT_start
|
||
|
*
|
||
|
* @brief start fft calculate.
|
||
|
*
|
||
|
* @param hfft: FFT_HandleTypeDef.
|
||
|
* @param fp_Data_In: the pointer of input data.
|
||
|
* @param fp_Data_Out: the pointer of output data.
|
||
|
* @param fu32_BlockCNT: Number of blocks to calculate.
|
||
|
*/
|
||
|
void fft_start(FFT_HandleTypeDef *hfft, uint32_t *fp_Data_In, uint32_t *fp_Data_Out, uint32_t fu32_BlockCNT)
|
||
|
{
|
||
|
int i;
|
||
|
uint32_t BlockSize;
|
||
|
uint32_t DataIndex = 0;
|
||
|
uint32_t DataOutIndex = 0;
|
||
|
|
||
|
/* wait fft calculate idle */
|
||
|
while(!__FFT_IS_IDLE());
|
||
|
|
||
|
switch (hfft->FFT_Init.FFT_Samples)
|
||
|
{
|
||
|
case FFT_128: BlockSize = 128; break;
|
||
|
case FFT_256: BlockSize = 256; break;
|
||
|
case FFT_512: BlockSize = 512; break;
|
||
|
|
||
|
default:break;
|
||
|
}
|
||
|
|
||
|
while(fu32_BlockCNT--)
|
||
|
{
|
||
|
/* Data IN */
|
||
|
for (i = 0; i < BlockSize; i++)
|
||
|
FFT->FFT_ACCESSRAM = fp_Data_In[DataIndex++];
|
||
|
/* Wait calculate done */
|
||
|
while(!__FFT_CAL_IS_DONE());
|
||
|
/* Data OUT */
|
||
|
for (i = 0; i < BlockSize; i++)
|
||
|
fp_Data_Out[DataOutIndex++] = FFT->FFT_ACCESSRAM;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/************************************************************************************
|
||
|
* @fn FFT_start_IT
|
||
|
*
|
||
|
* @brief start fft calculate with isr.
|
||
|
*
|
||
|
* @param hfft: FFT_HandleTypeDef.
|
||
|
* @param fp_Data_In: the pointer of input data.
|
||
|
* @param fp_Data_Out: the pointer of output data.
|
||
|
* @param fu32_BlockCNT: Number of blocks to calculate.
|
||
|
*/
|
||
|
int fft_start_IT(FFT_HandleTypeDef *hfft, uint32_t *fp_Data_In, uint32_t *fp_Data_Out, uint32_t fu32_BlockCNT)
|
||
|
{
|
||
|
int i;
|
||
|
uint32_t BlockSize;
|
||
|
|
||
|
if (hfft->FFT_Busy)
|
||
|
return -1;
|
||
|
|
||
|
/* wait fft calculate idle */
|
||
|
while(!__FFT_IS_IDLE());
|
||
|
|
||
|
switch (hfft->FFT_Init.FFT_Samples)
|
||
|
{
|
||
|
case FFT_128: BlockSize = 128; break;
|
||
|
case FFT_256: BlockSize = 256; break;
|
||
|
case FFT_512: BlockSize = 512; break;
|
||
|
default:break;
|
||
|
}
|
||
|
|
||
|
__FFT_INT_ENALE();
|
||
|
hfft->FFT_Busy = true;
|
||
|
hfft->BlockCNT = fu32_BlockCNT;
|
||
|
hfft->BlockSize = BlockSize;
|
||
|
hfft->DataIndex = 0;
|
||
|
hfft->DataOutIndex = 0;
|
||
|
hfft->DataIn = fp_Data_In;
|
||
|
hfft->DataOut = fp_Data_Out;
|
||
|
|
||
|
hfft->BlockCNT--;
|
||
|
|
||
|
/* Data IN */
|
||
|
for (i = 0; i < hfft->BlockSize; i++)
|
||
|
FFT->FFT_ACCESSRAM = hfft->DataIn[hfft->DataIndex++];
|
||
|
|
||
|
return 0;
|
||
|
}
|