STM32 标准库

定时器定时中断

恢复缺省配置

void TIM_DeInit(TIM_TypeDef* TIMx);

时机单元初始化

void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
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);

选择内部时钟

void TIM_InternalClockConfig(TIM_TypeDef* TIMx);

选择ITRx其它定时器时钟

void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);

选择TIx捕获通道的时钟

void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
                                uint16_t TIM_ICPolarity, uint16_t ICFilter);

选择ETR通过外部时钟模式1输入的时钟

void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
                             uint16_t ExtTRGFilter);

选择ETR通过外部时钟模式2输入的时钟

void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, 
                             uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);

单独写预分频值的函数

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

给计数器写入一个值

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

获取标志位和清除标志位的值

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

配置定时器流程

##Timer.c

extern uint16_t Num;

void Timer_Init(void)
{
	// 1. 开启定时器1时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);	
	
	// 2. 选择时机单元时钟 设置为内部时钟
	TIM_InternalClockConfig(TIM2);
	
	// 3. 配置时机单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstructer;
	TIM_TimeBaseInitstructer.TIM_ClockDivision = TIM_CKD_DIV1;    //1分频,也是不分屏
	TIM_TimeBaseInitstructer.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitstructer.TIM_Period = 10000 - 1;
	TIM_TimeBaseInitstructer.TIM_Prescaler = 7200 - 1;    //1Hz 对72M进行7200分频 得到10K的计数频率,在10K的频率下计10000个数,就是1s
	TIM_TimeBaseInitstructer.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitstructer);
	
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);	//清除更新中断标志位
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//使能中断
	
	// 4. NVIC优先级分组
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;    //抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;           //响应优先级
	NVIC_Init(&NVIC_InitStructure);
	
	// 5. 启动定时器
	TIM_Cmd(TIM2, ENABLE);
}

// 当定时器产生更新中断时,函数会被自动执行
void TIM2_IRQHandler(void)
{
	// 检查中断标志位
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)	// 获取中断标志位
	{
		/************************业务代码**********************/
		Num ++;
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);	//清除标志位
	}
}
##main.c
main()
#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(2, 4, "Num:");
	
	while (1)
	{
		OLED_ShowNum(2, 8, Num, 5);
	}
}

定时器外部时钟

#include "stm32f10x.h"                  // Device header

extern uint16_t Num;

void Timer_Init(void)
{
	// 1. 开启定时器1时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
    // 通过ETR引脚的外部时钟模式2配置外部时钟2
	TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x00);
	
	// 3. 配置时机单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstructer;
	TIM_TimeBaseInitstructer.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitstructer.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitstructer.TIM_Period = 10 - 1;
	TIM_TimeBaseInitstructer.TIM_Prescaler = 1 - 1;
	TIM_TimeBaseInitstructer.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitstructer);
	
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);	//清除更新中断标志位
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
	
	// 4. NVIC优先级分组
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);
	
	// 5. 启动定时器
	TIM_Cmd(TIM2, ENABLE);
}


// 获取Cnt计数器的值
uint16_t Timer_GetCounter(void)
{
	return TIM_GetCounter(TIM2);
}

// 当定时器产生更新中断时,函数会被自动执行
void TIM2_IRQHandler(void)
{
	// 检查中断标志位
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)	// 获取中断标志位
	{
		/************************业务代码**********************/
		Num ++;
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);	//清除标志位
	}
}
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(2, 4, "Num:");
	OLED_ShowString(3, 4, "Cnt:");
	
	while (1)
	{
		OLED_ShowNum(2, 8, Num, 5);
		OLED_ShowNum(3, 8, Timer_GetCounter(), 5);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值