01.01.2016, 19:33
|
|
Гражданин KAZUS.RU
Регистрация: 16.02.2012
Сообщений: 441
Сказал спасибо: 89
Сказали Спасибо 735 раз(а) в 149 сообщении(ях)
|
STM32F030 одиночный импульс на TIM14.1
Пытаюсь сгенерить одиночный импульс заданной длительности на PB1 (TIM14.1). Не получается - постоянно вкл/выкл. Toggle работает.
настройка:
Код:
|
// TIM14 PWM
RCC-›APB1ENR |= RCC_APB1Periph_TIM14;
tb.TIM_ClockDivision = TIM_CKD_DIV1;
tb.TIM_CounterMode = TIM_CounterMode_Down;
tb.TIM_Period = 0xFFFF;
tb.TIM_Prescaler = 0;
tb.TIM_RepetitionCounter = 1;
TIM_TimeBaseInit(TIM14, &tb);
oc.TIM_OCMode = TIM_OCMode_PWM2;
oc.TIM_OutputState = TIM_OutputState_Enable;
oc.TIM_OutputNState = TIM_OutputNState_Disable;
oc.TIM_OCPolarity = TIM_OCPolarity_High;
oc.TIM_OCIdleState = TIM_OCIdleState_Reset;
oc.TIM_Pulse = 0;
TIM_OC1Init(TIM14, &oc);
TIM14-›CR1 &= ~TIM_CR1_ARPE;
TIM14-›CR1 |= TIM_CR1_OPM;
TIM14-›CNT = 0;
TIM14-›EGR |= TIM_EGR_UG;
TIM14-›CCMR1 &= ~TIM_CCMR1_OC1PE; |
запуск:
Код:
|
void pulse_start(u32 us){
if (us){
tim_dis(TIM14);
u32 pre = PULSE_PRE;
while (us › 65535uL){
us ››= 1;
pre ‹‹= 1;
}
TIM14-›PSC = pre;
TIM14-›ARR = us;
TIM14-›CCR1 = 0;
TIM14-›CNT = us;
TIM14-›RCR = 1;
TIM14-›EGR |= TIM_EGR_UG | TIM_EGR_CC1G;
tim_en(TIM14);
}
} |
длительность рассчитывает правильно - видно как TIM14.CNT отрабатывает, но выход не реагирует.
Последний раз редактировалось zöner; 01.01.2016 в 19:55.
|
|
|
|
01.01.2016, 20:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: STM32F030 одиночный импульс на TIM14.1
А он включен?
|
|
|
|
01.01.2016, 21:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.02.2008
Сообщений: 1,802
Сказал спасибо: 124
Сказали Спасибо 602 раз(а) в 419 сообщении(ях)
|
Re: STM32F030 одиночный импульс на TIM14.1
Да там изначально непонятно,
Сообщение от zöner
|
постоянно вкл/выкл. Toggle работает.
|
потом
Сообщение от zöner
|
TIM14.CNT отрабатывает, но выход не реагирует.
|
|
|
|
|
01.01.2016, 22:06
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: STM32F030 одиночный импульс на TIM14.1
Сообщение от andries5
|
непонятно
|
Порт, говорю, настроен?
|
|
|
|
01.01.2016, 23:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.02.2008
Сообщений: 1,802
Сказал спасибо: 124
Сказали Спасибо 602 раз(а) в 419 сообщении(ях)
|
Re: STM32F030 одиночный импульс на TIM14.1
Там вообще не видно настройки порта. И непонятно на выходном пине есть движение или нет ничего.
|
|
|
|
02.01.2016, 14:16
|
|
Гражданин KAZUS.RU
Регистрация: 16.02.2012
Сообщений: 441
Сказал спасибо: 89
Сказали Спасибо 735 раз(а) в 149 сообщении(ях)
|
Re: STM32F030 одиночный импульс на TIM14.1
заработал такой код:
настройка:
Код:
|
RCC-›APB1ENR |= RCC_APB1Periph_TIM14;
TIM_TimeBaseStructInit(&tb);
tb.TIM_ClockDivision = TIM_CKD_DIV4;
tb.TIM_CounterMode = TIM_CounterMode_Up;
tb.TIM_Period = 0xFFFF;
tb.TIM_Prescaler = 0;
tb.TIM_RepetitionCounter = 1;
TIM_TimeBaseInit(TIM14, &tb);
TIM_OCStructInit(&oc);
oc.TIM_OCMode = TIM_OCMode_PWM1;
oc.TIM_OutputState = TIM_OutputState_Enable;
oc.TIM_OutputNState = TIM_OutputNState_Disable;
oc.TIM_OCPolarity = TIM_OCPolarity_Low;
oc.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OC1Init(TIM14, &oc);
TIM14-›CR1 |= TIM_CR1_OPM;
TIM14-›CCR1 = 1; |
рассчет импульса и старт:
Код:
|
#define PULSE_PRE 12
void pulse_calc(u32 us){
if (us){
u32 pre = PULSE_PRE;
while (us › 65535uL){
us ››= 1;
pre ‹‹= 1;
}
TIM14-›PSC = pre;
TIM14-›ARR = us;
TIM14-›EGR |= TIM_EGR_UG;
}
}
void pulse_start(){
tim_en(TIM14);
}
inline void tim_en(TIM_TypeDef* t){ t-›CR1 |= TIM_CR1_CEN; } |
P.S. в документации как-то забыли про бит TIM14.CR1.OPM - без его установки таймер отказывался работать в режиме одиночного импульса. И еще: таймер считает только вверх, хотя на схеме таймера есть и декремент.
Цитата:
|
Там вообще не видно настройки порта. И непонятно на выходном пине есть движение или нет ничего
|
порт настроен как GPIO_AF_0 - работает.
Последний раз редактировалось zöner; 02.01.2016 в 14:26.
|
|
|
|
02.01.2016, 14:52
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: STM32F030 одиночный импульс на TIM14.1
Чушь какая-то. В первой мессаге OPM тоже присутствует. Изменилось направление счёта DOWN на UP, хотя бита DIR в TIM14 нет. Такое впечатление, что всё ваялось вслепую, без логанализатора и понимания происходящего.
Сообщение от zöner
|
таймер считает только вверх
|
Таймеру пофигу как считать, если он это умеет. Важнее то, какой результат хотели получить.
=========
А, вспомнил! В STM32 если бита DIR в таймере нет, но попытаться его установить, то таймер отказывается работать. Это проскакивало и здесь и на других форумах.
Последний раз редактировалось STM32F0; 02.01.2016 в 15:06.
|
|
|
Сказали "Спасибо" STM32F0
|
|
|
02.01.2016, 15:21
|
|
Гражданин KAZUS.RU
Регистрация: 16.02.2012
Сообщений: 441
Сказал спасибо: 89
Сказали Спасибо 735 раз(а) в 149 сообщении(ях)
|
Re: STM32F030 одиночный импульс на TIM14.1
да, ваяю без лог.анализатора, отладчика и прочих наворотов и "благ цивилизации".
а вы, наверно, без этого уже и мигнуть светодиодом не сможете ?
развратились тут, панимаишь...
Цитата:
|
хотя бита DIR в TIM14 нет.
|
бита OPM в документации тоже нет, хотя он есть...
Последний раз редактировалось zöner; 02.01.2016 в 15:26.
|
|
|
|
02.01.2016, 15:36
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: STM32F030 одиночный импульс на TIM14.1
Сообщение от zöner
|
вы, наверно, без этого уже и мигнуть светодиодом не сможете ?
|
Глупость какая! Я таймерами и ДМА пользуюсь по полной, предпочитаю хардварные решения типа "STM32 - Tips 'N Tricks", там без анализатора уже никак.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:22.
|
|