Перейти к содержанию
    

Stm32f4 дрыгание ножкой с помощью таймера без прерываний

Доброго времени суток! 
Есть мк stm32f407vgt6. Хотелось бы  в программе мк задавать период, при достижении которого бы менялось состояние ножки мк на противоположное состояние. Кроме того хотелось чтобы это было без прерывания (чтобы не отрывать мк от других задач - период может быть очень мал несколько мкс) и чтобы следующее изменение периода происходило в моменты, когда счетчик таймера досчитал до периода (а не в произвольные моменты времени). Из описания на мк так понял, что вроде бы это в принципе возможно.  Типо есть каналы  таймера, которые можно как то настроить на определенные ножки, но не понял как именно. Соответственно вопрос: можно ли это сделать или  нет?

Изменено пользователем haker_fox
Для STM32 есть свой подфорум.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

33 минуты назад, MrYuran сказал:

Можно.

stm32 timer_output compare

 на HAL примеров много, а на SPL, который используется в моём проекте пока не нашел.. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 минут назад, aske1 сказал:

 

 на HAL примеров много, а на SPL, который используется в моём проекте пока не нашел.. 

Найти примеры STM32F1 на SPL и немного поправить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

56 минут назад, aske1 сказал:

 на HAL примеров много, а на SPL, который используется в моём проекте пока не нашел.. 

А тут и без HAL'а и без SPL'а можно обойтись, на одних регистрах:

        TIM1->PSC = делитель;
        TIM1->ARR = период - 1;
        TIM1->CCR1 = период / 2;

Здесь CCR1 задан половине периода, чтобы меандр на выходе получился со скважностью 1:1.

Т.е. таймер считает вверх до ARR, а затем сбрасывается. А на уровне CCR1 выходной сигнал меняет полярность. После сброса восстанавливается исходная полярность. И так в каждом цикле.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 28.11.2023 в 13:12, Xenia сказал:

А тут и без HAL'а и без SPL'а можно обойтись, на одних регистрах:   

 

и ещё желательно в центр мэйна воткнуть.

Для пущего подчеркивания крутизны )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

29 минут назад, Xenia сказал:

на одних регистрах:

А пин на выход кто будет настраивать? А системные частоты?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Т.е. инициализация как то так должна выглядеть?:

void timer_1_init()
{
    GPIO_InitTypeDef GPIO_init_time1; 
  RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //тактирование таймера
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//тактирование лапы TIM1_CH3 44-я нога PE13
    
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource13, GPIO_AF_TIM1);
    
    GPIO_init_time1.GPIO_Mode = GPIO_Mode_AF;
    GPIO_init_time1.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_init_time1.GPIO_OType = GPIO_OType_PP;
    GPIO_init_time1.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_init_time1.GPIO_Pin = GPIO_Pin_13;    
        
    GPIO_Init(GPIOE, &GPIO_init_time1);
     
    TIM1->PSC = 0; //делитель-1
    TIM1->ARR = 65534; // период -1
    TIM1->CCR3 = TIM1->ARR/ 2; //TIM capture/compare register 3
    TIM1->CR1 |= TIM_CR1_CEN; //Старт счетчика таймера
}

И после, когда надо , я просто меняю TIM1->ARR = нужное значение; ?

И нигде не надо настраивать чтобы период менялся в моменты окончания счета, а не в произвольные моменты времени?

Изменено пользователем haker_fox
Для оформления кода есть кнопка <>.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 минут назад, aske1 сказал:

И нигде не надо настраивать чтобы период менялся в моменты окончания счета, а не в произвольные моменты времени?

Нигде. Период по умолчанию сменится не в момент установки нового ARR, а лишь после того, как закончится текущий период (т.е. после сброса).
Но если вам немедленно надо изменить период, то после замены ARR надо добавить это:

TIM1->EGR |= TIM_EGR_UG;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если меняете период счета таймера через ARR, то надо усатновить бит ARPE (auto-reload preload enable) в регистре CR. В этом случае новое значение ARR загрузится в момент перехода счетчика CNT через 0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/28/2023 at 3:31 PM, aske1 said:

И нигде не надо настраивать чтобы период менялся в моменты окончания счета, а не в произвольные моменты времени?

Это зависит от того включена или нет буферизация.

On 11/28/2023 at 3:31 PM, aske1 said:

    
    TIM1->PSC = 0; //делитель-1
    TIM1->ARR = 65534; // период -1
    TIM1->CCR3 = TIM1->ARR/ 2; //TIM capture/compare regis

Еще CCMR, BDTR надо настроить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, aske1 сказал:

 на HAL примеров много, а на SPL, который используется в моём проекте пока не нашел.. 

Можно поискать примеры на LowLayer Library, она гораздо больше похожа на SPL чем HAL.

Также, LLL код для таймеров можно сгенерировать кубом, основываясь на тех "примерах" для HAL.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или хотябы просто прочитать мануал на HAL. Он есть, на полторы тыщщи страниц, на сайте st.com

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

чтобы меандр на выходе получился со скважностью 1:1
Если меандр, то это ужЕ скважность 2, кстати (((-8Ж

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...