Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: DMA+DAC
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
stm32f4
Всем привет)Поскажите, как можно изменить значения массива, который указан в качестве передаваемого в DMA ЦАПу?
т.е имеется массив значений для генерации синуса:
Код
const uint16_t sin_50hz[] =
{ 2048, 2112, 2177, 2241, 2305, 2368, 2432, 2495, 2557, 2619, 2681, 2742, 2802,
        2861, 2920, 2978, 3035, 3091, 3145, 3199, 3252, 3303, 3353, 3402, 3450,
        3496, 3541, 3584, 3626, 3666, 3705, 3742, 3777, 3811, 3843, 3873, 3901,
        3928, 3952, 3975, 3996, 4015, 4032, 4047, 4060, 4071, 4080, 4087, 4092,
        4095, 4095, 4095, 4092, 4087, 4080, 4071, 4060, 4047, 4032, 4015, 3996,
        3975, 3952, 3928, 3901, 3873, 3843, 3811, 3777, 3742, 3705, 3666, 3626,
        3584, 3541, 3496, 3450, 3402, 3353, 3303, 3252, 3199, 3145, 3091, 3035,
        2978, 2920, 2861, 2802, 2742, 2681, 2619, 2557, 2495, 2432, 2368, 2305,
        2241, 2177, 2112, 2048, 1984, 1919, 1855, 1791, 1728, 1664, 1601, 1539,
        1477, 1415, 1354, 1294, 1235, 1176, 1118, 1061, 1005, 951, 897, 844,
        793, 743, 694, 646, 600, 555, 512, 470, 430, 391, 354, 319, 285, 253,
        223, 195, 168, 144, 121, 100, 81, 64, 49, 36, 25, 16, 9, 4, 1, 0, 1, 4,
        9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 168, 195, 223, 253, 285, 319,
        354, 391, 430, 470, 512, 555, 600, 646, 694, 743, 793, 844, 897, 951,
        1005, 1061, 1118, 1176, 1235, 1294, 1354, 1415, 1477, 1539, 1601, 1664,
        1728, 1791, 1855, 1919, 1984 };

с помощью DMA я передаю ЦАПу все значения по прерыванию таймера!!!!!
Код
//***********DMA1***************
    RCC->AHB1ENR    |= RCC_AHB1ENR_DMA1EN;
    DMA1_Stream5->CR|= DMA_SxCR_CHSEL;            // 111: channel 7 selected
    DMA1_Stream5->PAR= (uint32_t)&DAC->DHR12R1; // указатель на переферийное устройство
    DMA1_Stream5->M0AR=(uint32_t)&sin_50hz[0];//адрес буфера
    DMA1_Stream5->NDTR=200;                        // кол-во передаваемых данных
    DMA1_Stream5->CR|= DMA_SxCR_MINC;            // инкремент указателя буфера
    DMA1_Stream5->CR|= DMA_SxCR_MSIZE_0;        // размер элемента в памяти 16 бит
    DMA1_Stream5->CR|= DMA_SxCR_PSIZE_0;        // размер элемента в переферии 16 бит
    DMA1_Stream5->CR|= DMA_SxCR_CIRC;            // цикличная передача данных
    DMA1_Stream5->CR|= DMA_SxCR_DIR_0;            // 01: Memory-to-peripheral
    DMA1_Stream5->CR|= DMA_SxCR_PL;                // 11: Very high
    DMA1_Stream5->CR|= DMA_SxCR_EN;                // включение ПДП


так вот,повторюсь) как в процессе передачи данных добавить делитель!!!!!!!!!!! к примеру по нажатию кнопки урезать(увеличить) размах!!!!!!т.е сделать что-то типа этого: DMA1_Stream5->M0AR=((uint32_t)&sin_50hz[0])/2-делить каждый элемент буферана опр знач!
AHTOXA
Разместите sin_50hz[] в ОЗУ, и меняйте как угодно.
stm32f4
Цитата(AHTOXA @ Oct 2 2012, 13:52) *
Разместите sin_50hz[] в ОЗУ, и меняйте как угодно.

А можно поподробней?, пожалуйста!
haker_fox
QUOTE (stm32f4 @ Oct 2 2012, 19:45) *
А можно поподробней?, пожалуйста!

Уберите слово const в объявлении массива) Согласно этому объект (Вам массив) будет размещен в ОЗУ.

Т.к. в DMA Вы передаете только стартовый адрес массива, то менять Вам придется весь массив (делить или домножать на некое число). DMA же в ходе передачи не сможет делать выборку каждого значения и модифицировать его.

Следовательно, перед передачей придется менять все значения Вашего массива. Для того, чтобы их можно было менять, они и должны лежать в ОЗУ.

Примерно так
CODE
arrayModifyFunc( uint16_t mul_val )
{
    for( uint16_t i = 0; i < sizeof( sin_50hz ) / sizeof( uint16_t ); i++ )
        sin_50hz[ i ] *= mul_val;
}
_pv
Цитата(haker_fox @ Oct 2 2012, 17:55) *
Примерно так
Код
arrayModifyFunc( uint16_t mul_val ){
  for( uint16_t i = 0; i < sizeof( sin_50hz ) / sizeof( uint16_t ); i++ ) sin_50hz[ i ] *= mul_val;
}

только лучше всё-таки делать копию исходного массива умножая на нужное число, а то после некоторого количества регулировок туда-сюда из-за ошибок округления синус может превратиться в совсем не синус.
AHTOXA
Конечно копию. А если нужно совсем аккуратно, то две копии. Пока одна работает, меняем другую, и уже потом переключаем DMA на неё.
stm32f4
Цитата(haker_fox @ Oct 2 2012, 15:55) *
Уберите слово const в объявлении массива) Согласно этому объект (Вам массив) будет размещен в ОЗУ.

Т.к. в DMA Вы передаете только стартовый адрес массива, то менять Вам придется весь массив (делить или домножать на некое число). DMA же в ходе передачи не сможет делать выборку каждого значения и модифицировать его.

Следовательно, перед передачей придется менять все значения Вашего массива. Для того, чтобы их можно было менять, они и должны лежать в ОЗУ.

Примерно так
Код
arrayModifyFunc( uint16_t mul_val )
{
    for( uint16_t i = 0; i < sizeof( sin_50hz ) / sizeof( uint16_t ); i++ )
        sin_50hz[ i ] *= mul_val;
}

Ух ты, то что надо)спасибо!
_Pasha
Синус, который меняет амплитуду в переходе через ноль - это правильно!
haker_fox
QUOTE (_pv @ Oct 2 2012, 21:41) *
только лучше всё-таки делать копию исходного массива умножая на нужное число, а то после некоторого количества регулировок туда-сюда из-за ошибок округления синус может превратиться в совсем не синус.

Ну да, я лишь скелет набросал. Да и с делением автору придется подумать. Я лишь только умножение сделал)

А может имеет смысл все во float перегнать. Какая разница для ARM? rolleyes.gif Тогда по бубену, множитель ли, делитель ли, все одно wink.gif
_Pasha
Цитата(haker_fox @ Oct 3 2012, 03:25) *
А может имеет смысл все во float перегнать. Какая разница для ARM?

Танунах. Как будто процу больше заниматься нечем. И при этом ошибки округления все равно будут накапливаться.
YAM
А что, уже не кошерно на выход DAC поставить цифровой резюк и делать что хочешь уже на выходе? (все равно там ну хоть какой буфер надо ставить) rolleyes.gif
Вы же должны сами понимать, что при чисто "цифровом делении" уменьшается число квантовний выходного сигнала.
haker_fox
QUOTE (_Pasha @ Oct 3 2012, 13:44) *
Танунах. Как будто процу больше заниматься нечем. И при этом ошибки округления все равно накапливаться.

А фдрух нэчэм? rolleyes.gif Моя же вариант допольнительный предлагать rolleyes.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.