Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

stm32 после старта TIM6 сразу прерывание

Непрочитано 04.07.2013, 00:46  
kvark85
Прописка
 
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
kvark85 на пути к лучшему
По умолчанию 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.
kvark85 вне форума  
Непрочитано 04.07.2013, 00:47  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: stm32 после старта TIM6 сразу прерывание

может вниз считает?
Easyrider83 вне форума  
Непрочитано 04.07.2013, 00:58  
kvark85
Прописка
 
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
kvark85 на пути к лучшему
По умолчанию Re: stm32 после старта TIM6 сразу прерывание

таймер 6 - это базовый, простой таймер. он не может считать вниз.
__________________
Kvsrk85(Андрей)
kvark85 вне форума  
Непрочитано 04.07.2013, 05:39  
ewseltek
Частый гость
 
Регистрация: 14.07.2010
Сообщений: 30
Сказал спасибо: 0
Сказали Спасибо 7 раз(а) в 6 сообщении(ях)
ewseltek на пути к лучшему
По умолчанию Re: stm32 после старта TIM6 сразу прерывание

С таймерами у меня было много проблем , пока при инициализации не начал их их
сбрасывать - там у них есть ф-я в библиотеке RCCAPBRESET(... )
Полезно еще перед запуском таймера сбрасывать нужный флаг.
ewseltek вне форума  
Непрочитано 04.07.2013, 10:52  
kvark85
Прописка
 
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
kvark85 на пути к лучшему
По умолчанию Re: stm32 после старта TIM6 сразу прерывание

я не использую библиотеки, только CMSIS. в ручную пробовал уже всячески обнулять таймер перед стартом. что там в этой функции RCCAPBRESET(... ) делается?
__________________
Kvsrk85(Андрей)
kvark85 вне форума  
Непрочитано 04.07.2013, 11:02  
ewseltek
Частый гость
 
Регистрация: 14.07.2010
Сообщений: 30
Сказал спасибо: 0
Сказали Спасибо 7 раз(а) в 6 сообщении(ях)
ewseltek на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" ewseltek
kvark85 (04.07.2013)
Непрочитано 04.07.2013, 11:07  
nahimovv
Заблокирован
 
Регистрация: 25.04.2013
Сообщений: 1,427
Сказал спасибо: 0
Сказали Спасибо 381 раз(а) в 251 сообщении(ях)
nahimovv на пути к лучшему
По умолчанию 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 прерывания
Как-то так.
nahimovv вне форума  
Эти 3 пользователя(ей) сказали Спасибо nahimovv за это сообщение:
Ghost99 (11.12.2021), kvark85 (04.07.2013), Unknown (18.07.2014)
Непрочитано 04.07.2013, 11:10  
nahimovv
Заблокирован
 
Регистрация: 25.04.2013
Сообщений: 1,427
Сказал спасибо: 0
Сказали Спасибо 381 раз(а) в 251 сообщении(ях)
nahimovv на пути к лучшему
По умолчанию Re: stm32 после старта TIM6 сразу прерывание

Сообщение от ewseltek Посмотреть сообщение
С таймерами у меня было много проблем , пока при инициализации не начал их их
сбрасывать - там у них есть ф-я в библиотеке RCCAPBRESET(... )
Плацебо!
nahimovv вне форума  
Непрочитано 04.07.2013, 11:22  
kvark85
Прописка
 
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
kvark85 на пути к лучшему
По умолчанию Re: stm32 после старта TIM6 сразу прерывание

после добавления

TIM6-›EGR |= TIM_EGR_UG;
TIM6-›SR1 &= ~(TIM_SR1_UIF);

в инициализацию контроллера - заработало как надо.
__________________
Kvsrk85(Андрей)
kvark85 вне форума  
Сказали "Спасибо" kvark85
Ghost99 (11.12.2021)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изучаем STM32 Cortex M3 EugVor ARM 6171 20.05.2025 20:16
Прерывание по совпадению таймера 1 gruffi AVR 38 21.10.2016 22:58
stm32 после запуска ADC1 не выставляется EOC kvark85 ARM 1 03.07.2013 11:29


Часовой пояс GMT +4, время: 10:32.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.