我是通過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小時在線,我都會回復大家,除非博主睡著了,另外每天中午和晚上我會私發給大家,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/286689.html
標籤:其他
上一篇:【嵌入式】串口控制
