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

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

20.08.2015, 15:45. Просмотров 1672. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.08.2015, 15:45
Ответы с готовыми решениями:

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

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

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

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

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

14
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
20.08.2015, 17:21 2
Настройте прерывание таймера и из него дергайте ножки, а лучше используйте режим ШИМ, когда таймер сам будет дергать ногами. Работа с GPIO не конек ARM(ов) особенно в чипах без Bit Banding, а у Вас чип без него.
Цитата Сообщение от GaFBich Посмотреть сообщение
if(TIM3->CNT==1)
не делайте так больше, плз. Повторюсь еще раз, для этого есть прерывание.
1
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 309
20.08.2015, 18:03  [ТС] 3
Огромное спасибо, просто у меня есть прерывание на вывод PA1, так там просто идет
C
1
plen=TIM3->CNT;
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
20.08.2015, 20:12 4
Цитата Сообщение от GaFBich Посмотреть сообщение
plen=TIM3->CNT;
Я не вижу это в коде.
Если Вы до ARM программировали AVR, PIC итд, то Вам придется отказаться от парадигм этих систем, здесь немного не так.
Добро пожаловать в реальность (С)
0
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 309
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
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
20.08.2015, 20:44 6
Цитата Сообщение от Витальич Посмотреть сообщение
Работа с GPIO не конек ARM(ов)
Вы наверно не обратили внимание на моё замечание.
Цитата Сообщение от GaFBich Посмотреть сообщение
Обработчик на АРМ
Включите таймер в "режим захвата"
P.S. Извините но Keil плохо знаю, а синтаксис IAR несколько отличаются, примеры не привожу просто больше запутаю, ИМХО.
0
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 309
20.08.2015, 20:55  [ТС] 7
В режиме захвата?! Боюсь без Вашей чуткой справки я не смогу нормально понять что Вы имеете ввиду!
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
20.08.2015, 21:03 8
http://robocraft.ru/blog/ARM/739.html
0
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 309
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
ValeryS
Модератор
7484 / 5666 / 726
Регистрация: 14.02.2011
Сообщений: 19,374
Завершенные тесты: 1
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
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 309
24.08.2015, 08:56  [ТС] 11
ValeryS, если данные команды для работы с портом не атомарны, то как тогда в этом случае отрабатывает SysTick - он дает 1мкс, как у него устроено обращение к выводу?! Хотел сказать большое спасибо про подробные комментарии!
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
24.08.2015, 08:59 12
В C/C++ каждая операция считается неатомарной до тех пор, пока другое не будет явно указано прозводителем компилятора или аппаратной платформы
1
ValeryS
Модератор
7484 / 5666 / 726
Регистрация: 14.02.2011
Сообщений: 19,374
Завершенные тесты: 1
24.08.2015, 09:01 13
Цитата Сообщение от GaFBich Посмотреть сообщение
если данные команды для работы с портом не атомарны,
именно с 051 я никогда не работал
но у 100 серии например есть атомарное обращение к портам BRR и BSRR регистры(установить\сбросить)
Цитата Сообщение от GaFBich Посмотреть сообщение
то как тогда в этом случае отрабатывает SysTick - он дает 1мкс, как у него устроено обращение к выводу?!
не знаю а разбираться лень
скорее всего на аппаратном уровне,таймера тоже ножками дергают на аппаратном уровне(в режиме ШИМ)
1
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
24.08.2015, 09:04 14
Цитата Сообщение от ValeryS Посмотреть сообщение
но у 100 серии например есть атомарное обращение к портам BRR и BSRR регистры
Цитата Сообщение от Витальич Посмотреть сообщение
Работа с GPIO не конек ARM(ов) особенно в чипах без Bit Banding, а у Вас чип без него.
Цитата Сообщение от ValeryS Посмотреть сообщение
скорее всего на аппаратном уровне
так точно.
1
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 309
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
28.08.2015, 20:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2015, 20:25

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

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

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


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

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

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