|
double n; n=a/b/1000.0 //除1000不會(huì)得小數(shù),1000.0才會(huì)有小數(shù)
void T1Capture1_Init(void) //定時(shí)器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為無(wú)濾波
// 在TIM1_CCER1寄存器中置CC1P(1)位設(shè)置捕獲上升或下降沿(0上升沿,1下降沿)
TIM1_CCMR1 |= 0x0C; // 輸入模式下第2-3位置00-11來(lái)配置0-8分頻(每n個(gè)事件觸發(fā)捕獲)
TIM1_CCER1 |= 0x01; //輸入模式下第0位CC1E置1使能捕獲
TIM1_IER |= 0x02; //第1位CC1IE置1使能捕獲中斷
TIM1_SR1 &= 0xFD; //第二位CC1IF置0清除捕獲/比較1中斷標(biāo)記
}
#pragma vector=0xE //定時(shí)器1捕獲中斷
__interrupt void TIM1_CAP_COM_IRQHandler(void)
{
if(TIM1_SR1&0x02) //判斷是TIM1的中斷
{
static u8 T1N=0;
static u16 T1Cap_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) //定時(shí)器溢出處理
T1Cap_value差值正常算;
else
T1Cap_value= 0xFFFF + T1Cap_value2 - T1Cap_value1;
*/
f=16000000*8/T1Cap_value/1000.0; //8分頻了所以*8,除1000單位換成K
TIM1_CNTRH = 0x00;//清零計(jì)數(shù)器高8位
TIM1_CNTRL = 0x00;//清零計(jì)數(shù)器低8位
T1N=0;
}
}
TIM1_SR1 &= 0xFD; //清除捕獲比較1中斷標(biāo)志
TIM1_SR2 &= 0xFD; //第二位CC1OF置0清除重復(fù)捕獲標(biāo)志
}
void BEEP(void) //蜂鳴器
{
CLK_ICKR |= 0x08; //第3位LEISN置1打開(kāi)LSI(低速)
while((CLK_ICKR & 0x10) == 0); //LSI時(shí)鐘準(zhǔn)備好后第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; //打開(kāi)BEEP引腳(PD4,要在option byte更改默認(rèn)輸出模式)
delay_ms(200);
BEEP_CSR &= 0xDF; //關(guān)
}
question:如 #pragma vector=0xE
__interrupt void TIM1_CAP_COM_IRQHandler(void)這個(gè)中斷服務(wù)子函數(shù)如何找到,在芯片手冊(cè)里只看到中斷的地址,是像頭文件這樣在編譯環(huán)境的頭文件定義好了地址就可以直接用上述名稱進(jìn)入中斷服務(wù)子函數(shù),然后不同的編譯軟件就有不同的中斷服務(wù)子函數(shù)入口。是這樣嗎?
|
評(píng)分
-
查看全部評(píng)分
|