源代码:
void TIM2_Cap_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<0;
RCC->APB2ENR|=1<<2;
GPIOA->CRL&=0XFFFFFFF0;
GPIOA->CRL|=0X00000008;
GPIOA->ODR|=0<<0;
TIM2->ARR=arr;
TIM2->PSC=psc;
TIM2->CCMR1|=1<<0;
TIM2->CCMR1|=1<<4;
TIM2->CCMR1|=0<<10;
TIM2->CCER|=0<<1;
TIM2->CCER|=1<<0;
TIM2->DIER|=1<<1;
TIM2->DIER|=1<<0;
TIM2->CR1|=0X01;
MY_NVIC_Init(2,0,TIM2_IRQn,2);
}
int main(void)
{
u32 temp=0;
u8 temp1;
STM32_Clock_Init(9); //72MHz
uart_init(72,9600);
delay(1000);
LED_Init();
KEY_Init();
TIM1_PWM_Init(899,0);
TIM2_Cap_Init(0xffff,72-1);
while(1)
{
delay(80);
LED0_PWM_VAL++;
if(LED0_PWM_VAL==300)LED0_PWM_VAL=0;
if(TIM2CH1_CAPTURE_STA&0X80)
{
temp=TIM2CH1_CAPTURE_STA&0X3F;
temp*=65536;
temp+=TIM2CH1_CAPTURE_VAL;
Uart1_SendString("HIGH:",5);
temp1=(u8)(temp/100000+0x30);
Uart1_SendByte(temp1);
temp1=(u8)(temp%100000/10000+0x30);
Uart1_SendByte(temp1);
temp1=(u8)(temp%10000/1000+0x30);
Uart1_SendByte(temp1);
temp1=(u8)(temp%1000/100+0x30);
Uart1_SendByte(temp1);
temp1=(u8)(temp%100/10+0x30);
Uart1_SendByte(temp1);
temp1=(u8)(temp%10+0x30);
Uart1_SendByte(temp1);
Uart1_SendString(" usrn",7);
TIM2CH1_CAPTURE_STA=0;
}
}
}
void TIM2_IRQHandler(void)
{
u16 tsr;
tsr=TIM2->SR;
if((TIM2CH1_CAPTURE_STA&0X80)==0)
{
if(tsr&0x01)
{
if(TIM2CH1_CAPTURE_STA&0X40)
{
if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)
{
TIM2CH1_CAPTURE_STA|=0X80;
TIM2CH1_CAPTURE_VAL=0xffff;
}else TIM2CH1_CAPTURE_STA++;
}
}
if(tsr&0x02)
{
if(TIM2CH1_CAPTURE_STA&0X40)
{
TIM2CH1_CAPTURE_STA|=0X80;
TIM2CH1_CAPTURE_VAL=TIM2->CCR1;
TIM2->CCER&=~(1<<1);
}else
{
TIM2CH1_CAPTURE_VAL=0;
TIM2CH1_CAPTURE_STA=0X40;
TIM2->CNT=0;
TIM2->CCER|=1<<1;
}
}
}
TIM2->SR=0;
}
功能:捕获PA0的按键高电平持续时间。
效果图:
|