aske1 0 21 февраля Опубликовано 21 февраля · Жалоба Здравствуйте! Пытаюсь сделать так, чтобы один таймер STM32f407 TIM2 периодически запускал другой TIM1 и чтобы тот другой на лапке мк формировал импульс заданной длительности. Соответственно у таймера TIM2 взял настроил на выход канал CH1 и соединил его с каналом таймера TIM1 СH2, который настроил на вход, у TIM1 так же канал СH1 настроил на выход. С таймером TIM2 проблем нет. На его CH1 вижу периодически меняющийся сигнал. Проблемы с таймером TIM1 на его канале CH1 импульсов нет, хотя в отладчике вижу, что он считает хотя и как то странно (мне нужен 1 импульс, а он переполняется несколько раз) за время переполнения TIM2. Инициализацию TIM1 приложил. Подскажите пожалуйста что я делаю не так? Вроде всё должно быть просто, а уже столько времени потратил.. static void MX_SLAVE_TIM1_INIT(void) { //Форма импульса OPM определяется записью в регистры сравнения (с учетом тактовой частоты и прескалера счетчика). /* set the Timer prescaler to get 1MHz as counter clock */ RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; /* configure the Timer prescaler */ TIM1->PSC = 9; /* configure the period */ TIM1->ARR = 500-1; /* configure the repetition counter */ // TIM1->RCR = 1; /* configure pulse width */ TIM1->CCR1 = 250 ; /* Select the Clock Division to 1*/ // TIM1->CR1 |= TIM_CLOCKDIVISION; /* Reset clock Division bit field */ TIM1->CR1 &= ~ TIM_CR1_CKD; //Отобразите TI2FP2 на TI2 записью CC2S=01 в регистре TIMx_CCMR1. TIM1->CCMR1 &=~(0x3UL << (8U)); TIM1->CCMR1 |=(0x1UL << (8U)); //TI2FP2 должен детектировать положительный перепад, для этого запишите CC2P=0 и CC2NP=0 в регистре TIMx_CCER 7?5 TIM1->CCER &=~(0x1UL << (5U)); TIM1->CCER &=~(0x1UL << (7U)); //Сконфигурируйте TI2FP2 в качестве триггера для контроллера подчиненного режима (TRGI) записью TS=110 в регистре TIMx_SMCR TIM1->SMCR &=~(0x7UL << (4U)); TIM1->SMCR |=(0x6UL << (4U)); //TI2FP2 используется для запуска счетчика путем записи SMS=110 в регистре TIMx_SMCR (режим триггера). TIM1->SMCR &=~(0x7UL << (0U)); TIM1->SMCR |=(0x6UL << (0U)); //разрешите PWM mode 2 записью OC1M=111 в регистре TIMx_CCMR1 TIM1->CCMR1 &=~(0x7UL << (4U)); TIM1->CCMR1 |=(0x7UL << (4U)); //Пользователь может опционально разрешить регистры предзагрузки записью OC1PE=1 в регистре TIMx_CCMR1 и ARPE в регистре TIMx_CR1 //В нашем примере биты DIR и CMS регистра TIMx_CR1 должны быть в лог. 0. TIM1->CR1 &=~(0x1UL << (4U)); TIM1->CR1 &=~(0x3UL << (5U)); // Когда бит OPM в регистре TIMx_CR1 установлен в 0, выбирается режим повторения (Repetitive Mode) TIM1->CR1 &=~(0x1UL << (3U)); /* * Если пользователь хочет вывести сигнал с минимальной задержкой, * то должен быть установлен бит OCxFE в регистре TIMx_CCMRx. * Тогда OCxRef (и OCx) принудительно будут установлены в ответ * на сигнал стимула, без обращения внимания на сравнение. * Новый уровень такой же, как если бы произошло совпадение сравнения. * OCxFE действует только если канал сконфигурирован в режиме PWM1 или PWM2. * */ TIM1->CCMR1 &=~(0x1UL << (2U)); TIM1->CCMR1 |=(0x1UL << (2U));//Output compare 1 fast enable /* Enable the TIM Counter */ // TIM1->CR1 |= TIM_CR1_CEN; } while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ ch1=TIM1->CNT ;//тот что slave ch2= TIM2->CNT ; // мастер ch5=TIM1->SMCR; if(ch1==251){ ch3=ch3+1;//сколько раз slave } if(ch2==999){ ch4=ch4+1;//сколько раз master } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 53 21 февраля Опубликовано 21 февраля · Жалоба Ой, навряд ли кто помнит на память позиции битов в регистрах. Есть же текстовые дефайны - ими и пишите. Иначе чтобы разобраться в вашем тексте, надо открывать документацию и пальчиком прослеживать все эти циферки. Я оставлю вот эту картинку, а вы сверьтесь со значениями битов у себя: А значения регистров можете смотреть прямо вон там, на вкладке SFRs, там весь список всех регистров и всех битов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
my504 2 21 февраля Опубликовано 21 февраля · Жалоба Добавлю. В показанном коде есть только инициализация слейвного TIM1 (в нем выбирается источник сигнала для TRGI (ITR1) - мастер-таймер TIM2). Но требуется еще инициализировать TIM2 - выбрать источник сигнала (TRGO) который будет подключен к TRGI слейвного таймера Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aske1 0 21 февраля Опубликовано 21 февраля · Жалоба 54 минуты назад, EdgeAligned сказал: А значения регистров можете смотреть прямо вон там, на вкладке SFRs, там весь список всех регистров и всех битов. Честно говоря я так и не догнал где во вкладке SFRs брать названия отдельных битов, группы битов там видел например CC2S. Как записать например вот эти строчки с помощью того, что есть в той вкладке? //Отобразите TI2FP2 на TI2 записью CC2S=01 в регистре TIMx_CCMR1. TIM1->CCMR1 &=~(0x3UL << (8U)); TIM1->CCMR1 |=(0x1UL << (8U)); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 53 21 февраля Опубликовано 21 февраля · Жалоба 1 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 21 февраля Опубликовано 21 февраля · Жалоба Просто жуть. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 53 21 февраля Опубликовано 21 февраля · Жалоба Принцип обозначения битов простой - сначала базовое имя модуля, (только без номера), например TIM, затем через _ имя регистра, например SMCR, затем через _ имя бита или битовой маски для группы битов: TS, TS_0. Итого, TIM_SMCR_TS0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aske1 0 21 февраля Опубликовано 21 февраля · Жалоба 1 час назад, EdgeAligned сказал: Принцип обозначения битов простой - сначала базовое имя модуля, (только без номера), например TIM, затем через _ имя регистра, например SMCR, затем через _ имя бита или битовой маски для группы битов: TS, TS_0. Итого, TIM_SMCR_TS0 Переписал, если я правильно понял принцип то оно должно выглядеть так: static void MX_SLAVE_TIM1_INIT(void) { //Форма импульса OPM определяется записью в регистры сравнения (с учетом тактовой частоты и прескалера счетчика). /* set the Timer prescaler to get 1MHz as counter clock */ RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; /* configure the Timer prescaler */ TIM1->PSC = 9; /* configure the period */ TIM1->ARR = 500-1; /* configure the repetition counter */ // TIM1->RCR = 1; /* configure pulse width */ TIM1->CCR1 = 250 ; /* Select the Clock Division to 1*/ // TIM1->CR1 |= TIM_CLOCKDIVISION; /* Reset clock Division bit field */ TIM1->CR1 &= ~ TIM_CR1_CKD; //Отобразите TI2FP2 на TI2 записью CC2S=01 в регистре TIMx_CCMR1 TIM1->CCMR1 |=TIM_CCMR1_CC2S_0; //TI2FP2 должен детектировать положительный перепад, для этого запишите CC2P=0 и CC2NP=0 в регистре TIMx_CCER 7?5 TIM1->CCMR1 &=~(TIM_CCER_CC2P|TIM_CCER_CC2NP); //Сконфигурируйте TI2FP2 в качестве триггера для контроллера подчиненного режима (TRGI) записью TS=110 в регистре TIMx_SMCR //TI2FP2 используется для запуска счетчика путем записи SMS=110 в регистре TIMx_SMCR (режим триггера). TIM1->SMCR |=(TIM_SMCR_TS_2|TIM_SMCR_TS_1|TIM_SMCR_SMS_2|TIM_SMCR_SMS_1); //разрешите PWM mode 2 записью OC1M=111 в регистре TIMx_CCMR1 TIM1->CCMR1 |=(TIM_CCMR1_OC1M_2|TIM_CCMR1_OC1M_1|TIM_CCMR1_OC1M_0); //В нашем примере биты DIR и CMS регистра TIMx_CR1 должны быть в лог. 0. TIM1->CR1 &=~(TIM_CR1_DIR|TIM_CR1_CMS); // Когда бит OPM в регистре TIMx_CR1 установлен в 0, выбирается режим повторения (Repetitive Mode) TIM1->CR1 &=~(TIM_CR1_OPM); /* * Если пользователь хочет вывести сигнал с минимальной задержкой, * то должен быть установлен бит OCxFE в регистре TIMx_CCMRx. * Тогда OCxRef (и OCx) принудительно будут установлены в ответ * на сигнал стимула, без обращения внимания на сравнение. * Новый уровень такой же, как если бы произошло совпадение сравнения. * OCxFE действует только если канал сконфигурирован в режиме PWM1 или PWM2. * */ TIM1->CCMR1 |=TIM_CCMR1_OC1FE; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 21 февраля Опубликовано 21 февраля · Жалоба Взять Keil, выбрать процессор STM32F217IG и в симуляторе посмотреть как работают таймеры в нужных режимах. Без взякого железа. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aske1 0 21 февраля Опубликовано 21 февраля · Жалоба 3 часа назад, EdgeAligned сказал: Я оставлю вот эту картинку, а вы сверьтесь со значениями битов у себя: Я пытаюсь это через внешний вход сделать TI2FP2 у TIM1 , но т.к. на рисунке написано тоже пробовал и тоже не получилось Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aske1 0 22 февраля Опубликовано 22 февраля · Жалоба Заработало, не понял только почему 1-й импульс Tim1 длительностью меньше, чем все остальные.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться