新手上路
- 积分
- 38
- 金钱
- 38
- 注册时间
- 2016-6-29
- 在线时间
- 17 小时
|
#include "timer3.h"
//设置NVIC分组
//NVIC_Group:NVIC分组 0~4 总共5组
void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)
{
u32 temp,temp1;
temp1=(~NVIC_Group)&0x07;//取后三位
temp1<<=8;
temp=SCB->AIRCR; //读取先前的设置
temp&=0X0000F8FF; //清空先前分组
temp|=0X05FA0000; //写入钥匙
temp|=temp1;
SCB->AIRCR=temp; //设置分组
}
//NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先
void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)
{
u32 temp;
MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组
temp=NVIC_PreemptionPriority<<(4-NVIC_Group);
temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
temp&=0xf; //取低四位
NVIC->ISER[NVIC_Channel/32]|=(1<<NVIC_Channel%32);//使能中断位(要清除的话,相反操作就OK)
NVIC->IP[NVIC_Channel]|=temp<<4; //设置响应优先级和抢断优先级
}
//定时器5通道1输入捕获配置
//arr:自动重装值
//psc:时钟预分频数
void TIM3_Cap_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1; //TIM3 时钟使能
RCC->APB2ENR|=1<<3; //使能PORTB时钟
GPIOB->CRL&=0XFF0FFFFF; //PB0 清除之前设置
GPIOB->CRL|=0X00B00000; //PB0 输入
GPIOB->ODR|=0<<0; //PB0 下拉
TIM3->ARR=arr; //设定计数器自动重装值
TIM3->PSC=psc; //预分频器
TIM3->CCMR2|=1<<0; //CC3S=01 选择输入端映射到TI3上
TIM3->CCMR2|=0<<4; //IC1F=0000 配置输入滤波器 不滤波
TIM3->CCMR2|=0<<10; //IC2PS=00 配置输入分频,不分频
TIM3->CCER|=0<<1; //CC1P=0 上升沿捕获
TIM3->CCER|=1<<0; //CC1E=1 允许捕获计数器的值到捕获寄存器中
TIM3->DIER|=1<<1; //允许捕获中断
TIM3->DIER|=1<<0; //允许更新中断
TIM3->CR1|=0x01; //使能定时器2
MY_NVIC_Init(2,0,TIM3_IRQn,2);//抢占2,子优先级0,组2
}
//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到高电平;1,已经捕获到高电平了.
//[5:0]:捕获高电平后溢出的次数
u8 TIM3CH1_CAPTURE_STA=0; //输入捕获状态
u16 TIM3CH1_CAPTURE_VAL; //输入捕获值
////定时器5中断服务程序
void TIM3_IRQHandler(void)
{
u16 tsr;
tsr=TIM3->SR;
if((TIM3CH1_CAPTURE_STA&0X80)==0)//还未成功捕获一次高电平脉冲
{
if(tsr&0X01)//溢出
{
if(TIM3CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
{
if((TIM3CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
{
TIM3CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
TIM3CH1_CAPTURE_VAL=0XFFFF;
}
//else TIM3CH1_CAPTURE_STA++;
}
}
if(tsr&0x02)//捕获1发生捕获事件
{
if(TIM3CH1_CAPTURE_STA&0X40) //捕获到第二次上升沿
{
TIM3CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次高电平脉宽
TIM3CH1_CAPTURE_VAL=TIM3->CCR3; //获取当前的捕获值,在定时器timer3的通道3上
TIM3->CCER&=~(1<<1); //CC1P=0 设置为上升沿捕获
}
else //还未开始,第一次捕获上升沿
{
TIM3CH1_CAPTURE_STA=0; //清空
TIM3CH1_CAPTURE_VAL=0;
TIM3CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿
TIM3->CNT=0; //计数器清空
TIM3->CCER|=~(1<<1); //CC1P=1 设置为上升沿捕获
}
}
}
TIM3->SR=0;//清除中断标志位
}
|
|