Quantcast
Channel: Комментарии: STM32Cube. Таймер и прерывания.
Viewing all 63 articles
Browse latest View live

Автор: Алексей

$
0
0

И еще, прескаллер 16000-1 для повышения точности.


Автор: Андрей

$
0
0

Подскажите, break interrupt — это прерывания чем вызываются.

Автор: Никита

$
0
0

Здравствуйте. Подскажите пожалуйста. Вот строка HAL_TIM_Base_Start_IT(&htim3); запускает таймер? То есть таймер начинает считать только после этой строки. Правильно ли я понял?
И в связи с этим вопрос: а при настройке таймера в режим аппаратного ШИМ эта строка так же необходима?

Автор: Aveal

$
0
0

Да, иначе таймер просто выключен будет

Автор: Андрей

$
0
0

Друзья, недавно в stm. Сразу начал осваивать hal. Требуется помощь.
Подскажите, пожалуйста, как правильно обрабатывать прерывания DMA? Я настроил прерывания от DMA. Настроил таймеры. Обработчик находится в _it.c. я так понимаю.
У меня алгоритм следующий. 1) Таймер по захвату передает данные посредством DMA. DMA по окончанию приема должно выработать прерывание. Но так как перывания от DMA объединены, нам надо убедиться, что это «прерывание по завершению» прочитав соответствующий флаг.
Верная ли последовательность?
Как это сделать (прочитать флаг)?
Нужно ли потом очищать флаги?
2) Нужно определить по спаду или нарастанию на таймере-счетчике произошел запрос от DMA.
Как прочитать регистр флагов прерывания?
3) подскажите как пользоваться библиотекой, иногда получается (с выводами, с USART, а иногда нет).
Вот например очистка флагов DMA. В dma.h есть такой define:

#define __HAL_DMA_CLEAR_FLAG(__HANDLE__, __FLAG__) \
(((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA2_Stream3)? (DMA2->HIFCR = (__FLAG__)) :\
((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream7)? (DMA2->LIFCR = (__FLAG__)) :\
((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream3)? (DMA1->HIFCR = (__FLAG__)) : (DMA1->LIFCR = (__FLAG__)))

#define __HAL_DMA_GET_FLAG(__HANDLE__, __FLAG__)\
(((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA2_Stream3)? (DMA2->HISR & (__FLAG__)) :\
((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream7)? (DMA2->LISR & (__FLAG__)) :\
((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream3)? (DMA1->HISR & (__FLAG__)) : (DMA1->LISR & (__FLAG__)))

Как им воспользоваться, как с помощью него считывать?

Автор: Андрей

$
0
0

И еще один вопрос. После создания проекта в Cube в keil у меня на некоторых строках в файлах .h следующая надпись unknow type name uint32_t , в частности напротив этой строки #include «stm32f4xx_hal_def.h» . Это ненормально же? Как это исправить можно?

Автор: Aveal

Автор: Андрей

$
0
0

Keil5. Сразу после генерации проекта в Cube, еще ничего не пишу, просто проект собираю и в .h файлах такая штука появляется


Автор: Александр

$
0
0

TIM1 расширенный режим. Генерация комплементарных сигналов PWM с deadtime.
Запуск HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
Вопрос: сигнал генерится только на одном выходе TIM1_CH1N (PA7), на другом выходе TIM1_CH1 (PA8) фиксированный уровень. В чем может быть проблема?

Автор: Викор

$
0
0

Если ВЫ уж используете HAL, то советую не в прерывании писать а использовать Callback, например HAL_TIM_PeriodElapsedCallback(прерывание по периоду).

Автор: Lexa

$
0
0

Здравствуйте.
Подскажите пожалуйста как пользоваться Callback-ми для обработки данных? Вот допустим получил данные по SPI, мне необходимо обработать их. Если не писать обработку в обработчике прерываний, то как это сделать с помощью callback?

Автор: Aveal

$
0
0

Просто пиши свой код в callback-функции вместо прерывания

Автор: Алексей

$
0
0

Здравствуйте.
Столкнулся с проблемой разного времени выхода на вектор прерывания. В cube установил высокий приоритет HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); у всех остальных HAL_NVIC_SetPriority(x, 0, 1);
Вот код void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
counter_time ++;
switch (counter_time)
{
case 1:
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET);
break;

case 2: HAL_GPIO_WritePin(GPIOE, GPIO_PIN_2, GPIO_PIN_SET); flag_1 = 1; break;

case 3: HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET); break;

case 4: HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET); counter_time =0;break;

}
}
Смотрел осциллографом pin stm32f429. Все болтается такое ощущение что что-то выполняет какие то операции и не дает сразу перейти на вектор но что не понятно. Подскажите что делать

Автор: Ефим

$
0
0

Здравствуйте!
Я начинающий, поэтому не судите строго, но данное занятие я проделать не смог.
Не объясняется что , как и почему, почему именно эти значения в инфекциях и откуда взяли. Также куда вставили последний кусок
В общем приходится додумывать самому

Автор: Ефим

$
0
0

в общем разобрался откуда ноги растут
https://www.youtube.com/watch?v=GrF0Kto5c48
вот не плохое видео. которое хорошо дополняет этот урок
сам все делаю в воркбенхе код после куба автоматом разбит на файлы
править нужно майн и stm32f1xx_it.c
единственное пока не понял у меня 103 контроллер от кварца на 72 мегагерца. таймер 2 на 1APB частота 36М делил на 36к и потом умножал на 499 получалось 2 секунды. пока с определением времени вопрос открытый


Автор: Aveal

$
0
0

Добрый день!

На самом деле вот в этом абзаце полностью объясняется откуда берутся два числа, которые используются в примере:
«Выбираем делитель частоты равным 16000. В итоге получаем (16 МГц / 16000) = 1000 Гц. То есть один тик таймера будет соответствовать 1 мс. Установив период 499 (это значение в Cube надо ставить на единицу меньше, чем целевое значение, аналогично и значение делителя) получим прерывания по переполнению таймера каждые 500 мс — то, что нам и надо.»

Ну а последний кусок — это же прерывание, из названия функции это видно…

По поводу частоты — видимо тактирование неверно настроено

Автор: Ефим

$
0
0

Ув. Aveal насчет частот все понятно.
вы не указали что надо поставить галочку NVIC Setting ну отсюда и естественно куда вкладывать код моргания диода (без галочки он не генерируется), так же нет объяснения откуда взялся параметр (&htim3) — по логике вещей понятно, но на видео по ссылке, что вкладывал автор все показывает и становится понятно, т.к. хотелось, что бы инструкция была относительно универсальна. (т.е. к разным МК и таймерам)
для своего Мк выставил все верно — таймер2 частота 36МГЦ (по кубу и это максимальная по даташиту) при делении на 36к и умножении на 499 почему то получилось 2сек, в итоге сделал умножение на 249 и вроде стала 1сек., но почему не понял

Автор: Voha

$
0
0

Добрый день Aveal. Спасибо за такие классные материалы по HAL, всё очень просто и понятно.

Есть у меня небольшой вопрос. Подразумевает ли Cube возможность изменение периода таймера во время работы контроллера? Я хочу изменять период таймера на работающем контроллере, без перепрошивки.

Я предполагаю нужно в этой строке «htim3.Init.Period = 499» вместо числового значения поставить переменную «htim3.Init.Period = a», а потом перезапускать таймер после изменения значения этой переменной. Но боюсь Cube сотрёт эту переменную, т.к. она будет находится вне блока User Code.

Может есть ещё способы?
А может ткнёте носом в мануал\ссылку, где это всё расписано 🙂

Автор: Aveal

$
0
0

Можно просто в регистр таймера напрямую писать значения — регистр TIMx->ARR, насколько я помню.

Автор: Василий Теркин

$
0
0

(c)»вы не указали что надо поставить галочку NVIC Setting»
А я два часа голову себе ломал — что я не так делаю. Досадная неточность автора. Спасибо Ефим.

Viewing all 63 articles
Browse latest View live