Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 329
1

STM32F0DISCOVERY (STM32F051R8T6) настройка таймера и реализации такта в 1 мкс

20.08.2015, 15:45. Просмотров 2389. Ответов 14
Метки нет (Все метки)


Необходимо настроить таймер и получить временную границу между тиками таймера в 1мкс. Как это реализовать?
Привожу код, который у меня, он не работает. STM32F051R8T6 работает на HSE (8МГц). Пишу в Keil u5.

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
32
33
34
35
36
37
38
39
#include "stm32f0xx_tim.h"
#include "stm32f0xx_rcc.h"
#include "stm32f0xx_gpio.h"
GPIO_InitTypeDef gpioc;
TIM_TimeBaseInitTypeDef tim3;       
 
void GPIOC_init(void)
{
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC,ENABLE);
    gpioc.GPIO_Mode=GPIO_Mode_OUT;
    gpioc.GPIO_OType=GPIO_OType_PP;
    gpioc.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9;
    gpioc.GPIO_PuPd=GPIO_PuPd_NOPULL;
    gpioc.GPIO_Speed=GPIO_Speed_Level_1;
    GPIO_Init(GPIOC,&gpioc);
}
 
void TIM3_init(void)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
    TIM3->CR1|=(0<<9)|(0<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(0<<3)|(0<<2)|(1<<1);
    TIM3->PSC=7+1;
    TIM3->ARR=65534+1;
    TIM3->CR1|=(1<<0);
    }
 
int main(void)
{
    GPIOC_init();
    TIM3_init();
    
    while(1)
    {
        if(TIM3->CNT==1){GPIO_SetBits(GPIOC,GPIO_Pin_8);}
        if(TIM3->CNT==2){GPIO_ResetBits(GPIOC,GPIO_Pin_8);}
        if(TIM3->CNT==3){GPIO_SetBits(GPIOC,GPIO_Pin_8);}
        if(TIM3->CNT==4){GPIO_ResetBits(GPIOC,GPIO_Pin_8);}
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.08.2015, 15:45
Ответы с готовыми решениями:

STM32F0DISCOVERY (STM32F051R8T6) Внешнее прерывание на PA1
Проблема с настройкой внешнего прерывания на PA1 Настройки прерывания: #include...

Настройка таймера
Доброго времени суток. Господа, проблема такая: есть скрипт таймера. Нужно сделать так чтоб таймер...

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

настройка таймера/счетчика
Как настроить таймер ATmega8 на отсчет интервалов времени равных 1 сек. Я попытался настроить...

14
1279 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,884
20.08.2015, 17:21 2
Настройте прерывание таймера и из него дергайте ножки, а лучше используйте режим ШИМ, когда таймер сам будет дергать ногами. Работа с GPIO не конек ARM(ов) особенно в чипах без Bit Banding, а у Вас чип без него.
Цитата Сообщение от GaFBich Посмотреть сообщение
if(TIM3->CNT==1)
не делайте так больше, плз. Повторюсь еще раз, для этого есть прерывание.
1
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 329
20.08.2015, 18:03  [ТС] 3
Огромное спасибо, просто у меня есть прерывание на вывод PA1, так там просто идет
C
1
plen=TIM3->CNT;
0
1279 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,884
20.08.2015, 20:12 4
Цитата Сообщение от GaFBich Посмотреть сообщение
plen=TIM3->CNT;
Я не вижу это в коде.
Если Вы до ARM программировали AVR, PIC итд, то Вам придется отказаться от парадигм этих систем, здесь немного не так.
Добро пожаловать в реальность (С)
0
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 329
20.08.2015, 20:35  [ТС] 5
Да до этого тока PIC и AVR. Мне важно чтобы тик таймера был равен 1мкс, почему, так как я обрабатываю входной сигнал с передатчика, там четкие временные диапазоны для лог 1 и 0. На пике у меня было 1 тик равен 0.5мкс, я его делил на 2 и получал 1мкс, ниже обработчик прерывания для пика к примеру.
C
1
2
3
4
5
6
7
8
interrupt isr() {
    p0_len = TMR1/2;//Длительность сигнала
    TMR1 = 0;
    INTF = 0;
    INTEDG=~INTEDG;
    PR_LM75A();//Сама процедура, та что анализирует, по p0_len и p0_prev_len
    p0_prev_len = p0_len;
}
вот то же самое хочу сделать на ARM. Но при этом у меня не получается 1мкс (прием вообще бееее)
Обработчик на АРМ
C
1
2
3
4
5
6
7
8
void EXTI0_1_IRQHandler(void)
{
    p0_len = (TIM3->CNT)//1 тик ну ни как не равен 1мкс;
    TIM3->CNT=0;
    PR_LM75A();
    p0_prev_len = p0_len;
    EXTI_ClearITPendingBit(EXTI_Line1);
}
0
1279 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,884
20.08.2015, 20:44 6
Цитата Сообщение от Витальич Посмотреть сообщение
Работа с GPIO не конек ARM(ов)
Вы наверно не обратили внимание на моё замечание.
Цитата Сообщение от GaFBich Посмотреть сообщение
Обработчик на АРМ
Включите таймер в "режим захвата"
P.S. Извините но Keil плохо знаю, а синтаксис IAR несколько отличаются, примеры не привожу просто больше запутаю, ИМХО.
0
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 329
20.08.2015, 20:55  [ТС] 7
В режиме захвата?! Боюсь без Вашей чуткой справки я не смогу нормально понять что Вы имеете ввиду!
0
1279 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,884
20.08.2015, 21:03 8
http://robocraft.ru/blog/ARM/739.html
0
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 329
22.08.2015, 01:11  [ТС] 9
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include "stm32f0xx_conf.h"
#include "stm32f0xx_rcc.h"
#include "stm32f0xx_gpio.h"
#include "stm32f0xx_exti.h"
#include "stm32f0xx_tim.h"
 
GPIO_InitTypeDef gpioc;//Объявляем структуру порта GPIOC
GPIO_InitTypeDef gpioa;//Объявляем структуру порта GPIOA
GPIO_InitTypeDef gpioa6;//Объявляем структуру порта GPIOA
EXTI_InitTypeDef ext_PA1;
TIM_TimeBaseInitTypeDef timer_ic;
void GPIOC_init(void);//Инициализация структуры GPIOC для выводов PIN8 & PIN9
void GPIOA_init(void);//Инициализация структуры GPIOA для вывода PIN1
 
 
 
void TIM3_IRQHandler(void)
{
    GPIOC->ODR^= GPIO_ODR_8;//Инвертируем состояние вывода - зажигаем/гасим светодиод
    TIM3->SR &= ~TIM_SR_UIF; //Сбрасываем бит вызова прерывания.
 
}
 
void tim_ic(void)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
    TIM_TimeBaseStructInit(&timer_ic);
    timer_ic.TIM_Prescaler=8-1;
    timer_ic.TIM_Period=1;
    timer_ic.TIM_CounterMode=TIM_CounterMode_Up;
    TIM3->DIER |= TIM_DIER_UIE; //Разрешаем прерывание при переполнении счетчика
    TIM_TimeBaseInit(TIM3,&timer_ic);
    TIM_Cmd(TIM3,ENABLE);
 
}
 
 
void GPIOC_init(void)
{
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC,ENABLE);
    gpioc.GPIO_Mode=GPIO_Mode_OUT;
    gpioc.GPIO_OType=GPIO_OType_PP;
    gpioc.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9;
    gpioc.GPIO_PuPd=GPIO_PuPd_NOPULL;
    gpioc.GPIO_Speed=GPIO_Speed_Level_1;
    GPIO_Init(GPIOC,&gpioc);
}
 
void GPIOA_init(void)
{
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
    gpioa.GPIO_Mode=GPIO_Mode_IN;
    gpioa.GPIO_OType=GPIO_OType_PP;
    gpioa.GPIO_Pin=GPIO_Pin_1;
    gpioa.GPIO_PuPd=GPIO_PuPd_NOPULL;
    gpioa.GPIO_Speed=GPIO_Speed_Level_1;
    GPIO_Init(GPIOA,&gpioa);
 
    gpioa6.GPIO_Mode=GPIO_Mode_AF;
    gpioa6.GPIO_Pin=GPIO_Pin_6;
    GPIO_Init(GPIOA,&gpioa6);
}
 
void extPA1_init(void)
{
    //ext_PA1->
}
 
int main(void)
{
    NVIC_SetPriority(TIM3_IRQn, 0); //Приоритет прерывания
    NVIC_EnableIRQ(TIM3_IRQn); //Разрешаем обработку прерывания от таймера 3
    GPIOC_init();
    GPIOA_init();
    tim_ic();
 
    while(1)
    {
 
    }
}
При таком коде, с прерыванием. У меня один тик таймера составляет 8мкс?! Все настроил правильно, а предделителя как-будто нет!
0
Модератор
Эксперт по электронике
8357 / 6203 / 834
Регистрация: 14.02.2011
Сообщений: 21,562
23.08.2015, 16:39 10
Цитата Сообщение от GaFBich Посмотреть сообщение
При таком коде, с прерыванием. У меня один тик таймера составляет 8мкс?!
Цитата Сообщение от GaFBich Посмотреть сообщение
STM32F051R8T6 работает на HSE (8МГц).
во первых для того чтобы процессор зашел в прерывание,тоже нужно время
во вторых вот эта фигня
Цитата Сообщение от GaFBich Посмотреть сообщение
GPIOC->ODR^= GPIO_ODR_8;//Инвертируем состояние вывода - зажигаем/гасим светодиод
занимает как минимум 3 такта
1 считали
2 изменили
3 записали
Цитата Сообщение от GaFBich Посмотреть сообщение
TIM3->SR &= ~TIM_SR_UIF; //Сбрасываем бит вызова прерывания.
это еще три такта
еще и выход из прерывания
вывод: увеличивай частоту синхронизации
напаяй внешний кварц ( на своей дискавери я так и сделал, правда у меня 100 я поменял камень на 103,и пришпандорил оба кварца ) и работай с HSE
открой для себя программку STM32cubeSX, очень удобно настраивать перефериию, а для некоторых камней она и код генерит

Добавлено через 1 минуту
или второй вариант который предложил Витальич,
Используй аппаратный ШИМ
Цитата Сообщение от Витальич Посмотреть сообщение
а лучше используйте режим ШИМ, когда таймер сам будет дергать ногами.
0
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 329
24.08.2015, 08:56  [ТС] 11
ValeryS, если данные команды для работы с портом не атомарны, то как тогда в этом случае отрабатывает SysTick - он дает 1мкс, как у него устроено обращение к выводу?! Хотел сказать большое спасибо про подробные комментарии!
0
1279 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,884
24.08.2015, 08:59 12
В C/C++ каждая операция считается неатомарной до тех пор, пока другое не будет явно указано прозводителем компилятора или аппаратной платформы
1
Модератор
Эксперт по электронике
8357 / 6203 / 834
Регистрация: 14.02.2011
Сообщений: 21,562
24.08.2015, 09:01 13
Цитата Сообщение от GaFBich Посмотреть сообщение
если данные команды для работы с портом не атомарны,
именно с 051 я никогда не работал
но у 100 серии например есть атомарное обращение к портам BRR и BSRR регистры(установить\сбросить)
Цитата Сообщение от GaFBich Посмотреть сообщение
то как тогда в этом случае отрабатывает SysTick - он дает 1мкс, как у него устроено обращение к выводу?!
не знаю а разбираться лень
скорее всего на аппаратном уровне,таймера тоже ножками дергают на аппаратном уровне(в режиме ШИМ)
1
1279 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,884
24.08.2015, 09:04 14
Цитата Сообщение от ValeryS Посмотреть сообщение
но у 100 серии например есть атомарное обращение к портам BRR и BSRR регистры
Цитата Сообщение от Витальич Посмотреть сообщение
Работа с GPIO не конек ARM(ов) особенно в чипах без Bit Banding, а у Вас чип без него.
Цитата Сообщение от ValeryS Посмотреть сообщение
скорее всего на аппаратном уровне
так точно.
1
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 329
28.08.2015, 20:25  [ТС] 15
Подскажите, я хочу в прерывании менять свойство, к примеру по какому критерию будет срабатывать к примеру сначала по нарастающему фронту, по том по спадающему. как правильно это надо описать в самом прерывании. я делал так, но конечно же не работает))
C
1
2
3
4
5
6
7
8
9
10
11
12
13
void EXTI0_1_IRQHandler(void)
{
    p0_len = (TIM6->CNT);
    TIM6->CNT=0;
    PR_KEELOQ();
    //Pin9(0);
    if(exti.EXTI_Trigger==EXTI_Trigger_Rising)exti.EXTI_Trigger=EXTI_Trigger_Falling;
    else exti.EXTI_Trigger=EXTI_Trigger_Rising;
        exti.EXTI_LineCmd = ENABLE;    /// вкл
    GPIO_ResetBits(GPIOC,GPIO_Pin_8);
    p0_prev_len = p0_len;
    EXTI_ClearITPendingBit(EXTI_Line1);
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2015, 20:25

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

Настройка таймера в ATmega8
Здравствуйте! Необходимо сделать таймер с обратным отсчетом. Исходник уже есть. В нем не понятно...

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

Правильная настройка таймера
Не понимаю, что делаю не так. Пытаюсь делать простую задержку таймером TIM2 для мигания светодиода....

сшарп, настройка таймера
есть 2 формы, в одной задается время прохождения теста, а в другой есть таймер, который...

Настройка таймера времени
Получаю на сервере текущее время.Мне нужно вычесть из 24 часов текущее время и получить ,что...

ATmega2560 настройка таймера
Добрый день, уважаемые участники форума, В процессе изучения курса AVR и дойдя до &quot;AVR. Учебный...


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

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

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