Stm32f103c8t6(proteus仿真)学习——6.定时器中断TIM

一、proteus原理图绘制

在这里插入图片描述
双击主控芯片 -> OSC Frequency 改成 72M
在这里插入图片描述

二、定时器代码的编写

1. timer.c文件

头文件

#include "timer.h"                  // Device header

定时器计数值的定义

extern uint16_t Time_Num ; //定时器计数值

定时器初始化函数

void Timer_Init(void){ //定时器初始化函数
	//TIM_TimeBase的结构体定义,定义一个GPIO类型的结构体,名字为TIM_TimeBaseInitStructure
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	//NVIC的结构体定义,定义一个NVIC类型的结构体,名字为NVIC_InitStructure
	NVIC_InitTypeDef NVIC_InitStructure;
	
	//开启定时器的时钟,注意是APB1(GPIO的是APB2)
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	//选择定时器的内部时钟源
	TIM_InternalClockConfig(TIM2);
	
	//配置定时器时基单元:TIM_TimeBase
	//选择时钟分频,可以选择1分频、2分频和4分频
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //TIM_CKD_DIV1:1分频
	//选择定时器计数方式,可选择向上计数、向下计数、中心对齐计数
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM_CounterMode_Up:向上计数
	/* 定时频率 = 72M/(PSC+1)(ARR+1) ,定时时间T=7200*10000/72M=1s  定时1s */
	//设置ARR,即定时器周期:TIM_Period,取值0-65535
	TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;
	//设置PSC,即定时器预分频器的值:TIM_Prescaler,取值0-65535
	TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;
	//高级定时器才用的到,重复计算器,先用不上赋值为0
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	//TIM_TimeBase初始化
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	
	
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);
	//使能定时器 更新中断TIM_IT_Update
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//ENABLE使能
	
	//选择NVIC的中断优先级分组
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//2组,抢占优先级2位,响应优先级2位
	//一个项目只需选择一次NVIC的中断优先级分组,全项目通用
	/*   分组                 抢占优先级                  响应优先级
		  	0                 0位(取值为0)              4位(取值为0-15)
				1                 1位(取值为0-1)            3位(取值为0-7)
				2                 2位(取值为0-3)            2位(取值为0-3)
				3                 3位(取值为0-7)            1位(取值为0-1)     
				4                 4位(取值为0-15)           0位(取值为0)    */
	
	//配置NVIC
	//选择中断源,定时器2的中断源名字是:TIM2_IRQn
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
	使能中断源
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	//设置抢占优先级(中断优先级分组为2组,抢占优先级2位,取值0-3)
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	//设置响应优先级(中断优先级分组为2组,响应优先级2位,取值0-3)
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	//初始化NVIC
	NVIC_Init(&NVIC_InitStructure);
	
	//定时器TIM2使能
	TIM_Cmd(TIM2, ENABLE);
}

定时器中断函数

//中断函数名字固定,定时器2的中断函数名字是:TIM2_IRQHandler
void TIM2_IRQHandler(void){  //定时器中断函数
	//获取TIM2 更新中断TIM_IT_Update 的中断标志位
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) //如果更新中断TIM_IT_Update 的中断标志位 == SET
	{
		Time_Num ++;  //定时器的计数
		
		//清除 更新中断TIM_IT_Update 的中断标志
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
}

2. timer.h头文件

#ifndef __TIMER_H
#define __TIMER_H

#include "stm32f10x.h"                  // Device header
#include "delay.h"

void Timer_Init(void);
void TIM2_IRQHandler(void);

#endif

3. main.c文件

#include "stm32f10x.h"
#include  "OLED.h"
#include  "timer.h"
#include "delay.h"
uint16_t Time_Num =0 ; //定时器中断的计数值

int main(void)
{ 
	delay_init();
	OLED_Init();
	Timer_Init();
	
	OLED_ShowString(2,1,"Time_Num:"); //定时器中断TIM

	while(1){ 
			OLED_ShowNum(2, 10, Time_Num , 5);
	}		
}

4. 效果展示

定时器中断每1s中断一次,计数值加1
在这里插入图片描述

三、项目(代码+仿真)分享链接

百度网盘
链接:https://pan.baidu.com/s/1pcVtAcER2mAwnQnyRL3aXQ
提取码:p8q4

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值