目录
中断优先级分组
/*
zu_bie:
NVIC_PriorityGroup_0
NVIC_PriorityGroup_1
NVIC_PriorityGroup_2
NVIC_PriorityGroup_3
NVIC_PriorityGroup_4
*/
void NVIC_PriorityGroupConfig(zu_bie);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组
使能时钟
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器3时钟
中断初始化
配置中断源
配置抢占优先级
配置子优先级
定时器3中断源使能
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);//初始化中断
NVIC_InitTypeDef DSQ_3_ZD;
DSQ_3_ZD.NVIC_IRQChannel=TIM3_IRQn;//定时器3中断源
DSQ_3_ZD.NVIC_IRQChannelCmd=ENABLE;//定时器3中断源使能
DSQ_3_ZD.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级1
DSQ_3_ZD.NVIC_IRQChannelSubPriority=1;//子优先级
NVIC_Init(&DSQ_3_ZD);//定时器3中断初始化
定时器初始化
配置第一次时钟分频
配置计数模式
配置重载值。(注:从0开始计数,最终要减1。重载值=中断一次的时间/计数一次的时间-1)
配置预分频系数。(预分频系数=72MHz/(1/计数一次的时间)-1)
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
DSQ_3.TIM_ClockDivision=TIM_CKD_DIV1;//第一次时钟分频,不分频
DSQ_3.TIM_CounterMode=TIM_CounterMode_Up;//计数模式,向上计数模式
DSQ_3.TIM_Period=1600-1;//重载值,从0开始计数,800ms中断一次
DSQ_3.TIM_Prescaler=(72000000/2000)-1;//预分频系数 72MHz/2000Hz-1,0.5ms计数一次
TIM_TimeBaseInit(TIM3,&DSQ_3);//定时器3初始化
定时器溢出使能
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//定时器3计数值更新、溢出,使能
使能定时器
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
TIM_Cmd(TIM3,ENABLE);//使能定时器3
重写定时器中断服务函数
注意:中断服务函数的函数已经固定,重新定义相同名字的函数即可,在定义好的函数里写中断的操作,哪个串口发生中断就得重定义哪个串口中断的函数
void TIM3_IRQHandler(){
static u8 LED_B_flag=0;
LED_B_flag++;
LED_B_flag=LED_B_flag%2;
if(LED_B_flag){
LED_B_NO();
}
else{
LED_ALL_OFF();
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除中断标志位
}
清空定时器中断标志位
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除中断标志位
例程
例程说明
通过定时器3中断配置,每计数一次0.5ms,每800ms中断一次,然后中断服务函数中控制LED实现LED1状态取反(闪烁)
main.h
#ifndef _MAIN_H_
#define _MAIN_H_
#include "stm32f10x.h" // Device header
#include "stm32f10x_gpio.h" // Keil::Device:StdPeriph Drivers:GPIO
#include "stm32f10x_tim.h" // Keil::Device:StdPeriph Drivers:TIM
#include <stm32f10x_rcc.h>
#include <stm32f10x_usart.h>
#include <stm32f10x_sdio.h>
#include <misc.h>
#include <stdio.h>
#include <delay.h>
#include "timch.h"
#include "bsp_SysTick.h"
#include "led.h"
#include "DSQ.h"
#endif
main.c
#include "main.h"
int main() {
LED_Init();
DSQ_3_Init();
while(1);
}
led.h
#ifndef __LED_H_
#define __LED_H_
#include "stdio.h"
#include "sys.h"
void LED_Init();
void LED_ALL_OFF();
void LED_R_NO();
void LED_R_OFF();
void LED_G_NO();
void LED_G_OFF();
void LED_B_NO();
void LED_B_OFF();
#endif
led.c
#include "led.h"
void LED_Init(){
GPIO_InitTypeDef GPIO;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO.GPIO_Pin=GPIO_Pin_5;
GPIO.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO.GPIO_Pin=GPIO_Pin_0;
GPIO_Init(GPIOB,&GPIO);
GPIO_SetBits(GPIOB,GPIO_Pin_0);
GPIO.GPIO_Pin=GPIO_Pin_1;
GPIO_Init(GPIOB,&GPIO);
GPIO_SetBits(GPIOB,GPIO_Pin_1);
}
void LED_ALL_OFF(){
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_SetBits(GPIOB,GPIO_Pin_0);
GPIO_SetBits(GPIOB,GPIO_Pin_1);
}
void LED_R_NO(){
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}
void LED_R_OFF(){
GPIO_SetBits(GPIOB,GPIO_Pin_5);
}
void LED_G_NO(){
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
}
void LED_G_OFF(){
GPIO_SetBits(GPIOB,GPIO_Pin_0);
}
void LED_B_NO(){
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
}
void LED_B_OFF(){
GPIO_SetBits(GPIOB,GPIO_Pin_1);
}
DSQ.h
#ifndef __DSQ_H_
#define __DSQ_H_
#include "stdio.h"
#include "delay.h"
#include "led.h"
void DSQ_3_Init();
#endif
DSQ.c
#include "DSQ.h"
void DSQ_3_Init(){
TIM_TimeBaseInitTypeDef DSQ_3;
NVIC_InitTypeDef DSQ_3_ZD;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器3时钟
DSQ_3.TIM_ClockDivision=TIM_CKD_DIV1;//第一次时钟分频,不分频
DSQ_3.TIM_CounterMode=TIM_CounterMode_Up;//计数模式,向上计数模式
DSQ_3.TIM_Period=1600-1;//重载值,从0开始计数,800ms中断一次
DSQ_3.TIM_Prescaler=(72000000/2000)-1;//预分频系数 72MHz/2000Hz-1,0.5ms计数一次
TIM_TimeBaseInit(TIM3,&DSQ_3);//定时器3初始化
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//定时器3计数值更新、溢出,使能
TIM_Cmd(TIM3,ENABLE);//使能定时器3
DSQ_3_ZD.NVIC_IRQChannel=TIM3_IRQn;//定时器3中断源
DSQ_3_ZD.NVIC_IRQChannelCmd=ENABLE;//定时器3中断源使能
DSQ_3_ZD.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级1
DSQ_3_ZD.NVIC_IRQChannelSubPriority=1;//子优先级
NVIC_Init(&DSQ_3_ZD);//定时器3中断初始化
}
void TIM3_IRQHandler(){//定时器3中断服务函数
static u8 LED_B_flag=0;
LED_B_flag++;
LED_B_flag=LED_B_flag%2;
if(LED_B_flag){
LED_B_NO();
}
else{
LED_ALL_OFF();
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除中断标志位
}