CMSIS DSP返回硬故障(Cortex M0)

时间:2018-11-27 09:09:42

标签: arm fft microcontroller nxp-microcontroller cmsis

我正在尝试调试此代码,并在调用fft方法时确定导致严重错误的原因。该程序正在通过中断从ADC读取数据,并且每128个周期就会计算前一组周期的FFT。

我已指出引起故障的线路。谁能识别我在做什么错?

uint16_t dataADC[64];
uint16_t dataFFT[128];
uint16_t magFFT[64];
uint16_t count = 127;

arm_rfft_instance_q15 RealFFT_Instance;
arm_cfft_radix4_instance_q15 MyComplexFFT_Instance;


void ADC_IRQHandler(void){
    /* Read ADC value */
    Chip_ADC_ReadValue(LPC_ADC, ADC_CH0, &dataADC[count]);

    count--;

    if (count == 0){
        NVIC_DisableIRQ(ADC_IRQn);
    }

    Chip_ADC_SetStartMode(LPC_ADC, ADC_START_NOW, ADC_TRIGGERMODE_RISING);
}

/**
 * @brief   main routine for ADC example
 * @return  Function should not exit
 */
int main(void){
    SystemCoreClockUpdate();
    Board_Init();
    Init_ADC_PinMux();
    DEBUGSTR("ADC Demo\r\n");

    //Init FFT
    arm_rfft_init_q15(&RealFFT_Instance, &MyComplexFFT_Instance, 64,0,1);

    /* ADC Init */
    Chip_ADC_Init(LPC_ADC, &ADCSetup);
    Chip_ADC_EnableChannel(LPC_ADC, ADC_CH0, ENABLE);

    /* Enable ADC interrupt*/
    NVIC_ClearPendingIRQ(ADC_IRQn);
    NVIC_EnableIRQ(ADC_IRQn);

    HAID_ADC->INTEN |= 0x0011;

    /* Start A/D conversion */
    Chip_ADC_SetStartMode(LPC_ADC, ADC_START_NOW, ADC_TRIGGERMODE_RISING);

    while (1) {
        if(count == 0){
                NVIC_DisableIRQ(ADC_IRQn);
                arm_rfft_q15(&RealFFT_Instance, (q15_t *)dataADC, (q15_t *)dataFFT); //Causing Hard Fault!
                for(int i = 0; i < 128; i++){
                    dataFFT[i] <<= 8; //scaling
                }
                arm_cmplx_mag_q15((q15_t *)dataFFT, (q15_t *)magFFT, 64);
                count = 63;
                NVIC_EnableIRQ(ADC_IRQn);
        }
        __WFI();
    }
    return 0;
}

#endif

0 个答案:

没有答案