定时器定时中断&定时器外部时钟

前言

本文为笔者学习江科协stm32[6-2 定时器定时中断&定时器外部时钟]笔记,非常感谢作者的细致详解,让我理解更深刻。笔者才疏学浅,班门弄斧,详情请移步STM32入门教程-2023版 细致讲解 中文字幕

定时器定时中断

在这里插入图片描述
这个是定时器中断的整个框架结构,只需要把这里的每个模块打通 ,就可以让定时器工作了
1.RCC开启时钟,定时器的基准时钟和整个外设的工作时钟都会同时打开了;
2.选择时基单元的时钟源,对于定时中断,可以选择内部时钟源;
3.配置时基单元,配置预分频器等;
4.配置输出中断控制,允许更新中断输出到NVIC;
5.配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级;
6.使能定时器,定时器使能后,计数器就会开始计数了,触发中断;

相关库函数

函数功能
void TIM_Cmd()定时器使能和失能,对应运行控制
void TIM_TimeBaseInit()时基单元初始化
void TIM_ITConfig()配置定时器中断,ITConfig代表配置相关外设中断
void TIM_InternalClockConfig()选择内部时钟
void TIM_ITRxExternalClockConfig()选择ITR其他定时器时钟
void TIM_TIxExternalClockConfig()选择TIMx捕获通道时钟
void TIM_ETRClockMode1Config()选择ETR通过外部时钟模式1输入的时钟
void TIM_ETRClockMode2Config()选择ETR通过外部时钟模式2输入的时钟
void TIM_ETRConfig()单独用来配置ETR引脚的预分频器,极性,滤波器这些参数
void TIM_PrescalerConfig()单独写入预分频值
void TIM_CounterModeConfig改变计数器的计数模式

接下来我们实现让定时器每秒增加1,并且在OLED 屏幕显示1s,具体接线方式和OLED 库函数参考江协大大给的资料
资料下载

timer.c文件

#include "stm32f10x.h"                  // Device header

extern int Num;

void TimerInit(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	TIM_InternalClockConfig(TIM2);
	
	
	TIM_TimeBaseInitTypeDef Tim_TimBaseInitStruct;
	//指定时钟分频	跟时基单元关系不大
	Tim_TimBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
	//计数器模式,向上计数,向下计数等
	Tim_TimBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
	//ARR
	Tim_TimBaseInitStruct.TIM_Period = 10000-1;
	//PSC
	Tim_TimBaseInitStruct.TIM_Prescaler = 7200-1;
	//重复计数器,只有高级计数器才有
	Tim_TimBaseInitStruct.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2,&Tim_TimBaseInitStruct);
	
	
	//配置更新中断到NVIC通路
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
	//配置NVIC	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef NVICInitStructure;
	//定时器2在NVIC通道
	NVICInitStructure.NVIC_IRQChannel  = TIM2_IRQn;
	NVICInitStructure.NVIC_IRQChannelCmd = ENABLE;
	//优先级
	NVICInitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	NVICInitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVICInitStructure);
	
	TIM_Cmd(TIM2,ENABLE);	
}

void TIM2_IRQHandler(void){
	//获取标志位
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET){
		Num++;
		//清除标志位
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
	
}

timer.h

#ifndef __TIMER_H
#define __TIMER_H

void TimerInit(void);

#endif

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "timer.h"
int Num;
int main(void)
{
	OLED_Init();
	TimerInit();
	
	OLED_ShowString(1,1, "Num:");
	while (1)
	{
		OLED_ShowNum(1,5,Num,2);
	}
}

定时器外部时钟中断

将对射式红外传感器接入PA0引脚,PA0引脚对应ETR,接线参考原始资料;

更改部分如下,将之前选择内部时钟源,TIM_InternalClockConfig(TIM2);改为如下,然后获取TIM_COUNTER()就可以了。

	GPIO_InitTypeDef GPIO_InitLED;
	//GPIO的8种工作模式
	//GPIO_Mode_Out_PP 设置为推挽输出
	GPIO_InitLED.GPIO_Mode= GPIO_Mode_IPU;
	//选择LED引脚
	GPIO_InitLED.GPIO_Pin = GPIO_Pin_0;
    //输出速度
	GPIO_InitLED.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA,&GPIO_InitLED);
	
	
	TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x00);

Keil使用技巧

可以使用书签,标记当前代码。
在这里插入图片描述

在启动文件中找到TIM2_IRQHandler,当定时器产生更新中断时,这个函数就会自动执行。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值