STM32通用定时器基本定时功能与PWM

1.STM32的Timer简介

STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2

个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick,看门狗定时器以后再详细研究。今天主要是研究剩下的8个定时器。

其中TIM1和TIM8是能够产生3对PWM互补输出的高级登时其,常用于三相电机的驱动,时钟由APB2的输出产生。TIM2-TIM5是普通定时器,TIM6和TIM7是基本定时器,其时钟由APB1输出产生。由于STM32的TIMER功能太复杂了,所以只能一点一点的学习。因此今天就从最简单的开始学习起,也就是TIM2-TIM5普通定时器的定时功能。

2.普通定时器TIM2-TIM5

2.1时钟来源

计数器时钟可以由下列时钟源提供:

·内部时钟(CK_INT)

·外部时钟模式1:外部输入脚(TIx)

·外部时钟模式2:外部触发输入(ETR)

·内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。

由于今天的学习是最基本的定时功能,所以采用内部时钟。TIM2-TIM5的时钟不是直接来自于APB1,而是来自于输入为APB1的一个倍频器。这个倍频器的作用是:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其他数值时(即预分频系数为2、4、8或16),这个倍频器起作用,定时器的时钟频率等于APB1的频率的2倍。APB1的分频在STM32_SYSTICK的学习笔记中有详细描述。通过倍频器给定时器时钟的好处是:APB1不但要给TIM2-TIM5提供时钟,还要为其他的外设提供时钟;设置这个倍频器可以保证在其他外设使用较低时钟频率时,TIM2-TIM5仍然可以得到较高的时钟频率。

2.2计数器模式

TIM2-TIM5可以由向上计数、向下计数、向上向下双向计数。向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器内容),然后重新从0开始计数并且产生一个计数器溢出事件。在向下模式中,计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一

个计数器向下溢出事件。而中央对齐模式(向上/向下计数)是计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。

2.3编程步骤

1.配置系统时钟;

2.配置NVIC;

3.配置GPIO;

4.配置TIMER;

其中,前3项在前面的笔记中已经给出,在此就不再赘述了。第4项配置TIMER有如下配置:(1)利用TIM_DeInit()函数将Timer设置为默认缺省值;

(2)TIM_InternalClockConfig()选择TIMx来设置内部时钟源;

(3)TIM_Perscaler来设置预分频系数;

(4)TIM_ClockDivision来设置时钟分割;

(5)TIM_CounterMode来设置计数器模式;

(6)TIM_Period来设置自动装入的值

(7)TIM_ARRPerloadConfig()来设置是否使用预装载缓冲器

(8)TIM_ITConfig()来开启TIMx的中断

其中(3)-(6)步骤中的参数由TIM_TimerBaseInitTypeDef结构体给出。步骤(3)中的预分频系数用来确定TIMx所使用的时钟频率,具体计算方法为:CK_INT/(TIM_Perscaler+1)。CK_INT是内部时钟源的频率,是根据2.1中所描述的APB1的倍频器送出的时钟,TIM_Perscaler是用户设定的预分频系数,其值范围是从0 – 65535。

步骤(4)中的时钟分割定义的是在定时器时钟频率(CK_INT)与数字滤波器(ETR,TIx)使用的采样频率之间的分频比例。TIM_ClockDivision的参数如下表:

数字滤波器(ETR,TIx)是为了将ETR进来的分频后的信号滤波,保证通过信号频率不超过某个限定。

步骤(7)中需要禁止使用预装载缓冲器。当预装载缓冲器被禁止时,写入自动装入的值(TIMx_ARR)的数值会直接传送到对应的影子寄存器;如果使能预加载寄存器,则写入ARR的数值会在更新事件时,才会从预加载寄存器传送到对应的影子寄存器。

ARM中,有的逻辑寄存器在物理上对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadow register(影子寄存器);设计preload register和shadow register的好处是,所有真正需要起作用的寄存器(shadow register)可以在同一个时间(发生更新事件时)被更新为所对应的preload register的内容,这样可以保证多个通道的操作能够准确地同步。如果没有shadow register,或者preload register和shadow register 是直通的,即软件更新preload register时,同时更新了shadow register,因为软件不可能在一个相同的时刻同时更新多个寄存器,结果造成多个通道的时序不能同步,如果再加上其它因素(例如中断),多个通道的时序关系有可能是不可预知的。

3.程序源代码

本例实现的是通过TIM2的定时功能,使得LED灯按照1s的时间间隔来闪烁#include "stm32f10x_lib.h"

void RCC_cfg();

void TIMER_cfg();

void NVIC_cfg();

void GPIO_cfg();

int main()

{

RCC_cfg();

NVIC_cfg();

GPIO_cfg();

TIMER_cfg();

//开启定时器2

TIM_Cmd(TIM2,ENABLE);

while(1);

}

void RCC_cfg()

{

//定义错误状态变量

ErrorStatus HSEStartUpStatus;

//将RCC寄存器重新设置为默认值

RCC_DeInit();

//打开外部高速时钟晶振

RCC_HSEConfig(RCC_HSE_ON);

//等待外部高速时钟晶振工作

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(HSEStartUpStatus == SUCCESS)

{

//设置AHB时钟(HCLK)为系统时钟

RCC_HCLKConfig(RCC_SYSCLK_Div1);

//设置高速AHB时钟(APB2)为HCLK时钟

RCC_PCLK2Config(RCC_HCLK_Div1);

//设置低速AHB时钟(APB1)为HCLK的2分频

RCC_PCLK1Config(RCC_HCLK_Div2);

//设置FLASH代码延时

FLASH_SetLatency(FLASH_Latency_2);

//使能预取指缓存

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

//设置PLL时钟,为HSE的9倍频8MHz * 9 = 72MHz

RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

//使能PLL

RCC_PLLCmd(ENABLE);

//等待PLL准备就绪

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

//设置PLL为系统时钟源

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

//判断PLL是否是系统时钟

while(RCC_GetSYSCLKSource() != 0x08);

}

//允许TIM2的时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

//允许GPIO的时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

}

void TIMER_cfg()

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

//重新将Timer设置为缺省值

TIM_DeInit(TIM2);

//采用内部时钟给TIM2提供时钟源

TIM_InternalClockConfig(TIM2);

//预分频系数为36000-1,这样计数器时钟为72MHz/36000 = 2kHz TIM_TimeBaseStructure.TIM_Prescaler = 36000 - 1;

//设置时钟分割

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;

//设置计数器模式为向上计数模式

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置计数溢出大小,每计2000个数就产生一个更新事件

TIM_TimeBaseStructure.TIM_Period = 2000 - 1;

//将配置应用到TIM2中

TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

//清除溢出中断标志

TIM_ClearFlag(TIM2, TIM_FLAG_Update);

//禁止ARR预装载缓冲器

TIM_ARRPreloadConfig(TIM2, DISABLE);

//开启TIM2的中断

TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

}

void NVIC_cfg()

{

NVIC_InitTypeDef NVIC_InitStructure;

//选择中断分组1

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

//选择TIM2的中断通道

NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;

//抢占式中断优先级设置为0

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

//响应式中断优先级设置为0

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

//使能中断

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

void GPIO_cfg()

{

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //选择引脚5

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出频率最大50MHz GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //带上拉电阻输出

GPIO_Init(GPIOB,&GPIO_InitStructure);

}

在stm32f10x_it.c中,我们找到函数TIM2_IRQHandler(),并向其中添加代码

void TIM2_IRQHandler(void)

{

u8 ReadValue;

//检测是否发生溢出更新事件

if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)

{

//清除TIM2的中断待处理位

TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);

//将PB.5管脚输出数值写入ReadValue

ReadValue = GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5);

if(ReadValue == 0)

{

GPIO_SetBits(GPIOB,GPIO_Pin_5);

}

else

{

GPIO_ResetBits(GPIOB,GPIO_Pin_5);

}

}

}

STM32学习笔记(5):通用定时器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参考手册》的“定时器复用功能重映射”一节。在此需要强调的是,不同的TIMx有分配不同的引脚,但是考虑到管脚复用功能,STM32提出了一个重映像的概念,就是说通过设置某一些相关的寄存器,来使得在其他非原始指定的管脚上也能输出PWM。但是这些重映像的管脚也是由参考手册给出的。比如说TIM3的第2个通道,在没有重映像的时候,指定的管脚是PA.7,如果设置部分重映像之后,TIM3_CH2的输出就被映射到PB.5上了,如果设置了完全重映像的话,TIM3_CH2的输出就被映射到PC.7上了。

1.3PWM输出信号

PWM输出的是一个方波信号,信号的频率是由TIMx的时钟频率和TIMx_ARR预分频器所决定的,具体设置方法在前面一个学习笔记中有详细的交代。而输出信号的占空比则是由TIMx_CRRx寄存器确定的。其公式为“占空比=(TIMx_CRRx/TIMx_ARR)*100%”,因此,可以通过向CRR中填入适当的数来输出自己所需的频率和占空比的方波信号。

2.TIMER输出PWM实现步骤

1.设置RCC时钟;

2.设置GPIO时钟;

3.设置TIMx定时器的相关寄存器;

4.设置TIMx定时器的PWM相关寄存器。

第1步设置RCC时钟已经在前文中给出了详细的代码,在此就不再多说了。需要注意的是通用定时器TIMx是由APB1提供时钟,而GPIO则是由APB2提供时钟。注意,如果需要对PWM的输出进行重映像的话,还需要开启引脚复用时钟AFIO。

第2步设置GPIO时钟时,GPIO模式应该设置为复用推挽输出GPIO_Mode_AF_PP,如果需要引脚重映像的话,则需要用GPIO_PinRemapConfig()函数进行设置。

第3步设置TIMx定时器的相关寄存器时,和前一篇学习笔记一样,设置好相关的TIMx 的时钟和技术模式等等。具体设置参看“TIMER基本定时功能”的学习笔记。

第4步设置PWM相关寄存器,首先要设置PWM模式(默认情况下PWM是冻结的),然后设置占空比(根据前面所述公式进行计算),再设置输出比较极性:当设置为High时,输出信号不反相,当设置为Low时,输出信号反相之后再输出。最重要是是要使能TIMx 的输出状态和使能TIMx的PWM输出使能。

相关设置完成之后,就可以通过TIM_Cmd()来打开TIMx定时器,从而得到PWM输出了。

3.TIMER输出PWM源代码

由于我现在手上的奋斗开发板是将PB.5接到LED上,因此需要使用TIM3的CH2通道,并且要进行引脚重映像。打开TIM3之后,PWM输出,使得LED点亮,通过改变PWM_cfg()中的占空比可以调节LED的亮度。

#include "stm32f10x_lib.h"

void RCC_cfg();

void GPIO_cfg();

void TIMER_cfg();

void PWM_cfg();

//占空比,取值范围为0-100

int dutyfactor = 50;

int main()

{

int Temp;

RCC_cfg();

GPIO_cfg();

TIMER_cfg();

PWM_cfg();

//使能TIM3计时器,开始输出PWM

TIM_Cmd(TIM3, ENABLE);

while(1);

}

void RCC_cfg()

{

//定义错误状态变量

ErrorStatus HSEStartUpStatus;

//将RCC寄存器重新设置为默认值

RCC_DeInit();

//打开外部高速时钟晶振

RCC_HSEConfig(RCC_HSE_ON);

//等待外部高速时钟晶振工作

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(HSEStartUpStatus == SUCCESS)

{

//设置AHB时钟(HCLK)为系统时钟

RCC_HCLKConfig(RCC_SYSCLK_Div1);

//设置高速AHB时钟(APB2)为HCLK时钟

RCC_PCLK2Config(RCC_HCLK_Div1);

//设置低速AHB时钟(APB1)为HCLK的2分频

RCC_PCLK1Config(RCC_HCLK_Div2);

//设置FLASH代码延时

FLASH_SetLatency(FLASH_Latency_2);

//使能预取指缓存

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

//设置PLL时钟,为HSE的9倍频8MHz * 9 = 72MHz

RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

//使能PLL

RCC_PLLCmd(ENABLE);

//等待PLL准备就绪

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

//设置PLL为系统时钟源

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

//判断PLL是否是系统时钟

while(RCC_GetSYSCLKSource() != 0x08);

}

//开启TIM3的时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

//开启GPIOB的时钟和复用功能

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |

RCC_APB2Periph_AFIO,ENABLE);

}

void GPIO_cfg()

{

GPIO_InitTypeDef GPIO_InitStructure;

//部分映射,将TIM3_CH2映射到PB5

// GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);

GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);

//选择引脚5

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

//输出频率最大50MHz

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

//复用推挽输出

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOB,&GPIO_InitStructure);

}

void TIMER_cfg()

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

//重新将Timer设置为缺省值

TIM_DeInit(TIM3);

//采用内部时钟给TIM3提供时钟源

TIM_InternalClockConfig(TIM3);

//预分频系数为0,即不进行预分频,此时TIMER的频率为72MHz

TIM_TimeBaseStructure.TIM_Prescaler = 0;

//设置时钟分割

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;

//设置计数器模式为向上计数模式

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

//设置计数溢出大小,每计7200个数就产生一个更新事件,即PWM的输出频率为10kHz TIM_TimeBaseStructure.TIM_Period = 7200 - 1;

//将配置应用到TIM3中

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

}

void PWM_cfg()

{

TIM_OCInitTypeDef TimOCInitStructure;

//设置缺省值

TIM_OCStructInit(&TimOCInitStructure);

//PWM模式1输出

TimOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

//设置占空比,占空比=(CCRx/ARR)*100%或(TIM_Pulse/TIM_Period)*100% TimOCInitStructure.TIM_Pulse = dutyfactor * 7200 / 100;

//TIM输出比较极性高

TimOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

//使能输出状态

TimOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

//TIM3的CH2输出

TIM_OC2Init(TIM3, &TimOCInitStructure);

//设置TIM3的PWM输出为使能

TIM_CtrlPWMOutputs(TIM3,ENABLE);

}

STM32 TIM的PMW模式

STM32 TIM的PMW模式 STM32开发板学习日记-[5]TIM的PMW模式 脉冲宽度调制模式可以产生一个由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 位设置,它可以设置为高电平有效活或低电平有效。 TIMx_CCER寄存器中的CCxE位控制OCx输出使能。 在PWM模式(模式1或模式2)下,TIMx_CNT和TIM1_CCRx

始终在进行比较,(依据计数器的计数方向)以确定是否符合TIM1_CCRx≤TIM1_CNT或者 TIM1_CNT≤TIM1_CCRx。然而为了与OCREF_CLR 的功能(在下一个PWM周期之前,ETR信号上的一个外部事件能够清除OCxREF)一致,OCxREF信号只能在下述条件下产生: ●当比较的结果改变 ●当输出比较模式(TIMx_CCMRx寄存器中的OCxM位)从 “冻结”(无比较,OCxM=’000’)切换到某个PWM模式(OCxM=’110’或 ’111’)。这样在运行中可以通过软件强置PWM输出。 根据TIMx_CR1寄存器中CMS位的状态,定时器能够产生边沿对齐的PWM信号或中央对齐的PWM信号。 110:PWM模式1-在向上计数时,一旦 TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平 (OC1REF=1)。 111:PWM模式2-在向上计数时,一旦 TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1

stm32通用定时器

stm32通用定时器 STM32的定时器是个强大的模块,定时器使用的频率也是很高的,定时器可以做一些基本的定时,还可以做PWM输出或者输入捕获功能。 时钟源问题: 名为TIMx的有八个,其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在 APB1总线上。其中TIM1&TIM8称为高级控制定时器(advanced control tim er).他们所在的APB2总线也比APB1总线要好。APB2可以工作在72MHz下,而APB1最大是36MHz。 定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器。 下面以定时器2~7的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。 假定AHB=36MHz,因为APB1允许的最大频率为36MHz,所以APB1的预分频系数可以取任意数值;当预分频系数=1时,APB1=36MHz,TIM2~7的时钟频率=36MHz(倍频器不起作用);当预分频系数=2时,APB1=18MHz,在倍频器的作用下,TIM2~7的时钟频率=36MHz。 有人会问,既然需要TIM2~7的时钟频率=36MHz,为什么不直接取APB1的预分频系数=1?答案是:APB1不但要为TIM2~7提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM2~7仍能得到较高的时钟频率。

再举个例子:当AHB=72MHz时,APB1的预分频系数必须大于2,因为APB1的最大频率只能为36MHz。如果APB1的预分频系数=2,则因为这个倍频器,TIM2~7仍然能够得到72MHz的时钟频率。能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频器的初衷。 TIM通用定时器配置步骤: 1.配置TIM时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); 2.定时器基本配置 void TIM2_Configuration(void) { TIM_Tim eBaseInitTypeDef TIM_Tim eBaseStructure; // TIM_OCInitTypeDef TIM_OCInitStructure ; TIM_DeInit(TIM2); //复位TIM2定时器 /* TIM2 configuration */ TIM_Tim eBaseStructure.TIM_Period = 5; // 2.5m s TIM_Tim eBaseStructure.TIM_Prescaler = 36000; // 分频36000 TIM_Tim eBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频 TIM_Tim eBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数方向向上计数 TIM_Tim eBaseInit(TIM2, &TIM_Tim eBaseStructure); /* Clear TIM2 update pending flag[清除TIM2溢出中断标志] */ TIM_ClearFlag(TIM2, TIM_FLAG_Update); /* Enable TIM2 Update interrupt [TIM2溢出中断允许]*/ TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); /* TIM2 enable counter [允许tim2计数]*/ TIM_Cmd(TIM2, ENABLE); } TIM_Period设置了在下一个更新事件装入活动的自动重装载寄存器周期的值。它的取值必须在0x0000和0xFFFF之间。 TIM_Prescaler设置了用来作为TIMx时钟频率除数的预分频值。它的取值必须在0x0000和0xFFFF之间。 TIM_ClockDivision的作用是做一段延时,一般在特殊场合的时候会用到,可不关心。 TIM_CounterMode选择了计数器模式。 TIM_CounterMode_Up TIM向上计数模式

STM32F10x通用定时器_输入捕捉与输出比较

14.4 通用定时器输入触发和输入捕捉 通用定时器有4个独立输入通道和一个专用触发输入,这些输入主要用于定时器的计数时钟、触发、门控、初始化和输入捕捉。 14.4.1 通用定时器外部触发输入 图14-5为通用定时器专用触发输入电路,通过配置从模式控制寄存器(TIMx_SMCR)可以将ETRF选作为定时器的计数时钟、外部触发、外部门控和外部初始化(清零和更新)。 图14-5 通用定时器外部触发输入框图 14.4.2 通用定时器通道1和通道2的输入捕捉 图14-6为通用定时器通道1和通道2的输入捕捉电路,通道1的输入TI1可以直接连接到通道1的引脚CH1,也可以连接到三个通道(CH1,CH2,CH3)的异或输出。每个通道的输入信号经过滤波、极性选择、预分频后再连接到升沿检测器,每个上升跳沿都将当前主计数器的计数值锁存到相应的捕捉比较寄存器TIMx_CCRy(y=1,2,3,4)中,并置位相应的中断标志CCyIF产生相应的中断请求。此外TI1F_ED,TIF1P1和TIF2P2三个信号还连接到从模式控制寄存器,通过配置从模式控制寄存器(TIMx_SMCR)可以将这些信号选作为定时器的计数时钟、外部触发、外部门控和外部初始化(清零和更新)。 图14-6 通用定时器通道1和通道2输入捕捉框图

14.4.3 通用定时器通道3和通道4的输入捕捉 图14-7为通用定时器通道3和通道4的输入捕捉电路,通道3,4仅用于输入捕捉,其工作原理和和通道1,2相同。TRC为内部触发捕捉信号,来自从模式控制器。通过配置从模式控制寄存器TIMx_SMCR中的TS[2:0]位域,可选择ITR0、ITR1、ITR2、ITR3和TI1F_ED 之一作为内部捕捉信号。TRC仅仅受TS[2:0]位域影响而与从模式无关。 图14-7 通用定时器通道3和通道4输入捕捉框图

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.360docs.net/doc/7e19329993.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.360docs.net/doc/7e19329993.html,F7=Output_Af_push_pull; // PC.07 复用功能推挽输出模式 STM32_Gpioc_Regs->crl.bit.MODE7=Output_Mode_50mhz; // PC.07 输出模式,最大速度50MHz

STM32定时器的基础知识

STM32定时器的基础知识: STM32定时器是STM32系列微控制器中的一个重要的硬件模块,它主要用于产生定时中断和PWM信号。以下是关于STM32定时器的基础知识: 1.定时器分类 STM32定时器可以分为通用定时器和高级定时器两类。其中,通用定时器包括TIM2、TIM3、TIM4和TIM5,它们都具有定时器/计数器、PWM输出和输入捕获等功能;高级定时器包括TIM1、TIM8、TIM9、TIM10、TIM11,它们除了拥有通用定时器的功能外,还具有编码器接口、高级PWM输出、同步功能等。 2.定时器模式 STM32定时器有四种模式:向上计数模式、向下计数模式、向上/向下计数模式和中央对齐模式。其中,向上计数模式是最常用的模式,它从0计数到设定值后产生中断或触发事件。 3.定时器时钟 STM32定时器时钟可以从内部时钟源(如HSI、HSI14、HSI48、LSI、LSE等)或外部时钟源(如HSE、PLL等)中选择。时钟频率的选择会影响定时器的分辨率和计数速度。 4.定时器中断 STM32定时器可以通过产生中断来实现定时器功能。可以设置定时器的计数值和预分频值来控制中断的触发时间。在中断服务程序中可以执行需要定时的任务,如更新LCD显示、采集传感器数据等。 5.定时器PWM输出 STM32定时器可以产生PWM信号,通过调节

占空比和周期可以实现不同的输出波形。PWM输出可以应用于电机控制、LED灯控制、音频合成等场合。 6.定时器输入捕获 STM32定时器还可以用于输入捕获,即通过输入引脚捕获外部信号的边沿,并将捕获的时间戳保存在定时器的寄存器中。输入捕获常用于测量脉冲宽度、频率等应用。 7.定时器输出比较 STM32定时器还可以进行输出比较,即将定时器的计数值与设定的比较值进行比较,当计数值等于比较值时触发中断或输出事件。输出比较常用于控制LED、蜂鸣器、继电器等应用。 8.定时器互联 STM32定时器可以通过互联功能进行互联,即将多个定时器连接在一起形成一个大的定时器,以提高计数范围和精度。例如,将TIM2和TIM3互联后,可以将TIM2作为主定时器,TIM3作为从定时器,从而实现一个32位定时器的功能。9.定时器时钟分频 STM32定时器的时钟可以通过预分频器进行分频,以控制定时器的计数速度。例如,如果将定时器时钟设置为72MHz,预分频器设置为7199,则定时器的计数速度为10kHz,每计数10次就产生一个1ms的中断。 10.定时器配置 STM32定时器的配置需要涉及到多个寄存器,包括定时器控制寄存器、预分频器寄存器、计数器寄存器、比较寄存器、捕获寄存器等。在配置定时器之前,需要确定定时器的模式、时钟源、时钟分频、中断时间等参数,然后将这些参数写入相应的寄存器中即可。

STM32通用定时器基本定时功能与PWM

1.STM32的Timer简介 STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2 个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick,看门狗定时器以后再详细研究。今天主要是研究剩下的8个定时器。 其中TIM1和TIM8是能够产生3对PWM互补输出的高级登时其,常用于三相电机的驱动,时钟由APB2的输出产生。TIM2-TIM5是普通定时器,TIM6和TIM7是基本定时器,其时钟由APB1输出产生。由于STM32的TIMER功能太复杂了,所以只能一点一点的学习。因此今天就从最简单的开始学习起,也就是TIM2-TIM5普通定时器的定时功能。 2.普通定时器TIM2-TIM5 2.1时钟来源 计数器时钟可以由下列时钟源提供: ·内部时钟(CK_INT) ·外部时钟模式1:外部输入脚(TIx) ·外部时钟模式2:外部触发输入(ETR) ·内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。 由于今天的学习是最基本的定时功能,所以采用内部时钟。TIM2-TIM5的时钟不是直接来自于APB1,而是来自于输入为APB1的一个倍频器。这个倍频器的作用是:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其他数值时(即预分频系数为2、4、8或16),这个倍频器起作用,定时器的时钟频率等于APB1的频率的2倍。APB1的分频在STM32_SYSTICK的学习笔记中有详细描述。通过倍频器给定时器时钟的好处是:APB1不但要给TIM2-TIM5提供时钟,还要为其他的外设提供时钟;设置这个倍频器可以保证在其他外设使用较低时钟频率时,TIM2-TIM5仍然可以得到较高的时钟频率。 2.2计数器模式 TIM2-TIM5可以由向上计数、向下计数、向上向下双向计数。向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器内容),然后重新从0开始计数并且产生一个计数器溢出事件。在向下模式中,计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一

STM32通用定时器

STM32的定时器功能很强大,学习起来也很费劲儿. 其实手册讲的还是挺全面的,只是无奈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.360docs.net/doc/7e19329993.html,/STM32/401461/message.aspx) 2、输入滤波机制 在ETR何TIx输入端有个输入滤波器,它的作用是以采样频率Fdts来采样N次进行滤波的。(具体也请参考版主博客 https://www.360docs.net/doc/7e19329993.html,/STM32/263170/message.aspx) 3、输入引脚和输出引脚是相同的。 二、时基单元 时基单元有三个部分:CNT、PSC、ARR。CNT的计数方式分三种:向上、向下、中央对齐。通俗的说就是0—ARR、ARR—0、0—(ARR-1)—ARR—1. 三、时钟源的选择 这个是难点之一。从手册上我们看到共有三种时钟源: 1、内部时钟。 也就是选择CK_INT做时钟,这个简单,但是有一点要注意,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器,当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;

STM32定时器所支持的三种计数模式及计数过程

STM32定时器所支持的三种计数模式及计数过程 STM32常规定时器主要包括基本定时器、通用定时器和高级定时器。不论哪一类定时器,都有个共同的计数定时单元,我们把它称之为时基单元。 该单元主要由三部分组成: 分频模块、计数模块、自动重装载模块。 分频模块用来对外来的计数时钟进行分频,这里有个分频计数器,通过它来实现对时钟的分频功能。与之对应的有个分频器寄存器TIMx_PSC,用来配置和存放分频比、分频系数。计数模块用来对来自分频器输出的计数脉冲进行计数。相应的这里有个寄存器—计数器寄存器TIMx_CNT,为了把该计数器跟别的计数器区别开来,不妨称它为核心计数器。 自动重装载模块用来配合计数器溢出,当计数器溢出时为之赋予初始计数值的功能单元。与之相应的有个自动重装载寄存器TIMx_ARR.当自动重装载寄存器TIMx_ARR修改生效后就可以自动地作为计数器的计数边界或重装值。 关于自动重装及自动重装载寄存器TIMx_ARR是个相对比较难理解的地方,尤其关于ARR寄存器数据的含义。我们在看STM32参考手册时,很难一下子理解得很到位,往往需要结合上下文内容反复阅读后去领会。关于计数器的溢出与重装,在手册里只有些零散且并不算清晰的介绍,这里尽力跟大家做些交流,以供参考。 当计数器溢出时,自动重装载器为计数器重装计数初始值。自动重装寄存器【ARR】为计数器设置计数边界或初始值,决定计数脉冲的多少或计时周期长短。比如:计数器向上计数时,计到多少发生溢出;向下计数时从多少开始往下计数。平常我们泛泛地说ARR寄存器为计数器提供计数边界或重装值,但它的具体含义及使用需要结合计数器的计数模式才能确定。 那一起看看STM32定时器所支持的三种计数模式及计数过程。 【文中图片可以点击放大观看】

STM32学习笔记(5):通用定时器PWM输出

STM32学习笔记(5):通用定时器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有分

定时器实现PWM功能

AVR使用范例--定时器实现PWM功能 本页关键词:什么是pwm pwm原理pwm控制pwm芯片pwm 单片机单片机pwm控制应用pwm电路pwm输出pwm调制 脉宽调制PWM是开关型稳压电源中的术语。这是按稳压的控制方式分类的,除了PWM型,还有PFM型和PWM、PFM混合型。脉宽宽度调制式(PWM)开关型稳压电路是在控制电路输出频率不变的情况下,通过电压反馈调整其占空比,从而达到稳定输出电压的目的。 通俗的说PWM就是波形,波形的波峰以波谷的比例关系成为占空比,我们可以通过PWM控制电机,音量控制,模拟控制等。 AVR单片机的定时器可以轻松实现PWM功能。mega16和mega32的timer0是和timer2都具有PWM功能,timer0和timer2都为8位定时器。timer2为异步操作定时器,在操作过程中要等待寄存器状态更改完成。详情参看数据手册:8位有pwm操作的异步操作定时器timer2。 下图设定使用timer0来实现PWM功能。PWM电机控制:访问AVR与L298进行直流电机控制。 OC0 output mode 设定了pwm输出控制选择:正常的端口操作,不与OC0 相连接,比较匹配发生时OC0 取反,比较匹配发生时OC0 清零,比较匹配发生时OC0 置位。

Waveform mode设定了波形产生模式:比较匹配输出模式,快速PWM 模式,相位修正PWM 模式。更详细的内容请参看数据手册。 看看程序代码:下载相关文件 //ICC-AVR application builder : 2006-11-25 0:15:12 // Target : M16 // Crystal: 7.3728Mhz #include #include void port_init(void) { PORTA = 0x00; DDRA = 0x00; DDRB = 0x08; //PB3为PWM输出,非常重要,否则无法输出波形 DDRB = 0x00; PORTC = 0x00; //m103 output only DDRC = 0x00; PORTD = 0x00; DDRD = 0x00; } //TIMER0 initialize - prescale:64 // WGM: Normal // desired value: 1KHz // actual value: 1.002KHz (0.2%) void timer0_init(void) { TCCR0 = 0x00; //stop TCNT0 = 0x8D; //set count /*TCNT0*/ OCR0 = 0x73; //set compare /*OCR0*/ TCCR0 = 0x23; //start timer /*TCCR0*/ } #pragma interrupt_handler timer0_comp_isr:20 void timer0_comp_isr(void) { //compare occured TCNT0=OCR0 } #pragma interrupt_handler timer0_ovf_isr:10 void timer0_ovf_isr(void)

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

stm32pwm原理

stm32pwm原理 STM32是一款高性能、低功耗的微控制器,它具有丰富的外设和强大的处理能力。其中,PWM(Pulse Width Modulation)是STM32 中常用的一种外设,它可以用来控制电机、LED灯等设备的亮度或速度。本文将介绍STM32中PWM的原理和使用方法。 一、PWM原理 PWM是一种通过改变信号占空比来控制电机、LED灯等设备的亮度 或速度的技术。在STM32中,PWM的实现是通过定时器和比较器来完成的。具体来说,STM32中的定时器可以产生一个周期性的计数器值,而比较器可以将计数器值与预设的比较值进行比较,从而产生PWM信号。 在STM32中,PWM信号的占空比可以通过改变比较器的预设值来实现。例如,如果比较器的预设值为50,那么当计数器值小于50时,PWM信号为高电平,当计数器值大于等于50时,PWM信号为低电平。因此,通过改变比较器的预设值,可以改变PWM信号的占空比,从而控制设备的亮度或速度。 二、PWM使用方法

在STM32中,使用PWM需要进行以下步骤: 1. 初始化定时器和比较器:首先需要初始化定时器和比较器,设置它们的工作模式、时钟源等参数。 2. 设置PWM输出引脚:将定时器和比较器的输出引脚与设备的控制引脚相连,从而将PWM信号输出到设备上。 3. 设置比较器的预设值:根据需要控制设备的亮度或速度,设置比较器的预设值,从而改变PWM信号的占空比。 4. 启动定时器:启动定时器,让它开始产生周期性的计数器值。 5. 控制设备:根据PWM信号的占空比,控制设备的亮度或速度。 下面是一个简单的PWM控制LED灯的例子: ```c #include "stm32f10x.h" void PWM_Init(void) {

STM32定时器PWM输出总结

STM32定时器PWM输出总结 STM32是意法半导体(STMicroelectronics)公司推出的一系列32 位微控制器(MCU)的产品,相较于传统的8位和16位MCU,STM32具有 更强的处理能力和更多的外设资源。其中,定时器是STM32系列MCU的重 要外设之一,可以用于实现各种定时、计数和PWM输出等功能。 定时器是STM32系列MCU中一个非常重要的外设,可以提供一些基本 的定时、计数和计时功能。除了基本功能外,定时器还可以通过配置不同 的工作模式、输入捕获和输出比较等功能来实现更多的应用。 在STM32中,每个定时器可以被划分为多个通道,每个通道可以配置 为不同的工作模式。其中,PWM输出功能通常使用定时器的输出比较模式 来实现,通过配置不同的占空比来实现不同的PWM波形输出。 使用STM32定时器的PWM输出功能,一般需要进行以下步骤: 1.选择合适的定时器和通道:在STM32系列MCU中,一般会有多个定 时器可供选择,根据实际需求选择合适的定时器和通道。 2.配置定时器的工作模式:定时器的工作模式取决于具体的应用需求,可以选择定时模式、计数模式、输入捕获模式或者输出比较模式。 3.配置输出比较模式:输出比较模式是实现PWM输出的关键,通过配 置不同的比较值和占空比来实现不同的PWM波形输出。 4.配置GPIO引脚:将定时器的输出引脚与GPIO引脚相连,实现PWM 波形的输出。 使用STM32定时器的PWM输出功能,可以实现多种应用。比如:

-控制电机的转速和方向:通过调整PWM波形的占空比,可以控制电机的转速和方向。 -LED灯的亮度调节:通过调整PWM波形的占空比,可以实现LED灯的亮度调节。 -蜂鸣器的声音控制:通过调整PWM波形的频率,可以实现蜂鸣器的声音控制。 总结起来,STM32定时器的PWM输出功能是一种非常有用且灵活的功能,可以通过配置不同的定时器和通道,实现多种不同的应用。通过控制输出比较模式和占空比,可以实现精确的PWM波形输出。通过结合其他外设,如GPIO引脚,可以实现更多的功能扩展,满足不同的应用需求。

05STM32F4通用定时器详细讲解

系列共有个定时器,功能很强大。个定时器分别为: 个高级定时器:和 个通用定时器: 和 个基本定时器: 和 本篇欲以通用定时器为例,详细介绍定时器的各个方面,并对其功能做彻底的探讨。 是一个位的定时器,有四个独立通道,分别对应着 主要功能是:输入捕获——测量脉冲长度。 输出波形——输出和单脉冲输出。 有个时钟源: :内部时钟() ,来自的 :外部时钟模式:外部输入与 :外部时钟模式:外部触发输入,仅适用于、 、,,对应着引脚 :内部触发输入:一个定时器触发另一个定时器。 时钟源可以通过相关位进行设置。这里我们使用内部时钟。 定时器挂在高速外设时钟或低速外设时钟上, 时钟不超过内部高速时钟, 故当不为时, 定时 器时钟为其倍,当为时,为了不超过,定时器时钟等于。 例如:我们一般配置系统时钟为,内部高速时钟 ,欲分频为, (因为最高时钟为) ,那么挂 在总线上的时钟为。 《中文参考手册》的页列出与通用定时器相关的寄存器一共个, 以下列出与相关的寄存器及重要寄存器的简单介绍。 控制寄存器 () 作用:使能自动重载 定时器的计数器递增或递减计数。 事件更新。 计数器使能 控制寄存器 () 从模式控制寄存器 () 中断使能寄存器 () 作用::使能事件 更新中断 :使能捕获比较中断 状态寄存器 () :事件更新中断标志 :捕获比较中断标志 事件生成寄存器 () 捕获比较模式寄存器 () :输出比较模式 :输出比较预装载使能,即使能后可以随时改变 捕获比较寄存器 ()的值 :捕获比较 选择 捕获比较模式寄存器 () 捕获比较使能寄存器 () :上升沿触发下降沿触发 :捕获比较输出使能 计数器 () 预分频器 () 计数器时钟频率 等于 ([] )。 自动重载寄存器 () 当自动重载值为空时,计数器不工作 难道说每次事件都必须装载重载值? 捕获比较寄存器 () 输出时:是捕获比较寄存器的预装载值,由的位使能。 (最高 )

STM32定时器输出六路PWM

定时器实验 一、实验要求 编程序利用STM32的通用定时器TIM2和TIM3产生六路PWM输出。 二、实验原理 实验主要考察对STM32F10X系列单片机定时器的使用。 STM32F103系列的单片机一共有11个定时器,其中: ✧2个高级定时器 ✧4个普通定时器 ✧2个基本定时器 ✧2个看门狗定时器 ✧1个系统嘀嗒定时器 出去看门狗定时器和系统滴答定时器的八个定时器列表; 八个定时器分成3个组 TIM1和TIM8是高级定时器 TIM2-TIM5是通用定时器 TIM6和TIM7是基本的定时器 这8个定时器都是16位的,它们的计数器的类型除了基本定时器TIM6和TIM7都支持向上,向下,向上/向下这3种计数模式。 本次试验主要用到通用定时器TIM2和TIM3。 通用定时器(TIM2~TIM5)的主要功能: 除了基本的定时器的功能外,还具有测量输入信号的脉冲长度( 输入捕获) 或者产生输出波形( 输出比较和PWM)。 通用定时器的时钟来源;

a:内部时钟(CK_INT) b:外部时钟模式1:外部输入脚(TIx) c:外部时钟模式2:外部触发输入(ETR) d:内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器 通用定时期内部时钟的产生: 通用定时器(TIM2-5)的时钟不是直接来自APB1,而是通过APB1的预分频器以后才到达定时器模块。 当APB1的预分频器系数为1时,这个倍频器就不起作用了,定时器的时钟频率等于APB1的频率; 当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1时钟频率的两倍。 PWM输出模式; STM32的PWM输出有两种模式: 模式1和模式2,由TIMx_CCMRx寄存器中的OCxM位确定的(“110”为模式1,“111”为模式2)。区别如下: 110:PWM模式1,在向上计数时,一旦TIMx_CNT 在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。 111:PWM模式2-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平。 由以上可知:模式1和模式2正好互补,互为相反,所以在运用起来差别也并不太大。而从计数模式上来看,PWM也和TIMx在作定时器时一样,也有向上计数模式、向下计数模式和中心对齐模式 通用定时器PWM工作原理: 以PWM模式1为例,定时器2向上计数,有效电平是高电平,定时器2的第1个PWM通道为例:定时器2的第1个PWM通道对应是PA0这引脚。 当定时器2的计数器(TIM2_CNT)刚开始计数的时候是小于捕获/比较寄存器(TIM2_CCR1)的值,此时PA0输出高电平,随着计数器(TIM2_CNT)值慢慢的增加; 当计数器(TIM2_CNT)大于捕获/比较寄存器(TIM2_CCR1)的值时,这时PA0电平就会翻转,输出低电平,计数器(TIM2_CNT)的值继续增加; 当TIM2_CNT=TIM2_ARR的值时,TIM2_CNT重新回到0继续计数,PA0电平翻转,输出高电平,此时一个完整的PWM信号就诞生了。 三、程序分析 定时器配置函数为TIM_PWM_Init()(详细见)。 配置函数首先使能TIM2和TIM3时钟:

stm32的定时器输入捕获与输出比较讲解

标签:分类: stm32 it 时间标记可用来计算频率,占空比及信号的其他特征,以及为事件创建日志,主要是用来测量外部信号的频率。 输出比较:定时器中计数寄存器在初始化完后会自动的计数。从bottom 计数到top。并且有不同的工作模式。 配则会产生比较中断(比较中断使能的情况下)。

很简单,当你设置的捕获开始的时候,cpu会将计数寄存器的值复制到捕获比较寄存器中并开始计数,当再次捕捉到电平变化时,这是计数寄存器中的值减去刚才复制的值就是这段电平的持续时间,你可以设置上升沿捕获、下降沿捕获、或者上升沿下降沿都捕获。它没多大用处,最常用来测频率。 是的,不过默认不要写入 我如果捕获上升沿,两个值相减,代表的时两个上升沿中间那段电平的时间。对不? 是的 timerl有五个通道(对应五个10引脚),在同一时刻,只能捕获一个引脚的值,对不? 那是肯定的,通道很像ADC通道,是可以进行切换的。 这里有两个单元:一个计数器单元和一个比较单元,比较单元就是个双缓冲寄存器,比较单元的值是可以根据不同的模式设置的,与此同时,计数器在不停的计数,并不停的与比较寄存器中的值进行比较,当计数器的值与比较寄存器的值相等的时候一个比较匹配就发生了,根据自己的设置,匹配了是io电平取反、变低、还是变高,就会产生不同的波形了。

是的,但是他要根据你的控制寄存器的配置,来初始化你的比较匹配寄存器 5:3CMP[2:0]000itltolWHK 成选畀・卅崔时■的G尊于在TICCO中的比较也迭丼操f OOOt 庄比较淆涂轨出 01泄比较忧換3ft.出 Olh隹向上比较设置総曲・Kom <■■4匕比较講徐諛由・在0设覽 !0h没奇馥用 1101没有便用 Hh匕址化罐HT14 CMP[M】不蠢 还是变高,就会产生不同的波形了” 形啊要不然你要比较单元有什么用呢? 设置输出就是置1,清除输出就是置0,切换输出就是将原来的电平取反,对不? 是的你理解的很快 011 :计数器向上计数达到最大值时将引脚置1,达到0时,引脚电平置0,,对不?

STM32日记之TIM1模块产生PWM(分别用库函数和寄存器)

C语言: TIM1模块产生PWM,带死区 //Step1.开启TIM和相应端口时钟 //启动GPIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | \ RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,\ ENABLE); //启动AFIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //启动TIM1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //Step2. GPIO做相应设置,为AF输出 //PA.8/9口设置为TIM1的OC1输出口 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8| GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); //PB.13/14口设置为TIM1_CH1N和TIM1_CH2N输出口 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13| GPIO_Pin_14; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);

通用定时器-PWM实验

通用定时器-PWM实验 二、预备知识 通用定时器分为四个部分: 1、选择时钟 2、时基电路 3、输入捕获 4、输出比较 定时器PWM输出主要涉及到定时器框图右下方部分,即输出比较部分 时基时钟来源于内部默认时钟。 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。 PWM工作过程:每个定时器有四个通道,每一个通道都有一个捕获比较寄存器,将寄存器值和计数器值比较,通过比较结果输出高低电平,实现PWM信号。 PWM输出库函数 1、定时器通道初始化-TIM_OC1Init 使用PWM需要配置,配置参数对应框图位置如下:

1)TIMx_CCMR1寄存器的OC1M[2:0]位,设置输出模式控制器 2)TIMx_CCER寄存器的CC1P位,设置输入/捕获通道1输出极性 3)TIMx_CCER:CC1E位控制输出使能电路,信号由此输出到对应引脚初始化定时器输出比较通道: void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); TIM_OCInitTypeDef结构体: typedef struct { uint16_t TIM_OCMode; // PWM模式1或者模式2 uint16_t TIM_OutputState; // 输出使能OR失能 uint16_t TIM_OutputNState; // PWM输出不需要 uint16_t TIM_Pulse; // 比较值,写CCRx,可以有次函数 uint16_t TIM_OCPolarity; // 比较输出极性 uint16_t TIM_OCNPolarity; // PWM输出不需要 uint16_t TIM_OCIdleState; // PWM输出不需要 uint16_t TIM_OCNIdleState; // PWM输出不需要 } TIM_OCInitTypeDef; 2、设置比较值函数-TIM_SetCompare1 作用:外部改变TIM_Pulse值,即改变CCR的值 void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1); 3、使能输出比较预装载-TIM_OC1PreloadConfig 作用:TIM_CCMRx寄存器OCxPE位使能相应的预装在寄存器 void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); 4、使能自动重装载的预装载寄存器允许位-TIM_ARRPreloadConfig 作用:操作TIMx_CR1寄存器ARPE位,使能自动重装载的预装载寄存器 void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState); 5、修改通道极性 作用:操作TIMx_CCER的CC1P位,修改通道极性 void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); 三、实验步骤: PWM输出步骤:

相关主题
相关文档
最新文档