Долгое время потратил на организацию единичного отсчета времени. В итоге: после первого запуска 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 при первом запуске. подскажите, может чего то недопонял
stm32 после старта TIM6 сразу прерывание
- kvark85
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Сб ноя 08, 2008 21:23:06
- Откуда: Харьков
- Контактная информация:
Re: stm32 после старта TIM6 сразу прерывание
как это часто бывает после создания темы - разобрался. в инициализацию прерывания надо добавить
TIM6->EGR |= TIM_EGR_UG;
TIM6->SR1 &= ~(TIM_SR1_UIF);
в целом ф-я инициализации таймера выглядит так:
void TIM6_init(void)
{
RCC->APB1ENR |= RCC_APB1ENR_TIM6EN; //подаем тактирование на TIM6
TIM6->PSC = 24000 - 1; // Настраиваем делитель что таймер тикал 1000 раз в секунду
TIM6->ARR = 1000 ; // Чтоб прерывание случалось раз в секунду
TIM6->DIER |= TIM_DIER_UIE; //разрешаем прерывание от таймера
TIM6->CR1 |= TIM_CR1_OPM; //рижем одиночного импульса
TIM6->EGR |= TIM_EGR_UG; //Update generation
TIM6->SR &= ~TIM_SR_UIF; //Сбрасываем флаг UIF
NVIC_EnableIRQ(TIM6_DAC_IRQn); //Разрешение TIM6_DAC_IRQn прерывания
// TIM6->CR1 |= TIM_CR1_CEN; // Начать отсчёт! )(закоментированно так как стартую тогда когда надо, а не в момент инициализации)
}
TIM6->EGR |= TIM_EGR_UG;
TIM6->SR1 &= ~(TIM_SR1_UIF);
в целом ф-я инициализации таймера выглядит так:
void TIM6_init(void)
{
RCC->APB1ENR |= RCC_APB1ENR_TIM6EN; //подаем тактирование на TIM6
TIM6->PSC = 24000 - 1; // Настраиваем делитель что таймер тикал 1000 раз в секунду
TIM6->ARR = 1000 ; // Чтоб прерывание случалось раз в секунду
TIM6->DIER |= TIM_DIER_UIE; //разрешаем прерывание от таймера
TIM6->CR1 |= TIM_CR1_OPM; //рижем одиночного импульса
TIM6->EGR |= TIM_EGR_UG; //Update generation
TIM6->SR &= ~TIM_SR_UIF; //Сбрасываем флаг UIF
NVIC_EnableIRQ(TIM6_DAC_IRQn); //Разрешение TIM6_DAC_IRQn прерывания
// TIM6->CR1 |= TIM_CR1_CEN; // Начать отсчёт! )(закоментированно так как стартую тогда когда надо, а не в момент инициализации)
}