关于F407板子输入捕获的问题

2019-07-20 19:26发布

各位大大,小弟现在用F407板子做输入捕获,需要两路输入捕获低电平。
根据datasheet,选用了TIM5_CH1(PA0)和TIM3_CH2(PA7)作为输入。
配置代码如下:
TIM5_CH1:
//定时器5通道1输入捕获配置(计数器) PA0
//arr:自动重装值(TIM2,TIM5是32位的!!)
//psc:时钟预分频数
void TIM5_CH1_Cap_Init(u32 arr,u32 psc)
{
        RCC->APB1ENR|=1<<3;   //使能TIM5
        RCC->AHB1ENR|=1<<0;   //使能GPIOA
       
        GPIOA->MODER&=~(3<<0);
        GPIOA->MODER|=2<<0;   //设置PA0 复用模式
       
        GPIOA->OSPEEDR&=~(3<<0);
        GPIOA->OSPEEDR|=3<<0; //速度100M
       
        GPIOA->OTYPER&=~(1<<0);
        GPIOA->OTYPER|=0<<0;  // 推挽输出
       
        GPIOA->UPDR&=~(3<<0);
        GPIOA->UPDR|=1<<0;   // 上拉
       
        GPIOA->AFR[0]&=~(15<<0);
        GPIOA->AFR[0]|=2<<0;  //AFR[0]对应端口0~7,AFR[1]对应端口8-15; 首先复位端口,随后选择AF0~15,
                                                                                                //AF0~15设置情况(这里仅是列出常用的,详细的请见407datasheet,56页Table 7):
                                                                                                //AF0:MCO/SWD/SWCLK/RTC   AF1:TIM1/TIM2;            AF2:TIM3~5;               AF3:TIM8~11
                                                                                                //AF4:I2C1~I2C3;          AF5:SPI1/SPI2;            AF6:SPI3;                 AF7:USART1~3;
                                                                                                //AF8:USART4~6;           AF9;CAN1/CAN2/TIM12~14    AF10:USB_OTG/USB_HS       AF11:ETH
                                                                                                //AF12:FSMC/SDIO/OTG/HS   AF13CIM                 AF14:                     AF15:EVENTOUT
       
        TIM5->ARR=arr;                    //设定计数器自动重装值   
        TIM5->SC=psc;                    //预分频器
       
        TIM5->CCMR1|=1<<0;                //CC1S=01         选择输入端 IC1映射到TI1上
        TIM5->CCMR1|=3<<4;                 //IC1F=0011 配置输入滤波器
        TIM5->CCMR1|=0<<2;         //IC1PS=00         配置输入分频,不分频

        TIM5->CCER|=1<<1;                 //CC1P=1        下降沿捕获
        TIM5->CCER|=1<<0;                 //CC1E=1         允许捕获计数器的值到捕获寄存器中

        TIM5->SMCR|=5<<4;     //触发选择:滤波后的定时器输入1(TI1FP1)
        TIM5->SMCR|=7<<0;     //外部时钟模式1
       
        TIM5->CR1|=1<<0;      //使能定时器5
       
}


TIM3_CH2:
//定时器3通道2输入捕获配置(计数器) PA7
//arr:自动重装值(TIM3是16位的!!)
//psc:时钟预分频数
void TIM3_CH2_Cap_Init(u16 arr,u16 psc)
{
        RCC->APB1ENR|=1<<1;   //使能TIM3
        RCC->AHB1ENR|=1<<0;   //使能GPIOA
       
        GPIOA->MODER&=~(3<<14);
        GPIOA->MODER|=2<<14;   //设置PA7 复用模式
       
        GPIOA->OSPEEDR&=~(3<<14);
        GPIOA->OSPEEDR|=3<<14; //速度100M
       
        GPIOA->OTYPER&=~(1<<7);
        GPIOA->OTYPER|=0<<7;  // 推挽输出
       
        GPIOA->UPDR&=~(3<<14);
        GPIOA->UPDR|=1<<14;   // 上拉
       
        GPIOA->AFR[0]&=~((u32)15<<28);   //强制类型转换,否则可能越界 161007  ?
        GPIOA->AFR[0]|=2<<28;  //AFR[0]对应端口0~7,AFR[1]对应端口8-15; 首先复位端口,随后选择AF0~15,
                                                                                                //AF0~15设置情况(这里仅是列出常用的,详细的请见407datasheet,56页Table 7):
                                                                                                //AF0:MCO/SWD/SWCLK/RTC   AF1:TIM1/TIM2;            AF2:TIM3~5;               AF3:TIM8~11
                                                                                                //AF4:I2C1~I2C3;          AF5:SPI1/SPI2;            AF6:SPI3;                 AF7:USART1~3;
                                                                                                //AF8:USART4~6;           AF9;CAN1/CAN2/TIM12~14    AF10:USB_OTG/USB_HS       AF11:ETH
                                                                                                //AF12:FSMC/SDIO/OTG/HS   AF13CIM                 AF14:                     AF15:EVENTOUT
       
        TIM3->ARR=arr;                    //设定计数器自动重装值   
        TIM3->SC=psc;                    //预分频器
       
        TIM3->CCMR1|=1<<8;                //CC2S=01         选择输入端 IC2映射到TI2上
        TIM3->CCMR1|=3<<12;         //IC2F=0011 配置输入滤波器
        TIM3->CCMR1|=0<<10;         //IC2PS=00         配置输入分频,不分频

        TIM3->CCER|=1<<5;                 //CC2P=1        下降沿捕获
        TIM3->CCER|=1<<4;                 //CC2E=1         允许捕获计数器的值到捕获寄存器中

        TIM3->SMCR|=6<<4;     //触发选择:滤波后的定时器输入2(TI2FP2)   ??
        TIM3->SMCR|=7<<0;     //外部时钟模式1
       
        TIM3->CR1|=1<<0;      //使能定时器3
}


现在的问题是,我的输入是每分钟6000个低电平,也就是1秒100个低电平,
通道5捕获的CNT数据输出没有问题
但是通道3的CNT数据输出居然为370000多……
请问各位大大,我的代码哪有问题……跪谢……
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。