stm32f4xx-定时器

文章目录

  • 一、硬件定时器
    • 1、定义
    • 2、STM32F407的定时器有以下特征
      • a.所有的定时器都能实现最基本的定时功能
      • b.基本定时器是专门提供给音频的输出接口
      • c.计数器模式:向上,向下,向上下
      • d.DMA(直接存储器访问)请求:传输数据只需要通过DMA,不用经过CPU,减少CPU的占用
      • e.PWM是脉冲宽度调制,在工业应用领域用途非常广泛
      • f.16位可编程分频器,用于对计数器时钟频率进行分频(运行时修改),分频系数1~65536之间
      • 注:
    • 3、计数模式
  • 二、定时计算
      • 1、如果APB预分频器为1,定时器时钟频率等于APB域(APB1和APB2)的频率(一般预分频器不可能为1)
      • 2、否则,等于APB域(APB1和APB2)的频率的两倍
    • 3、定时器硬件时钟
    • 4.定时500ms
  • 三、库函数
    • test

一、硬件定时器

1、定义

​ 设置等待时间,到达后则执行指定的操作的硬件

2、STM32F407的定时器有以下特征

stm32f4xx-定时器_第1张图片

​ 具有基本的定时功能,也有PWM输出(灯光的亮度控制、电机的转速)、脉冲捕获功能(红外捕捉)

2个高级定时器、10个通用定时器和2个基本定时器

高级定时器(TIM1 和 TIM8 ),挂载到APB2

​ 具有16位定时器功能,也具有PWM输出高级控制功能

通用定时器(TIM2 到 TIM5),挂载到APB1

​ 具有16位定时器功能,也具有PWM输出控制功能

通用定时器(TIM9 到 TIM14 ),挂载到APB1和APB2

​ 具有16位定时器功能,也具有PWM输出控制功能

基本定时器:(TIM6 和 TIM7),挂载到APB1

​ 具有16位定时器功能

a.所有的定时器都能实现最基本的定时功能

b.基本定时器是专门提供给音频的输出接口

c.计数器模式:向上,向下,向上下

d.DMA(直接存储器访问)请求:传输数据只需要通过DMA,不用经过CPU,减少CPU的占用

e.PWM是脉冲宽度调制,在工业应用领域用途非常广泛

f.16位可编程分频器,用于对计数器时钟频率进行分频(运行时修改),分频系数1~65536之间

注:

TIM是TIMER单词的缩写

通用定时器与高级定时器(CH表示输出通道)

3、计数模式

stm32f4xx-定时器_第2张图片

二、定时计算

《STM32F4XX中文参考手册.pdf》108页

STM32F405xx/07xx和STM32F415xx/17xx的定时器时钟频率由硬件自动设置。分为两种情况:

1、如果APB预分频器为1,定时器时钟频率等于APB域(APB1和APB2)的频率(一般预分频器不可能为1)

2、否则,等于APB域(APB1和APB2)的频率的两倍

关于APB1与APB2预分频值得说明在system_stm32f4xx.c文件的头部,详细描述如下
stm32f4xx-定时器_第3张图片

关于APB1和APB2预分频值设置在system_stm32f4xx.c文件,详细代码如下:

stm32f4xx-定时器_第4张图片

3、定时器硬件时钟

stm32f4xx-定时器_第5张图片

4.定时500ms

//计数值 84000000/8400 = 10000hz/2,决定定时时间1/2秒

TIM_TimeBaseStructure.TIM_Period = (10000/2)-1; 

TIM_TimeBaseStructure.TIM_Prescaler = 8400-1;   //预分频值 8400-1 + 1 = 8400 

//向上计数的方法

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        

8400 

//向上计数的方法

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

三、库函数

使能定时器硬件时钟

stm32f4xx-定时器_第6张图片

定时器初始化

stm32f4xx-定时器_第7张图片

配置定时器

stm32f4xx-定时器_第8张图片

定时器使能

stm32f4xx-定时器_第9张图片

1.使能定时器硬件时钟

2.定时器的硬件配置

3.配置定时器分频值、计数值等

4.使能定时器更新定时器的中断触发

5.配置定时器中断nvic优先级

6.定时器中断服务函数

test

void tim3_init(void)
{
	//使能TIM3的硬件时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
 
	//TIM3的硬件配置
	//配置定时器3分频值、技术值等等
	TIM_TimeBaseStructure.TIM_Period = (10000/2)-1;	//计数值 84000000/8400 = 10000hz/2,决定定时时间1/2秒
	TIM_TimeBaseStructure.TIM_Prescaler = 8400-1;	//预分频值 8400-1 + 1 = 8400 
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;		//向上计数的方法	
//	TIM_TimeBaseStructure.TIM_ClockDivision = 0;	//在F407是不支持
	
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
	
	//配置定时器3中断的触发方式:时间更新
	TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
	
	//开启TIM3的NVIC中断
	NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;				//定时器3的请求通道
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x02;	//抢占优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x02;			//响应优先级
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;				//使能该通道中断
	NVIC_Init(&NVIC_InitStruct);
	
	
	//使能定时器3工作
	TIM_Cmd(TIM3, ENABLE);
}

//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
	//判断TIM3是否有中断请求
	if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
	{
		PFout(9) ^= 1;
		
		//清空标志位,告诉CPU,已经完成当前中断处理,可以响应新的中断请求
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update);			
	}
}

你可能感兴趣的:(STM32,stm32,单片机,arm)