一、定时器信息
STM32F407VET6一共有14个定时器,包括2个高级控制定时器、8个通用定时器、2个基本定时器和2个看门狗定时器。
高级定时器(TIMER1和TIMER8)是四通道定时器,支持输入捕获和输出比较。可以产生PWM信号控制电机和电源管理。
通用定时器TIM2、TIM3、TIM4和TIM5是4通道定时器,支持输入捕获和输出比较,可以产生PWM信号控制电机和电源管理。
通用定时器TIM9、TIM10、TIM11、TIM12、TIM13和TIM14是单通道定时器,支持输入捕获,输出比较,产生PWM信号控制电机和电源管理。
基本定时器(TIMER6和TIMER7)包含一个无符号的16位计数器。可以被用作通用定时器和为DAC(数字到模拟转换器) 提供时钟。基本定时器可以配置产生DMA请求,TRGO触发连接到DAC。
二、定时器时钟
三、定时器选择
我们选择定时器3,它挂载在APB1时钟上,APB1时钟最大42MHz,而定时器外设在这基础上倍频2倍,所以定时器三的频率为84MHz。
四、定时器配置
/** 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源* 开发板官网:www.lckfb.com* 技术支持常驻论坛,任何技术问题欢迎随时交流学习* 立创论坛:club.szlcsc.com* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!* 不靠卖板赚钱,以培养中国工程师为己任*/
#include "board.h"
#include "bsp_uart.h"
#include "stdio.h"
#include "sys.h"#define led PBout(2)uint16_t timercounter=0;int main(void)
{board_init();uart1_init(115200);//1.初始化LEDGPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOB, &GPIO_InitStructure);//2.初始化TIMERTIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//3.打开定时器时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);TIM_TimeBaseStructure.TIM_ClockDivision=0x00; //不分频TIM_TimeBaseStructure.TIM_Prescaler=84-1; //84分频 84MHZ/84=1MHZTIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数TIM_TimeBaseStructure.TIM_RepetitionCounter=0; //不重复计数TIM_TimeBaseStructure.TIM_Period=1000-1; //周期为1000,T=1000*(1/f)=1000*(1/1M)=1msTIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//4.允许定时器中断TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//5.配置中断NVIC_InitTypeDef NVIC_InitStucture;NVIC_InitStucture.NVIC_IRQChannel=TIM3_IRQn;NVIC_InitStucture.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStucture.NVIC_IRQChannelPreemptionPriority=0x01;NVIC_InitStucture.NVIC_IRQChannelSubPriority=0x01;NVIC_Init(&NVIC_InitStucture); //6.开启定时器TIM_Cmd(TIM3,ENABLE);while(1){ //10.定时到达1s if(timercounter>999){led=!led;timercounter=0;} }}//7.中断服务函数
void TIM3_IRQHandler(void)
{
//8.判断定时器3是否中断if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET){
//9.清除定时器3的中断标志位TIM_ClearITPendingBit(TIM3,TIM_IT_Update);timercounter++;}
}