功能描述:配置STM32F405的TIM2的时钟模式为外部时钟模式2,TIM2通过PA5引脚输入的外部时钟进行计数,每10个外部时钟周期后cnt的值加1,并在OLED屏上显示。
- main.c文件内容如下
#include "stm32f4xx.h" // Device header
#include "OLED.h"
#include "Timer.h"
uint8_t cnt = 0;
int main(void)
{
Timer_Init();
OLED_Init();
OLED_Clear(); //清屏OLED
OLED_Refresh(); //刷新OLED
while(1)
{
OLED_Printf(0,0,8,"cnt = %d",cnt); //在OLED上显示cnt
OLED_Refresh();
}
}
//TIM2中断服务函数
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET) //判断相应的中断挂起标志位是否置SET
{
cnt++;
TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除上述中断挂起标志位
}
}
- Timer.c文件内容如下
#include "Timer.h"
/**
* @摘要 初始化TIM
* @参数 无
* @返回值 无
* @说明 无
*/
void Timer_Init(void)
{
//开启GPIOA的时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
//将PA5配置为复用模式,复用为TIM2的ETR外部触发输入引脚
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_TIM2);
//定义GPIO初始化结构体
GPIO_InitTypeDef GPIO_InitStructure;
//初始化上述结构体
GPIO_StructInit(&GPIO_InitStructure);
//配置GPIO模式为复用模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
//配置GPIO输出类型为推挽输出(此处无用)
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
//指定GPIO引脚为Pin5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
//配置GPIO输入类型为浮空输入
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
//配置GPIO的速度为快速50MHZ
GPIO_InitStructure.GPIO_Speed = GPIO_Fast_Speed;
//初始化对应的GPIO
GPIO_Init(GPIOA, &GPIO_InitStructure);
//开启TIM2时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
//选择TIM2的时钟模式为外部时钟模式2,时钟源为ETR引脚的输入
TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x03);
//定义时基单元初始化结构体
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
//初始化上述结构体
TIM_TimeBaseStructInit(&TIM_TimeBaseInitStructure);
//配置预分频器的值为1
TIM_TimeBaseInitStructure.TIM_Prescaler = 1-1;
//配置自动重装寄存器的值为10
TIM_TimeBaseInitStructure.TIM_Period = 10-1;
//配置计数模式为向上计数
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
//配置定时器时钟频率与数字滤波器所使用的采样时钟之间的分频比
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//配置重复计数器的值为0
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
//初始化时基单元
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
//清除TIM2更新中断标志位,因为初始化结束会立刻置该中断标志位为1
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
//使能TIM2的更新中断到NVIC
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
//开启TIM2,此时计数器开始工作
TIM_Cmd(TIM2, ENABLE);
//NVIC优先级分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//定义NVIC初始化结构体
NVIC_InitTypeDef NVIC_InitStructure;
//选择NVIC通道为TIM2_IRQn
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
//使能该通道
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//配置抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
//配置响应优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
//初始化NVIC
NVIC_Init(&NVIC_InitStructure);
}
- Timer.h文件内容如下
#ifndef __TIMER_H
#define __TIMER_H
#include "stm32f4xx.h" // Device header
void Timer_Init(void);
#endif