Перейти к содержанию
    

Nucleo-F401RE + TIM

Приветствую всех.

 

Начав изучать таймеры столкнулся вот с чем:

 

Дано: Nucleo-F401RE + приемник диапазона 433.92 МГц, ASK (MP433PRO)

 

Подключил выход приемника на вход контроллера (PA8 - TIM1 Channel 1, APB2 84 MHz) . Написал небольшую функцию получения кода с пульта.

Все работает, но так как хотел использовать TIM1 для других экспериментов переделал все на TIM3 (PB4 - TIM3 channel1, APB1 42MHz). Нет сигнала с приемника, даже шума нет.

Через какое то время оказалось, что сигнал все же есть, но если поднести пульт вплотную к антенне приемника, до этого все прекрасно работало и из другого конца квартиры

(при этом получаю длительности импульсов на TIM3 не те, что нужно, но скорее всего не учел что-то в тактировании, но это второй вопрос, наверно), но почему так?!

Ок.. переделал на TIM4 (PB6 - TIM4 Channel1, APB1 42MHz). Такой же результат. Вернул на TIM1 все заработало.

 

Почему так?!

 

Спасибо!

 

 

P.S. на всякий случай немного кода:

 

#define UINT16_MAXIMUM	0xFFFF

#define TIM1_PERIOD				UINT16_MAXIMUM - 1

#define TIM1CH1_PULSE			((TIM1_PERIOD+1)/2)

#define TIM1_PRESCALER		(((SystemCoreClock / 1000000) / 2) - 1)

#define TIM3_PERIOD				UINT16_MAXIMUM - 1

#define TIM3_PRESCALER		(((SystemCoreClock / 1000000) / 4 ) - 1)


#define TIM4_PERIOD				UINT16_MAXIMUM - 1

#define TIM4_PRESCALER		(((SystemCoreClock / 1000000) / 4 ) - 1)

 

 

	
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_OFF);
RCC_HSICmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

 

 

void TIM1_Configuration(void)
{
TIM_ICInitTypeDef	TIM_ICInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_TimeBaseStructure.TIM_Prescaler = TIM1_PRESCALER;
TIM_TimeBaseStructure.TIM_Period = TIM1_PERIOD;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

TIM_ICInitStructure.TIM_ICPolarity	= TIM_ICPolarity_BothEdge;
TIM_ICInitStructure.TIM_ICSelection	= TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler	= TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter		= 0x0;

TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInit(TIM1, &TIM_ICInitStructure);

TIM_Cmd(TIM1, ENABLE);
TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);

 

 

void TIM3_Configuration(void)
{
TIM_ICInitTypeDef	TIM_ICInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_TimeBaseStructure.TIM_Prescaler = TIM3_PRESCALER;
TIM_TimeBaseStructure.TIM_Period = TIM3_PERIOD;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

TIM_ICInitStructure.TIM_ICPolarity	= TIM_ICPolarity_BothEdge;	
TIM_ICInitStructure.TIM_ICSelection	= TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler	= TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter		= 0x0;

TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInit(TIM3, &TIM_ICInitStructure);

TIM_Cmd(TIM3, ENABLE);
TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);
}

 

 

void TIM4_Configuration(void)
{
TIM_ICInitTypeDef	TIM_ICInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_TimeBaseStructure.TIM_Prescaler = TIM4_PRESCALER;
TIM_TimeBaseStructure.TIM_Period = TIM4_PERIOD;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

TIM_ICInitStructure.TIM_ICPolarity	= TIM_ICPolarity_BothEdge;	
TIM_ICInitStructure.TIM_ICSelection	= TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler	= TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter		= 0x0;

TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInit(TIM4, &TIM_ICInitStructure);

TIM_Cmd(TIM4, ENABLE);
TIM_ITConfig(TIM4, TIM_IT_CC1, ENABLE);

 

 

void TIM1_CC_IRQHandler(void)
{
if (TIM_GetITStatus(TIM1, TIM_IT_CC1) == SET)
{
		TIM1->SR &= ~TIM_SR_CC1IF;

		Current[0]	= TIM1->CCR1;}
}

 

 

void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_CC1) == SET)
{
//TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);

		TIM3->SR &= ~TIM_SR_CC1IF;

		Current[1]	= TIM3->CCR1;}
}

Изменено пользователем Yngvarr

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поставьте между выходом приемника и входом МК последовательный резистор, килоом в десять. И посмотрите осциллографом сигнал с одной стороны резистора и с другой:

1) в случае нормальной работы

2) в случае непонятной неработы.

 

Вероятно, Вы ногу неправильно сконфигурировали, например оставили ее включенной на вывод, или не подключили (или, наоборот, подключили) pull-up или pull-down цепь.

чудес не бывает. что-то не так делаете. еще вполне возможно что Вы неправильно описали ситуацию или сделали неправильные выводы из увиденного.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Советик: при использовании SPL-ных мегаструктур всегда в обязательном порядке их инициализировать. Там специальные функции есть, типа TIM_ICStructInit(...), TIM_TimeBaseStructInit(...).

Какой-нибудь пропущенный член структуры, забитый мусором, потом "подклеивается" к корректным данным и записывается в регистр. Отладка становится крайне занимательной.

 

Ну или вообще этой графоманией не пользоваться. Первые шаги в эту сторону в Вашем коде уже видно :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответы!

 

Ruslan1: к сожалению осциллографа пока нет, только в планах =(

 

esaulenka: спасибо за совет, учел.. =)

 

 

На данный момент нашел полумеру. В описываемой мной ранее ситуации, порты сконфигурированы таким образом:

 

	GPIO_DeInit(GPIOA);
GPIO_DeInit(GPIOB);
GPIO_DeInit(GPIOC);
GPIO_DeInit(GPIOD);
GPIO_DeInit(GPIOE);


/* GPIO USART2 & TIM1 Channel 1 Configuration */
       GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* GPIOB PB4 (TIM3 channel 1) configuration */
GPIO_StructInit(&GPIO_InitStructure);
       GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

 

Полумера заключается в том, что если убрать из конфигурации GPIO_Pin_8 (TIM1 channel1, PA8), то на TIM3 все начинает работать как и полагается... но мне нужны оба таймера (и порт PA8 очень удобен для меня), а главное хочется понять почему так происходит.

Изменено пользователем Yngvarr

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А где GPIO_PinAFConfig() ?

На каждую ножку подключено несколько периферийных модулей, и при инициализации надо выбрать нужный.

 

 

PS Почему TIM1 при этом работает, загадка. По идее, не должен..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А где GPIO_PinAFConfig() ?

На каждую ножку подключено несколько периферийных модулей, и при инициализации надо выбрать нужный.

 

 

PS Почему TIM1 при этом работает, загадка. По идее, не должен..

 

 

Это забыл выложить:

 

	/* Connect TIM3 pins to AF */
GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_TIM3);
/* Connect TIM1 pins to AF */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_TIM1);

 

 

Эмм.. Если не убирать из конфигурации GPIO_pin_8, то:

... если подключить выход приемника на TIM1, сигнал получаю, если на TIM3, то ситуация описанная вначале.

 

... если убрать эту строчку из конфигурации, то сигнал с приемника, подключенного к TIM1, конечно перестает поступать, но если при этом приемник подключить ко входу TIM3, то все начинает работать.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ruslan1: к сожалению осциллографа пока нет, только в планах =(

Это очень важно, уметь описать словами происходящее.

Когда Вы пишете "Нет сигнала с приемника, даже шума нет.", я, например, подумал что Вы хотите сказать, что "приемник не выдает сигнал, даже шум не выдает". А оказывается, Вы вложили в эту фразу смысл "моя программа не видит сигнала с приемника, даже шума не видит".

 

У Вас явно порт некорректно настроен, где- это вопрос сложный, кусочек кода на это не ответит.

Если еще не разобрались- откройте под отладчиком содержимое регистров и проверьте, насколько реально содержащееся там соответствует тому, что там должно быть для Вашего применения, согласно даташиту. Когда найдете кто неправильно установлен- виновника найти гораздо легче будет

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В итоге:

 

Если в настройках порта PA8 (к которому даже ничего не подключено пока) в регистре GPIOA_PUPDR не выставлять подтяжку к питанию или подтяжку к минусу относительно земли, то в регистр GPIOB->IDR данные с приемника приходят, в любом ином случае - нет..

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В итоге:

 

Если в настройках порта PA8 (к которому даже ничего не подключено пока) в регистре GPIOA_PUPDR не выставлять подтяжку к питанию или подтяжку к минусу относительно земли, то в регистр GPIOB->IDR данные с приемника приходят, в любом ином случае - нет..

Я бы не назвал это "итогом", это только запутывает ситуацию. Вероятно, Вы сделали неправильные выводы, например, не заметили что еще поменялось.

Отладчик в руки- и смотреть, какие регистры портов и таймера реально изменяются от ситуации "не работает" к "работает".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...