2018 -0524 STM32計時器中斷
阿新 • • 發佈:2018-12-18
用一個計時器計時1秒,使得LED燈間隔一秒閃爍。
主程式:
#include "stm32f10x.h" #include "delay.h" #include "LED1.h" #include "time.h" int main(void) { delay_init(10); //延時初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設定中斷分組 這個要在設定中斷優先順序前面,一開始就要設定好的不能更改 LED_Init1(); Time3_Init(9999, 7199); //時間計算放在下面說明 while (1) { GPIO_ResetBits(GPIOB,GPIO_Pin_12); //讓LED燈一直亮 } }
標頭檔案:
1. LED1.h
#ifndef __LED_H
#define __LED_H
void LED_Init1(void);
#endif
2.time.h
#ifndef __TIME__H
#define __TIME__H
#include "sys.h"
void Time3_Init(u16 arr, u16 psc); //定時器3初始化函式
#endif
C檔案
1. LED.c
#include "LED1.h" //引用標頭檔案
#include"stm32f10x.h"
void LED_Init1(void) { GPIO_InitTypeDef GPIO_InitStrucyure; //結構變數 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能時鐘GPLOB GPIO_InitStrucyure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStrucyure.GPIO_Pin=GPIO_Pin_12; GPIO_InitStrucyure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStrucyure); //初始化io口 GPIO_SetBits(GPIOB,GPIO_Pin_12); // io口預設不點亮,先將io口設定為高電平 }
2.time.c
#include "time.h" #include "delay.h" #include "LED1.h" void Time3_Init(u16 arr, u16 psc) { NVIC_InitTypeDef NVIC_Initstruct; //結構變數 TIM_TimeBaseInitTypeDef TIM_Timeinit; //結構變數 TIM_Timeinit.TIM_ClockDivision = TIM_CKD_DIV1; //隨意選取 TIM_Timeinit.TIM_CounterMode = TIM_CounterMode_Up; //計數模式 TIM_Timeinit.TIM_Period = arr; // 需要根據要計時的長度來計算輸入 TIM_Timeinit.TIM_Prescaler = psc; //預分頻係數 計算輸入 //TIM_Timeinit.TIM_RepetitionCounter = //這個不需要 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //使能定時器3時鐘 TIM_TimeBaseInit(TIM3,&TIM_Timeinit); //初始化定時器配置 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //開啟定時器中斷 配置nvic ////////配置NIIC 記住要在主函式main中 先設定好優先順序分組 NVIC_Initstruct.NVIC_IRQChannel=TIM3_IRQn ; //通道在stm32的標頭檔案中找,io10對應通道9 對應EXTI9_5_IRQn NVIC_Initstruct.NVIC_IRQChannelCmd= ENABLE; NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority=2; //搶佔優先順序, 在這個之前要中斷分組好,所以要在主函式中分好組 NVIC_Initstruct.NVIC_IRQChannelSubPriority= 2 ; //子優先順序 NVIC_Init(&NVIC_Initstruct); ////////////////////// TIM_Cmd(TIM3,ENABLE); //使能定時器 ///前面4個步驟已經完成現在完成中斷服務函式 } void TIM3_IRQHandler() { if(TIM_GetITStatus(TIM3,TIM_IT_Update) == SET) //獲取狀態定時器的狀態 Upadate更新中斷,是否更新了 { GPIO_SetBits(GPIOB,GPIO_Pin_12); //定時器中斷髮生,將燈滅; delay_ms(500); ///////別忘記了手動清除標誌位!!!!!!!!! TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中斷標誌 } }
其中在主程式中有 Time3_Init(9999, 7199); 這裡表示定時的時間是1s:
計算公式:
T = (A+1)*(B+1)/TCLK; A為前面的輸入 ,B 為後面的那個輸入
TCLK一般為72M 先計算(B+1)/TCLK 當B為7199時候,(B+1)/TCLK = 0.1ms 所以要讓T 為1, 只要將A設為9999。