如何用STM32实现定时功能并报警(附代码加原理讲解,亲测)

您所在的位置:网站首页 stm32程序怎么写 如何用STM32实现定时功能并报警(附代码加原理讲解,亲测)

如何用STM32实现定时功能并报警(附代码加原理讲解,亲测)

2023-07-29 08:39| 来源: 网络整理| 查看: 265

我是通过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小时在线,我都会回复大家,除非博主睡着了。另外每天中午和晚上我会私发给大家。



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3