各位大大,小弟现在用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 AF13
CIM 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 AF13
CIM 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多……
请问各位大大,我的代码哪有问题……跪谢……
奥, 看成高电平了===.
一周热门 更多>