文档库 最新最全的文档下载
当前位置:文档库 › STM32入门篇之通用定时器彻底研究

STM32入门篇之通用定时器彻底研究

STM32入门篇之通用定时器彻底研究
STM32入门篇之通用定时器彻底研究

STM32入门篇之通用定时器彻底研究

STM32的定时器功能很强大,学习起来也很费劲儿,本人在这卡了5天才算

看明白。写下下面的文字送给后来者,希望能带给你点启发。在此声明,本人

也是刚入门也是刚入门,,接触STM32不足10天,所以有失误的地方请以手册为准所以有失误的地方请以手册为准,

,欢迎大家拍砖。

其实手册讲的还是挺全面的其实手册讲的还是挺全面的,,只是无奈TIMER 的功能太复杂的功能太复杂,

,所以显得手册很难懂,我就是通过这样看手册:很难懂,我就是通过这样看手册:while(!SUCCESS){while(!SUCCESS){while(!SUCCESS){看手册看手册…}才搞明白的才搞明白的!

!所以接下来我以手册的顺序为主线,增加一些自己的理解,并通过11个例程个例程对

对TIMER 做个剖析做个剖析。。实验环境是STM103V100的实验板的实验板,,MDK3.2+Library2.+Library2.东西都

东西都不怎么新,凑合用……

TIMER 主要是由三部分组成:

1、时基单元。

2、输入捕获。

3、输出比较。

还有两种模式控制功能:从模式控制和主模式控制。

一、框图

让我们看下手册让我们看下手册,,一开始是定时器的框图一开始是定时器的框图,,这里面几乎包含了所有定时器

的信息,您要是能看明白,那么接下来就不用再看别的了…

为了方便的看图,我对里面出现的名词和符号做个注解:

TIMx_ETR:TIMER 外部触发引脚ETR:ETR:外部触发输入

外部触发输入ETRP:ETRP:分频后的外部触发输入分频后的外部触发输入ETRF:ETRF:滤波后的外部触发输入

滤波后的外部触发输入ITRx:ITRx:内部触发内部触发x(x(由另外的定时器触发由另外的定时器触发由另外的定时器触发)

)TI1F_ED:TI1的边沿检测器。

TI1FP1/2:TI1FP1/2:滤波后定时器

滤波后定时器1/2的输入TRGI:TRGI:触发输入触发输入TRGO:TRGO:触发输出

触发输出CK_PSC:CK_PSC:应该叫分频器时钟输入

应该叫分频器时钟输入CK_CNT:CK_CNT:定时器时钟定时器时钟定时器时钟。。(定时周期的计算就靠它)

TIMx_CHx:TIMER 的输入脚TIx:TIx:应该叫做定时器输入信号

应该叫做定时器输入信号x ICx:ICx:输入比较输入比较x ICxPS:ICxPS:分频后的

分频后的ICx OCx:OCx:输出捕获输出捕获x OCxREF:OCxREF:输出参考信号

输出参考信号关于框图还有以下几点要注意:

1、影子寄存器。

有阴影的寄存器,表示在物理上这个寄存器对应2个寄存器,

一个是程序员可以写入或读出的寄存器,称为preload register(register(预

预装载寄存器装载寄存器)

),另一个是程序员看不见的、但在操作中真正起作用的寄存器寄存器,,称为shadow register(register(影子寄存器影子寄存器影子寄存器));(详细请参考版主博详细请参考版主博客

客)

2、输入滤波机制

在ETR 何TIx 输入端有个输入滤波器,它的作用是以采样频输入端有个输入滤波器,它的作用是以采样频率

率Fdts 来采样N 次进行滤波的。

(具体也请参考版主博客https://www.wendangku.net/doc/b41388443.html,/STM32/263170/message.aspx )

3、输入引脚和输出引脚是相同的。

二、时基单元

时基单元有三个部分:时基单元有三个部分:CNT CNT CNT、、PSC PSC、、ARR ARR。。CNT 的计数方式分三种:向上的计数方式分三种:向上、

、向下、中央对齐。通俗的说就是0—ARR ARR、

、ARR —0、0—(ARR-1)—ARR —1.三、时钟源的选择

这个是难点之一。从手册上我们看到共有三种时钟源:

1、内部时钟。

也就是选择CK_INT 做时钟,这个简单,但是有一点要注意做时钟,这个简单,但是有一点要注意,

,定时器的时钟不是直接来自APB1或APB2APB2,,而是来自于输入为APB APB1

1或APB2的一个倍频器的一个倍频器,

,当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB APB1

1的预分频系数为其它数值的预分频系数为其它数值((即预分频系数为2、4、8或16)16)时,

时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍的频率两倍。

。例如AHP 7272M M ,APB12分频36M 36M,,那么TIMER 就是APB1的2倍频倍频,

,即72M 72M。

。怎么选择时钟模怎么选择时钟模式式1呢?只要呢?只要将将SMC SMCR R 中SMS[2:0]SMS[2:0]弄弄成00000

0就好了

SMCR

2、外部时钟模式1

这个比较麻烦这个比较麻烦,,时钟源选择的其实就是TRGI TRGI((触发输入触发输入)),但触

发输入选择挺多的发输入选择挺多的,,共8个……。看框图看框图,,他们是他们是::ITRx ITRx、、TI1F_ED TI1F_ED、

、TI1FP1TI1FP1、、TI2FP2TI2FP2、

、ETRF ITRx 的东西跟定时器的级联有关,暂时不管他。要进入这种时

钟模式首先置SMS 为111111,当然这还没完,不像内部时钟那样,当然这还没完,不像内部时钟那样,当然这还没完,不像内部时钟那样,

,什么都配好了什么都配好了,,这里你还得配置一下别的参数这里你还得配置一下别的参数,,比如选择TI1FP1,

自然要对输入通道1的参数配置好的参数配置好,,这样时钟才能按你需要的方

式进来。就是配框图这块

相关寄存器

(输入)

CCMR1

CCMR1(输入)

CCER

SMCR

TS[2:0]))为TI1这样输入通道就配好了

这样输入通道就配好了!!

中选择触发源((TS[2:0]

CCIP))然后在SMCR中选择触发源

(CCIP

CEN))。现在时钟就是从TI1上的输入

开启时钟((CR1中的CEN

最后选择SMS为111

111,,开启时钟

了,可以接个时钟源进行计数之类的。同理,如果要用ETR就把它相关通道配好就可以了。

3、外部时钟模式2

选择外部输入作为时钟,看框图:

从图上可以看出ETR 可以直接作为时钟输入也可以通过触发输入

(TRGI TRGI))来作为时钟输入即在时钟模式1中触发源选择为ETR ETR,

,两个效果上是一样的,看起来好像这个外部时钟模式2没什么用处,实际上

不是的,他可以跟一些从模式(复位、触发、门控)进行组合。比如

当从模式选为触发时,我们不可能再通过触发源选择ETR 了,因为从

模式控制器被占了模式控制器被占了,

,好在有外部时钟模式2,我们选择这种模式后就可以把两者组合在一起完成一些功能了。

总结一下总结一下,,STM32的时钟选择比较特别的时钟选择比较特别,

,在SFR 中关于时钟选择配置位不再一块,不是说两个位在一起0000、、0101、

、11就选择了而是由SMCR 中SMS 和ECE 来控制来控制,

,这样感觉可以吧内部时钟与外部模式2同时打开(时打开(SMS:000,ECE:1SMS:000,ECE:1SMS:000,ECE:1)),也可以吧外部模式1和外部模式2同时打

开(SMS:111,ECE (SMS:111,ECE::1)1),实际上上述两种方式用的都是外部时钟

,实际上上述两种方式用的都是外部时钟2.四、捕获比较通道

这就是我说的定时器三个组成部分中的两个部分了。核心是那个捕获

比较寄存器。

看框图

异或那块先不管他异或那块先不管他,,好像跟编码器有关好像跟编码器有关,,输入有个特色就是可以输入有个特色就是可以把

把TI 的输入搞到CC1上去上去,,也可以把T2的输入搞到CC1上去上去,

,其实也可以把T1搞到CC1上去同时把T1搞到CC2上去上去,,这样就有了后来的PW PWM

M 输入。

输出上的特色是不直接输出,而是有个OC1REF OC1REF,这样可以定义高有效

,这样可以定义高有效

还是低有效,输出自己需要的有效电平。

五、做实验

讲了这么多你一定烦了吧,那么让我们搞点实际的吧,通过做实验来

熟悉定时器,用到新知识时再在其中加以介绍。

实验一:

TIMER-1TIMER-1:定时器上溢,中断中取反

:定时器上溢,中断中取反LED.现象:现象:LED

LED 周期2秒闪烁。主要代码如下:

TIM_DeInit(TIM2);

TIM_TimeBaseStructure.TIM_Period=2000;//ARR 的值

TIM_TimeBaseStructure.TIM_Prescaler=0;

TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;////采样

采样分频

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//

向上计数模式

TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

TIM_PrescalerConfig(TIM2,0x8C9F,TIM_PSCReloadMode_Immediate)

;//;//时钟分频系数时钟分频系数3600036000,所以定时器时钟为

,所以定时器时钟为2K TIM_ARRPreloadConfig(TIM2,DISABLE);//DISABLE);//禁止

禁止ARR 预装载缓冲器TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

TIM_Cmd(TIM2,ENABLE);ENABLE);//////开启时钟

开启时钟解释一下,首先得配好ARR ARR,这是必须地。然后配置预分频,为什么

,这是必须地。然后配置预分频,为什么我先配为0再用

TIM_PrescalerConfig(TIM2,0x8C9F,TIM_PSCReloadMode_Immediate)

配呢配呢,,原来PSC 也有个预装载功能也有个预装载功能,,却不像ARR 和CRR 那样有相关的位

控制立即装载或更新事件装载控制立即装载或更新事件装载。。也就是说只能更新事件来装载也就是说只能更新事件来装载。。在上面

函数中手工产生了一个更新事件,使PSC 立刻生效。立刻生效。CK_DIV

CK_DIV 暂时没用到。计数模式配置为向上计数。然后在中断中做下LED 取反就可以了取反就可以了。

。溢出周期怎么算?在这个实验里AHB 为72M 72M,,APB1为36M 36M,,所以CK_IN CK_INT

T 为72M 72M,,36000分频变为2K.ARR=20002K.ARR=2000,所以

,所以1秒溢出1次。相关寄存器:

CR1

ARR

PSC

接下来的4个实验跟输出通道有关系

实验2

强置输出

TIMER-2:

TIMER-2:强置输出

LED常亮

现象:LED

现象:

例子比较简单关键是配好输出通道

CCER

将通道1配为输出,输出使能,输出极性选择好,输出模式选择好就

LED,,刚好对应着TIMER3重映射可以了

可以了。。在V100实验板上PC6-9接了LED

后的输出,注意程序里的AFIO函数。

实验3

TIMER-3:

输出比较

TIMER-3:输出比较

LED2秒的周期闪烁。

现象:LED

现象:

跟上个实验配置大致相同,只是把输出模式改为翻转功能,并且CR CRR R

要配好,当CRR=CNT时翻转输出。

实验4

TIMER-4:PWM输出

波,44个LED亮度不同。

现象:输出4种不同占空比的PWM波,

实验5

单脉冲方式

TIMER-7:

TIMER-7:单脉冲方式

LED只闪烁一次。

现象:

现象:LED

将上个实验加一句话

TIM_SelectOnePulseMode(TIM3,TIM_OPMode_Single);////设设置单

脉冲模式

就是这个实验。其实手册上关于此实验的本意是由一个外部触发使能

计数器,然后产生一个脉冲的,这里还没涉及从模式所以简化处理。

涉及寄存器

CR1

接下来再做两个输入的实验

实验6

TIMER-5TIMER-5:输入捕获模式。

:输入捕获模式。现象:通过V100的JOYSTICK 键的SELECT 键进入捕获,硬件仿真键进入捕获,硬件仿真看

看CRR 的值。

首先是基本的配置:首先是基本的配置:ARR ARR 的值、时钟PSC PSC、采样、采样CKD CKD、计数方式。

、计数方式。然后配置输入通道。

选择输入捕获模式选择输入捕获模式、、输入极性输入极性、

、把T1配到CC1上、选好输入的滤波跟分频,就可以了。

讲下输入滤波功能讲下输入滤波功能,,在此实验中Fdts=CK_INT/2,Fsample=Fdts/4,Fdts=CK_INT/2,Fsample=Fdts/4,所以

所以定时器时钟为2K 2K,,所以采样周期为4ms 4ms。

。才8次的话周期小于32ms 的干扰会滤除。

相关寄存器

CR1

ARR

CCMR1CCMR1(输入)

(输入)CCER

实验7

TIMER-6:PWM 输入

现象:由TIMER3输出通道1产生一路周期2秒占空比50%50%的

的PWM 波,飞线飞线到到TIMER TIMER44的输入通的输入通道道1,有TIMER TIMER44来测量来测量该该PW PWM M 得周期和占空比得周期和占空比。

。在做实验之前引入三种从模式控制在做实验之前引入三种从模式控制::复位复位、、触发触发、、门控门控。

。通过SMCR 选择后可以进入这三种从模式

SMCR

SMS:100101110

复位门控触发

所谓从模式简单理解就是受控于别人了,包括何时启动、何时停止、何时复位。相关作用请看手册。提示一点就是进入这三种模式后时钟是谁的问题?肯定不是外部时钟1了,可以是内部时钟和外部时钟2.

接着看实验,接着看实验,PWM PWM 方式的原理是这样的,如前文提到过输入时可以方式的原理是这样的,如前文提到过输入时可以把

把T1映射到CC1上去同时映射到CC2上,将CC1和CC2的捕获边沿搞成

相反的,比如CC1捕获T1上升沿,上升沿,CC2CC2捕获T1下降沿,还要再设下降沿,还要再设置

置T1为复位从模式,上升沿有效,这样T1上升沿后计数器开始计数上升沿后计数器开始计数。。下

降沿CC2捕获发生捕获发生,,此为PWM 占空比占空比,,在来一个上升沿在来一个上升沿,

,CC1捕获发生此为PWM 周期。注意CC1捕获的第一次无效。

这是从模式跟输入捕获的一种组合使用,从模式还可以跟输出比较组合使用。比如手册上的单脉冲实验。

接着做4个实验跟定时器的级联和定时器同步有关系,在实验前先得说说主模式的问题。在CR2寄存器中的MMS 位决定了定时器的主模式

方式方式,,即决定TRGO.TRGO.几种方式可以参看手册几种方式可以参看手册几种方式可以参看手册。

。要说明一点就是一个定期器既可以是主模式同时它也是从模式,这就好像你是一个中层干部一样,既可以领导别人同时又被别人领导,这个不冲突的。

简单介绍下4个实验。

实验8

TIMER-8:TIMER2作为TIMER3的分频器的分频器.

.现象:现象:LED

LED 以10秒周期闪烁。TIMER3配置为PWM 输出,但是始终有TIMER2的溢出时间频率来提供的溢出时间频率来提供,

,其溢出频率为100Hz 所以TIMER3PWM 的周期为10S.

实验9

TIMER-9:TIMER2来使能TIMER3.

现象:现象:LD1

LD1前15秒以1秒的周期闪烁,后15秒熄掉,然后下个15秒再闪烁如此循环。

在这个实验里TIEMR3输出一个周期1秒的PWM 波,仍然驱动LD1闪烁闪烁。

。同时从模式配成门控模式,同时从模式配成门控模式,TIEMR2TIEMR2将OC1作为TRGO TRGO,,OC1是一个周是一个周期

期30S 占空比50%50%的

的PWM 波。实验10

TIMER-10:IMER2启动TIMER3

现象:上电后延迟15秒LD1以1秒的周期闪烁。

此实验跟上个实验配置差不多只要把TIMER3有门控改为触发方式即可。

实验11

TIMER-11:TIMER4的通道1同时出发TIMER4和TIMER3两个定时器

现象:按下JOYSTICK 的“选择选择””键同时出发两个定时器开始。同键同时出发两个定时器开始。同时

时TIMER3驱动LD1以1秒周期闪烁。

以上4个实验实际上是主模式和从模式的组合以及主模式和外部时个实验实际上是主模式和从模式的组合以及主模式和外部时钟

钟1的组合。其实根据自己的需要还可以做出多种组合,这就是STM32定时器强大的地方。

最后多熟悉下库函数,关于TIM 的库(的库(2.02.0版本版本)),本人认为有两点

错误:

1、TIM.C 中CR1_CounterMode_Mask 的值为0x039F 应该改为

0x038F 这样才能覆盖CR1的DIR 位。

2、TIM.C 中TIM_PrescalerConfig 函数原文

if (TIM_PSCReloadMode ==TIM_PSCReloadMode_Immediate){

TIMx->EGR |=TIM_EventSource_Update;

}

else

{

TIMx->EGR &=TIM_EventSource_Update;

}

红色的这句好像不对吧?应该TIMx->EGR &=~TIM_EventSource_Update;才对吧。

推荐-stm32中定时器产生不同PWM的基本思路 精品

在stm32中利用定时器TIM调制PWM的几种方法: 说说我的学习经历:从开始接触到现在有好几个月了,但是学习还是比较的费劲,而且速度也比较的缓慢,当然相比之前还是有很大的进步,记得刚刚学习的时候,建工程都是大四学长手把手教的。废话不多说先来讲讲定时器的配置: STM32F10系列最少3个、做多有8个定时器,都是16位定时器,且相互之间是独立的,计数范围为0x0000-0xffff,最大计数值为65535.可以用于测量输入信号的脉冲长度或者产生输出波形(输出比较和PWM)分为通用定时器,高级定时器,以及看门狗定时器 下面主要讲通用定时器的配置问题: 以定时器TIM1为例:先进行函数的配置 void timer1_config() { TIM_TimeBaseInitTypDef TIM_TimeBaseStructure; //开定时器1外设时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM1,ENABLE); //计时50000次时间为50000/10M=500ms TIM_TimeBaseStructure.TIM_Period=50000 ; TIM_TimeBaseStructure.TIM_Prescaler = 720-1;//720分频 TIM_TimeBaseStructure.TIM_ClockDivision =0;//时钟分割为0; //计数模式向上计数 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure)//初始化TIM1 TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);//开启定时器中断 TIM_Cmd(TIM1,ENABLE); //使能定时器 } 关于时间的计算问题: 外设系统时钟的频率为72M,进行720分频以后,频率f=72M/720=100khz. 如果要定时0.1s 则计数值为10000,计算公式为:时间(t)=计数值(n)/频率(f).注意计数值n介于0到65535之间 有定时器则一定会有中断发生,所以要配置中断优先级,对于中断优先 级函数配置如下: V oid nvic_config() { NVIC_InitTypDef NVIC_InitStructure; //抢占优先级为1位,从优先级为3位 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1) ; NVIC_InitStructure.NVIC_IRQChannel=TIM1_IRQn; //定义定时器1为请求通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占式优先级为0 NVIC_InitStructure.NVIC_IRQChannelSubPriority=2; //从优先级为2 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能中断优先级 NVIC_Init(&NVIC_InitStructure); //初始化中断 } 对于优先级中的抢占式和从优先级做如下解释: 抢占式优先级:是可以抢占的中断,比如正在执行的优先级为10的中断,突然来了一个优

05_STM32F4通用定时器详细讲解精编版

STM32F4系列共有14个定时器,功能很强大。14个定时器分别为: 2个高级定时器:Timer1和Timer8 10个通用定时器:Timer2~timer5 和 timer9~timer14 2个基本定时器: timer6和timer7 本篇欲以通用定时器timer3为例,详细介绍定时器的各个方面,并对其PWM 功能做彻底的探讨。 Timer3是一个16位的定时器,有四个独立通道,分别对应着PA6 PA7 PB0 PB1 主要功能是:1输入捕获——测量脉冲长度。 2 输出波形——PWM 输出和单脉冲输出。 Timer3有4个时钟源: 1:内部时钟(CK_INT ),来自RCC 的TIMxCLK 2:外部时钟模式1:外部输入TI1FP1与TI2FP2 3:外部时钟模式2:外部触发输入TIMx_ETR ,仅适用于TIM2、TIM3、TIM4,TIM3,对应 着PD2引脚 4:内部触发输入:一个定时器触发另一个定时器。 时钟源可以通过TIMx_SMCR 相关位进行设置。这里我们使用内部时钟。 定时器挂在高速外设时钟APB1或低速外设时钟APB2上,时钟不超过内部高速时钟HCLK ,故当APBx_Prescaler 不为1时,定时器时钟为其2倍,当为1时,为了不超过HCLK ,定时器时钟等于HCLK 。 例如:我们一般配置系统时钟SYSCLK 为168MHz ,内部高速时钟 AHB=168Mhz ,APB1欲分频为4,(因为APB1最高时钟为42Mhz ),那么挂在APB1总线上的timer3时钟为84Mhz 。 《STM32F4xx 中文参考手册》的424~443页列出与通用定时器相关的寄存器一共20个, 以下列出与Timer3相关的寄存器及重要寄存器的简单介绍。 1 TIM3 控制寄存器 1 (TIM3_CR1) SYSCLK(最高 AHB_Prescaler APBx_Prescaler

STM32高级定时器日记之PWM

STM32高级定时器PWM实用程序 文章来源:本站原创作者:佚名 该文章讲述了STM32高级定时器PWM实用程序. 高级定时器与通用定时器比较类似,下面是一个TIM1 的PWM 程序,TIM1是STM32唯一的高级定时器。共有4个通道有死区有互补。 先是配置IO脚: GPIO_InitTypeDef GPIO_InitStructure; /* PA8设置为功能脚(PWM) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /*PB13 设置为PWM的反极性输出*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure); /*开时钟PWM的与GPIO的*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /*配置TIM1*/ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; void Tim1_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_DeInit(TIM1); //重设为缺省值 /*TIM1时钟配置*/ TIM_TimeBaseStructure.TIM_Prescaler = 4000; //预分频(时钟分 频)72M/4000=18K TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数TIM_TimeBaseStructure.TIM_Period = 144; //装载值18k/144=125hz 就是说向上加的144便满了 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置了时钟分割不

stm32高级定时器使用教程

STM32 高级定时器-PWM简单使用 2010-04-14 14:49:29| 分类:STM32 | 标签:|举报|字号大中小订阅高级定时器与通用定时器比较类似,下面是一个TIM1 的PWM 程序,TIM1是STM32唯一的高级定时器。共有4个通道有死区有互补。 先是配置IO脚: GPIO_InitTypeDef GPIO_InitStructure; /* PA8设置为功能脚(PWM) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /*PB13 设置为PWM的反极性输出*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); /*开时钟PWM的与GPIO的*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /*配置TIM1*/ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure;

STM32通用定时器_15-1-6

通用定时器的相关配置 1、预装入(Preload) 预装入实际上是设置TIMx_ARR寄存器有没有缓冲,根据“The auto-reload register is preloaded。Writing to or reading from the auto-reload register accesses the preload register。”可知: 1)如果预装入允许,则对自动重装寄存器的读写是对预装入寄存器的存取,自动重装寄存器的值在更新事件后更新; 2)如果预装入不允许,则对自动重装寄存器的读写是直接修改其本身,自动重装寄存器的值立刻更新; 3)设置方式:TIMx_CR1 →ARPE(1) 2、更新事件(UEV) 1)产生条件:①定时器溢出 ②TIMx_CR1→ UDIS = 0 ③或者:软件产生,TIMx_EGR→ UG = 1 2)更新事件产生后,所有寄存器都被“清零”,注意预分频器计数 器也被清零(但是预分频系数不变)。若在中心对称模式下或DIR=0(向上计数)则计数器被清零;若DIR=1(向下计数)则计数器取TIMx_ARR的值。 3)注意URS(复位为0)位的选择,如下:

如果是软件产生更新,则URS→1,这样就不会产生更新请求 和DMA请求。 4)更新标志位(UIF)根据URS的选择置位。 5)可以通过软件来失能更新事件: 3、计数器(Counter) 计数器由预分频器的输出时钟(CK_CNT)驱动,TIMx_CR1→CEN = 1 使能,注意:真正的计数使能信号(CNT_EN)在 CEN 置位后一个周期开始有效。 4、预分频器(Prescaler) 预分频器用来对时钟进行分频,分频值由TIMx_PSC决定,计数器的时钟频率CK_CNT= fCK_PSC / (PSC[15:0] + 1)。 根据“It can be changed on the fly as this control register

STM32的PWM精讲

STM32的PWM精讲 通过对TM1定时器进行控制,使之各通道输出插入死区的互补PWM输出,各通道输出频率均为17.57KHz。其中,通道1输出的占空比为50%,通道2输出的占空比为25%,通道3输出的占空比为12.5%。各通道互补输出为反相输出。 TM1定时器的通道1到4的输出分别对应PA.08、PA.09、PA.10和PA.11 引脚,而通道1到3的互补输出分别对应PB.13、PB.14和PB.15引脚,中止输入引脚为PB.12。将这些引脚分别接入示波器,在示波器上观查相应通道占空比的方波[12]。 配置好各通道后,编译运行工程;点击MDK的Debug菜单,点击Start/Stop Debug Session;通过示波器察看 PA.08、PA.09、PA.10、PB.13、PB.14、PB.15 的输出波形,其中PA.08和PB.13为第一通道和互补通道,PB.09和PB.14为第二通道和其互补通道,PB.10和PB.15为第三通道和其互补通道;第一通道显示占空比为50%,第二通道占空比为25%,第三通道占空比为12.5%。 第2章STM32处理器概述 STM32F103xx增强型系列产品中内置了多达3个同步的标准定时器。每个定时器都有一个16位的自动加载递加/递减计数器、一个16位的预分频器和4个独立的通道,每个通道都可用于输入捕获、输出比较、PWM和单脉冲模式输出,在最大的封装配置中可提供最多12个输入捕获、输出比较或PWM通道。它们还能通过定时器链接功能与高级控制定时器共同工作,提供同步或事件链接功能。 在调试模式下,计数器可以被冻结。任一个标准定时器都能用于产生PWM 输出。每个定时器都有独立的DMA请求机制。 2.4.2 高级控制定时器[22] 高级控制定时器(TM1)由一个16位的自动装载计数器组成,它由一个可编程预分频器驱动。它适合多种用途,包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较,PWM,嵌入死区时间的互补PWM等)。 使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒至几个毫秒的调节。高级控制(TIM1)和通用(TMx)定时器是完全

stm32定时器的区别

STM32高级定时器、通用定时器(TIMx) 、基本定时器(TIM6和TIM7) 区别? 高级定时器TIM1和TIM8、通用定时器(TIM2,TIM3,TIM4,TIM5) 、基本定时器(TIM6和TIM7) 区别? TIM1和TIM8主要特性TIM1和TIM8定时器的功能包括: ● 16位向上、向下、向上/下自动装载计数器 ● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值 ● 多达4个独立通道:─ 输入捕获─ 输出比较─ PWM生成(边缘或中间对齐模式) ─ 单脉冲模式输出 ● 死区时间可编程的互补输出 ● 使用外部信号控制定时器和定时器互联的同步电路 ● 允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器 ● 刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态 ● 如下事件发生时产生中断/DMA:─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ─ 输入捕获─ 输出比较─ 刹车信号输入 ● 支持针对定位的增量(正交)编码器和霍尔传感器电路 ● 触发输入作为外部时钟或者按周期的电流管理 TIMx主要功能通用TIMx (TIM2、TIM3、TIM4和TIM5)定时器功能包括: ● 16位向上、向下、向上/向下自动装载计数器 ● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意数值 ● 4个独立通道:─ 输入捕获─ 输出比较─ PWM生成(边缘或中间对齐模式) ─ 单脉冲模式输出 ● 使用外部信号控制定时器和定时器互连的同步电路 ● 如下事件发生时产生中断/DMA:─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ─ 输入捕获─ 输出比较 ● 支持针对定位的增量(正交)编码器和霍尔传感器电路 ● 触发输入作为外部时钟或者按周期的电流管理 TIM6和TIM7的主要特性TIM6和TIM7定时器的主要功能包括: ● 16位自动重装载累加计数器 ● 16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1~65536之间的任意数值分频 ● 触发DAC的同步电路注:此项是TIM6/7独有功能. ● 在更新事件(计数器溢出)时产生中断/DMA请求 强大,高级定时器应该是用于电机控制方面的吧

STM32学习笔记通用定时器PWM输出

STM32学习笔记(5):通用定时器PWM输出 2011年3月30日TIMER输出PWM 1.TIMER输出PWM基本概念 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。一般用来控制步进电机的速度等等。 STM32的定时器除了TIM6和TIM7之外,其他的定时器都可以用来产生PWM输出,其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出,而通用定时器也能同时产生4路的PWM输出。 1.1PWM输出模式 STM32的PWM输出有两种模式,模式1和模式2,由TIMx_CCMRx寄存器中的OCxM位确定的(“110”为模式1,“111”为模式2)。模式1和模式2的区别如下: 110:PWM模式1-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。 111:PWM模式2-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平。 由此看来,模式1和模式2正好互补,互为相反,所以在运用起来差别也并不太大。 而从计数模式上来看,PWM也和TIMx在作定时器时一样,也有向上计数模式、向下计数模式和中心对齐模式,关于3种模式的具体资料,可以查看《STM32参考手册》的“14.3.9 PWM模式”一节,在此就不详细赘述了。 1.2PWM输出管脚 PWM的输出管脚是确定好的,具体的引脚功能可以查看《STM32参考手册》的“8.3.7 定时器复用功能重映射”一节。在此需要强调的是,不同的TIMx有分配不同的引脚,但是考虑到管脚复用功能,STM32提出了一个重映像的概念,就是说通过设置某一些相关的寄存器,来使得在其他非原始指定的管脚上也能输出PWM。但是这些重映像的管脚也是由参考手册给出的。比如

STM32 高级定时器-PWM简单使用

STM32 高级定时器-PWM简 单使用 高级定时器与通用定时器比较类似,下面是一个TIM1 的PWM 程序,TIM1是STM32唯一的高级定时器。共有4个通道有死区有互补。 先是配置IO脚: GPIO_InitTypeDef GPIO_InitStructure; /* PA8设置为功能脚(PWM) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /*PB13 设置为PWM的反极性输出*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); /*开时钟PWM的与GPIO的*/ RCC_APB2PeriphClockCmd(RCC_A PB2Periph_TIM1,ENABLE); RCC_APB2PeriphClockCmd(RCC_A PB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_A PB2Periph_GPIOB, ENABLE); /*配置TIM1*/ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; void Tim1_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_DeInit(TIM1); //重设为缺省值 /*TIM1时钟配置*/ TIM_TimeBaseStructure.TIM_Prescaler = 4000; //预分频(时钟分频)72M/4000=18K TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数 TIM_TimeBaseStructure.TIM_Period = 144; //装载值18k/144=125hz 就是说向上加的144便满了 TIM_TimeBaseStructure.TIM_ClockDivision =

STM32-PWM输出总结讲课讲稿

学习后发现stm32的定时器功能确实很强大,小总结一下方便以后使用的时候做参考。Stm32定时器一共分为三种:tim1和tim8是高级定时器,6和7是基本定时器,2—5是通用定时器。从名字就可以看得出来主要功能上的差异。今天我主要是用定时器做pwm输出,所以总结也主要是针对pwm方面的。 先大致说下通用和高级定时器的区别。通用的可以输出四路pwm信号互不影响。高级定时器可以输出三对互补pwm信号外加ch4通道,也就是一共七路。 所以这样算下来stm32一共可以生成4*5+7*2=30路pwm信号。接下来还有功能上的区别:通用定时器的pwm信号比较简单,就是普通的调节占空比调节频率(别的不常用到的没去深究);高级定时器的还带有互补输出功能,同时互补信号可以插入死区,也可以使能刹车功能,从这些看来高级定时器的pwm天生就是用来控制电机的。 Pwm输出最基本的调节就是频率和占空比。频率当然又和时钟信号扯上了关系。高级定时器是挂接到APB2上,而通用定时器是挂接到APB1上的。APB1和APB2的区别就要在于时钟频率不同。APB2最高频率允许72MH,而APB1最高频率为36MHZ。这样是不是通用定时器只最高36MHZ频率呢,不是的;通用定时器时钟信号完整的路线应该是下面这样的:AHB(72mhz)→APB1分频器(默认2)→APB1时钟信号(36mhz)→倍频器(*2倍)→通用定时器时钟信号(72mhz)。 在APB1和定时器中间的倍频器起到了巨大的作用,假如红色字体的“APB1分频器”假如不为1(默认是2),倍频器会自动将APB1时钟频率扩大2倍后作为定时器信号源,这个它内部自动控制的不用配置。设置这个倍频器的目的很简单就是在APB1是36mhz的情况下通用定时器的频率同样能达到72mhz。我用的库函数直接调用函数SystemInit(); 这个函数之后时钟配置好了:通用定时器和高级定时器的时钟现在都是72mhz(你也可以自己再配置一下RCC让他的频率更低,但是不能再高了)。定时器接下来还有一个分频寄存器:TIMX_PSC 经过他的分频后,才是定时器计数的频率。所以真正的时钟频率应该是72mhz/(TIMX_PSC-1),我们设为tim_frepuency下面还会用到。 stm32的时钟频率弄得确实是很饶人的,所以关键就是先要把思路理清楚。时钟的频率弄好了下面终于可以开说重点PWM了。当然还少不了频率:pwm主要就是控制频率和占空比的:这两个因素分别通过两个寄存器控制:TIMX_ARR和TIMX_CCRX。ARR寄存器就是自动重装寄存器,也就是计数器记到这个数以后清零再开始计,这样pwm的频率就是tim_frequency/(TIMX_ARR-1)。在计数时会不停的和CCRX寄存器中的数据进行比较,如果小于的话是高电平或者低电平,计数值大于CCRX值的话电平极性反相。所以这也就控制了占空比。 下面是定时器1的配置代码: GPIO_InitTypeDef GPIO_InitStructure2; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_BDTRInitTypeDef TIM_BDTRInitStructure; //第一步:配置时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_GPIOB|RCC_APB2Periph_TIM1 ,ENABLE); //第二步,配置goio口 /********TIM1_CH1 引脚配置*********/

stm32f103通用定时器pwm应用例程--蜂鸣器演奏乐曲

stm32f103通用定时器pwm应用例程--蜂鸣器演奏乐曲STM32F103通用定时器PWM应用例程:蜂鸣器演奏乐曲一(说明:本例程是将流明LM3SLib_Timer.pdf文档中的例程9及例程10(PWM应用: 蜂鸣器演奏乐曲),移植到STM32F103上。 二(流明LM3SLib_Timer.pdf例程9及例程10的拷贝: 例程9( Timer PWM应用:蜂鸣器发声 如图1.1所示,为EasyARM1138开发板上的蜂鸣器驱动电路。蜂鸣器类型是交流蜂鸣器,也称无源蜂鸣器,需要输入一列方波才能鸣响,发声频率等于驱动方波的频率。 图1.1 蜂鸣器驱动电路 程序清单1.9是Timer模块16位PWM模式的一个应用,可以驱动交流蜂鸣器发声,运行后蜂鸣器以不同的频率叫两声。其中"buzzer.h"和"buzzer.c"是蜂鸣器的驱动程序,仅有3个驱动函数,用起来很简捷。

程序清单1.9 Timer PWM应用:蜂鸣器发声 文件:main.c #include "systemInit.h" #include "buzzer.h" // 主函数(程序入口) int main(void) { jtagWait(); // 防止JTAG失效,重要~ clockInit(); // 时钟初始化:晶振,6MHz buzzerInit(); // 蜂鸣器初始化 buzzerSound(1500); // 蜂鸣器发出1500Hz声音 SysCtlDelay(400* (TheSysClock / 3000)); // 延时约400ms buzzerSound(2000); // 蜂鸣器发出2000Hz声音 SysCtlDelay(800* (TheSysClock / 3000)); // 延时约800ms buzzerQuiet( ); // 蜂鸣器静音 for (;;) { } } 文件:buzzer.h #ifndef __BUZZER_H__ #define __BUZZER_H__ // 蜂鸣器初始化 extern void buzzerInit(void); // 蜂鸣器发出指定频率的声音 extern void buzzerSound(unsigned short usFreq); // 蜂鸣器停止发声

STM32入门篇之通用定时器彻底研究

STM32入门篇之通用定时器彻底研究 STM32的定时器功能很强大,学习起来也很费劲儿,本人在这卡了5天才算看明白。写下下面的文字送给后来者,希望能带给你点启发。在此声明,本人也是刚入门,接触STM32不足10天,所以有失误的地方请以手册为准,欢迎大家拍砖。 其实手册讲的还是挺全面的,只是无奈TIMER的功能太复杂,所以显得手册很难懂,我就是通过这样看手册:while(!SUCCESS){看手册…}才搞明白的!所以接下来我以手册的顺序为主线,增加一些自己的理解,并通过11个例程对TIMER 做个剖析。实验环境是STM103V100的实验板,MDK3.2 +Library2.东西都不怎么新,凑合用…… TIMER主要是由三部分组成: 1、时基单元。 2、输入捕获。 3、输出比较。 还有两种模式控制功能:从模式控制和主模式控制。 一、框图 让我们看下手册,一开始是定时器的框图,这里面几乎包含了所有定时器的信息,您要是能看明白,那么接下来就不用再看别的了… 为了方便的看图,我对里面出现的名词和符号做个注解: TIMx_ETR:TIMER外部触发引脚ETR:外部触发输入 ETRP:分频后的外部触发输入ETRF:滤波后的外部触发输入 ITRx:内部触发x(由另外的定时器触发) TI1F_ED:TI1的边沿检测器。 TI1FP1/2:滤波后定时器1/2的输入 TRGI:触发输入TRGO:触发输出 CK_PSC:应该叫分频器时钟输入 CK_CNT:定时器时钟。(定时周期的计算就靠它) TIMx_CHx:TIMER的输入脚TIx:应该叫做定时器输入信号x

ICx:输入比较x ICxPS:分频后的ICx OCx:输出捕获x OCxREF:输出参考信号 关于框图还有以下几点要注意: 1、影子寄存器。 有阴影的寄存器,表示在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预装 载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存 器,称为shadow register(影子寄存器);(详细请参考版主博客 https://www.wendangku.net/doc/b41388443.html,/STM32/401461/message.aspx) 2、输入滤波机制 在ETR何TIx输入端有个输入滤波器,它的作用是以采样频率 Fdts来采样N次进行滤波的。(具体也请参考版主博客 https://www.wendangku.net/doc/b41388443.html,/STM32/263170/message.aspx ) 3、输入引脚和输出引脚是相同的。 二、时基单元 时基单元有三个部分:CNT、PSC、ARR。CNT的计数方式分三种:向上、向下、中央对齐。通俗的说就是0—ARR、ARR—0、0—(ARR-1)—ARR—1. 三、时钟源的选择 这个是难点之一。从手册上我们看到共有三种时钟源: 1、内部时钟。 也就是选择CK_INT做时钟,这个简单,但是有一点要注意,定 时器的时钟不是直接来自APB1或APB2,而是来自于输入为

STM32 定时器 PWM

STM32+按键调控PWM输出+串口输出占空比(2010-09-20 21:59) 分类:STM32学习笔记

TIM.c

main.c

#include "stm32f10x.h" TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; uint16_t CCR1_V al = 250; uint16_t CCR2_V al = 500; uint16_t CCR3_V al = 750; uint16_t CCR4_V al = 0; uint16_t PrescalerV alue = 0; void RCC_Configuration(void); //时钟配置 void GPIO_Configuration(void); //管脚配置 void Delay (__IO uint32_t nCount); //延时函数 int main(void) { RCC_Configuration(); GPIO_Configuration(); PrescalerV alue = (uint16_t) (SystemCoreClock / 24000000) - 1; TIM_TimeBaseStructure.TIM_Period = 1000; //周期 TIM_TimeBaseStructure.TIM_Prescaler = PrescalerV alue; //分频 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分割 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始TIM3 /*************************** 通道1 ********************************/ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //PWM功能使能TIM_OCInitStructure.TIM_Pulse = CCR1_V al; //写比较值(占空比TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //置高 TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); /****************************** 通道2 ******************************/ /* PWM1 Mode configuration: Channel2 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR2_V al; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC2Init(TIM3, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); /******************************* 通道3 *********************************/ /* PWM1 Mode configuration: Channel3 */

STM32通用定时器

STM32通用定时器 一、定时器的基础知识 三种STM32定时器区别 通用定时器功能特点描述: STM3 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能特点包括: 位于低速的APB1总线上(APB1) 16 位向上、向下、向上/向下(中心对齐)计数模式,自动装载计数器(TIMx_CNT)。 16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数 为 1~65535 之间的任意数值。 4 个独立通道(TIMx_CH1~4),这些通道可以用来作为: ①输入捕获 ②输出比较 ③ PWM 生成(边缘或中间对齐模式) ④单脉冲模式输出 可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。 如下事件发生时产生中断/DMA(6个独立的IRQ/DMA请求生成器): ①更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ②触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ③输入捕获 ④输出比较 ⑤支持针对定位的增量(正交)编码器和霍尔传感器电路 ⑥触发输入作为外部时钟或者按周期的电流管理 STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。 STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。 定时器框图:

倍频得到),外部时钟引脚,可以通过查看数据手册。也可以是TIMx_CHn,此时主要是实现捕获功能; 框图中间的时基单元 框图下面左右两部分分别是捕获输入模式和比较输出模式的框图,两者用的是同一引脚,不能同时使用。

基于寄存器操作的STM32高级定时器TIM1的四路PWM输出程序讲解

经过一天的努力,终于把stm32 tim1的四路pwm输出搞了出来,为了使大家快速的用起tim1,打算写这篇文档与大家分享。 stm32 tim1功能丰富。针对pwm输出与tim2只有细小的差别,之前在网上找了一些网友的程序,发现大部分都是基于库文件写的,不能对tim1的pwm输出有深层次的理解,个人认为一个合格的程序员,想要最大程度的用好一个片子的话还是要针对寄存器直接操作,完全了解定时器的运行过程,可以对片子的结构有一定的了解。 高级控制定时器(TIM1 和TIM8) 由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动。它适合多种用途,包含测量输入信号的脉冲宽度( 输入捕获) ,或者产生输出波形( 输出比较、PWM、嵌入死区时间的互补PWM等)。使用定时器预分频器和RCC 时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。 高级控制定时器(TIM1 和TIM8) 和通用定时器(TIMx) 是完全独立的,它们不共享任何资源。 请读者仔细阅读一下信息: 脉冲宽度调制模式可以产生一个由TIMx_ARR 寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。在TIMx_CCMRx寄存器中的OCxM 位写入’110’(PWM 模式1) 或’111’(PWM 模式2) ,能够独立地设置每个OCx 输出通道产生一路PWM。必须通过设置TIMx_CCMRx寄存器的OCxPE位使能相应的预装载寄存器,最后还要设置TIMx_CR1 寄存器的ARPE 位,( 在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计数之前,必须通过设置TIMx_EGR 寄存器中的UG位来初始化所有的寄存器。OCx 的极性可以通过软件在TIMx_CCER 寄存器中的CCxP位设置,它可以设置为高电平有效或低电平有效。OCx 的输出使能通过(TIMx_CCER 和TIMx_BDTR寄存器中)CCxE 、CCxNE、MOE、OSSI和OSSR 位的组合控制。详见TIMx_CCER寄存器的描述。在PWM模式(模式1或模式2) 下,TIMx_CNT 和TIMx_CCRx始终在进行比较,( 依据计数器的计数方向)以确定是否符合TIMx_CCRx≤TIMx_CNT 或者TIMx_CNT ≤TIMx_CCRx。根据TIMx_CR1 寄存器中CMS位的状态,定时器能够产生边沿对齐的PWM信号或中央对齐的PWM信号。 根据以上信息的提示,我们可以归纳出寄存器操作的步骤: (1)使能相应的定时器时钟线。 (2)配置tim1四路pwm输出引脚为复用功能输出。 (3)配置tim1的分频比和计数装载值。 (4)配置相应通道的pwm输出模式和使能预装载。 (5)打开自动重装载预装载允许位。 (6)根据需要选择向上或者是向下计数模式。 (7)打开相应通道的输出使能。 (8)配置各通道的占空比。 (9)开启开启OC和OCN。 (10)最后使能定时器1. 关于分频比和计数装载值的选择: Tim1的最大时钟频率为72M,假设我们想得到一个频率为4KHZ,占空比0~100%步进为1的pwm。根据计数器的时钟频率(CK_CNT) 等于f CK_PSC/( PSC[15:0]+1)。因为占空比0~100%步进为1,所以我们把计数值设为100.比较值可以设为0~100之间,实现占空比的调节。计数器的时钟频率(CK_CNT)应为4KHZ X 100=400KHZ。所以PSC = 179。ARR=100。有不明白的请看手册。

STM32 定时器与 PWM 快速使用入门

STM32 定时器与 PWM 快速使用入门 要求:在万利的开发板 EK-STM32F 上产生周期为1秒,占空比分别为 50% 10%的 PWM 并且点亮板上的 LD1,LD2 灯闪烁。 做法很简单。 STM32的PWM是由定时器来产生的。 可以看出。定时器3的通道1至4在GPIO端口的映像。如果是完全映射。 各通道的连接引脚如下: CH1=PC6, CH2=PC7, CH3=PC8, CH4=PC9 这样,刚好与板上的LD1,LD2灯符合,因为LD1连接到PC7,LD2连接到PC6引脚。 关于PWM一些知识. STM32的TIMx 是 TIMx_ARR 寄存器确定频率(周期)、由TIMx_CCRx 寄存器确定占空比的信号。 使用定时器3。而TIM2、3、4的时钟源是 APB1 即是 PCLK1 ( APB1 对应 PCLK1 ) PCLK1 = APB1 = HCLK/2 = SYSCLK/2 = 36MHZ (36,000,000 HZ) 但是注意:倍频器会自动倍2,即是【72MHZ】! 代码如下: void STM32_PWM_GPIO_Configuration(void) { // 11:完全映像 STM32_Afio_Regs->mapr.bit.TIM3_REMAP=3; // LD1 =P7 LD2=PC6 /*GPIOA Configuration: ( PC6 PC7 ) TIM3 channel 1 and 2 as alternate function push -pull */ STM32_Gpioc_Regs-&https://www.wendangku.net/doc/b41388443.html,F6=Output_Af_push_pull; // PC.06 复用功能推挽输出模式 STM32_Gpioc_Regs->crl.bit.MODE6=Output_Mode_50mhz; // PC.06 输出模式,最大速度50MHz STM32_Gpioc_Regs-&https://www.wendangku.net/doc/b41388443.html,F7=Output_Af_push_pull; // PC.07 复用功能推挽输出模式 STM32_Gpioc_Regs->crl.bit.MODE7=Output_Mode_50mhz; // PC.07 输出模式,最大速度50MHz

相关文档
相关文档 最新文档