STM32自学历程——用外部时钟计数(红外传感器为触发)

外部时钟计数

先做一个区分,外部时钟和内部时钟是怎么计数的?

内部时钟:通过内部晶振来实现计数,每到一个上升沿就计数一次;

外部时钟:通过外部触发的方式来触发定时中断,比如利用红外传感器,只要用手挡一次,就变化电平,计数器就加1。

代码讲解

定义外部触发

(1)先打开红外传感器的引脚的时钟,再定义红外传感器的引脚(这里选用GPIOA_0引脚)

GPIO_InitTypeDef GPIO_InitStruct={GPIO_Pin_0,GPIO_Speed_50MHz,GPIO_Mode_IPU};

(2)定义外部时钟

TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x00);

(3)返回计数值

uint16_t Timer_GetCounter(void)
{
	return TIM_GetCounter(TIM2);
}

(4)修改预分频值为0,以及自动重装计数器为10

	TIM_TimeBaseInitStructure.TIM_Period = 10 - 1;
	TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;

程序代码

main部分

#include "stm32f10x.h"                  // Device header
#include "timer.h"
int main(void)
{	
	OLED_Init();
	Timer_Init();
	OLED_ShowString(1,1,"count=");
	OLED_ShowString(2,1,"count2=");
//	TIM_SetCounter(TIM2,00);
	while (1)
	{
	OLED_ShowNum(1,7,Timer_return(),5);
	OLED_ShowNum(2,8,TIM_GetCounter(TIM2),5);
	}

}

Timer.c部分

#include "stm32f10x.h"                  // Device header
#include "timer.h"
uint16_t count;
uint16_t count2;
void Timer_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	
	
	GPIO_InitTypeDef GPIO_InitStruct={GPIO_Pin_0,GPIO_Speed_50MHz,GPIO_Mode_IPU};
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x00);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct={1-1,TIM_CounterMode_Up,10-1,TIM_CKD_DIV1,0};
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
	
	TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStruct={TIM2_IRQn,2,2,ENABLE};
	NVIC_Init(&NVIC_InitStruct);
	
	TIM_Cmd(TIM2,ENABLE);
	
}

uint16_t Timer_return(void)
{
	return count;
}

uint16_t Count_return(void)
{
	return TIM_GetCounter(TIM2);;
}

void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
	{
		count++;
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
}

Timer.h部分

#ifndef _TIMER_H
#define _TIMER_H
void Timer_Init(void);
void TIM2_IRQHandler(void);
uint16_t Timer_return(void);
uint16_t Count_return(void);
#endif

本篇仅仅作为上一篇的延申,大家参考一下即可。

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值