实现功能
一个函数运行中,5s没达到条件灯亮。
定时器相关函数
//定时器初始化
void TIM6_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct3;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);//时钟使能
TIM_TimeBaseInitStruct3.TIM_ClockDivision=TIM_CKD_DIV1; //时钟分频
TIM_TimeBaseInitStruct3.TIM_CounterMode=TIM_CounterMode_Up; //计数模式,向上计数
TIM_TimeBaseInitStruct3.TIM_Period=arr; //设置计数值
TIM_TimeBaseInitStruct3.TIM_Prescaler=psc; //预分频器 如果设置成7200 -1,那就是72MHZ/7200=10000HZ,也就是1s中记10000个数
TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); //使能更新中断
NVIC_InitStruct.NVIC_IRQChannel=TIM6_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStruct);
TIM_TimeBaseInit(TIM6,&TIM_TimeBaseInitStruct3);
TIM_Cmd(TIM6,ENABLE); //使能计数器
}
//中断服务函数,0.5s中断一次
void TIM6_IRQHandler(void)
{
static u8 record8 =0;
if(TIM_GetITStatus(TIM6,TIM_IT_Update)!=RESET)
{
record8++;
if(record8>10)
{record8=0;
//未到达位置,灯亮
if(flag==1&&ClosePosition==1){
LED1=0;
}
TIM_Cmd(TIM6,DISABLE);
}
TIM_ClearITPendingBit(TIM6,TIM_IT_Update);
}
}
主函数
int main(void){
while(1){
if(/*执行条件*/){
//自己要执行的动作
flag=1;
TIM6_Int_Init(4999,7199);
delay_ms(100);
while(flag){
//达到条件,跳出循环
if(ClosePosition==0){
//停止动作
flag=0;
LED1=0;
break;
}
}
}
}
}