📄 measure_main.c
字号:
/********************************************************************
* Project: Tasking-STM32-Stick
* File: meassure_main.c
*
* System: Cortex ARMv7 32 Bit (STM32FRT)
* Compiler: Tasking Altuim VX Toolchain v2.01
*
* Date: 2007-08-20
* Author: Application@Hitex.de
*
* Rights: Hitex Development Tools GmbH
* Greschbachstr. 12
* D-76229 Karlsruhe
********************************************************************
* Description:
*
* This file is part of the Tasking Example chain
* The code is based on usage of the STmicro library functions
* This is a small implementation of different features
* The application runs in ARM mode with high optimization level.
*
********************************************************************
* History:
*
* Revision 1.0 2007/08/20 Gn
* Initial revision
********************************************************************
* This is a preliminary version.
*
* WARRANTY: HITEX warrants that the media on which the SOFTWARE is
* furnished is free from defects in materials and workmanship under
* normal use and service for a period of ninety (90) days. HITEX entire
* liability and your exclusive remedy shall be the replacement of the
* SOFTWARE if the media is defective. This Warranty is void if failure
* of the media resulted from unauthorized modification, accident, abuse,
* or misapplication.
*
* DISCLAIMER: OTHER THAN THE ABOVE WARRANTY, THE SOFTWARE IS FURNISHED
* "AS IS" WITHOUT WARRANTY OF ANY KIND. HITEX DISCLAIMS ALL OTHER WARRANTIES,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* NEITHER HITEX NOR ITS AFFILIATES SHALL BE LIABLE FOR ANY DAMAGES ARISING
* OUT OF THE USE OF OR INABILITY TO USE THE SOFTWARE, INCLUDING DAMAGES FOR
* LOSS OF PROFITS, BUSINESS INTERRUPTION, OR ANY SPECIAL, INCIDENTAL, INDIRECT
* OR CONSEQUENTIAL DAMAGES EVEN IF HITEX HAS BEEN ADVISED OF THE POSSIBILITY
* OF SUCH DAMAGES.
********************************************************************/
#include "system.h"
#include "FFTfunc.h"
#include "measure_main.h"
TaskInfo VU1State;
TaskInfo AmbState;
TaskInfo ScanState;
TaskInfo OversamplingState;
TaskInfo FFTState;
TaskInfo CounterState;
short fr[N_SAMPLE], fi[N_SAMPLE], loud[N_SAMPLE/2];
u16 FFT_Index = 0;
u32 event_counter;
u32 frequency;
u16 freq_time;
u8 tim_set_null;
u8 FFT_Port;
u8 TriggerSource;
bool Counter_Gate;
void START_ADCs (void)
{
/* ADC1 Configuration ------------------------------------------------------*/
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
/* ADC1 Regular Channel14 Configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_55Cycles5);
/* Enable Vrefint channel17 */
ADC_TempSensorVrefintCmd(ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
}
void AmbStop(void)
{
/* Configure PB.00 (ADC Channel8) as input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* reset PB1 for voltage source usage */
GPIO_WriteBit(GPIOB, GPIO_Pin_1, Bit_RESET);
AmbState.enabled = FALSE;
}
void VU1Stop(void)
{
/* Configure PC.00 (ADC Channel10) as input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStructure);
VU1State.enabled = FALSE;
}
/*-----------------------------------------------------------------------------------*/
void VU1Start(void)
{
/* Configure PC.00 (ADC Channel10) as analog input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure);
START_ADCs ();
FFT_Index = 0;
/* Start ADC1 Software Conversion */
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
VU1State.enabled = TRUE;
}
void AmbStart(void)
{
/* Configure PB.00 (ADC Channel8) as analog input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* reset PB1 for voltage source usage */
GPIO_WriteBit(GPIOB, GPIO_Pin_1, Bit_RESET);
START_ADCs ();
FFT_Index = 0;
/* Start ADC1 Software Conversion */
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
AmbState.enabled = TRUE;
}
void ScanStart(void)
{
EXTI_DeInit();
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource0);
EXTI_ClearITPendingBit(EXTI_Line0);
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/*Init Timer*/
TIM_DeInit(TIM2);
TIM_InternalClockConfig(TIM2);
TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
TIM_TimeBaseStructure.TIM_Prescaler = 6400; /*Sample rate 1ms*/
TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_SetCounter(TIM2,0);
frequency =0;
tim_set_null = 1;
TIM_Cmd(TIM2, ENABLE);
EXTI_Init(&EXTI_InitStructure);
ScanState.enabled = TRUE;
}
void ScanStop(void)
{
EXTI_DeInit();
TIM_DeInit(TIM2);
ScanState.enabled = FALSE;
}
void CounterStart(void)
{
EXTI_DeInit();
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource0);
EXTI_ClearITPendingBit(EXTI_Line0);
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
event_counter = 0;
CounterState.enabled = TRUE;
Counter_Gate = FALSE;
}
void CounterStop(void)
{
EXTI_DeInit();
CounterState.enabled = FALSE;
}
void OversamplingStart(void)
{
OversamplingState.enabled = TRUE;
}
/*-----------------------------------------------------------------------------------*/
void FFT (void)
{
int i=0;
if (FFTState.enabled)
{
if (FFTState.process_ready == FALSE)
{
wave(fi,0,0,0); // set fi to 0
if(FFT_Port == 3)
{
Norming (fr, 1, 1); // correct to the analog world
}
else
{
Norming (fr, 3, 2); // correct to the analog world
}
window(fr);
fft(fr, fi);
loudness(loud, fr, fi);
FFTState.process_ready = FALSE;
FFTState.enabled = FALSE;
ReEntryProcess = Dummy;
ReEntry.enabled = FALSE;
}
else
{
/* data are on the line */
// if (SendTask->Process == 0)
{
FFTState.enabled = TRUE;
/* TIM1 counter disable */
TIM_Cmd(TIM2, ENABLE);
while (FFT_Index < N_SAMPLE);
FFT_Index = 0;
/* TIM1 counter disable */
TIM_Cmd(TIM2, DISABLE);
FFTState.process_ready = FALSE;
}
}
}
}
void FFTStart(void)
{
/* Configure TIM1_CH1 (PA8) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* TIM1 configuration ------------------------------------------------------*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_DeInit(TIM2);
TIM_TimeBaseStructure.TIM_Period = 400; //0x100 low
if(FFT_Port == 3)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -