Создаем простой проект с использованием DSP библиотеки в CodeWarrior.

1. Запускаем CodeWarrior
2. Создаем новый проект, для этого необходимо:
нажать File -> New -> Bareboard Project.
Даем нашему проекту имя dsp, выбираем используемый контроллер: Kinetis -> K60 Family -> MK60N512MD100
Выбираем способ подключения платы: P&E Open Sourse JTAG
Выбираем средство, упрощающее инициализацию переферии и ее использование: Device Initialization, жмем Next -> Finish

3. Пустой проект готов, можем перейти непосредственно к библиотеке DSP.

Для ее использования нужно присоединить следующие файлы:
— core_cm4.h
-core_cm4_simd.h
-arm_math.h
Для этого в Project Panel делаем правый клик по папке Sources и в выпадающем меню нажимаем Add Files



Идем в то место, куда мы скачали библиотеку CMSIS, открываем папки CMSIS\CM4\CoreSupport и выбираем core_cm4.h и core_cm4_simd.h выбираем Copy Files And Directories и жмем OK.
Файл arm_math.h можно найти в папке CMSIS\DSP_Lib\include
Открываем этот файл и в самом его начале меняем
#define _ARM_MATH_H на
#define ARM_MATH_CM4 – этим самым мы определяем ядро нашего микроконтроллера и дописываем:

#define __INLINE __attribute__((always_inline)) inline


Включаем файлы CMSIS\CM4\DeviceSupport\ARM\ARMCM4\ARMCM4.h
CMSIS\CM4\CoreSupport\core_cmFunc.h и core_cmInstr.h
Далее выбираем функции, которые понадобятся в нашем проекте.
Это будут синус, косинус, векторные сложение и умножение.
Для их использования присоединяем следующие файлы:
arm_sin_f32.c
arm_cos_f32.c
arm_mult_f32.c
arm_add_f32.c
Они находятся в папках CMSIS\DSP_Lib\Source\Cortex-M4-M3\FastMathFunctions и CMSIS\DSP_Lib\Source\Cortex-M4-M3\BasicMathFunctions
Полный список функций и их описание можно найти в документации на библиотеку, для этого необходимо открыть файл CMSIS\Documentation\DSP_Lib\html\index.html

. С этого момента можем пользоваться функциями.
Создадим новый .c файл: правый клик по папке Sources в ProjectPanel, назовем его DSP_function.c
И скопируем туда пример из документации на библиотеку.
Этот пример проверяет одно из основных тригонометрических тождеств:
Берет число со входа, складывает квадраты его косинуса и синуса и сравнивает результат с единицей. Если результат будет отличаться больше чем на число DELTA, функция выдаст ошибку и войдет в бесконечный цикл.
#include <math.h>    
#include "arm_math.h
"
 
/* ----------------------------------------------------------------------
* Defines each of the tests performed
* ------------------------------------------------------------------- */
#define MAX_BLOCKSIZE   32
#define DELTA           (0.000001f)
 
 
/* ----------------------------------------------------------------------
* Test input data for Floating point sin_cos example for 32-blockSize
* Generated by the MATLAB randn() function
* ------------------------------------------------------------------- */
 
const float32_t testInput_f32[MAX_BLOCKSIZE] = 
{   
    -1.244916875853235400,  -4.793533929171324800,  0.360705030233248850,   0.827929644170887320,   -3.299532218312426900,  3.427441903227623800,   3.422401784294607700,   -0.108308165334010680,  
    0.941943896490312180,   0.502609575000365850,   -0.537345278736373500,  2.088817392965764500,   -1.693168684143455700,  6.283185307179590700,   -0.392545884746175080,  0.327893095115825040,   
    3.070147440456292300,   0.170611405884662230,   -0.275275082396073010,  -2.395492805446796300,  0.847311163536506600,   -3.845517018083148800,  2.055818378415868300,   4.672594161978930800,   
    -1.990923030266425800,  2.469305197656249500,   3.609002606064021000,   -4.586736582331667500,  -4.147080139136136300,  1.643756718868359500,   -1.150866392366494800,  1.985805026477433800
 
 
}; 
 
const float32_t testRefOutput_f32 = 1.000000000;
 
/* ----------------------------------------------------------------------
* Declare Global variables 
* ------------------------------------------------------------------- */
uint32_t blockSize = 32;
float32_t  testOutput; 
float32_t  cosOutput; 
float32_t  sinOutput; 
float32_t  cosSquareOutput; 
float32_t  sinSquareOutput;
 
/* ----------------------------------------------------------------------
* Max magnitude FFT Bin test
* ------------------------------------------------------------------- */
 
int32_t sincos(void)
{
    arm_status status;
    float32_t diff;
    uint32_t i;
 
    for(i=0; i< blockSize; i++)
    {
        cosOutput = arm_cos_f32(testInput_f32[i]);
        sinOutput = arm_sin_f32(testInput_f32[i]);
 
        arm_mult_f32(&cosOutput, &cosOutput, &cosSquareOutput, 1);
        arm_mult_f32(&sinOutput, &sinOutput, &sinSquareOutput, 1);
 
        arm_add_f32(&cosSquareOutput, &sinSquareOutput, &testOutput, 1);
 
        /* absolute value of difference between ref and test */
        diff = fabsf(testRefOutput_f32 - testOutput);
    
        /* Comparison of sin_cos value with reference */
        if(diff > DELTA)
        {
           status = ARM_MATH_TEST_FAILURE;
        }
        
        if( status == ARM_MATH_TEST_FAILURE)
        {
           while(1);
        }
 
    }
}


5. Теперь в main можем вызвать функцию sincos();
6. Скомпилируем и загрузим проект в память контроллера. Это можно сделать, воспользовавшись сочетаниями быстрых клавиш Ctrl+B и Ctrl+F11.

В приложении архив с примером.
  • +2
  • 16 сентября 2011, 16:52
  • usasha
  • 1
Файлы в топике: dsp.zip

Комментарии (15)

RSS свернуть / развернуть
Всем хороша статья. Только похожа на рекламу продукта, который к тому же и не бесплатен.
-1
Это представитель техслужбы freescale
0
если нравится статья — хорошо, насчет рекламы — ну да, я лицо заинтересованное и этого не скрываю,
однако здесь я для того, чтобы писать примеры работы с фрискейловскими контроллерами, чтобы кому-то было проще с ними работать, а не для «покупайте выбирайте»

кстати, КодоВоин бесплатен до 128Кб, в сравнении со стандартными 32, если этого станет мало — гугл по ключевым словам «keys codewarrior» и вперед :)
0
const float32_t testRefOutput_f32 = 1.000000000;
А зачем столько нулей?
0
  • avatar
  • Vga
  • 17 сентября 2011, 04:23
да в общем то незачем :)

это пример от арм, это творчество фаешников из арм
0
Вы не могли бы выложить тот документ, где перечисленны доступные функции? Скриншот есть, но там мелоко, не разберу. А качать на работе не хочется. Спасибо
0
Basic Math Functions
Vector Absolute Value
Vector Addition
Vector Dot Product
Vector Multiplication
Vector Negate
Vector Offset
Vector Scale
Vector Shift
Vector Subtraction
Fast Math Functions
Cosine
Sine
Square Root
Complex Math Functions
Complex Conjugate
Complex Dot Product
Complex Magnitude
Complex Magnitude Squared
Complex-by-Complex Multiplication
Complex-by-Real Multiplication
Filtering Functions
Biquad Cascade IIR Filters Using Direct Form I Structure
Biquad Cascade IIR Filters Using a Direct Form II Transposed Structure
High Precision Q31 Biquad Cascade Filter
Convolution
Partial Convolution
Correlation
Finite Impulse Response (FIR) Decimator
Finite Impulse Response (FIR) Filters
Finite Impulse Response (FIR) Lattice Filters
Finite Impulse Response (FIR) Sparse Filters
Infinite Impulse Response (IIR) Lattice Filters
Least Mean Square (LMS) Filters
Normalized LMS Filters
Finite Impulse Response (FIR) Interpolator
Matrix Functions
Matrix Addition
Matrix Initialization
Matrix Inverse
Matrix Multiplication
Matrix Scale
Matrix Subtraction
Matrix Transpose
Transform Functions
Complex FFT Functions
DCT Type IV Functions
Real FFT Functions
Controller Functions
Sine Cosine
PID Motor Control
Vector Clarke Transform
Vector Inverse Clarke Transform
Vector Park Transform
Vector Inverse Park transform
Statistics Functions
Maximum
Mean
Minimum
Power
Root mean square (RMS)
Standard deviation
Variance
Support Functions
Convert 16-bit Integer value
Convert 32-bit Integer value
Convert 32-bit floating point value
Convert 8-bit Integer value
Vector Copy
Vector Fill
Interpolation Functions
Linear Interpolation
Bilinear Interpolation
Examples
Class Marks Example
Convolution Example
Dot Product Example
FIR Lowpass Filter Example
Frequency Bin Example
Graphic Audio Equalizer Example
Linear Interpolate Example
Matrix Example
Signal Convergence Example
SineCosine Example
Variance Example

качните из дома библиотеку, там много описаний по функциям в хелпе
0
Спасибо!
0
Полазил немного по сайту и не понял, как можно скачать библиотеку отдельно. Вы можете подсказать где искать?
0
Благодарю. В итоге там же нашел CMSIS 2.1 (). Как я понял, она годится и для Cortex-M3, в то время как CMSIS 2.0 только для M4. У меня как раз STM32F103, т.е. M3. Попробую.
0
можете скачать любую(2.0 или 2.1) — во второй добавилась поддержка М0 и М4 без плавающей точки
0
А на чем основана эта IDE? Eclipse или своя разработка?
0
  • avatar
  • Vga
  • 19 сентября 2011, 11:15
Все верно — Eclipse
0
ну да, я лицо заинтересованное и этого не скрываю
Я в шоке. Был бы трезвый, ей богу не догадался бы.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.