0 / 0 / 0
Регистрация: 10.06.2016
Сообщений: 27
|
|
1 | |
STM32F407VG Basic Timer 6 Магическое число18.09.2016, 12:51. Показов 3645. Ответов 13
Метки нет (Все метки)
Здравствуйте, с помощью таймера 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); } } Также при задании DELAY_TIME: 15, 20, 1000 получаются корректные временные интервалы. НО! если я выставляю DELAY_TIME = 12, то задержка в этом случае составляет 420 ns! Кто-нибудь может подсказать что я упускаю? UPD: на Timer7 такая же ерунда.
0
|
18.09.2016, 12:51 | |
Ответы с готовыми решениями:
13
Объясните поведение basic таймера ( basic timer ) STM32F103C8T6 Basic Timer Магическое число 10 Магическое число 1 Магическое число |
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 |
Сообщение от Висиль Казирь
Я просто хочу ещё таким способом измерять 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
Сообщение от Висиль Казирь
а по поводу измерения периода шим - я как-то в статье описывал такую фишку для анализа протокола 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
Насколько я понимаю, в режиме input capture значения нужно забирать в прерывании. Но дело в том что я в своей программе использую уже несколько прерываний. И мне бы не хотелось использовать ещё одно. Я использую внешнее прерывание для ШИМ сигнала, так как взависимости от фронта или спада мне необходимо выставлять определённые флаги необходимые для функции main(). Поэтому я и хотел использовать уже имеющееся прерывание для измерения интервалов времени, а не прыгать в ещё одно и забирать оттуда значения.
0
|
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
|
|
19.09.2016, 14:16 | 9 |
Сообщение от dymf_99
Нужно отдавать себе отчет и точно представлять требования к реакции системы. Если это обработка клавиатуры, то сотня миллисекунд вообще ничего не решает. Не заметишь разницы. А если это какой-то 1-wire, то тут уже без микросекундного таймера никуда.
0
|
0 / 0 / 0
Регистрация: 02.06.2016
Сообщений: 241
|
|
19.09.2016, 16:53 | 10 |
Сообщение от dymf_99
0
|
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
|
|
19.09.2016, 18:46 | 11 |
Сообщение от Висиль Казирь
... и не забыть про атомарность, 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 | |
19.09.2016, 20:44 | |
Помогаю со студенческими работами здесь
14
Магическое число Магическое число 0х53 Std::bad_alloc магическое число Магическое число и ф-ция goto Магическое число 93368853 в виртуальном CListCtrl Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |