目录
一、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