外部时钟计数
先做一个区分,外部时钟和内部时钟是怎么计数的?
内部时钟:通过内部晶振来实现计数,每到一个上升沿就计数一次;
外部时钟:通过外部触发的方式来触发定时中断,比如利用红外传感器,只要用手挡一次,就变化电平,计数器就加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
本篇仅仅作为上一篇的延申,大家参考一下即可。