任务:做一个硬定时。
分析:操作计数的那个值,控制从哪里到哪里,就可以得到时间。
控制时间基础为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;
}
用中断去读按键,完成按键的长按。