|
doublen; n=a/b/1000.0 //除1000不会得小数,1000.0才会有小数 voidT1Capture1_Init(void) //定时器1捕获初始化 { TIM1_CCER1 &= 0xFE; //先禁止捕获 TIM1_CCMR1 &= 0xFD; TIM1_CCMR1 |= 0x01; //第0-1位CC1S[1:0]置01,CC1通道被配置为输入,IC1映射在TI1FP1上;输入模式下第4-7位IC1F[3:0],置0000为无滤波 // 在TIM1_CCER1寄存器中置CC1P(1)位设置捕获上升或下降沿(0上升沿,1下降沿) TIM1_CCMR1 |= 0x0C; // 输入模式下第2-3位置00-11来配置0-8分频(每n个事件触发捕获) TIM1_CCER1 |= 0x01; //输入模式下第0位CC1E置1使能捕获 TIM1_IER |= 0x02; //第1位CC1IE置1使能捕获中断 TIM1_SR1 &= 0xFD; //第二位CC1IF置0清除捕获/比较1中断标记 } #pragmavector=0xE //定时器1捕获中断 __interruptvoid TIM1_CAP_COM_IRQHandler(void) { if(TIM1_SR1&0x02) //判断是TIM1的中断 { static u8 T1N=0; static u16T1Cap_value=0,T1Cap_value1=0,T1Cap_value2=0; if (T1N==0) { T1Cap_value1=TIM1_CCR1H; T1Cap_value1=(T1Cap_value1<<8)+TIM1_CCR1L; //获取捕获值 T1N=1; } else { T1Cap_value2=TIM1_CCR1H; T1Cap_value2=(T1Cap_value2<<8)+TIM1_CCR1L; T1Cap_value=T1Cap_value2-T1Cap_value1; /* if(T1Cap_value1 >T1Cap_value2) //定时器溢出处理 T1Cap_value差值正常算; else T1Cap_value= 0xFFFF +T1Cap_value2 - T1Cap_value1; */ f=16000000*8/T1Cap_value/1000.0; //8分频了所以*8,除1000单位换成K TIM1_CNTRH = 0x00;//清零计数器高8位 TIM1_CNTRL = 0x00;//清零计数器低8位 T1N=0; } } TIM1_SR1 &= 0xFD; //清除捕获比较1中断标志 TIM1_SR2 &= 0xFD; //第二位CC1OF置0清除重复捕获标志 } void BEEP(void) //蜂鸣器 { CLK_ICKR |= 0x08; //第3位LEISN置1打开LSI(低速) while((CLK_ICKR & 0x10) == 0); //LSI时钟准备好后第4位LSIRDY被硬件置1 BEEP_CSR = 0x0e; //第0-4位BEEPDIV[4:0]置0E选择16分频,第6-7位BEEPSEL[1:0]置00选择输出f(LSI)/ (8 x BEEPDIV) kHz→128/(8*16)=1KHZ(输出频率越大声音越尖锐) BEEP_CSR |= 0x20; //打开BEEP引脚(PD4,要在option byte更改默认输出模式) delay_ms(200); BEEP_CSR &=0xDF; //关 } question:如 #pragma vector=0xE __interrupt void TIM1_CAP_COM_IRQHandler(void)这个中断服务子函数如何找到,在芯片手册里只看到中断的地址,是像头文件这样在编译环境的头文件定义好了地址就可以直接用上述名称进入中断服务子函数,然后不同的编译软件就有不同的中断服务子函数入口。是这样吗? |
| 很好的学习资料,感谢楼主的奉献 |
微信公众号
手机版