|
Вопрос по таймеру в STM32 Cortex |
|
|
|
 |
Ответов
(1 - 13)
|
Jun 14 2010, 07:09
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Halfback @ Jun 14 2010, 12:06)  Что значит свободный забег? не понял. и как это может помочь в настоящей задаче? Ну, без автозагрузки. Чтоб считал до 0xFFFF, потом снова 0. Цитата Может не совсем доходчиво объяснил но хочется, чтобы событие возникало не при t0>=t1 а только при t0==t1. Может штатные таймеры такое позволяют? Именно так всё и работает  . Compare match = совпадение (равенство).
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jun 14 2010, 14:59
|
Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 28-05-05
Пользователь №: 5 512

|
Предлагаю ближе к делу: Таймер конфигурируется так (конкретные значения периода, прескалеров привести не могу т.к. проект не под рукой): Код TIM_TimeBaseStructure.TIM_Period = 65535; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_Cmd(TIM3, ENABLE); Захват вот так: Код TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Active; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR1_Val; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure); Далее в момент времени таймера = 800 (таймер считает до 1000 и перезагружается, начинает считать с 0) надо отмерить 400мс и делаю Код TIM_SetCompare1(TIM3,400-(1000-800)); TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE) и сразу вылетаю в обработчик прерывания. Почему это происходит понятно, т.к. 800>(400-(1000-800)) Так вот надо чтобы таймер обнулился, начал считать заново и сделал событие в момент времени (400-(1000-800)). Потом попробую отработать событие TIM_EventSource_COM Может это то что надо.
Сообщение отредактировал Halfback - Jun 14 2010, 15:07
|
|
|
|
|
Jun 15 2010, 05:31
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Halfback @ Jun 14 2010, 20:59)  Далее в момент времени таймера = 800 (таймер считает до 1000 и перезагружается, начинает считать с 0) надо отмерить 400мс и делаю Код TIM_SetCompare1(TIM3,400-(1000-800)); TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE) и сразу вылетаю в обработчик прерывания. Почему это происходит понятно, т.к. 800>(400-(1000-800)) Что за чушь? Ещё раз повторю: компаратор сравнивает не на "больше", а на "равно". В обработчик вы вылетаете по другой причине. Посмотрите пример к библиотеке в папке TIM\OCToggle - это то, что вам надо.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jun 29 2011, 04:28
|
Местный
  
Группа: Участник
Сообщений: 294
Регистрация: 29-06-11
Пользователь №: 65 952

|
Добрый день. Проблема похожа чем то: прерывания работают но не все, в частности использую TIM1, TIM2, TIM3, прерывания от TIM1 c фиксированной частотой по переполнению, TIM2 - захват 1 и переполнение, TIM3 - сравнение 1 и переполнение. не работают переполнения во всех. Вот так настраиваю: CODE TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_ICInitTypeDef TIM_ICInitStruct; TIM_OCInitTypeDef TIM_OCInitStruct; NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); TIM_TimeBaseInitStruct.TIM_Prescaler=3664; // TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up; // TIM_TimeBaseInitStruct.TIM_Period=0xFFFF; TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1; // TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct); TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct); TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);
//TIM_PrescalerConfig(TIM2, 900, TIM_PSCReloadMode_Update); // //TIM_SetAutoreload(TIM3,0xFFFF);// //TIM_SetCompare1(TIM3, 0x0045); // TIM_ICInitStruct.TIM_Channel=TIM_Channel_1; TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising; TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI; TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1; TIM_ICInitStruct.TIM_ICFilter=0;
TIM_ICInit(TIM2, &TIM_ICInitStruct);
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_Timing; TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable; TIM_OCInitStruct.TIM_OutputNState = TIM_OutputNState_Disable; TIM_OCInitStruct.TIM_Pulse=0x00FF; // TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low; TIM_OCInitStruct.TIM_OCIdleState = TIM_OCIdleState_Reset; TIM_OCInitStruct.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
TIM_OC1Init(TIM3, &TIM_OCInitStruct); //TIM_SelectOCxM(TIM3); TIM_UpdateDisableConfig(TIM1,ENABLE); TIM_UpdateDisableConfig(TIM2,ENABLE); TIM_UpdateDisableConfig(TIM3,ENABLE);
TIM_Cmd(TIM1,ENABLE); TIM_Cmd(TIM2,ENABLE); TIM_Cmd(TIM3,ENABLE);
TIM_ITConfig(TIM1,TIM_IT_Update, ENABLE); // TIM_ITConfig(TIM2, TIM_IT_Update | TIM_IT_CC1, ENABLE);// TIM_ITConfig(TIM3, TIM_IT_Update | TIM_IT_CC1,ENABLE); // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_TIM16_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); Вот так обработчик прерываний: CODE void TIM3_IRQHandler(void) { if(TIM_GetITStatus(TIM3,TIM_IT_CC1)!=RESET) { TIM_ClearITPendingBit(TIM3, TIM_IT_CC1); /*какой то код*/ } if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET) { TIM_ClearITPendingBit(TIM3, TIM_IT_Update); /*какой то код*/ } TIM3->SR=0; } void TIM1_UP_TIM16_IRQHandler(void) { if(TIM_GetITStatus(TIM1,TIM_IT_Update)!=RESET) { TIM_ClearITPendingBit(TIM1, TIM_IT_Update); /*какой то код*/ } TIM1->SR=0; } void TIM2_IRQHandler(void) { /*** Ôóíêöèÿ ïðåðûâàíèÿ ïî çàõâàòó ñ ÄÏÐ ***/ if(TIM_GetITStatus(TIM2,TIM_IT_CC1)!=RESET) { TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); /*какойто код*/ } if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET) { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); freq=0; } TIM2->SR=0; }
Сообщение отредактировал IgorKossak - Jun 29 2011, 14:30
Причина редактирования: [codebox]
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|