реклама на сайте
подробности

 
 
> STM32L151 TIM и DMA, Правильно ли я понимаю их взаимосвязи ?
MiklPolikov
сообщение Jun 25 2012, 07:13
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Правитльно ли я понимаю взаимосвязи периферийных устройств ?

Мне нужно читать содержимое приёмного регистра SPI2 с частотой 8КГц.
(в сам SPI данные приходят с частотой 40КГц из аудиокодека, в файл нужно писать с частотой 8 или 16, всё лишнее просто теряя) .
Для этого я хочу генерировать запрос ДМА с частотой 8КГц. Таймеры TIM9 10 11 , которые у меня тактируются от генератора LSE 32768
запрос ДМА генерировать не могут. А все остальные таймеры , которые его генерировать могут, не могут тактироватся от LSE, а могут только от системной частоты. Системная частота у меня всё время неняется. И таким образом я оказываюсь в некотором тупике.

Всё верно ? Ничего не упустил ?


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 1)
MiklPolikov
сообщение Jun 27 2012, 14:21
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Разобрался .

TIM9 тактируется от LSE 32КГц , выдаёт событие TRGO и PWM на TIM9_CH1 с частотой 16КГц.
К выходу TIM9_CH1 подключен TIM4 , который создаёт запросы DMA с частотой 16КГц.

Кому надо вот код.

CODE
///////////////////////////Настраиваем и запускаем TIM9 на генерацию события TRGO и такой же частоты на выходе TIM9_CH1 ////////////////
void TIM9_START(void)
{
RCC->APB2ENR|=RCC_APB2ENR_TIM9EN; //включили тактирование TIM9
RCC->APB2LPENR|=RCC_APB2LPENR_TIM9LPEN;

RCC->APB2RSTR|=RCC_APB2RSTR_TIM9RST; //сброс настроек TIM9
RCC->APB2RSTR&=~RCC_APB2RSTR_TIM9RST;

TIM9->CR1|=TIM_CR1_URS; //только переполнение генерирует прерывание
TIM9->CR2|=TIM_CR2_MMS_1;//выбрали событие Update в качестве триггера TRGO
TIM9->SMCR|=TIM_SMCR_TS_0; // выбрали TI1 , к которому подключен LSE
TIM9->SMCR|=TIM_SMCR_ECE; //разрешили внешнее тактирование
TIM9->OR|=TIM_OR_TI1RMP_0; //выбрали LSE

TIM9->CCMR1|=TIM_CCMR1_OC1M_0|TIM_CCMR1_OC1M_1|TIM_CCMR1_OC1M_2; //PWM на TIM9_CH1


TIM9->ARR=1; // 16КГц //до этого значения производится счёт
TIM9->CCR1=1; //для PWM на TIM9_CH1
}
TIM9->CR1|=TIM_CR1_CEN; //включили таймер
}


/////////////////////////////////настраиваем и запускаем TIM4 для генерации запроса ДМА TIM4_CH2 ////////////////////////////////////////////
void TIM4_START(void)
{
RCC->APB1ENR|=RCC_APB1ENR_TIM4EN;
RCC->APB1LPENR|=RCC_APB1LPENR_TIM4LPEN; //включили тактирование TIM4


RCC->APB1RSTR|=RCC_APB1RSTR_TIM4RST;
RCC->APB1RSTR&=~RCC_APB1RSTR_TIM4RST; //сбросили настройки TIM4

TIM4->SMCR|=TIM_SMCR_TS_0;
TIM4->SMCR|=TIM_SMCR_TS_1; //выбор TIM9
TIM4->SMCR|=TIM_SMCR_SMS_2; //каждый клок триггера сбрасывает таймер

TIM4->CR2|=TIM_CR2_CCDS;//запрос ДМА при переполнении

TIM4->SMCR|=TIM_SMCR_ECE; //External clock mode 2 enabled. The counter is clocked by any active edge on the ETRF signal.

TIM4->DIER|=TIM_DIER_CC2DE; //разрешаем запрос DMA по СС2

TIM4->CR1|=TIM_CR1_CEN;// включили таймер

}


Сообщение отредактировал IgorKossak - Jun 28 2012, 19:13
Причина редактирования: [codebox] для длинного кода!!!


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 09:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01371 секунд с 7
ELECTRONIX ©2004-2016