[STM32F1] STM32F103 TIM4定时器

[复制链接]
462|9
 楼主| 是你的乱码 发表于 2022-12-31 23:49 | 显示全部楼层 |阅读模式
通用定时器(TIM)
通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。
它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和
PWM)。
使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个
毫秒间调整。
每个定时器都是完全独立的,没有互相共享任何资源。
通用定时器框图
8340163b05a1ff0289.png

 楼主| 是你的乱码 发表于 2022-12-31 23:51 | 显示全部楼层
配置流程
1 、开定时器4的时钟
  1. RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM4,ENABLE);        //开系统时钟
 楼主| 是你的乱码 发表于 2022-12-31 23:52 | 显示全部楼层
定时器4初始化
函数TIM_TimeBaseInit :
8225363b05a7ac681c.png
 楼主| 是你的乱码 发表于 2022-12-31 23:53 | 显示全部楼层
参数介绍:

TIM_TimeBaseInitTypeDef structure TIM_TimeBaseInitTypeDef
定义于文件“stm32f10x_tim.h”:
typedef struct { u16 TIM_Period; u16
TIM_Prescaler; u8 TIM_ClockDivision;
u16 TIM_CounterMode;
}TIM_TimeBaseInitTypeDef;
 楼主| 是你的乱码 发表于 2022-12-31 23:53 | 显示全部楼层
TIM_Period TIM_Period 设置了在下一个更新事件装入活动的自动重装载寄存器周期的值。它的取值必须在 0x0000 和0xFFFF 之间。 TIM_Prescaler TIM_Prescaler 设置了用来作为 TIMx时钟频率除数的预分频值。它的取值必须在 0x0000 和 0xFFFF 之间。 TIM_ClockDivision TIM_ClockDivision 设置了时钟分割。该参数取值见下表
TIM_TimeBaseInitTypeDef
TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 7200-1;
TIM_TimeBaseStructure.TIM_Prescaler = 10000;
 楼主| 是你的乱码 发表于 2022-12-31 23:54 | 显示全部楼层
 楼主| 是你的乱码 发表于 2022-12-31 23:55 | 显示全部楼层
  1.   TIM_TimeBaseInitTypeDef.TIM_TimeBaseStructure;
  2.   TIM_TimeBaseStructure.TIM_Period = 7200-1;   //设置psc
  3.   TIM_TimeBaseStructure.TIM_Prescaler = 10000;  //设置ARR = 1000
  4.   
  5. //7200/72MHZ*10000=1s 即1s钟中断一次
  6. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分频英子位为1
  7.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
  8.   TIM_TimeBaseInit(TIM4, & TIM_TimeBaseStructure);   //调用初始化函数
  9.                         //使能接收中断
 楼主| 是你的乱码 发表于 2022-12-31 23:56 | 显示全部楼层
打开更新中断(NVIC开关和定时器外设的中断源开关)

  1. TIM_ITConfig(TIM4,TIM_IT_Update, ENABLE);       
  2. NVIC_SetPriority(TIM4_IRQn, NVIC_EncodePriority (7-2, 1, 2)); //将合成的优先级设置给USART1中断源
  3. NVIC_EnableIRQ(TIM4_IRQn);                                          //使能NVIC控制器中断开关,这一步必须要
 楼主| 是你的乱码 发表于 2022-12-31 23:57 | 显示全部楼层
失能定时器4
  1. TIM_Cmd(TIM4,DISABLE);                                                                //先失能
 楼主| 是你的乱码 发表于 2022-12-31 23:59 | 显示全部楼层
编写中断服务函数

  1. void TIM4_IRQHandler()
  2. {  
  3.     if(TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
  4.     {      //这里写中断结束后需要执行的程序
  5.        // printf("aaaaaaaaaa\r\n");
  6.      }
  7.       TIM_ClearITPendingBit(TIM4, TIM_FLAG_Update);
  8. }
  9.        
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

490

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部