STM32定时器外部时钟

  STM32定时器可以使用外部时钟作为时钟源,这样可以灵活地控制定时器的时钟频率和精度。使用外部时钟作为定时器的时钟源可以提高定时器的精度和稳定性,同时也可以适应不同的应用需求。外部时钟可以是外部晶体振荐器、外部信号源等,具体的选择取决于实际的应用场景和性能要求。在实际的应用中,通过配置定时器的输入时钟源为外部时钟,可以实现更灵活和精准的定时器功能。

下图是代码的运行结果和STM32定时器外部时钟基本接线图:

设置STM32定时器外部时钟分六部走,和上一节的STM32内部时钟差不多,唯一的不同就是选择时钟,通过ETR引脚的外部时钟模式2配置 。步骤如下:

1.打开RCC时钟 

2.通过ETR引脚的外部时钟模式2配置

3.配置时基单元

4. TIM使能中断  开启更新中断到NVIC的通路

5.设置NVIC 

6.启动定时器

Time.c的代码如下:

#include "stm32f10x.h"                  // Device header
  
  //要用主函数的num变量就在变量前面声明  
extern uint16_t Num;
extern uint16_t Cnt;
void Timer_Init(void)
{
	//第一步打开RCC时钟  注意TIM2是APB1的外设
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	//打开GPIOA的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIOstucture;
	GPIOstucture.GPIO_Mode=GPIO_Mode_IPU;
	GPIOstucture.GPIO_Pin=GPIO_Pin_0;
	GPIOstucture.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIOstucture);
	
	//第二步通过ETR引脚的外部时钟模式2配置  TIM_ExtTRGPSC_OFF不分频   
	//TIM_ExtTRGPolarity_NonInverted  高电平或上升沿有效
	//外部触发滤波器 0x00
	TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x00);
	
	
	//第三步配置时基单元
	TIM_TimeBaseInitTypeDef  TimeStructure;
	TimeStructure.TIM_ClockDivision=TIM_CKD_DIV1;//1分频
	TimeStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数   
	TimeStructure.TIM_Period=10-1;//ARR自动重装器的值  9次进一次1
	TimeStructure.TIM_Prescaler=1-1;//PSC就是预分频器的值   0 不需要分频
	TimeStructure.TIM_RepetitionCounter=0;   //重复计数器 高级计数器才有 所以置0
	TIM_TimeBaseInit(TIM2,&TimeStructure);
	
	
	TIM_ClearFlag(TIM2,TIM_IT_Update);//防止每次复位从1开始
	
	//第四步 TIM使能中断  开启更新中断到NVIC的通路
	TIM_ITConfig(TIM2, TIM_IT_Update,ENABLE);
	
	//第五步设置NVIC 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef  NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;//指定中断通道来开启或关闭 我们用的是STM32F10X_MD的15_10
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//指定的通道是使能还是失能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//设置抢占优先级 2组的取值是0-3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;//设置响应优先级  2组的取值是0-3
	NVIC_Init(&NVIC_InitStructure);
	
	//第六步启动定时器
	TIM_Cmd(TIM2, ENABLE);
}
//定时器2的中断函数
uint16_t getCnt(void)
{
	 return TIM_GetCounter(TIM2);//查看CNT计数器的值 10
}
void  TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
	{
		Num++;
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
}

Time.h的代码如下:

#ifndef __TIMER_H
#define __TIMER_H

void Timer_Init(void);
uint16_t getCnt(void);
	
#endif

main.c代码如下:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"
uint16_t Num;
uint16_t Cnt;
int main(void)
{
	/*模块初始化*/
	OLED_Init();		//OLED初始化
	Timer_Init();
	while (1)
	{
		OLED_ShowString(1, 1, "NUM:");
		OLED_ShowNum(1,5,Num,4);
		OLED_ShowString(2, 1, "CNT:");
		OLED_ShowNum(2,5,getCnt(),4);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elegent C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值