STM32--TIM定时中断&TIM输出比较

目录

一.TIM中断

1.TIM简介

2.定时器类型

1)基本定时器

2)通用定时器

3)高级定时器 

3.时基单元 

 二.TIM输出比较

1.输出比较简介OC

2.PWM

1.PWM简介

2.PWM结构 

3.参数计算 

3.输出比较通道(通用)

1)输出模式控制器

2)至主模式控制器

3)极性选择

4)输出使能电路

5)OCx———GPIO口


一.TIM中断

1.TIM简介

  • 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断。
  • 16位计数器(CNT),预分配器(PSC),自动重装寄存器(ARR)的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时。72M/65536/65536=1/59.65
  • 不仅具备基本的定时中断功能,而且还包含了内外时钟选择,输入捕获,输出比较,编码器接口,主从触发模式等多种功能。
  • 类型:高级定时器,通用定时器,基本定时器。

2.定时器类型

STM32F103CT6具有:TIM1,TIM2,TIM3,TIM4

类型编号总线功能

高级定时器

TIM1,TIM8APB2拥有通用定时器全部功能,并额外具有重复定时器,死区生成,互补输出,刹车输入等功能
通用定时器TIM2,TIM3,TIM4,TIM5APB1拥有基本定时器全部功能,并额外具有内外时钟选择,输入捕获,输出比较,主从触发模式等功能
基本定时器TIM6,TIM7ABP1拥有定时触发,主从式触发DAC的功能

*DAC:数模转换器,D数,A模,将数字信号转换为模拟信号的电子设备

1)基本定时器

*基本定时器只有DAC 而通用和高级定时器不仅有DAC 还有ADC 

*UI触发DAC较U触发更加消耗CPU

基本定时器,时钟来源于内部时钟,即72MHz

预分频器:对输入的基准频率提前进行一个分频操作,且写入值与实际分频数相差1。寄存器写入0,实际不分频(1分频),输出=输入=72MHz;寄存器写1,实际2分频,输出=输入/2=36MHz;由于预分频器寄存器有16为,最大写入65535,即实际65536分频。

自动重装载寄存器:设置目标值,16位寄存器,目标值最大写入65535。

计数器:计数器发生自增,一个波形,计数器+1,当达到自动重装载寄存器的值后,清零重新自增并产生中断(如无重复寄存器)。

UI/U:UI更新中断,通向NVIC中断;U更新事件,触发其他设备。

2)通用定时器

 CNT计数模式

*基本定时器只有向上计数模式 

TIMx_ETR(外部时钟)  :外接电波作为外部时钟

 ITRx:用来实现定时器的级联,类如TIM1的TRGO连接到TIM2的ITRO上,最大定时时间大幅度提高。

 TI1F_ED:连接的是TIMx_CH1的捕获单元的CH1引脚

TI1FP1/TI2FP2:前者连接CH1的引脚,后者连接CH2的引脚,负责捕获输出电平作为外部时钟。

编码器接口:读取正交编码器的输出波形 

 输入捕获和输出比较

3)高级定时器 

*较前面两个定时器,增加重复计数器 

3.时基单元 

缓冲寄存器才是真正起作用的寄存器

计数器计数频率:CK_CNT=CK_PSC/(PSC+1)

计数器溢出频率:CK_CNT_OV=CK_CNT/(ARR+1)=CK_PSC/(PSC+1)/(ARR+1)

 二.TIM输出比较

1.输出比较简介OC

  • OC(Output Compare)输出比较
  • 输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1,置0或翻转的操作,用于输出一定频率和占空比的PWM波形
  • 每个高级的定时器和通用定时器都拥有4个输出比较通道(4个共用CCR)
  • 高级定时器的前三个通道额外拥有死区生成和互补输出的功能

*IC:Input Capture 输入捕获

*CC:Capture/Company 表示输入捕获和输出比较的单元

上图为CCR

2.PWM

1.PWM简介

2.PWM结构 

3.参数计算 

PWM频率:    Freq = CK_PSC/(PSC+1)/(ARR+1)

PWM占空比:Duty = CCR/(ARR+1)

PWM分辨率:Reso = 1/(ARR+1)

3.输出比较通道(通用)

1)输出模式控制器

可以改变它输出OC1REF(REF:参考信号)的高低电平

模式描述
冻结CNT=CCR时,REF保持为原状态
匹配时置有效电平CNT=CCR时,REF置有效电平(一次性,不适合输出连续变化的波形)
匹配时置无效电平CNT=CCR时,REF置无效电平(一次性,不适合输出连续变化的波形)
匹配时电平翻转CNT=CCR时,REF电平翻转
强制为无效电平CNT与CCR无效,REF强制为无效电平
强制为有效电平CNT与CCR无效,REF强制为有效电平
PWM模式1

向上计数:CNT<CCR时,REF置有效电平,CNT>=CCR时,REF置无效电平

向下计数:CNT>CCR时,REF置无效电平,CNT<=CCR时,REF置有效电平

PWM模式2

向上计数:CNT<CCR时,REF置无效电平,CNT>=CCR时,REF置有效电平

向下计数:CNT>CCR时,REF置有效电平,CNT<=CCR时,REF置无效电平

2)至主模式控制器

可以把REF映射到主模式的TRGO输出

3)极性选择

写0,正常输出。写1,信号就会往下走,信号会通过一个非门取反,那么输出信号就是输出信号高低电平反转的信号。

4)输出使能电路

选择是否输出

5)OCx———GPIO口

 

  • 40
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在HAL库中,使能定时器输出比较中断需要进行以下步骤: 1. 配置定时器的时基参数,包括计数模式、时钟分频系数和重载值等。 2. 配置比较通道的参数,包括比较值和比较输出模式等。 3. 使能定时器输出比较中断,并设置中断优先级。 下面是一个使用HAL库使能TIM3定时器通道1的输出比较中断的示例代码: ``` // 定义TIM_HandleTypeDef类型的句柄变量 TIM_HandleTypeDef htim3; // 定义TIM3的比较通道1配置结构体变量 TIM_OC_InitTypeDef sConfigOC; // 定义中断优先级变量 uint32_t uwPriorityGroup = NVIC_GetPriorityGrouping(); uint32_t uwPriority = 0; // 初始化定时器句柄变量 htim3.Instance = TIM3; htim3.Init.Prescaler = 71; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 9999; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_Base_Init(&htim3); // 配置比较通道1 sConfigOC.OCMode = TIM_OCMODE_TIMING; sConfigOC.Pulse = 4999; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_OC_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1); // 使能定时器输出比较中断 HAL_TIM_Base_Start_IT(&htim3); uwPriority = NVIC_EncodePriority(uwPriorityGroup, 0, 0); HAL_NVIC_SetPriority(TIM3_IRQn, uwPriority, 0); HAL_NVIC_EnableIRQ(TIM3_IRQn); ``` 在这个示例代码中,首先初始化定时器句柄变量htim3,并配置定时器的时基参数。然后,配置比较通道1的参数,包括比较值和比较输出模式等。最后,通过调用HAL_TIM_Base_Start_IT函数使能定时器输出比较中断,并设置中断优先级。在中断服务函数中,可以根据需要执行相应的操作。 需要注意的是,在使用HAL库使能定时器输出比较中断时,需要根据具体的应用需求进行配置和调整。同时,也需要注意避免中断嵌套和中断重复触发等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值