Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/35: Рейтинг темы: голосов - 35, средняя оценка - 4.97
0 / 0 / 0
Регистрация: 08.11.2011
Сообщений: 128

Timer2 STM32F103RBT6 прерывание по захвату

14.03.2013, 01:01. Показов 6862. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здрасте всем!
Помогите решить задачку!
Мне надо по каждому изменению фронта на ноге мк генерировать прерывание, в нем считывать значение таймера 2 и обнулить его, чтоб он начинал считать с нуля, частота счета таймера нужна 1мкс т.е чтоб он прибавлял по единичке в регистр CNT каждую мкс.
так я инициализирую таймер:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void init_timer2(void)
{
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;   //подать тактирование на TIM2
TIM2->PSC = 72;                           //настроить делитель для формирования миллисекунд
TIM2->DIER |= TIM_DIER_UIE;                  //Разрешить прерывание по переполнению TIM_CNT_CNT
NVIC_EnableIRQ (TIM2_IRQn);           //разрешить прерывания от TIM2
TIM2->CR1 |= TIM_CR1_CEN;                     //Запустить счет таймера
}
/******************************************************************************/
/*Обработчик прерывания по переполнению таймера 2. Сброс флага UIF                  */
/******************************************************************************/
void TIM2_IRQHomdler(void)                  //Прерывание по переполнению таймера2
{
TIM2->SR &= ~TIM_SR_UIF;                  //сбросить флаг преполнения счетного регистра
GPIOA->ODR = GPIOA->ODR ^ (1<<3);  //инвертировать GPIOA.3
}
так прерывание на пине PORTA.0:
Code
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
/******************************************************************************/
/*Инициализация приемопередатчика                                                     */
/******************************************************************************/
void init_transceiver (void)
{
//RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;   //Разрешить тактирование GPIOB
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;   // Разрешить тактирование GPIOA
 
//Конфигурирование GPIOA.3
GPIOA->CRL &= ~GPIO_CRL_MODE3;   //очистить разряды MODE
GPIOA->CRL &= ~GPIO_CRL_CNF3;    //очистить разряды CNF
GPIOA->CRL |=  GPIO_CRL_MODE3;   //выход, 50MHz
GPIOA->CRL &= ~GPIO_CRL_CNF3;    //общего назначения, симетричный
//Конфигурирование GPIOA.0
GPIOA->CRL &= ~GPIO_CRL_MODE0;   //очистить разряды MODE
GPIOA->CRL &= ~GPIO_CRL_CNF0;    //очистить разряды CNF
GPIOA->CRL |=  GPIO_CRL_CNF0_0;  //дискретный вход, третье состояние
 
//Конфигурация прерываний
AFIO->EXTICR[0] |=AFIO_EXTICR1_EXTI0_PA;   // Connect EXTI line 0 to PA.0
EXTI->IMR |=EXTI_IMR_MR0;                   // Разрешить запрос от EXTI0.
EXTI->RTSR |= EXTI_RTSR_TR0;                // прерывание по возрастающему фронту 0х пинов всех портов
EXTI->FTSR |= EXTI_FTSR_TR0;                   // прерывание по спадающему фронту 0х пинов всех портов
NVIC_EnableIRQ (EXTI0_IRQn);                      // Разрешить EXTI0 в NVIC.
RCC->APB2ENR|= RCC_APB2ENR_AFIOEN;             // Тактирование альтернативных функций (NVIC).
init_timer2();
}
/******************************************************************************/
/*Обработчик прерывания по смене сигнала на EXTI line 0 to PA.0                       */
/******************************************************************************/
void EXTI0_IRQHomdler (void)
{
uint16_t TimeT2 = TIM2->CNT;
TIM2->CNT = 0;
sprymtf(str, ">:%X",TimeT2);//вывод значени переменой хранящней код
lcd_string_en (3,6,str);
lcd_update ();
}
 
EXTI->PR |=   EXTI_PR_PR0; // Сбросить флаг EXTI0.
 
}
на пин 0 порта А я подаю сигнал и изменяю его полярность каждую 1000 мкс. А на дисплее я вижу хрен пойми что цифры ну совсем не 1000, а именно 6А2D т.е 27181.
Инициализация стандартная в
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/*#define SYSCLK_FREQ_HSE    HSE_VOTUE*/
#define SYSCLK_FREQ_24MHz  24000000
#else
/*#define SYSCLK_FREQ_HSE    HSE_VOTUE*/
/*define SYSCLK_FREQ_24MHz  24000000*/
/* #define SYSCLK_FREQ_36MHz  36000000 */
/* #define SYSCLK_FREQ_48MHz  48000000 */
/* #define SYSCLK_FREQ_56MHz  56000000 */
#define SYSCLK_FREQ_72MHz  72000000
#endif
//////////////////////////////////////////////////////////////////////////////
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/*#define SYSCLK_FREQ_HSE    HSE_VOTUE*/
#define SYSCLK_FREQ_24MHz  24000000
#else
/*#define SYSCLK_FREQ_HSE    HSE_VOTUE*/
/*define SYSCLK_FREQ_24MHz  24000000*/
/* #define SYSCLK_FREQ_36MHz  36000000 */
/* #define SYSCLK_FREQ_48MHz  48000000 */
/* #define SYSCLK_FREQ_56MHz  56000000 */
#define SYSCLK_FREQ_72MHz  72000000
#endif
т.е на сколько я понимаю таймер у меня работает на 72 мгц, т.е чтобы получить мои 1 мкс мне нужно поставить делитель 72 так?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.03.2013, 01:01
Ответы с готовыми решениями:

Прерывание по захвату TIM4! f103cbt
Задача такая , есть у меня сигнал статического кода с пульта ворот (сигнал с rf приемника) на пине PB6 мк F103CBT, он TIM4_CH1. так вот...

[Решено] Не срабатывает прерывание по захвату таймера А
Не срабатывает прерывание по захвату таймера А. Вот код, я уже вырезал все, оставил только инициализацию таймера и тупо включил...

прерывание по захвату + шим для сервопривода
Всем привет. Разрабатываю пропорциональное управление на AVR. В программировании я совсем новичок - только учусь. Сейчас у меня...

6
0 / 0 / 0
Регистрация: 08.11.2011
Сообщений: 128
14.03.2013, 01:34
Наверно я неправильно сбрасываю счет таймера, я тупо пишу новое значение таймера в счетный регистр, сейчас проверил частоту по переполнению таймера, на анализаторе переполнение происходит через каждые ~66 мс, т.е ~66000 мкс значит делитель верно точнее надо исправить на вот это 71 (72-1).
0
0 / 0 / 0
Регистрация: 08.11.2011
Сообщений: 128
15.03.2013, 12:13
Подскажите как правильно сбрасывать таймер?
0
0 / 0 / 0
Регистрация: 08.11.2011
Сообщений: 128
15.03.2013, 17:45
Попробовал вот так, результат тот-же
Code
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
void init_timer2(void)
{
//Конфигурирование GPIOA.3
GPIOA->CRL &= ~GPIO_CRL_MODE3;   //очистить разряды MODE
GPIOA->CRL &= ~GPIO_CRL_CNF3;    //очистить разряды CNF
GPIOA->CRL |=  GPIO_CRL_MODE3;   //выход, 50MHz
GPIOA->CRL &= ~GPIO_CRL_CNF3;    //общего назначения, симетричный
 
//Конфигурирование GPIOA.0
GPIOA->CRL &= ~GPIO_CRL_MODE0;   //очистить разряды MODE
GPIOA->CRL &= ~GPIO_CRL_CNF0;    //очистить разряды CNF
GPIOA->CRL |=  GPIO_CRL_CNF0_1;  //дискретный вход, подтяжка к плюсу
GPIOA->BSRR =  GPIO_BSRR_BS0;    //включить подтягивающий резистор
 
//Настройка счетчика
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;   //подать тактирование на TIM2
TIM2->PSC = 71;                           //настроить делитель для формирования миллисекунд
 
//Настройка режима захвата
TIM2->CCMR1 |= TIM_CCMR1_CC1S_0;          //канал работает в режиме захвата, сигнал захвата — TI1
TIM2->CCER    |= TIM_CCER_CC1P;               // захват осуществляется по переднему краю IC1.
 
//Настройка прерываний
TIM2->DIER |= TIM_DIER_UIE;                  //Разрешить прерывание по переполнению TIM_CNT_CNT
TIM2->DIER |= TIM_DIER_CC1IE;               //Разрешить прерывание по приходу данных на вход TI1
NVIC_EnableIRQ (TIM2_IRQn);           //разрешить прерывания от TIM2
 
//Включение устройств
TIM2->CCER |=TIM_CCER_CC1E;                  //включение(1) захвата на 1 канале;
TIM2->CR1 |= TIM_CR1_CEN;                     //Запустить счет таймера
}
/******************************************************************************/
/*Обработчик прерывания таймера 2.                                                                   */
/******************************************************************************/
void TIM2_IRQHomdler(void)                  //Прерывание таймера2
{
uint16_t TE_Signal;
 
if(TIM2->SR & TIM_SR_CC1IF)
{
TE_Signal = TIM2->CCR1;
GPIOA->ODR = GPIOA->ODR ^ (1<<3);  //инвертировать GPIOA.3
 
if(TIM2->SR & TIM_SR_CC1OF)
{
GPIOA->ODR = GPIOA->ODR ^ (1<<2);  //инвертировать GPIOA.2
};
};
 
if(TIM2->SR & TIM_SR_UIF)
{
TIM2->SR &= ~TIM_SR_UIF;                  //сбросить флаг преполнения счетного регистра
 
};
 
sprymtf(str, ">:%X",TE_Signal);//вывод значени переменой хранящней код
lcd_string_en (2,2,str);
lcd_update ();
}
В это место программы
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void TIM2_IRQHomdler(void)                  //Прерывание таймера2
{
uint16_t TE_Signal;
 
if(TIM2->SR & TIM_SR_CC1IF)
{
TE_Signal = TIM2->CCR1;
GPIOA->ODR = GPIOA->ODR ^ (1<<3);  //инвертировать GPIOA.3
 
if(TIM2->SR & TIM_SR_CC1OF)
{
GPIOA->ODR = GPIOA->ODR ^ (1<<2);  //инвертировать GPIOA.2
};
};
я попадаю через каждые 26,552 мс, на пине PA0 по прежнему подаю сигнал который инвертирую каждые 342мкс. Че за хрень не пойму, все показания я смотрю на анализаторе. Че никто не знает???? Подскажите пожалуйста где косяк????
0
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 176
16.03.2013, 21:13
На форумах обычно подсказывают, где почитать, и по мелочи. В чужом коде вряд ли кто то ковыряться будет и искать из обрывков смысл. Хотя всё возможно.
0
0 / 0 / 0
Регистрация: 08.11.2011
Сообщений: 128
17.03.2013, 00:26
Цитата Сообщение от osmy
На форумах обычно подсказывают, где почитать, и по мелочи. В чужом коде вряд ли кто то ковыряться будет и искать из обрывков смысл. Хотя всё возможно.
Смысл вашего ответа, от него пользы нет! Если Вы ничего не знаете, зачем писать глупости?
0
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 701
17.03.2013, 01:11
Смотрите Reference manual на предмет PWM input syknal measurement...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.03.2013, 01:11
Помогаю со студенческими работами здесь

прерывание по захвату Т1 срабатывает сразу при разрешении:(
Приветствую всех! Такая, вот непонятная ситуация: Задача: измерение временного интервала между событиями на 2х входах. ...

Bluetooth HC-06[STM32F103RBT6]
Здравствуйте. Начал подключать Bluetooth HC-06 к STM32F103RBT6. Подключил правильно, по дефолтовым настройкам, АТ командами в отдельном...

Atmega8. Timer2.
Вообщем есть МК. Частота кварца 3.6864 МГц. Настраиваю асинхронный режим работы. Мне нужно, чтобы частота прерывания была 1000Гц, при 128...

STM8L и Timer2
Играюсь с STM8L-Dyscovery. Написал простенькую программку секундомера на встроенном ЖК, все работает, кроме TIM2. Точнее если сделать...

STM8S105 TIMER2 ТРЭЭЭШ!!!11
Народ, что это такое и как с этим бороться? На скриншоте справа это то, что в отладчике. Как видим в TIM2_CCR1L 5 никак не получится, а в...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru