aske1 0 28 ноября, 2023 Опубликовано 28 ноября, 2023 (изменено) · Жалоба Доброго времени суток! Есть мк stm32f407vgt6. Хотелось бы в программе мк задавать период, при достижении которого бы менялось состояние ножки мк на противоположное состояние. Кроме того хотелось чтобы это было без прерывания (чтобы не отрывать мк от других задач - период может быть очень мал несколько мкс) и чтобы следующее изменение периода происходило в моменты, когда счетчик таймера досчитал до периода (а не в произвольные моменты времени). Из описания на мк так понял, что вроде бы это в принципе возможно. Типо есть каналы таймера, которые можно как то настроить на определенные ножки, но не понял как именно. Соответственно вопрос: можно ли это сделать или нет? Изменено 28 ноября, 2023 пользователем haker_fox Для STM32 есть свой подфорум. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 21 28 ноября, 2023 Опубликовано 28 ноября, 2023 · Жалоба Можно. stm32 timer_output compare Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aske1 0 28 ноября, 2023 Опубликовано 28 ноября, 2023 · Жалоба 33 минуты назад, MrYuran сказал: Можно. stm32 timer_output compare на HAL примеров много, а на SPL, который используется в моём проекте пока не нашел.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 75 28 ноября, 2023 Опубликовано 28 ноября, 2023 · Жалоба 13 минут назад, aske1 сказал: на HAL примеров много, а на SPL, который используется в моём проекте пока не нашел.. Найти примеры STM32F1 на SPL и немного поправить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 42 28 ноября, 2023 Опубликовано 28 ноября, 2023 · Жалоба 56 минут назад, aske1 сказал: на HAL примеров много, а на SPL, который используется в моём проекте пока не нашел.. А тут и без HAL'а и без SPL'а можно обойтись, на одних регистрах: TIM1->PSC = делитель; TIM1->ARR = период - 1; TIM1->CCR1 = период / 2; Здесь CCR1 задан половине периода, чтобы меандр на выходе получился со скважностью 1:1. Т.е. таймер считает вверх до ARR, а затем сбрасывается. А на уровне CCR1 выходной сигнал меняет полярность. После сброса восстанавливается исходная полярность. И так в каждом цикле. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 21 28 ноября, 2023 Опубликовано 28 ноября, 2023 · Жалоба В 28.11.2023 в 13:12, Xenia сказал: А тут и без HAL'а и без SPL'а можно обойтись, на одних регистрах: и ещё желательно в центр мэйна воткнуть. Для пущего подчеркивания крутизны ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dOb 10 28 ноября, 2023 Опубликовано 28 ноября, 2023 · Жалоба 29 минут назад, Xenia сказал: на одних регистрах: А пин на выход кто будет настраивать? А системные частоты? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 166 28 ноября, 2023 Опубликовано 28 ноября, 2023 · Жалоба 30 минут назад, Xenia сказал: TIM1->PSC = делитель; ... - 1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aske1 0 28 ноября, 2023 Опубликовано 28 ноября, 2023 (изменено) · Жалоба Т.е. инициализация как то так должна выглядеть?: 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 = нужное значение; ? И нигде не надо настраивать чтобы период менялся в моменты окончания счета, а не в произвольные моменты времени? Изменено 28 ноября, 2023 пользователем haker_fox Для оформления кода есть кнопка <>. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 42 28 ноября, 2023 Опубликовано 28 ноября, 2023 · Жалоба 16 минут назад, aske1 сказал: И нигде не надо настраивать чтобы период менялся в моменты окончания счета, а не в произвольные моменты времени? Нигде. Период по умолчанию сменится не в момент установки нового ARR, а лишь после того, как закончится текущий период (т.е. после сброса). Но если вам немедленно надо изменить период, то после замены ARR надо добавить это: TIM1->EGR |= TIM_EGR_UG; 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 79 28 ноября, 2023 Опубликовано 28 ноября, 2023 · Жалоба Если меняете период счета таймера через ARR, то надо усатновить бит ARPE (auto-reload preload enable) в регистре CR. В этом случае новое значение ARR загрузится в момент перехода счетчика CNT через 0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 59 28 ноября, 2023 Опубликовано 28 ноября, 2023 · Жалоба 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 надо настроить. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tgruzd 11 28 ноября, 2023 Опубликовано 28 ноября, 2023 · Жалоба 3 часа назад, aske1 сказал: на HAL примеров много, а на SPL, который используется в моём проекте пока не нашел.. Можно поискать примеры на LowLayer Library, она гораздо больше похожа на SPL чем HAL. Также, LLL код для таймеров можно сгенерировать кубом, основываясь на тех "примерах" для HAL. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 79 28 ноября, 2023 Опубликовано 28 ноября, 2023 · Жалоба Или хотябы просто прочитать мануал на HAL. Он есть, на полторы тыщщи страниц, на сайте st.com 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 36 28 ноября, 2023 Опубликовано 28 ноября, 2023 · Жалоба чтобы меандр на выходе получился со скважностью 1:1 Если меандр, то это ужЕ скважность 2, кстати (((-8Ж Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться