Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
1 / 1 / 1
Регистрация: 20.03.2017
Сообщений: 121
1

Правильная настройка таймера

29.03.2019, 09:45. Просмотров 538. Ответов 7
Метки нет (Все метки)

Не понимаю, что делаю не так. Пытаюсь делать простую задержку таймером TIM2 для мигания светодиода. Хочу, чтобы светодиод моргал каждую секунду без прерываний таймера. Но светодиод все время горит. Меняя значения PSC и ARR можно увидеть, что светодиод моргает, но гаснет не полностью.
Настройки частоты работы МК нет. Значит он работает на 8МГц. Устанавливаю в PSC=8000-1 => тики на таймер будут поступать каждую 1мс. Устанавливаю в ARR = 1000-1 => таймер будет считать до 1с. Но в жизни все не так. Как исправить?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <STM32F4xx.h>
 
 
void io_init (){
    RCC->AHB1ENR        |=1<<3;                 //Enable port D
    GPIOD->MODER        |=0x55000000;   //PD12-PD15 - push-pull outputs
    GPIOD->OSPEEDR  |=0xFF000000;       //Fastest front for PD12-PD15
}
 
 
void timer2_init(unsigned int delay){
    RCC->APB1ENR     |= 1<<0;               //Enable timer2
    TIM2->PSC               = 8000-1;           
    TIM2->ARR               = delay-1;  
    TIM2->CR1                  |= 1<<0;                 
}
 
unsigned int t=1000;  //delay in ms
 
int main (void)
{
    io_init();
    timer2_init(t);
    while(1)
        {       
                GPIOD->ODR      |=(1<<15);  //PD15 output 1
                while(TIM2->CNT < t);
                GPIOD->ODR      &=~(1<<15); //PD15 output 0
                while(TIM2->CNT < t);
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.03.2019, 09:45
Ответы с готовыми решениями:

[РЕШЕНО]Настройка таймера
Добрый день, форумчане. Не получается никак настроить таймер (TIM3), чтобы прерывание было раз в...

Настройка таймера на шим и прерывание
Здравствуйте! Мне нужно настроить таймер на шим с прерыванием по спадающему фронту. Собираю проект...

STM32VL Discovery настройка таймера
Здравствуйте. Пытаюсь научиться нормально работать с учебной платкой STM32VL Dyscovery. Пока...

Настройка работы таймера stm32f4 discovery
Настраивается таймер: TIM_TimeBaseInitTypeDef base_timer;...

7
Модератор
Эксперт по электронике
8329 / 6181 / 829
Регистрация: 14.02.2011
Сообщений: 21,474
29.03.2019, 09:57 2
Цитата Сообщение от lipton_v Посмотреть сообщение
Но в жизни все не так
а как?
Цитата Сообщение от lipton_v Посмотреть сообщение
void timer2_init(unsigned int delay
16 битные там счетчики, следовательно надо писать
C
1
void timer2_init(unsigned short int delay)
Цитата Сообщение от lipton_v Посмотреть сообщение
while(TIM2->CNT < t);
и когда мы выйдем из цикла?
0
1 / 1 / 1
Регистрация: 20.03.2017
Сообщений: 121
29.03.2019, 10:49  [ТС] 3
Выйдет из цикла когда на таймере будет 1000
0
Модератор
Эксперт по электронике
8329 / 6181 / 829
Регистрация: 14.02.2011
Сообщений: 21,474
29.03.2019, 11:06 4
Цитата Сообщение от lipton_v Посмотреть сообщение
Выйдет из цикла когда на таймере будет 1000
а оно там будет?
0
1 / 1 / 1
Регистрация: 20.03.2017
Сообщений: 121
29.03.2019, 11:14  [ТС] 5
C
1
while(TIM2->CNT < (t-1));
- так тоже ничего не происходит
0
Модератор
Эксперт по электронике
8329 / 6181 / 829
Регистрация: 14.02.2011
Сообщений: 21,474
29.03.2019, 11:20 6
Цитата Сообщение от lipton_v Посмотреть сообщение
так тоже ничего не происходит
и не будет
CNT считает до значения записного в ARR , дальше идет обнуление CNT (счет вверх)
а что у тебя записано в ARR ? t-1
и когда выполнится условие
C
1
(( t-1)< (t-1))
0
1 / 1 / 1
Регистрация: 20.03.2017
Сообщений: 121
29.03.2019, 12:36  [ТС] 7
Вот так вроде работает. Но вначале есть слабое горение светодиода, потом моргает нормально.
C
1
2
3
4
5
6
unsigned short int t=2000;  //delay in ms
 
GPIOD->ODR      |=(1<<15);  //PD15 output 1
                while(TIM2->CNT < (t/2-1));
                GPIOD->ODR      &=~(1<<15); //PD15 output 0
                while(TIM2->CNT < (t-1));
0
Модератор
Эксперт по электронике
8329 / 6181 / 829
Регистрация: 14.02.2011
Сообщений: 21,474
29.03.2019, 15:51 8
Цитата Сообщение от lipton_v Посмотреть сообщение
Вот так вроде работает.
почитай уже что такое флаги, в частности таймера
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.03.2019, 15:51

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

STM32F0DISCOVERY (STM32F051R8T6) настройка таймера и реализации такта в 1 мкс
Необходимо настроить таймер и получить временную границу между тиками таймера в 1мкс. Как это...

Настройка лап и таймера 1 для PWM контроллера STM32F103VET6
Доброго дня. Понадобилось тут сделать один девайс на вышеуказанном контроллере. До этого работал...

PIC16F887 настройка таймера
Здравствуйте! Начал изучать pic контролеры. Таймер запустился таким образом(пример с даташита): ...

Правильная настройка c3560
Здравствeйте! Проблема такова: Есть коммутатор 3560. В порт Ga 0/0 заходит сеть 10.0.0.0/30, в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.