STM32——Timer简单应用

//TIM_TimeBaseInitTypeDef 定义于文件 “stm32f10x_tim.h”:
/typedef struct
{
u16 TIM_Period;
u16 TIM_Prescaler;
u8 TIM_ClockDivision;
u16 TIM_CounterMode;
u8 TIM_RepetitionCounter;
} TIM_TimeBaseInitTypeDef;
/
//TIM_Period:定时器周期,当计数寄存器的值递增到等于该值时,将相关事件标志位置位。范围0~65535。
//TIM_Prescaler:定时器预分频设置。时钟源经该预分频器才是定时器时钟。范围0~65535。
//TIM_ClockDivision:时钟分频。基本定时器没有这个功能,无需设置。
//TIM_CounterMode:定时器计数方式设置。基本定时器只能向上计数,无需设置。
//TIM_RepetitionCounter :重复计数器,基本定时器没有这个功能,无需设置。
/typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;
/
/************************** TIMER_BASE.H /
#ifndef __TIMER_BASE_H
#define __TIMER_BASE_H
#include “stm32f10x.h”
void TIME_NVIC_Configuration(u8 timeNo);
void TIME_Configuration(TIM_TypeDef * TIMx,u16 arr , u16 psc);
void GPIO_Config(void);
#endif
/
TIMER_BASE.c**************************/
#include “TIME_base.h”
void TIME_NVIC_Configuration(u8 timeNo)//如果系统会产生多种中断,那么就存在中断响应的优先级
{
NVIC_InitTypeDef NVIC_InitStructure;
switch (timeNo)
{
case 2: NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; break;//指定IRQ通道
case 3: NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; break;//指定IRQ通道
case 4: NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; break;//指定IRQ通道
case 5: NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; break;//指定IRQ通道
}
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置优先级分组,越小优先级越高
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //指定先占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //定义的IRQ是被使能还是失能
NVIC_Init(&NVIC_InitStructure);
}

void TIME_Configuration(TIM_TypeDef * TIMx,u16 arr , u16 psc)//配置TIMX
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
if (TIMx == TIM2)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
else if (TIMx == TIM3)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
else if (TIMx == TIM4)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
else if (TIMx == TIM5)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);
else return 0;
//TIM_DeInit(TIMx)
//TIM_InternalClockConfig(TIMx)

TIM_TimeBaseStructure.TIM_Period = arr - 1; //设置了在下一个更新事件装入活动的自动重装载寄存器周期的值 范围是0x0000-0xFFFF
TIM_TimeBaseStructure.TIM_Prescaler = psc - 1; //设置了用来作为 TIMx 时钟频率除数的预分频值
TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure); 
TIM_ITConfig(TIMx,TIM_IT_Update|TIM_IT_Trigger,ENABLE);//使能或者失能 TIM 的中断,详见附录图1
TIM_Cmd(TIMx, ENABLE); //使能TIMX外设 

}

void GPIO_Config(void)//配置一个IO口:
{
/定义一个GPIO_InitTypeDef类型的结构体/
GPIO_InitTypeDef GPIO_InitStructure;
/开启GPIOB的外设时钟/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
/选择要控制的GPIOB引脚/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
/设置引脚模式为通用推挽输出/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/设置引脚速率为50MHz /
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/调用库函数,初始化GPIOB/
GPIO_Init(GPIOB, &GPIO_InitStructure);
/PB.0 输出高/
GPIO_SetBits(GPIOB,GPIO_Pin_0);
}
在stm32f10x_it.c添加定时器触发的中断处理函数
void TIM6_IRQHandler(void)
{
Static vu8 flag = 0;
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //获取中断状态
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除中断标志
Count ++;
If (Count > =50)
{
If (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15) == Reset)
{
Flag ++;
}
If(flag %2)
{
If (GPIO_ReadInputDataBit(GPIOAGPIO_Pin_12) == Reset)
GPIO_SetBits(GPIOA,GPIO_Pin_12);
Else
GPIO_ResetBits(GPIOA,GPIO_Pin_12);
}
}
}
/
************************ main.c**************************/

#include “TIMER_BASE.h”
#include “stm32f10x_it.h”
int main()
{
GPIO_Config();
TIME_Configuration(TIM2,5000,72);
TIME_NVIC_Configuration(2);
while(1)
{
}
}

猜你喜欢

转载自blog.csdn.net/News53231323/article/details/113506465