TIM输出比较的三种模式
来源:互联网 发布:mysql 建表 索引 编辑:程序博客网 时间:2024/06/05 08:25
TIM输出比较的三种模式
当计数器与捕获/比较寄存器的内容相同时,输出比较功能做如下操作:
● 将输出比较模式(TIMx_CCMRx寄存器中的OCxM位)和输出极性(TIMx_CCER寄存器中的
CCxP位)定义的值输出到对应的引脚上。在比较匹配时,输出引脚可以保持它的电平
(OCxM=000)、被设置成有效电平(OCxM=001)、被设置成无效电平(OCxM=010)或进行翻
转(OCxM=011)。
● 设置中断状态寄存器中的标志位(TIMx_SR寄存器中的CCxIF位)。
● 若设置了相应的中断屏蔽(TIMx_DIER寄存器中的CCxIE位),则产生一个中断。
● 若设置了相应的使能位(TIMx_DIER寄存器中的CCxDE位,TIMx_CR2寄存器中的CCDS位
选择DMA请求功能),则产生一个DMA请求。
TIMx_CCMRx中的OCxPE位选择TIMx_CCRx寄存器是否需要使用预装载寄存器。
●
设置中断状态寄存器中的标志位(TIMx_SR寄存器中的CCxIF位)。
●
若设置了相应的中断屏蔽(TIMx_DIER寄存器中的CCXIE位),则产生一个中断。
●
若设置了相应的使能位(TIMx_DIER寄存器中的CCxDE位,TIMx_CR2寄存器中的CCDS位选择DMA请求功能),则产生一个DMA请求。
TIMx_CCMRx中的OCxPE位选择TIMx_CCRx寄存器是否需要使用预装载寄存器。
在输出比较模式下,更新事件UEV对OCxREF和OCx输出没有影响。
同步的精度可以达到计数器的一个计数周期。输出比较模式(在单脉冲模式下)也能用来输出一个单脉冲。
输出比较模式的配置步骤:
1.
选择计数器时钟(内部,外部,预分频器)
2.
将相应的数据写入TIMx_ARR和TIMx_CCRx寄存器中
3.
如果要产生一个中断请求和/或一个DMA请求,设置CCxIE位和/或CCxDE位。
4.
选择输出模式,例如:必须设置OCxM=’011’、OCxPE=’0’、CCxP=’0’和CCxE=’1’,当计数器CNT与CCRx匹配时翻转OCx的输出管脚,CCRx预装载未用,开启OCx输出且高电平有效。
5.
设置TIMx_CR1寄存器的CEN位启动计数器
TIMx_CCRx寄存器能够在任何时候通过软件进行更新以控制输出波形,条件是未使用预装载寄存器(OCxPE=’0’,否则TIMx_CCRx影子寄存器只能在发生下一次更新事件时被更新)
程序如下:
TIMx_CCRx寄存器能够在任何时候通过软件进行更新以控制输出波形,条件是未使用预装载寄存器(OCxPE=’0’,否则TIMx_CCRx影子寄存器只能在发生下一次更新事件时被更新)。这里设置为Disable
就是为了后面在中断服务子程序可以修改TIMx_CCR实时起作用~
}
中断服务子程序:
void TIM2_IRQHandler(void)
}
------------------------------------------------------------------------------------------------------------------
在STM32的某些应用中,用户有周期性执行某些程序的要求,使用定时器可以产生固定的时间周期,满足 这样的需求。
STM32相关特征:
STM32高级定时器TIM1、TIM8,通用定时器TIM2、TIM3、TIM4、TIM5;
定时器最大时钟72MHz,配合预分频,提供灵活的时钟周期;
每个TIM有4个独立捕获/比较通道,DMA/中断功能;
通道工作在输出比较定时模式,一个TIM至多可以提供4个不同的定时周期。
原理
TIM某输出/捕获通道工作在输出比较定时模式
计数器计数至比较值时产生中断,在中断中刷新捕获比较寄存器,这样在相同时间间隔后可产生下一次中断
TIM2时钟设置为36MHz,预分频设置为2,使用输出比较-翻转模式(Output Compare Toggle Mode)。
TIM2计数器时钟可表达为:TIM2 counter clock = TIMxCLK / (Prescaler +1) = 12 MHz
设置TIM2_CCR1寄存器值为32768,则CC1更新频率为TIM2计数器时钟频率除以CCR1寄存器值,为366.2 Hz。因此,TIM2通道1可产生一个频率为183.1 Hz的周期信号。
同理,根据寄存器TIM2_CCR2 、TIM2_CCR3和 TIM2_CCR4的值,TIM2通道2可产生一个频率为366.3 Hz的周期信号;TIM2通道3可产生一个频率为732.4 Hz的周期信号;TIM2通道4可产生一个频率为1464.8 Hz的周期信号。
#include "stm32f10x_lib.h"
TIM_TimeBaseInitTypeDef
TIM_OCInitTypeDef
vu16 CCR1_Val = 32768;
vu16 CCR2_Val = 16384;
vu16 CCR3_Val = 8192;
vu16 CCR4_Val = 4096;
ErrorStatus HSEStartUpStatus;
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
int main(void)
{
#ifdef DEBUG
#endif
}
void RCC_Configuration(void)
{
}
void GPIO_Configuration(void)
{
}
void NVIC_Configuration(void)
{
#ifdef
#else
#endif
}
#ifdef
void assert_failed(u8* file, u32 line)
{
}
#endif
中断服务:
void TIM2_IRQHandler(void)
{
}
当计数器与捕获/比较寄存器的内容相同时,输出比较功能做如下操作:
●
将输出比较模式(TIMx_CCMRx寄存器中的OCxM位)和输出极性(TIMx_CCER寄存器中的CCxP位)定义的值输出到对应的管脚上。在比较匹配时,输出管脚可以保持它的电平(OCxM=000)、
被设置成有效电平(OCxM=001)、
被设置成无有效电平(OCxM=010)
或进行翻转(OCxM=011)。
这几种模式对应定义在库中
TIM_OCInitTypeDef structure
TIM_OCInitTypeDef定义于文件“stm32f10x_tim.h”:
typedef struct
{
u16 TIM_OCMode;
u16 TIM_Channel;
u16 TIM_Pulse;
u16 TIM_OCPolarity;
} TIM_OCInitTypeDef;
TIM_OCMode选择定时器模式。该参数取值见下表。
●
设置中断状态寄存器中的标志位(TIMx_SR寄存器中的CCxIF位)。
●
若设置了相应的中断屏蔽(TIMx_DIER寄存器中的CCXIE位),则产生一个中断。
●
若设置了相应的使能位(TIMx_DIER寄存器中的CCxDE位,TIMx_CR2寄存器中的CCDS位选择DMA请求功能),则产生一个DMA请求。
TIMx_CCMRx中的OCxPE位选择TIMx_CCRx寄存器是否需要使用预装载寄存器。
在输出比较模式下,更新事件UEV对OCxREF和OCx输出没有影响。
同步的精度可以达到计数器的一个计数周期。输出比较模式(在单脉冲模式下)也能用来输出一个单脉冲。
输出比较模式的配置步骤:
1.
选择计数器时钟(内部,外部,预分频器)
2.
将相应的数据写入TIMx_ARR和TIMx_CCRx寄存器中
3.
如果要产生一个中断请求和/或一个DMA请求,设置CCxIE位和/或CCxDE位。
4.
选择输出模式,例如:必须设置OCxM=’011’、OCxPE=’0’、CCxP=’0’和CCxE=’1’,当计数器CNT与CCRx匹配时翻转OCx的输出管脚,CCRx预装载未用,开启OCx输出且高电平有效。
5.
设置TIMx_CR1寄存器的CEN位启动计数器
TIMx_CCRx寄存器能够在任何时候通过软件进行更新以控制输出波形,条件是未使用预装载寄存器(OCxPE=’0’,否则TIMx_CCRx影子寄存器只能在发生下一次更新事件时被更新)。
这三种模式我都拿板子的例程改了一下 ~
000:冻结。输出比较寄存器TIMx_CCR1与计数器TIMx_CNT间的比较对OC1REF不起作用;也就是Timing模式
001:匹配时设置通道1为有效电平。当计数器TIMx_CNT的值与捕获/比较寄存器1(TIMx_CCR1)相同时,强制OC1REF为高。这个也就是ACTIVE模式
010:匹配时设置通道1为无效电平。当计数器TIMx_CNT的值与捕获/比较寄存器1(TIMx_CCR1)相同时,强制OC1REF为低。这个也就是INACTIVE模式
011:翻转。当TIMx_CCR1=TIMx_CNT时,翻转OC1REF的电平。也就是toggle模式
程序如下:
TIMx_CCRx寄存器能够在任何时候通过软件进行更新以控制输出波形,条件是未使用预装载寄存器(OCxPE=’0’,否则TIMx_CCRx影子寄存器只能在发生下一次更新事件时被更新)。这里设置为Disable
就是为了后面在中断服务子程序可以修改TIMx_CCR实时起作用~
}
中断服务子程序:
void TIM2_IRQHandler(void)
}
- TIM输出比较的三种模式
- TIM通用定时器(二):输出比较——翻转模式
- 定时器TIM和PWM的输出
- 80386的三种模式比较
- 三种工厂模式的优劣比较
- 设计模式-单例模式三种方式的比较
- TIM通用定时器(三):PWM输入捕获模式
- TIM通用定时器(三):PWM输入捕获模式
- PHP的三种安装模式的比较
- PHP的三种安装模式的比较
- PHP的三种安装模式的比较
- [定时器]输出比较模式
- LVS 三种工作模式的优缺点比较
- IT项目监理的三种模式比较
- LVS 三种工作模式的优缺点比较
- SessionState 的三种模式比较以及常见错误
- LVS 三种工作模式的优缺点比较
- LVS 三种工作模式的优缺点比较
- data,bdata,idata,pdata,xdata,code存储类型与存储区
- hdu 5015 Matrix 233 矩阵快速幂
- 总结:p2p项目
- java正则表达式中的‘\\转义
- hbase异常regionserver宕机
- TIM输出比较的三种模式
- Protobuffor Java使用说明(包含nano、micro版本)附件protobuf-java-2.3.0.jar
- volatile
- HTML5添加 video 视频标签后仍然无法播放的解决方法
- 浅析Java中的final关键字
- 【LeetCode题目记录-4】插入数组间隔问题
- 读《周鸿祎自述:我的互联网方法论》有感
- html 欣赏
- 【Unix/Linux】【命令】【文件,目录操作工具】复制文件或目录——cp命令