【STM32F103ZET6——库函数】5.定时器3中断

目录

中断优先级分组

使能时钟

中断初始化

定时器初始化

定时器溢出使能

使能定时器

重写定时器中断服务函数

清空定时器中断标志位

例程

例程说明

main.h

main.c

led.h

led.c

DSQ.h

DSQ.c

中断优先级分组

/*
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时钟

中断初始化

  1. 配置中断源

  2. 配置抢占优先级

  3. 配置子优先级

  4. 定时器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中断初始化

定时器初始化

  1. 配置第一次时钟分频

  2. 配置计数模式

  3. 配置重载值。(注:从0开始计数,最终要减1。重载值=中断一次的时间/计数一次的时间-1

  4. 配置预分频系数。(预分频系数=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);//清除中断标志位
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

因心,三人水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值