Ср авг 31, 2022 13:32:05
void TIM4_Callback(void)
{
if(LL_TIM_IsActiveFlag_UPDATE(TIM4))
{
// START
GPIOC->BSRR = GPIO_BSRR_BS0;
// START TIMER 7
TIM7->ARR = SetTime7 - 1;
TIM7->SR &= ~ TIM_SR_UIF;
TIM7->CNT = 0;
TIM7->DIER = TIM_DIER_UIE;
LL_TIM_EnableCounter(TIM7);
// START TIMER 3
TIM3->ARR = SeеTime3 - 1;
TIM3->EGR = TIM_EGR_UG;
TIM3 ->SR &= ~ TIM_SR_UIF;
TIM3->CNT = 0;
TIM3->DIER = TIM_DIER_UIE;
LL_TIM_EnableCounter(TIM3);
// START TIMER 5
TIM5->ARR = SetTime5 - 1;
TIM5->EGR = TIM_EGR_UG;
LL_TIM_ClearFlag_UPDATE(TIM5);
TIM5->CNT = 0;
TIM5->DIER = TIM_DIER_UIE;
LL_TIM_EnableCounter(TIM5);
}
else
{
__NOP();
}
LL_TIM_ClearFlag_UPDATE(TIM4);
}
void TIM7_Callback(void)
{
if(LL_TIM_IsActiveFlag_UPDATE(TIM7))
{
switch (StateTim7)
{
case 0:
StateTim7 = 1;
// SET PIN LEVEL HIGH
GPIOC->BSRR = GPIO_BSRR_BS3;
TIM7->ARR = SetPeriod7 - 1;
break;
case 1:
StateTim7 = 0;
// SET PIN LEVEL LOW
GPIOC->BSRR = GPIO_BSRR_BR3;
LL_TIM_DisableCounter(TIM7);
break;
}
}
else
{
__NOP();
}
LL_TIM_ClearFlag_UPDATE(TIM7);
}
void TIM4_Callback(void)
{
if(LL_TIM_IsActiveFlag_UPDATE(TIM4))
{
TIM11->ARR = 4000;
TIM11->CCR1 = 1000;
TIM11->EGR = TIM_EGR_UG;
TIM11->CNT = 0;
TIM11->SR &= ~ TIM_SR_UIF;
TIM11->DIER = TIM_DIER_UIE;
HAL_TIM_Base_Start(&htim11);
HAL_TIM_PWM_Start(&htim11, TIM_CHANNEL_1);
TIM12->ARR = 4000;
TIM12->CCR2 = 1000;
TIM12->EGR = TIM_EGR_UG;
TIM12->CNT = 0;
TIM12->SR &= ~ TIM_SR_UIF;
TIM12->DIER = TIM_DIER_UIE;
HAL_TIM_Base_Start(&htim12);
HAL_TIM_PWM_Start(&htim12, TIM_CHANNEL_2);
}
else
{
__NOP();
}
LL_TIM_ClearFlag_UPDATE(TIM4);
}
TIM11->ARR = 4000;
TIM11->CCR1 = 1000;
TIM11->EGR = TIM_EGR_UG;
TIM11->CNT = 0;
TIM11->SR &= ~ TIM_SR_UIF;
TIM11->DIER = TIM_DIER_UIE;
HAL_TIM_Base_Start(&htim11);
HAL_TIM_PWM_Start(&htim11, TIM_CHANNEL_1);
TIM12->EGR = TIM_EGR_UG;
LL_TIM_EnableIT_CC1(TIM12);
LL_TIM_EnableIT_CC2(TIM12);
LL_TIM_EnableCounter(TIM12);
void TIM12_Callback(void)
{
if(LL_TIM_IsActiveFlag_UPDATE(TIM12))
{
if(LL_TIM_IsActiveFlag_CC1(TIM12))
{
LL_TIM_ClearFlag_CC1(TIM12);
HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_2); // Test
LL_TIM_DisableIT_CC1(TIM12);
}
else if(LL_TIM_IsActiveFlag_CC2(TIM12))
{
LL_TIM_ClearFlag_CC2(TIM12);
HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_2); // Test
LL_TIM_DisableIT_CC2(TIM12);
LL_TIM_DisableCounter(TIM12);
}
else
{
__NOP();
}
}
else
{
__NOP();
}
}
Чт сен 01, 2022 12:42:29
Чт сен 01, 2022 13:03:56
Чт сен 01, 2022 13:10:14
Чт сен 01, 2022 14:17:13
DmitryR писал(а):stm32f746
Чт сен 01, 2022 14:47:08
TIM3->ARR = 2000;
TIM3->CCR2 = Timer3;
TIM3->EGR = TIM_EGR_UG;
TIM5->ARR = 2000;
TIM5->CCR1 = Timer5;
TIM5->EGR = TIM_EGR_UG;
void TIM4_Callback(void)
{
if(LL_TIM_IsActiveFlag_UPDATE(TIM4))
{
TIM3->CNT = 0;
HAL_TIM_Base_Start(&htim3);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
TIM5->CNT = 0;
HAL_TIM_Base_Start(&htim5);
HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_1);
}
else
{
__NOP();
}
LL_TIM_ClearFlag_UPDATE(TIM4);
}
Чт сен 01, 2022 15:16:01
Чт сен 01, 2022 15:31:00
Чт сен 01, 2022 15:40:47
Чт сен 01, 2022 16:36:10
Eddy_Em, много ли у вас проектов на регистрах для STM32F7?Eddy_Em писал(а):Если выкинуть калокуб, задержка будет меньше.
Чт сен 01, 2022 16:43:28
Чт сен 01, 2022 16:44:18
Чт сен 01, 2022 18:08:51
OC1PE: Output Compare 1 preload enable
Бит для управления буферизацией регистра TIMx_CCR1.
0: буферизация регистра TIMx_CCR1 не используется; запись в регистр TIMx_CCR1 может быть произведена в любой момент и новое значение начнёт использоваться немедленно.
1: используется буферизация регистра TIMx_CCR1; операции чтения/записи выполняются с буферным регистром, новое значение из буфера передаётся в активный регистр (который и управляет работой таймера) при каждом событии обновления.
RTOS и HAL могут вносить значительные задержки в доступе непосредственно к регистрам таймера, просто по причине очень длинного кода. И даже если вы назначили высокий приоритет задаче работы с таймерами, она все равно будет на короткое время прерываться с интервалом каждого системного тика, но возвращаться назад, если более приоритетных нет. Системные события никуда не деваются ведь, планировщик не остановлен.
Ну про куб и HAL... Там ОС и Ethernet (LwIP), писать это на регистрах точно нет, поэтому какой выход я тут пытаюсь найти: настройка периферии на HAL или LL, далее все, что не имеет критическое значение и может работать медленно и не очень эффективно на HAL или том же LL, все, что критически важно на CMSIS. Ну как-то так... Благо ресурсы контроллера позволяют.Если выкинуть калокуб, задержка будет меньше.
а что за задача-то? Это случаем не генерирование трех синусоид со сдвигом в 120°?
Я вообще не понимаю, честно говоря, для каких целей такую жиробасину можно использовать. Да и дорого ужасно.
Чт сен 01, 2022 18:18:20
Чт сен 01, 2022 18:21:23
А стоимость, стоимость такой платы месяца 3-4 назад около 3-4 тыс, с алиэкспресс приехали абсолютно нормальные платы один в один как в чип и дипе
Чт сен 01, 2022 18:30:15
DmitryR писал(а):Там у FreeRTOS максимальный приоритет 5, у всех этих таймеров задан приоритет 3
Eddy_Em писал(а):orange pi + дешевый МК
Чт сен 01, 2022 19:44:52
А в случае с orange pi + дешевый МК вышло бы 2.5-3.5тыр
Все эти инструменты дело вкуса, навыков и времени на их осваивание. Raspberry pi еще есть)И на нормальном линуксе писать
P.S. Получается, нужно сгенерировать три импульса строго определенной длительности, идущие через строго определенные промежутки времени? А обязательно отсчитывать прямо от общего начала? Ведь можно отсчитывать от времени подачи первого импульса.
Если временные интервалы и формировать на ядре, то нужно чертовски точно до такта понимать что и как там работает. Во всех смыслах ловчее получается таки аппаратными средствами периферии, благо таковые средства имеются.
void TIM4_Callback(void)
{
if(LL_TIM_IsActiveFlag_UPDATE(TIM4))
{
TIM3->CNT = 0;
HAL_TIM_Base_Start(&htim3);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
TIM5->CNT = 0;
HAL_TIM_Base_Start(&htim5);
HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_1);
}
else
{
__NOP();
}
LL_TIM_ClearFlag_UPDATE(TIM4);
}
Systick, например, какой-нибудь может кааак сработать и всё
Чт сен 01, 2022 19:49:31
Чт сен 01, 2022 19:58:39
Чт сен 01, 2022 20:18:53