初始化函數沒有問題,定時器頻率為1MHZ,編程思路是定義兩個全局變量一個32位的TIM_CH1_CAPTURE_VAL一個8位的TIM_CH1_CAPTURE_STA,32位用來存放輸入捕獲值,8位的最高位用來表示捕獲到高電平(1表示捕獲)次高位表示脈沖是否捕獲完成(捕獲完成置1),低六位用來表示計數器溢出次數的,每溢出一次自加一,通過定義的i/o口結合按鍵手動輸入高電平,本來是不會出現溢出情況的(32位定時器溢出需要4千多秒)但是按一下按鍵有的時候就會出現溢出的那種情況,實在是找不出來有什么邏輯問題了,求大神指教,本人虛心求教萬望各位指點一二
QQ圖片20190401181239.png (8.72 KB, 下載次數: 61)
下載附件
測試結果
2019-4-2 13:54 上傳
STM32單片機主函數
int main()
{
long long time=0;
u8 a=0;
SysTick_Init(168);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
LED_Init();
USART1_Init(9600);
Input_Init(0xffffffff,83);
while(1)
{
a=TIM_CH1_CAPTURE_STA;
a&=0x40;
while(a==0x40)
{
a=TIM_CH1_CAPTURE_STA&0x80;
if(a!=0x80)
{
a=TIM_CH1_CAPTURE_STA;
a&=0x3f;
time=TIM_CH1_CAPTURE_VAL+a*0xffffffff;
printf("¸ßµçƽ³ÖÐøÊ±¼ä %lld us\n",time);
time=0;
TIM_CH1_CAPTURE_VAL=0;
TIM_CH1_CAPTURE_STA=0;
}
else
{
if(a==0x80)
{
time=0x3f*0xffffffff;
printf("%lld\n",time);
TIM_CH1_CAPTURE_STA=0x80;
}
}
a=0;
}
led1=!led1;
delay_ms(200);
}
}
中斷服務函數
void TIM5_IRQHandler(void)
{
if(TIM_GetITStatus(TIM5,TIM_IT_Update)==1)
{
if(TIM_CH1_CAPTURE_STA>=0x80)
{
if(TIM_CH1_CAPTURE_STA==0x3f)
{
TIM_CH1_CAPTURE_STA|=0x40;
TIM_Cmd(TIM5,DISABLE);
TIM_SetCounter(TIM5,0);
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);
TIM_Cmd(TIM5,ENABLE);
}
else
{
TIM_CH1_CAPTURE_STA++;
}
}
else
{
}
}
else
{
if(TIM_GetITStatus(TIM5,TIM_IT_CC1)==1)
{
if(TIM_CH1_CAPTURE_STA<0x80)
{
TIM_CH1_CAPTURE_STA=TIM_CH1_CAPTURE_STA|0x80;
TIM_Cmd(TIM5,DISABLE);
TIM_SetCounter(TIM5,0);
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);
TIM_Cmd(TIM5,ENABLE);
}
else
{
TIM_CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
TIM_CH1_CAPTURE_STA|=0x40;
TIM_CH1_CAPTURE_STA&=0x7f;
TIM_Cmd(TIM5,DISABLE);
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising);
TIM_Cmd(TIM5,ENABLE);
}
}
}
TIM_ClearITPendingBit(TIM5,TIM_IT_Update|TIM_IT_CC1);
}
|