|
STM32. Функция задержки, программные задержки на таймере |
|
|
|
Jun 27 2012, 19:47
|
Частый гость
 
Группа: Свой
Сообщений: 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; // Сбросить флаг прерывания }; Не пойму почему не выдерживается задержка? ЗЫ. Таймер тактирован в основной программе: Код RCC->APB1ENR |= RCC_APB1ENR_TIM7EN; // Тактируем базовый таймер TIM7
|
|
|
|
|
 |
Ответов
|
Jun 10 2014, 11:08
|
Группа: Новичок
Сообщений: 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] - для короткого!!!
|
|
|
|
Сообщений в этой теме
Влад Р. 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|