初级会员

- 积分
- 58
- 金钱
- 58
- 注册时间
- 2015-11-26
- 在线时间
- 10 小时
|
5金钱
程序如下:
void TIM4_CAP_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<2; //TIM4时钟使能
RCC->APB2ENR|=1<<0; //使能重映射时钟
AFIO->MAPR|=1<<12; //TIM4通道重映射
RCC->APB2ENR|=1<<5; //使能PORTD时钟
GPIOD->CRH&=0XFFF0FFFF; //PD12 清除之前设置
GPIOD->CRH|=0X00080000; //PD12 输入
GPIOD->ODR|=0<<12; //PD12 下拉
/*捕获1~25Hz*/
//////////////////////////////////////////////////////////
TIM4->ARR=arr; //周期
TIM4-> SC=psc; //时基
TIM4->CCMR1|=1<<0; //CC1S=01 选择输入端 IC1映射到TI1上,不滤波,不分频
//TIM4->CCMR1|=1<<4; //IC1F=0001 配置输入滤波器 以Fck_int采样,2个事件后有效
TIM4->CCMR1|=0<<10; //IC2PS=00 配置输入分频,不分频
TIM4->CCER|=0<<1; //CC1P=0 上升沿捕获
TIM4->CCER|=1<<0; //CC1E=1 允许捕获计数器的值到捕获寄存器中
TIM4->DIER|=1<<1; //允许捕获中断
TIM4->CR1=0x01; //使能定时器1
MY_NVIC_Init(1,3,TIM4_IRQn,2);//抢占2,子优先级0,组2
/////////////////////////////////////////////////////////////
}
/*TIM4中断服务函数*/
//////////////////////////////////////////////////////////////////////
u8 CNT=0; //捕获次数
void TIM4_IRQHandler(void)
{
if(CNT==0)
{
TIM4->CNT=0x0000;
TIM4->SR=0x0000;//清除中断标志位
CNT=1;
}
else
{
TIM1->ARR=TIM4->CNT;
TIM4->SR=0x0000;//清除中断标志位
CNT=0;
}
}
void TIM1_Int_Init(u16 arr,u16 psc)
{
RCC->APB2ENR|=1<<11; //TIM1时钟使能
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRH&=0XFFFFFFF0; //PA8 清除之前设置
GPIOA->CRH|=0X00000008; //PA8 输入
GPIOA->ODR|=0<<8; //PA8 下拉
TIM1->ARR=arr; //周期
TIM1-> SC=psc; //时基
TIM1->CCMR1|=1<<0; //CC1S=01 选择输入端 IC1映射到TI1上,不滤波,不分频
TIM1->CCMR1|=0<<10; //IC2PS=00 配置输入分频,不分频
TIM1->CCER|=0<<1; //CC1P=0 上升沿捕获
TIM1->CCER|=1<<0; //CC1E=1 允许捕获计数器的值到捕获寄存器中
TIM1->DIER|=1<<1; //允许捕获中断
TIM1->CR1|=0x01; //使能定时器1
MY_NVIC_Init(1,3,TIM1_CC_IRQn,2);//抢占2,子优先级0,组2
}
u16 CNT=0;
u16 TIM1CH1_CAPTURE_VAL=0;
void TIM1_CC_IRQHandler(void) //TIM1中断
{
if(CNT==0)
{
TIM1->CNT=0; //计数器清空
TIM1->CCER|=1<<1; //CC1P=1 设置为下降沿捕获
CNT=1;
}
else
{
TIM1CH1_CAPTURE_VAL=TIM1->CCR1; //获取当前的捕获值.
TIM1->CCER&=~(1<<1); //CC1P=0 设置为上升沿捕获
CNT=0;
}
TIM1->SR=0;//清除中断标志位
}
|
|