STM32定时器,只说最优解

任务:做一个硬定时

分析:操作计数的那个值,控制从哪里到哪里,就可以得到时间。

控制时间基础为1us。怎么搞呢?上代码。定时器的2个参数!

void TIMX_Config(void)
{
  TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
    TIM_OCInitTypeDef TIM_OCInitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
  RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE);//错误1
    TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
    TIM_TimeBaseInitStruct.TIM_Period=10000-1;//nosense
    TIM_TimeBaseInitStruct.TIM_Prescaler=72-1;// 1us
    TIM_TimeBaseInitStruct.TIM_ClockDivision=0;
    TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);
    TIM_ITConfig(TIM3, TIM_IT_Update,ENABLE);
    TIM_Cmd(TIM3, ENABLE);
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;                 //GPRS
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;        //抢占优先级 0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;              //子优先级为0
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;              //使能
    NVIC_Init(&NVIC_InitStructure);

}


上面就配置好了!!!

void TIM3_Delay(int us)
{
  uint16_t differ=0xffff-us-5;
  TIM_Cmd(TIM3, ENABLE);
  TIM_SetCounter(TIM3, differ);
while(differ<0xffff-5)
{
  differ=TIM_GetCounter(TIM3);
}
 TIM_Cmd(TIM3, DISABLE);

}

上面一个US基的延时函数!!

现在我们不调用void TIM3_Delay(int us) 自己在it看看

int qqq=1;
void tiggerqqq(void)
{
qqq=qqq?0:1;
}
void TIM3_IRQHandler(void)
{     
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
  tiggerqqq();

}


哇喔 10ms翻转一次 怎么回事?1us的时间基础,前面说:10000-1;//nosense 这样理解还是不深刻,

这个10000就是在it发挥了作用,10000个1us就是10ms!!!!!!

修改成1000就是1ms了

修改成50000就是50ms进去一次中断(就要这个 别太快)




OK 延时函数OK 理解IT也OK。


开始按键双击:

int qqq=1;
char NOADCARDMODE=0;
void tiggerqqq(void)
{
qqq=qqq?0:1;
}
void TIM3_IRQHandler(void)
{
static count=0;
  tiggerqqq();
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);


if(GPIO_ReadInputDataBit(TSKEY1GPIO ,TSKEY1GPIOPIN)==Reset)
{
count++;
if(count>=20)
{
count=0;
NOADCARDMODE=1;
}
}
else
count=0;


}


注意:1GPIO_ReadInputDataBit你的配置是上拉输入  2 你一直是Set按下去才是Reset

2去掉调试qqq (看50ms的)

3使用一个循环技巧a++     a=a%100+1



char NOSDCARDMODE=0;

void TIM3_IRQHandler(void)
{
static count=0;
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);


if(GPIO_ReadInputDataBit(TSKEY1GPIO ,TSKEY1GPIOPIN)==RESET)
{
count=count%20+1;
if(count==20)
{
count=0;
NOSDCARDMODE=1;
}
}
else
count=0;


}


用中断去读按键,完成按键的长按。

猜你喜欢

转载自blog.csdn.net/weixin_42381351/article/details/80594197