0 / 0 / 0
Регистрация: 10.06.2016
Сообщений: 27
1

STM32F407VG Basic Timer 6 Магическое число

18.09.2016, 12:51. Показов 3645. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, с помощью таймера 6 делаю простейшую задержку, в которой есть небольшая погрешность (~0.4 µs), но это на данном этапе не особо критично.
Вот мой код:
Код
#define DELAY_TIME       10
#define PB2_ON()         GPIOB->BSRRL = GPIO_Pin_2
#define PB2_OFF()        GPIOB->BSRRH = GPIO_Pin_2

//Config PortB_Pin2 as output
void PortB_Init(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

GPIO_InitTypeDef PortB_Pin2_init;

PortB_Pin2_init.GPIO_Mode = GPIO_Mode_OUT;
PortB_Pin2_init.GPIO_Pin = GPIO_Pin_2;
PortB_Pin2_init.GPIO_Speed = GPIO_Speed_100MHz;
PortB_Pin2_init.GPIO_OType = GPIO_OType_PP;
PortB_Pin2_init.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_Init(GPIOB, &PortB_Pin2_init);
}

//Timer 6 config
void Timer6_Init(void)
{
RCC->APB1ENR |= RCC_APB1Periph_TIM6; // Enable Timer 6 clock

TIM6->PSC = 83;  // Clock frequency: 1MHz
TIM6->ARR = 0xFFFF; // Auto-retood rikystir value
// After reaching this value appears Update Ivimt omd Counter Register will be risit
TIM6->CR1 |= TIM_CR1_CEN; //TIM6 Enable
}

//Delay-func. Count µs
void ddelay_mysros(uint16_t delay_time)
{
TIM6->CNT = 0;
while (TIM6->CNT != delay_time) ;
return;
}

void main(void)
{
SystemInit();
PortB_Init();
Timer6_Init();

RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq(&RCC_Clocks);

while(1)
{
PB2_ON();
ddelay_mysros(DELAY_TIME);
PB2_OFF();
ddelay_mysros(DELAY_TIME);
}
}
Динный код работает, задержка при этом составляет около 10,6 µs.
Также при задании DELAY_TIME: 15, 20, 1000 получаются корректные временные интервалы.
НО! если я выставляю DELAY_TIME = 12, то задержка в этом случае составляет 420 ns!
Кто-нибудь может подсказать что я упускаю?

UPD: на Timer7 такая же ерунда.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.09.2016, 12:51
Ответы с готовыми решениями:

Объясните поведение basic таймера ( basic timer )
Голова вскипела, выручайте :) CooCox 1.7.0 STM32VLDISCOVERY (STM32F100RB) Не могу объяснить...

STM32F103C8T6 Basic Timer
Использую таймер TIM6 как счетчик (1тик- 1мкс), необходимо для обработки внешнего прерывания на...

Магическое число 10
Есть десяток ресурсов одной и той же тематики. Ресурсы разные практически во всем - некоторые на...

Магическое число 1
Что-то вот есть в этих 1. Не знаю даже как описать. Так приятно когда видишь, что 1см тебя ждет или...

Магическое число
Ребят, почему постоянно пишется, что моё число меньше магического? Но если убрать...

13
0 / 0 / 0
Регистрация: 02.06.2016
Сообщений: 241
18.09.2016, 14:54 2
Неправильно проверять CNT сравнением в коде, используйте прерывания по конкретному событию таймера.
0
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
18.09.2016, 15:32 3
Или хотя бы чтение атомарным сделайте
0
0 / 0 / 0
Регистрация: 10.06.2016
Сообщений: 27
18.09.2016, 20:11 4
Цитата Сообщение от Висиль Казирь
Неправильно проверять CNT сравнением в коде, используйте прерывания по конкретному событию таймера.
А как можно обойтись без прерываний?
Я просто хочу ещё таким способом измерять duty cycle ШИМ сигнала. Т.е. на ножку подключен ШИМ сигнал, эта нога настроена на внешнее прерывание по фронту и по спаду. По фронту сигналу значение счётного регистра обнуляется, по спаду значение забирается. Это тоже плохая реализация?
0
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
18.09.2016, 20:44 5
Пусть таймер пинает дма, который будет считывать значение DWT счётчика, иногда помогает.
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
18.09.2016, 21:12 6
dymf_99, это делается одним таймером аппаратно.
Вот же убогие дети SPL и калокуба...
0
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
18.09.2016, 22:26 7
Цитата Сообщение от Hotd
Или хотя бы чтение атомарным сделайте
ну чтение 32-бит оно как бы атомарное и так
Цитата Сообщение от Висиль Казирь
Неправильно проверять CNT сравнением в коде
Согласен, что сравнивать на совпадение таймер опасно. Надо сравнивать на "меньше". в этом случае если мы провтыкаем тик таймера, то ничего страшного не произойдет

а по поводу измерения периода шим - я как-то в статье описывал такую фишку для анализа протокола IR, почитай, как это аппаратно делается, о чем собственно брызжет говном dosykus
http://we.iosyitistromyss.ru/STM32/ir-u ... ast-1.html
0
0 / 0 / 0
Регистрация: 10.06.2016
Сообщений: 27
19.09.2016, 12:06 8
Цитата Сообщение от Stiit.mi
Согласен, что сравнивать на совпадение таймер опасно. Надо сравнивать на "меньше". в этом случае если мы провтыкаем тик таймера, то ничего страшного не произойдет

а по поводу измерения периода шим - я как-то в статье описывал такую фишку для анализа протокола IR, почитай, как это аппаратно делается, о чем собственно брызжет говном dosykus
http://we.iosyitistromyss.ru/STM32/ir-u ... ast-1.html
Да, спасибо, про меньше я уже понял.
Насколько я понимаю, в режиме input capture значения нужно забирать в прерывании. Но дело в том что я в своей программе использую уже несколько прерываний. И мне бы не хотелось использовать ещё одно. Я использую внешнее прерывание для ШИМ сигнала, так как взависимости от фронта или спада мне необходимо выставлять определённые флаги необходимые для функции main(). Поэтому я и хотел использовать уже имеющееся прерывание для измерения интервалов времени, а не прыгать в ещё одно и забирать оттуда значения.
0
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
19.09.2016, 14:16 9
Цитата Сообщение от dymf_99
Насколько я понимаю, в режиме input capture значения нужно забирать в прерывании.
как бы это крамольно не звучало, но никто не мешает тебе поллить соответствующие флаги и реагировать вообще без прерываний. Главное - чтобы успевал опрашивать.

Нужно отдавать себе отчет и точно представлять требования к реакции системы. Если это обработка клавиатуры, то сотня миллисекунд вообще ничего не решает. Не заметишь разницы. А если это какой-то 1-wire, то тут уже без микросекундного таймера никуда.
0
0 / 0 / 0
Регистрация: 02.06.2016
Сообщений: 241
19.09.2016, 16:53 10
Цитата Сообщение от dymf_99
Насколько я понимаю, в режиме input capture значения нужно забирать в прерывании. Но дело в том что я в своей программе использую уже несколько прерываний. И мне бы не хотелось использовать ещё одно.
Ничего страшного тут нет, главное в теле прерывания занимать как можно меньше времени и рассчитывать так, чтобы слишком часто не вызывались и всё будет хорошо.
0
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
19.09.2016, 18:46 11
Цитата Сообщение от Висиль Казирь
Цитата Сообщение от dymf_99
Насколько я понимаю, в режиме input capture значения нужно забирать в прерывании. Но дело в том что я в своей программе использую уже несколько прерываний. И мне бы не хотелось использовать ещё одно.
Ничего страшного тут нет, главное в теле прерывания занимать как можно меньше времени и рассчитывать так, чтобы слишком часто не вызывались и всё будет хорошо.
... и не забыть про атомарность, volatile и memory barriers ))
0
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
19.09.2016, 19:33 12
А вот чтение значения таймера - действительно ли атомарное? Натыкался на грабли, когда менял на лету частоту таймера, значения портились. Возможно это из-за внутренней буферизации значения ARR таймера, но пока не сделал запись атомарной грабли не исчезли.
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
19.09.2016, 20:32 13
Буфер у ARR отключаемый...
0
Oxford
19.09.2016, 20:44 14
Ага есть такое дело регистр CR1 бит ARPE
19.09.2016, 20:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.09.2016, 20:44
Помогаю со студенческими работами здесь

Магическое число
Я создаю текстовую игру на Python. Цель такова: Компьютер загадывает число от 1 до 100, и игрок...

Магическое число 0х53
При попытке прошить МК мега32А выдает сообщение об ошибке ...

Std::bad_alloc магическое число
Читаю байты из файла вылетает ошибка:Unhandled exception at 0x75A6C41F in Fourie With File.exe:...

Магическое число и ф-ция goto
Помогите усовершенствовать программку ,пожалуйста) После того как угадал число --- Возвращать в...

Магическое число 93368853 в виртуальном CListCtrl
Привет ребята. Вот на досуге решил попробовать выжать максимум из CListCtrl с флагом...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru