1、对射式红外传感器模块,DO线接到PA0引脚

因为PA0引脚可以作为定时器TIM2的通道1(TIM2_CH1)或外部触发输入(ETR)

 

2、代码部分

Timer.c 文件

#include "stm32f10x.h"                  // Device header

extern uint16_t uiNum;

void Timer_Init(void)
{
	/* RCC开始TIM2定时器的时钟 */
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/*  RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4,
 *  RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7,
 *  RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3,
 *  RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, 
 *  RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP,
 *  RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_CEC,
 *  RCC_APB1Periph_TIM12, RCC_APB1Periph_TIM13, RCC_APB1Periph_TIM14
 */	
	
	/* RCC开始GPIO的时钟 */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/*  RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,
 *  RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,
 *  RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,
 *  RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,
 *  RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,
 *  RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17,
 *  RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11	
 */
	/* 选择时基单元的时钟 */
	TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_Inverted, 0x00);
	
	/* 配置GPIO */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 启用GPIOC的外设时钟
	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);
	
	/* 配置时基单元 */
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_Prescaler = 1 - 1;   //预分频值等于1
	TIM_TimeBaseInitStruct.TIM_Period = 2 - 1;    //  自动重装值等于10
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;	
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV2;
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; 
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
	
	TIM_ClearFlag(TIM2,TIM_FLAG_Update);
	
	/* 使能更新中断至NVIC */
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // TIM_IT_Update 表示更新中断
	
	/* 配置NVIC */
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef  NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn; 
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStruct);

	/* 启动定时器 */
	TIM_Cmd(TIM2, ENABLE);
}

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

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

 

Timer.h 文件

#ifndef __TIMER_H__
#define __TIMER_H__

extern void Timer_Init(void);
extern uint16_t Timer_GetCounter(void);

#endif

main.c 文件

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"

uint16_t uiNum = 0;

int main(void)
{
	OLED_Init();	
	Timer_Init();
	
	while(1)
	{
		OLED_ShowNum(1,1,uiNum, 5);
		OLED_ShowNum(2,1,Timer_GetCounter(), 5);
	}	
}

 

posted on 2025-01-22 10:23  轩~邈  阅读(43)  评论(0)    收藏  举报