stm32 после старта TIM6 сразу прерывание
04.07.2013, 00:46
|
|
|
Прописка
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
stm32 после старта TIM6 сразу прерывание
Долгое время потратил на организацию единичного отсчета времени. В итоге: после первого запуска TIM6 сразу наступает прерывание по переполнению. Дальнейшие запуски - нормально выдерживают задержку, а первый сразу после старта уходит в прерывание.
код:
volatile int f_TIM6=0; //флаг
uint32_t ccont;
//------------------------ прерывание по TIM6 -------------------------
extern "C" void TIM6_DAC_IRQHandler(void)
{
f_TIM6=0; //сбрасываем флаг
TIM6-›SR &= ~TIM_SR_UIF; //Сбрасываем флаг UIF
}
int main()
{
//------------------------ преднастройка TIM6 -------------------------
RCC-›APB1ENR |= RCC_APB1ENR_TIM6EN; //подаем тактирование на TIM6
TIM6-›PSC = 24000 - 1; // Настраиваем делитель что таймер тикал 1000 раз в секунду
TIM6-›ARR = 1000 ; // Чтоб прерывание случалось раз в секунду
TIM6-›DIER |= TIM_DIER_UIE; //разрешаем прерывание от таймера
TIM6-›CR1 |= TIM_CR1_OPM; //режим одиночного импульса
NVIC_EnableIRQ(TIM6_DAC_IRQn); //Разрешение TIM6_DAC_IRQn прерывания
while(1)
{
// !!!!! первый запуск таймера -неудачный
f_TIM6=1; //устанавливаем флаг
TIM6-›CR1 |= TIM_CR1_CEN; // Начать отсчёт одной секунды таймера
ccont=0;
while( f_TIM6=1; !=0)
{
ccont++; //по этой переменной видно что таймер работает не корректно
}
// !!!!! второй точно такой же запуск таймера - удачный
f_TIM6=1; //устанавливаем флаг
TIM6-›CR1 |= TIM_CR1_CEN; // Начать отсчёт одной секунды таймера
ccont=0;
while( f_TIM6=1; !=0)
{
ccont++; //теперь значение в ccont - некоторое большое число. таймер отработал правильно
}
}
}
помоему я уже все перепробовал, не могу выявить причину преждевременного срабатывания прерывания TIM6 при первом запуске. подскажите, может чего то недопонял
__________________
Kvsrk85(Андрей)
Последний раз редактировалось kvark85; 04.07.2013 в 00:59.
|
|
|
|
04.07.2013, 00:47
|
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
|
Re: stm32 после старта TIM6 сразу прерывание
может вниз считает?
|
|
|
|
04.07.2013, 00:58
|
|
|
Прописка
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: stm32 после старта TIM6 сразу прерывание
таймер 6 - это базовый, простой таймер. он не может считать вниз.
__________________
Kvsrk85(Андрей)
|
|
|
|
04.07.2013, 05:39
|
|
|
Частый гость
Регистрация: 14.07.2010
Сообщений: 30
Сказал спасибо: 0
Сказали Спасибо 7 раз(а) в 6 сообщении(ях)
|
Re: stm32 после старта TIM6 сразу прерывание
С таймерами у меня было много проблем , пока при инициализации не начал их их
сбрасывать - там у них есть ф-я в библиотеке RCCAPBRESET(... )
Полезно еще перед запуском таймера сбрасывать нужный флаг.
|
|
|
|
04.07.2013, 10:52
|
|
|
Прописка
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: stm32 после старта TIM6 сразу прерывание
я не использую библиотеки, только CMSIS. в ручную пробовал уже всячески обнулять таймер перед стартом. что там в этой функции RCCAPBRESET(... ) делается?
__________________
Kvsrk85(Андрей)
|
|
|
|
04.07.2013, 11:02
|
|
|
Частый гость
Регистрация: 14.07.2010
Сообщений: 30
Сказал спасибо: 0
Сказали Спасибо 7 раз(а) в 6 сообщении(ях)
|
Re: stm32 после старта TIM6 сразу прерывание
01200 * @brief Forces or releases Low Speed APB (APB1) peripheral reset.
01201 * @param RCC_APB1Periph: specifies the APB1 peripheral to reset.
01202 * This parameter can be any combination of the following values:
01203 * @arg RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4,
01204 * RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7,
01205 * RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3,
01206 * RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4,
01207 * RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2,
01208 * RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP,
01209 * RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_CEC,
01210 * RCC_APB1Periph_TIM12, RCC_APB1Periph_TIM13, RCC_APB1Periph_TIM14
01211 * @param NewState: new state of the specified peripheral clock.
01212 * This parameter can be: ENABLE or DISABLE.
01213 * @retval None
01214 */
01215 void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
01216 {
01217 /* Check the parameters */
01218 assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));
01219 assert_param(IS_FUNCTIONAL_STATE(NewState));
01220 if (NewState != DISABLE)
01221 {
01222 RCC-›APB1RSTR |= RCC_APB1Periph;
01223 }
01224 else
01225 {
01226 RCC-›APB1RSTR &= ~RCC_APB1Periph;
01227 }
01228 }
Сначала вызываешь с ENABLE потом с DISABLE
00128 RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, ENABLE);
00129 RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, DISABLE);
а уже потом подавать тактирование .
И сбрасывать флаг перед разрешением прерываний .
|
|
|
|
Сказали "Спасибо" ewseltek
|
|
|
04.07.2013, 11:07
|
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,427
Сказал спасибо: 0
Сказали Спасибо 381 раз(а) в 251 сообщении(ях)
|
Re: stm32 после старта TIM6 сразу прерывание
После загрузки значений нужно вызывать Update Event.
|
Код:
|
..............
..............
TIM6-›PSC = 24000 - 1; // Настраиваем делитель что таймер тикал 1000 раз в секунду
TIM6-›ARR = 1000 ; // Чтоб прерывание случалось раз в секунду
TIM6-›DIER |= TIM_DIER_UIE; //разрешаем прерывание от таймера
TIM6-›CR1 |= TIM_CR1_OPM; //режим одиночного импульса
TIM6-›EGR |= TIM_EGR_UG; //Вызываем Update Event
nop();
nop();
TIM6-›SR1 &= ~(TIM_SR1_UIF); /* Clear pending flag */
NVIC_EnableIRQ(TIM6_DAC_IRQn); //Разрешение TIM6_DAC_IRQn прерывания |
Как-то так.
|
|
|
|
Эти 3 пользователя(ей) сказали Спасибо nahimovv за это сообщение:
|
|
|
04.07.2013, 11:10
|
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,427
Сказал спасибо: 0
Сказали Спасибо 381 раз(а) в 251 сообщении(ях)
|
Re: stm32 после старта TIM6 сразу прерывание
Сообщение от ewseltek
|
С таймерами у меня было много проблем , пока при инициализации не начал их их
сбрасывать - там у них есть ф-я в библиотеке RCCAPBRESET(... )
|
Плацебо!
|
|
|
|
04.07.2013, 11:22
|
|
|
Прописка
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: stm32 после старта TIM6 сразу прерывание
после добавления
TIM6-›EGR |= TIM_EGR_UG;
TIM6-›SR1 &= ~(TIM_SR1_UIF);
в инициализацию контроллера - заработало как надо.
__________________
Kvsrk85(Андрей)
|
|
|
|
Сказали "Спасибо" kvark85
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:32.
|
|