如何用STM32实现定时功能并报警(附代码加原理讲解,亲测)
Posted CSINhua
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用STM32实现定时功能并报警(附代码加原理讲解,亲测)相关的知识,希望对你有一定的参考价值。
我是通过stm32里边的定时器来实现定时一段时间,比如说倒计时多长时间,很多人会考虑用delay函数,但delay的话程序无法执行其他语句,会一直处在delay()函数内,这样便会影响其他语句执行。
话不多说上代码:
#include "timer.h"
#include "stm32f10x.h"
#include "delay.h"
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;
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);
以上这是初始化定时器6的相关代码,不要忘记在.h文件内声明一下。如下所示:
#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"
void TIM6_Int_Init(u16 arr,u16 psc);
#endif
然后再主函数内,进行定时器6的初始化过程,将相关参数带入,假如我们要设定10秒钟定时,那么我们将定时器6初始化的两个参数arr和psc分别设定为4999和7199,设定这两个值得含义是定时500毫秒中断一次,我们要想定时10秒需要执行20次这个500毫秒的中断。所以我们索性设定一个变量为value,然后将value变为自己的2倍,拿10秒为例,就是value=20;拿20秒为例,value=40;相关代码如下所示:
#include "timer.h"
......
u8 velue ;
int main()
velue=10;
velue+=velue;
TIM6_Int_Init(4999,7199);
那么在定时器中断函数内执行的代码如下所示:
void TIM6_IRQHandler(void)
static u8 record8 =0;
if(TIM_GetITStatus(TIM6,TIM_IT_Update)!=RESET)
record8++;
if(record8>velue)
record8=0;
GPIO_SetBits(GPIOB,GPIO_Pin_8);
delay_ms(1000);
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
TIM_Cmd(TIM6,DISABLE);
TIM_ClearITPendingBit(TIM6,TIM_IT_Update);
这个PB8是设定的蜂鸣器接口,就是实现的功能就是设定倒计时10秒中,蜂鸣器响1秒,这样就实现了定时器定时功能,并且不会影响程序执行其他的。
如不懂或想要压缩包评论区留下邮箱,或加我QQ留言,QQ24小时在线,我都会回复大家,除非博主睡着了。另外每天中午和晚上我会私发给大家。
以上是关于如何用STM32实现定时功能并报警(附代码加原理讲解,亲测)的主要内容,如果未能解决你的问题,请参考以下文章
如何用STM32实现定时功能并报警(附代码加原理讲解,亲测)