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

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

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

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

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

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


 
Опции темы
Непрочитано 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,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
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,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
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,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
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 6166 19.02.2024 18:22
Прерывание по совпадению таймера 1 gruffi AVR 38 21.10.2016 22:58
stm32 после запуска ADC1 не выставляется EOC kvark85 ARM 1 03.07.2013 11:29


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot