STM32定时器,只说最优解 |
您所在的位置:网站首页 › 能看到毫秒的时钟 › STM32定时器,只说最优解 |
任务:用TIM做一个硬定时实现us级别的延时。 参考:https://blog.csdn.net/qq_22252423/article/details/76468161 https://blog.csdn.net/anchises/article/details/52101512 分析:操作计数的那个值,控制从哪里到哪里,就可以得到时间。也就是做一个稍大的定时,每1000us中断一次,如果要求延时200us那么我就截取其中一部分时间200段给你,要求500us就截取500段给你,用计数值控制。 控制时间基础为1us。怎么搞呢?上代码。定时器的2个参数! void TIMX_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_OCInitTypeDef TIM_OCInitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE); TIM_ClearITPendingBit(TIM3,TIM_IT_Update); TIM_TimeBaseInitStruct.TIM_Period=10000-1;//没意义吗?待定 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; 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 TIM_SetCounter(TIM3, differ); while(differ=20) { count=0; NOADCARDMODE=1; } } else count=0; }
注意:
1GPIO_ReadInputDataBit和GPIO_ReadOutputDataBit不同,现在按键是上拉输入哦 2 KEY一直是Set按下去才是Reset 3使用一个循环技巧a++ 《-------》 a=a%100+1
基础知识:参考:https://blog.csdn.net/yx_l128125/article/details/7879506
+++++++++++++++++++++20180719+++++++++++++++ 做Spi通讯LCD的TOUCH的时候发现小延时是没有问题的,而在计数器倒减过来的办法会死机
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |