定时器的定时中断

一、电路的连接

二、代码展示

1.main.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,"Hello jijiali");
	
	while (1)
	{
		OLED_ShowNum(2,5,Num,5);
	}
}

2.timer.c

a.步骤

/*一、RCC    开启内部时钟
  二、选择时基单元的时钟源
  三、配置时基单元(包括预分频器、自动重装器、计数模式)
  四、配置输出中断控制,允许更新中断输出到NNIC
  五、配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级
  六、运行控制*/


b.概念图

c.代码
#include "stm32f10x.h" // Device header
extern uint16_t Num;
/*一、RCC	开启内部时钟
  二、选择时基单元的时钟源
  三、配置时基单元(包括预分频器、自动重装器、计数模式)
  四、配置输出中断控制,允许更新中断输出到NNIC
  五、配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级
  六、运行控制*/

void Timer_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	//内部时钟
	TIM_InternalClockConfig(TIM2);
	//初始化时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitSturcture;
	TIM_TimeBaseInitSturcture.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitSturcture.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
	TIM_TimeBaseInitSturcture.TIM_Period=10000-1;
	TIM_TimeBaseInitSturcture.TIM_Prescaler=7200-1;
	TIM_TimeBaseInitSturcture.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitSturcture);
	
	TIM_ClearFlag(TIM2,TIM_FLAG_Update);
	//使能更新中断
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
	//NVIC优先级分组
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitSturcture;
	NVIC_InitSturcture.NVIC_IRQChannel=TIM2_IRQn;
	NVIC_InitSturcture.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitSturcture.NVIC_IRQChannelPreemptionPriority=2;
	NVIC_InitSturcture.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_InitSturcture);
	//定时器
	TIM_Cmd(TIM2,ENABLE);
	
}
void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
	{
		Num++;
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
}

3.timer.h

#ifndef __Timer_H
#define __Timer_H

void Timer_Init(void);

#endif

三、笔记

库函数的相关介绍

void TIM_DeInit(TIM_TypeDef* TIMx);
恢复缺省配置(未经其他任何指令更改,程序或系统默认的设置)

1.时基单元


void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
时基单元初始化
TIMx,:选择某一个TIMx选择某一个定时器
TIM_TimeBaseInitStruct:结构体,包含单元配置时基单元的一些参数,自动重装值和预分频值

void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
把结构体变量付一个默认值

2.运行控制


void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
使能计数
 TIMx:选择定时器
NewState:状态的选择(使能和失能)

3.使能外设的中断输出


void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
这是用来使能中断输出信号
 TIMx:选择定时器
TIM_IT:选择配置那个中断输出
NewState:状态的选择(使能和失能)

4.时钟源的选择部分


a.void TIM_InternalClockConfig(TIM_TypeDef* TIMx);
选择内部时钟

b.void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
选择ITRx其他定时器的时钟
 TIMx:选择定时器
TIM_InputTriggerSource:选择要接入那个定时器
 
c.void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
                                uint16_t TIM_ICPolarity, uint16_t ICFilter);
选择TIx捕获通道的时钟
 TIM_TIxExternalCLKSource:选择TI的某一个引脚
TIM_ICPolarity,ICFilter:输入极性和滤波器
对于外部引脚的波形,一般都会有极性选择和滤波器

d.void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
选择ETR通过外部时钟模式1输入的时钟
 TIM_ExtTRGPrescaler:外部触发预分频器(对ETR的外部时钟再提前做一个分频)
Polarity,Filter:极性和滤波器

e.void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
选择ETR通过外部始终模式2输出的时钟

f.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);
Prescaler:写入预分频值
TIM_PSCReloadMode:要写入的模式

void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);
改变计数器的计数模式
TIM_CounterMode:选择新的计数模式

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
自动重装器预装功能配置

void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);
给计数器写入一个值

void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);
给自动重装器写一个值

uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);
获取当前计数器的值

uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);
获取当前的预分频器的值

5.获取标志位和清楚标志位


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);


 

  • 25
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值