STM32第8定时器中断与OLED 1秒计时功能的实现指南

1.接线图:

2.程序:注意里面有一个时钟计算

定时器.c文件
#include "stm32f10x.h"   // Device header
//extern uint16_t Num; //声明全局变量Num 可以跨文件使用变量
void Timer_Init(void)
{
    //1.开启时钟 打开TIM2时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	//2.选择内部时钟源  这个可以省略,默认就是内部时钟
	TIM_InternalClockConfig(TIM2);
	//3.配置时基单元  初始化TIM 
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruccture;
	TIM_TimeBaseInitStruccture.TIM_ClockDivision =TIM_Channel_1; 
    //1分频  可以选择1,2,3,4分频。
	TIM_TimeBaseInitStruccture.TIM_CounterMode =TIM_CounterMode_Up;
    //向上计数  可以选择向上、向下、三种中央对齐的模式
	TIM_TimeBaseInitStruccture.TIM_Period =10000-1; 
    //周期 ARR自动重装器的值  定义一秒  参考公式 定时频率=72M/(PSC+1)/(ARR+1) 范围0-65535之 
      间
	TIM_TimeBaseInitStruccture.TIM_Prescaler =7200-1; 
    //PSC预分频器的值,定时1s也就是定时频率为1Hz   1000 000=1M PSC=7200,ARR=10000即 
      1HZ=72M/(7200+1)/(10000+1)
	TIM_TimeBaseInitStruccture.TIM_RepetitionCounter =0 ;
    //重复计数器的值  高级计数器才有的 这里不需要用 给0
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruccture);
	//4.更新中断  开启中断到NVIC的通道 
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); 
	//指定中断分组 在模块里每个程序要有一个  在主程序里放一次就行
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	//5.配置NOIC 配置中断优先级
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn ; //指定通道  TIM2通道
	NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE; //指定中断通道使能或者不使能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;       //响应优先级
	NVIC_Init(&NVIC_InitStructure);
	//6.启动定时器
	TIM_Cmd(TIM2,ENABLE);
	
}

//void TIM2_IRQHandler(void )
//{
//  if (TIM_GetITStatus(TIM2,TIM_IT_Update)==SET) //如果更新标识位等于1 
//	{
//		Num++;
//	 TIM_ClearITPendingBit(TIM2,TIM_IT_Update);   //清除标志位
//	}

//}
mian.c文件
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"

uint16_t Num;

int main(void)
{   
	OLED_Init();
	Timer_Init();
	
	OLED_ShowString(1,1,"Num");
	
	
	while(1) 
	{
		OLED_ShowNum(1,5,Num,5);
	}
	
    
}
void TIM2_IRQHandler(void )
{
  if (TIM_GetITStatus(TIM2,TIM_IT_Update)==SET) //如果更新标识位等于1 
	{
		Num++;
	 TIM_ClearITPendingBit(TIM2,TIM_IT_Update);   //清除标志位
	}

}

3.知识点:数据库函数解释:

TIM常用的函数:
void TIM_DeInit(TIM_TypeDef* TIMx);   //被指定的TIM会被复位
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); //TIM定义结构体(某个定时器,结构体)时基单元
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);//把结构体赋一个默认值
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);//使能计数器(定时器,使能或者不使能) 运行控制
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);//使能中断输出信号的(定时器,配置哪个中断输出,使能还是。)
时钟源选择6个函数
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);  //选择内部时钟 (定时器)
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);//选择ITRX其他定时器时钟(定时器,接入哪个要接入的定时器)
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,uint16_t TIM_ICPolarity, uint16_t ICFilter);//TIX捕获通道的时钟(定时器,TIX具体引脚,极性和滤波器)
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);//选择ETR外部时钟模式1(定时器,外部触发预分频器,极性和滤波器)
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);//选择ETR外部时钟模式2((定时器,外部触发预分频器,极性和滤波器))
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);//单独配置ETR引脚的预分频器、极性、滤波器

void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);  //单独写预分频值的  (定时器,预分频值,写入的模式,)
void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);  改变计数器的计数模式 (定时器,选择新的计数器模式)
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState); // 自动重装器预装功能配置(定时器,使能还是,)
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx); //获取当前计数器的值
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);//获取当前预分频的值
下面是获取标志位和清除标志位
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

作者:普通网友

物联沃分享整理
物联沃-IOTWORD物联网 » STM32第8定时器中断与OLED 1秒计时功能的实现指南

发表回复