void timer2_TRG(u16 arr,u16 psc)
{
RCC->APB1ENR |= 1<<0; //开启定时器2的时钟
RCC->AHB1ENR |= 1<<0; //开启PA口的时钟

GPIOA->MODER &= ~(3<<0*2);
GPIOA->MODER |= 2<<0*2; //复用功能

GPIOA->AFR[0] &= ~(0x0f<<4*0); //复用成TIM2_ETG
GPIOA->AFR[0] |= (1<<4*0);

GPIOA->PUPDR &= ~(3<<0*2); //浮空输入
// GPIOA->PUPDR |= 2<<0*2; //下拉输入

TIM2->SMCR |= 1<<14; //使能外部时钟模式2 计数器在外部触发输入ETR出现上升沿或下降沿时计数
TIM2->SMCR &=~(0x0f<<8); //不滤波
TIM2->SMCR &=~(1<<15); //0:高电平或者上升沿有效
TIM2->SMCR |= 0<<12;   //不分频ETRP

TIM2->ARR = arr; //设置重载值
TIM2->PSC = psc; //设置分频器

TIM2->CR1 |= 0x01; //CEN=1 使能计数器

}

 图1:PA0的复用功能一部分

图2:外部引脚作为时钟输入

 

查找STM32F407ZGT6芯片的芯片手册,PA0 的第一个复用功能就能作为TIM2的外部时钟输入,在SMCR寄存器的第14位使能外部时钟模式2 计数器在外部触发输入ETR出现上升沿或下降沿时计数,内部时钟输入就会被关闭,那么在选择极性,边沿检测和分频器,输入滤波器,就跟那么就跟内部时钟输入一样。

一般我们一次脉冲加一次,所以在输入脉冲分频器那里和计数分频那里都设置为1,不分频。使能计数, 最终只要定时读取TIM2的CNT计数器的值就是接收到的值了。