реклама на сайте
подробности

 
 
> STM32. Функция задержки, программные задержки на таймере
Влад Р.
сообщение Jun 27 2012, 19:47
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 87
Регистрация: 9-12-10
Пользователь №: 61 511



Написал функцию задержки на базовом таймере.
В одной программе работает отлично, но вызывается правда постоянно с одним и тем же значением. В другой то ли работает криво, то ли не работает вообще:
Код
#define APB1_FREQ 24000000

void delay_ms (uint16_t volatile ms) {
  TIM7->CR1 &= ~0xFF;                               // Сбрасываем регистр управления таймера TIM7
  if (ms != 1) {                                    // Если значение задержки НЕ равно 1,
  TIM7->PSC = APB1_FREQ/1000-1;                     // настраиваем таймер TIM7 на период 1 мс,
  TIM7->ARR = ms-1;                                 // установить конечное значение счёта с учетом импульса переполнения;
  } else {                                          // иначе,
      TIM7->PSC = 2*APB1_FREQ/1000-1;               // настраиваем таймер TIM7 на период в 2 раза меньше - 0,5 мс
      TIM7->ARR = 1; }                              // установить конечное значение счёта на 1 с учетом импульса переполнения
  TIM7->CR1 |= (TIM_CR1_OPM | TIM_CR1_CEN);         // Установить режим "одного импульса" и включить таймер TIM7
  while(!(TIM7->SR & TIM_SR_UIF));                  // Дождаться конца задержки
  TIM7->SR &= ~TIM_SR_UIF;                          // Сбросить флаг прерывания
};


Не пойму почему не выдерживается задержка? wacko.gif

ЗЫ. Таймер тактирован в основной программе:
Код
RCC->APB1ENR |= RCC_APB1ENR_TIM7EN;   // Тактируем базовый таймер TIM7
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Mimik
сообщение Jun 10 2014, 11:08
Сообщение #2





Группа: Новичок
Сообщений: 1
Регистрация: 10-06-14
Пользователь №: 81 922



Всем привет, прошу вашей помощи. Устроился на новую работу, и попался мне на переделку вот такой код :
CODE
class FreqIn
{
static std::vector<FreqIn*>tims;
static int timsNum;

public:
FreqIn(TIM_TypeDef *tim_, IRQn irqnUP_, IRQn irqnCC_, uint16_t chan_, uint32_t busDiv_)
: tim(tim_)
, irqnUP(irqnUP_)
, irqnCC(irqnCC_)
, chan(chan_)
, busDiv(busDiv_)
{
prescaler = 0;
tims.push_back(this);
timsNum ++;
reset();
}

void start()
{
stop();
enable = 1;
}
void stop()
{
enable = 0;
}
void reset()
{
timerInit();
stop();
}

inline float freq() {return freq_;}
inline uint16_t holdEdge() {return holdEdge_;}
inline void setEdge(uint16_t t)
{
timerInit();
holdEdge_ = t;
}
inline uint16_t holdPrescaler() {return prescaler;}
inline void setPrescaler(uint16_t t)
{
//timerInit();
prescaler = t;
}

private:
void timerInit()
{
NVIC_DisableIRQ(irqnUP);
NVIC_DisableIRQ(irqnCC);
TIM_Cmd(tim, DISABLE);

TIM_TimeBaseInitTypeDef timer_base;
TIM_TimeBaseStructInit(&timer_base);
timer_base.TIM_Prescaler = prescaler-1; //1,2,3
timer_base.TIM_Period = 0xFFFF;
TIM_TimeBaseInit(tim, &timer_base);

TIM_ICInitTypeDef TIM_ICStructure;
TIM_ICStructure.TIM_Channel = chan; // канал
if (holdEdge_)
{
TIM_ICStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; // по заднему фронту
}
else
{
TIM_ICStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
}
TIM_ICStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; // прямо с ножки
TIM_ICStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; // без делителя
TIM_ICStructure.TIM_ICFilter = 0; // без фильтра

// эта функция и включает режим PWM input - автоматически настраивает комплементарный канал
// правда в стандартной библиотеке работает на 1 и 2 канале, на 3 и 4 - не умеет
//TIM_PWMIConfig(tim, &TIM_ICStructure);

TIM_ICInit(tim, &TIM_ICStructure);

// Выбираем источник для триггера: вход 1
TIM_SelectInputTrigger(tim, TIM_TS_TI1FP1);
// По событию от триггера счётчик будет сбрасываться.
TIM_SelectSlaveMode(tim, TIM_SlaveMode_Reset);
// Включаем события от триггера
TIM_SelectMasterSlaveMode(tim, TIM_MasterSlaveMode_Enable);

// Разрешаем таймеру генерировать прерывание по захвату
if (chan == TIM_Channel_1) TIM_ITConfig(tim, TIM_IT_CC1, ENABLE);
if (chan == TIM_Channel_2) TIM_ITConfig(tim, TIM_IT_CC2, ENABLE);
if (chan == TIM_Channel_3) TIM_ITConfig(tim, TIM_IT_CC3, ENABLE);
if (chan == TIM_Channel_4) TIM_ITConfig(tim, TIM_IT_CC4, ENABLE);

TIM_ITConfig(tim, TIM_IT_Update, ENABLE);

TIM_ClearFlag(tim, TIM_FLAG_CC1);
TIM_ClearFlag(tim, TIM_FLAG_CC2);
TIM_ClearFlag(tim, TIM_FLAG_CC3);
TIM_ClearFlag(tim, TIM_FLAG_CC4);
TIM_ClearFlag(tim, TIM_IT_Update);

// Включаем таймер
TIM_Cmd(tim, ENABLE);
// разрешаем прерывания
NVIC_SetVector(irqnUP, (uint32_t)irqHandler);
NVIC_SetVector(irqnCC, (uint32_t)irqHandler);
NVIC_EnableIRQ(irqnUP);
NVIC_EnableIRQ(irqnCC);
}

static void irqHandler()
{
for (register int i = 0; i != timsNum; ++i)
{
tims[i]->irq();
}
}

inline void captCh(int ch)
{
}

inline void irq()
{
if (TIM_GetITStatus(tim, TIM_IT_CC1) != RESET) {
TIM_ClearITPendingBit(tim, TIM_IT_CC1);
TIM_ClearITPendingBit(tim, TIM_IT_Update);

cnt = TIM_GetCapture1(tim);
freq_ = float(SystemCoreClock/busDiv)/(float(cnt) + (ovf << 16));
ovf = 0;
}
if (TIM_GetITStatus(tim, TIM_IT_CC2) != RESET) {
TIM_ClearITPendingBit(tim, TIM_IT_CC2);
TIM_ClearITPendingBit(tim, TIM_IT_Update);

cnt = TIM_GetCapture2(tim);
freq_ = float(SystemCoreClock/busDiv)/(float(cnt) + (ovf << 16));
ovf = 0;
}
if (TIM_GetITStatus(tim, TIM_IT_CC3) != RESET) {
TIM_ClearITPendingBit(tim, TIM_IT_CC3);
TIM_ClearITPendingBit(tim, TIM_IT_Update);

cnt = TIM_GetCapture3(tim);
freq_ = float(SystemCoreClock/busDiv)/(float(cnt) + (ovf << 16));
ovf = 0;
}
if (TIM_GetITStatus(tim, TIM_IT_CC4) != RESET) {
TIM_ClearITPendingBit(tim, TIM_IT_CC4);
TIM_ClearITPendingBit(tim, TIM_IT_Update);

cnt = TIM_GetCapture4(tim);
freq_ = float(SystemCoreClock/busDiv)/(float(cnt) + (ovf << 16));
ovf = 0;
}
if (TIM_GetITStatus(tim, TIM_IT_Update) != RESET) {
TIM_ClearITPendingBit(tim, TIM_IT_Update);
ovf++;
}
}

uint32_t ovf;
uint32_t cnt;
uint32_t prescaler;
float freq_;
uint16_t holdEdge_;
uint16_t chan;
uint32_t busDiv;

volatile int enable;
TIM_TypeDef *tim;
IRQn irqnUP;
IRQn irqnCC;
};


это 4 таймера для считывания частоты.
на частотах до 2-3 герц работает отлично, на 32 килогерца показывает точно 320000, но стоит выстваить к примеру 32.101 как частота съезжает и показывается как 32.104 ~ 32.117, на схеме стоит внешний предделитель.

Подскажите я уже все перекопал, ничего не помогает...

Сообщение отредактировал IgorKossak - Jun 10 2014, 13:09
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Влад Р.   STM32. Функция задержки   Jun 27 2012, 19:47
- - skripach   Ну сделайте вы по людски, что-нибуди вроде: Кодvo...   Jun 27 2012, 20:58
|- - Влад Р.   Цитата(skripach @ Jun 27 2012, 23:58) Ну ...   Jun 27 2012, 21:01
- - Сергей Борщ   QUOTE (Влад Р. @ Jun 28 2012, 00:01) что ...   Jun 27 2012, 21:21
|- - Влад Р.   Цитата(Сергей Борщ @ Jun 28 2012, 00:21) ...   Jun 27 2012, 21:37
- - AHTOXA   Попробуйте после записи значений ARR и PSC сделать...   Jun 27 2012, 21:57
|- - Влад Р.   Цитата(AHTOXA @ Jun 28 2012, 00:57) Попро...   Jun 27 2012, 22:20
- - Влад Р.   Проблема решилась установкой бита ARPE в управляющ...   Jun 27 2012, 23:45
|- - AHTOXA   Короче, так. Регистр PSC обновляется только при up...   Jun 28 2012, 03:51
|- - Влад Р.   Цитата(AHTOXA @ Jun 28 2012, 06:51) Регис...   Jun 28 2012, 11:21
|- - AHTOXA   Цитата(Влад Р. @ Jun 28 2012, 17:21) Новы...   Jun 28 2012, 16:52
|- - Влад Р.   Цитата(AHTOXA @ Jun 28 2012, 19:52) Для з...   Jun 28 2012, 17:51
|- - AHTOXA   Да, это я лопухнулся Значит, не надо уменьшать на ...   Jun 28 2012, 18:03
|- - ViKo   Цитата(AHTOXA @ Jun 28 2012, 21:03) Да, э...   Dec 22 2012, 06:53
|- - AHTOXA   Цитата(ViKo @ Dec 22 2012, 12:53) Считаю,...   Dec 22 2012, 08:50
|- - vlad_new   Нодо на 1 уменьшать. Я то же практически проверял....   Dec 22 2012, 09:07
||- - AHTOXA   Цитата(vlad_new @ Dec 22 2012, 15:07) Не ...   Dec 22 2012, 17:15
|- - HHIMERA   Цитата(AHTOXA @ Dec 22 2012, 11:50) А я п...   Dec 22 2012, 10:09
- - sgs   АНТОХА написал все правильно. Есть только один тон...   Jun 28 2012, 04:36
- - scifi   Странный выбор таймера для задержки, если только в...   Jun 28 2012, 05:39
- - ViKo   Из мануала RM0041 на STM32F100 ЦитатаThe counter c...   Dec 22 2012, 10:20
|- - HHIMERA   Цитата(ViKo @ Dec 22 2012, 14:20) То, что...   Dec 22 2012, 10:32
|- - ViKo   Даете противоречивые показания. Цитата(HHIMERA ...   Dec 22 2012, 10:50
|- - HHIMERA   Update_event = TIM_CLK/((PSC + 1)*(ARR + 1)*(RCR +...   Dec 22 2012, 11:00
||- - ViKo   Цитата(HHIMERA @ Dec 22 2012, 14:00) ... ...   Dec 22 2012, 11:13
|- - HHIMERA   Цитата(ViKo @ Dec 22 2012, 13:50) По руко...   Dec 22 2012, 11:20
|- - ViKo   Цитата(HHIMERA @ Dec 22 2012, 14:18) Спас...   Dec 22 2012, 11:46
|- - HHIMERA   Цитата(ViKo @ Dec 22 2012, 14:28) Нихрена...   Dec 22 2012, 11:58
|- - ViKo   Цитата(HHIMERA @ Dec 22 2012, 14:58) Так ...   Dec 22 2012, 12:02
- - ViKo   Сочинил задержку подлиннее. Тактовая частота подра...   Dec 23 2012, 14:16
- - ViKo   Хочу продолжить. Написать универсальную задержку, ...   Dec 28 2012, 06:26
- - NaughtyFreak   Очень наворочено Почему правда для задержки не ...   Dec 28 2012, 08:17
|- - ViKo   Цитата(NaughtyFreak @ Dec 28 2012, 11:17)...   Dec 28 2012, 09:10
- - ViKo   Типа такого, но на препроцессоре. CODE#define FT_...   Dec 28 2012, 14:07
- - polyname   ЦитатаИ усё. в зависимости от надобности кофигурир...   Dec 28 2012, 17:44
- - sidy   Поскольку в данной теме много разбирающихся в нюан...   Mar 8 2013, 19:12


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 01:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01405 секунд с 7
ELECTRONIX ©2004-2016