----------------案列一:基本定时器TIM6实现点灯----------------
#ifndef __TIM_H
#define __TIM_H
//头文件
#include "stm32f4xx.h" //这个头文件一定要留
#include "led.h"
//宏定义
//函数声明
void TIM6_Init(uint32_t Period,uint16_t Prescaler);
#endif
#include "tim.h"
/*
* TIM6 --->APB1 定时器时钟 = 84MHz
*/
/*
* 功 能:初始化 TIM6 口
* 参 数:无
* 返回值:无
*/
void TIM6_Init(uint32_t Period,uint16_t Prescaler)
{
//时基结构体
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructrue;
NVIC_InitTypeDef NVIC_InitStructrue;
//1、开启 TIM 时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
//2、配置以及初始化 TIM
//TIM_TimeBaseInitStructrue.TIM_ClockDivision
TIM_TimeBaseInitStructrue.TIM_CounterMode = TIM_CounterMode_Up; //递增(默认从0开始计数) //计数模式(递增还是递减)
TIM_TimeBaseInitStructrue.TIM_Period = Period; //计数周期(计数次数)
TIM_TimeBaseInitStructrue.TIM_Prescaler = (Prescaler - 1); //预分频(每隔多久计数一次)
//Prescaler = 84 ,计数频率 = 84MHz/(84-1+1) = 1MHz -->每隔1us计数一次
//TIM_TimeBaseInitStructrue.TIM_RepetitionCounter
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseInitStructrue);
//3、开启更新(计数器上溢)中断
TIM_ITConfig(TIM6, TIM_IT_Update,ENABLE);
//4、初始化 NVIC
NVIC_InitStructrue.NVIC_IRQChannel = TIM6_DAC_IRQn;
NVIC_InitStructrue.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructrue.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructrue.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructrue);
//TIM_Cmd(TIM6,DISABLE); //执行这句话之后 计数器停止计数
TIM_Cmd(TIM6,ENABLE); //执行这句话之后 计数器开始计数
}
uint16_t cnt = 0;
uint8_t count = LED_OFF;
//TIM6_Init(1000,84); //每隔 1us 计数一次,总计 1000 次 ,每隔 1ms 中断产生一次
//定时器计数溢出时触发更新中断,就会执行此中断函数
void TIM6_DAC_IRQHandler(void)
{
//检测溢出中断是否发生
if(TIM_GetFlagStatus(TIM6,TIM_FLAG_Update) != RESET)
{
//清除中断标志位
TIM_ClearITPendingBit(TIM6,TIM_IT_Update);
cnt++;
if(cnt == 1000)
{
cnt = 0;
count = !count;
LED0(count);
}
}
}
#include "stm32f4xx.h" //类似于51单片机 #include <reg52.h>
#include "led.h"
#include "systick.h"
#include "tim.h"
int main(void)
{
//1、硬件初始化
Systick_Init();
GPIO_LED_Init();
TIM6_Init(1000,84);
while(1) //这个位置不能少!!!
{
}
}
---------------案列二:通用定时器TIM3实现点灯-----------------
#ifndef __TIM_H
#define __TIM_H
//头文件
#include "stm32f4xx.h" //这个头文件一定要留
#include "led.h"
//宏定义
//函数声明
void TIM3_Init(uint32_t Period,uint16_t Prescaler);
#endif
#include "tim.h"
/*
* TIM3 --->APB1 定时器时钟 = 84MHz
*/
/*
* 功 能:初始化 TIM6 口
* 参 数:无
* 返回值:无
*/
void TIM3_Init(uint32_t Period,uint16_t Prescaler)
{
//时基结构体
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructrue;
NVIC_InitTypeDef NVIC_InitStructrue;
//1、开启 TIM 时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
//2、配置以及初始化 TIM
TIM_TimeBaseInitStructrue.TIM_ClockDivision = TIM_CKD_DIV1; //跟数字滤波器有关,我们用不上
TIM_TimeBaseInitStructrue.TIM_CounterMode = TIM_CounterMode_Up; //递增(默认从0开始计数) //计数模式(递增还是递减)
TIM_TimeBaseInitStructrue.TIM_Period = Period; //计数周期(计数次数)
TIM_TimeBaseInitStructrue.TIM_Prescaler = (Prescaler - 1); //预分频(每隔多久计数一次)
//Prescaler = 84 ,计数频率 = 84MHz/(84-1+1) = 1MHz -->每隔1us计数一次
//TIM_TimeBaseInitStructrue.TIM_RepetitionCounter //跟高级定时器有关,我们用不上
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructrue);
//3、开启更新(计数器上溢)中断
TIM_ITConfig(TIM3, TIM_IT_Update,ENABLE);
//4、初始化 NVIC
NVIC_InitStructrue.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructrue.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructrue.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructrue.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructrue);
//TIM_Cmd(TIM3,DISABLE); //执行这句话之后 计数器停止计数
TIM_Cmd(TIM3,ENABLE); //执行这句话之后 计数器开始计数
}
uint16_t cnt = 0;
uint8_t count = LED_OFF;
//TIM3_Init(1000,84); //每隔 1us 计数一次,总计 1000 次 ,每隔 1ms 中断产生一次
//定时器计数溢出时触发更新中断,就会执行此中断函数
void TIM3_IRQHandler(void)
{
//检测溢出中断是否发生
if(TIM_GetFlagStatus(TIM3,TIM_FLAG_Update) != RESET)
{
//清除中断标志位
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
cnt++;
if(cnt == 5000)
{
cnt = 0;
count = !count;
LED0(count);
}
}
}
#include "stm32f4xx.h" //类似于51单片机 #include <reg52.h>
#include "led.h"
#include "systick.h"
#include "tim.h"
int main(void)
{
//1、硬件初始化
Systick_Init();
GPIO_LED_Init();
TIM3_Init(1000,84);
while(1) //这个位置不能少!!!
{
}
}