Начав изучать таймеры столкнулся вот с чем:
Дано: 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. на всякий случай немного кода:
CODE
#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)
#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)
CODE
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);
CODE
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);
{
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);
CODE
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);
}
{
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);
}
CODE
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);
{
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);
CODE
void TIM1_CC_IRQHandler(void)
{
if (TIM_GetITStatus(TIM1, TIM_IT_CC1) == SET)
{
TIM1->SR &= ~TIM_SR_CC1IF;
Current[0] = TIM1->CCR1;}
}
{
if (TIM_GetITStatus(TIM1, TIM_IT_CC1) == SET)
{
TIM1->SR &= ~TIM_SR_CC1IF;
Current[0] = TIM1->CCR1;}
}
CODE
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;}
}
{
if (TIM_GetITStatus(TIM3, TIM_IT_CC1) == SET)
{
//TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
TIM3->SR &= ~TIM_SR_CC1IF;
Current[1] = TIM3->CCR1;}
}