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

合集下载

stm32输出pwm占空比代码

stm32输出pwm占空比代码

stm32输出pwm占空比代码在STM32单片机中,输出PWM(脉冲宽度调制)信号是非常普遍的操作,这种信号通常用于控制电机、LED灯等电子设备的亮度或运动状态。

本文将详细介绍STM32单片机如何输出PWM占空比代码。

一、配置TIM定时器要输出PWM信号,首先需要进行TIM定时器的配置。

在KEIL C 编译器中,可以通过CubeMX插件进行配置。

在此之前需要先引入库文件“stm32fxx_hal_tim.h”。

在CubeMX中选择对应的TIM,进入“Mode”选项卡,将TIM定时器配置为PWM输出模式。

在“Configuration”选项卡中,配置TIM的时钟源和预分频系数等信息。

此外还需要配置PWM的周期和占空比,具体可以通过下面的步骤实现。

二、设置PWM周期在代码中设置PWM周期,可以使用HAL库中的“__HAL_TIM_SET_AUTORELOAD”函数。

该函数的第一个参数为TIM定时器的句柄,第二个参数为PWM的周期,单位为计数器的值。

可以根据需要调整该值来改变PWM的输出频率。

例如,将PWM周期设置为1000,代码如下:__HAL_TIM_SET_AUTORELOAD(&htim1, 1000);三、设置PWM占空比在代码中设置PWM占空比,需要使用HAL库中的“__HAL_TIM_SET_COMPARE”函数。

该函数的第一个参数是TIM定时器的句柄,第二个参数是设置输出PWM的通道,第三个参数是占空比。

占空比的取值范围为0到PWM周期。

例如,将PWM占空比设置为500,代码如下:__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 500);四、使用PWM输出信号最后,在代码中使用PWM输出信号,可以使用HAL库中的“HAL_TIM_PWM_Start”函数。

该函数的参数为TIM的句柄和输出PWM 的通道。

例如,在TIM1通道1上启动PWM输出,代码如下:HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);以上就是STM32单片机输出PWM占空比代码的详细步骤。

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

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】!代码如下:voidSTM32_PWM_GPIO_Configuration(void){// 11:完全映像STM32_Afio_Regs-&gtmapr.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-&F6=Output_Af_push_pull; // PC.06 复用功能推挽输出模式STM32_Gpioc_Regs-&gtcrl.bit.MODE6=Output_Mode_50mhz; // PC.06 输出模式,最大速度50MHzSTM32_Gpioc_Regs-&F7=Output_Af_push_pull; // PC.07 复用功能推挽输出模式STM32_Gpioc_Regs-&gtcrl.bit.MODE7=Output_Mode_50mhz; // PC.07 输出模式,最大速度50MHz}//end subvoidSTM32_TIM3_Configuration(void){// TIM_DeInit( TIM3);//复位TIM3定时器STM32_Rcc_Regs-&gtapb1rstr.all |= RCC_TIM3RST;STM32_Rcc_Regs-&gtapb1rstr.all &= ~RCC_TIM3RST;//时钟使能STM32_Rcc_Regs-&gtapb1enr.all |=RCC_TIM3EN;/* TIM3 base configuration *///TIM_TimeBaseStructure.TIM_Period = 9999;//TIM_TimeBaseStructure.TIM_Prescaler = 7200;//TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;//TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);STM32_Tim3_Regs-&gtarr.all=9999; // 定时周期,PWM频率! 10毫秒*100=1秒STM32_Tim3_Regs-&gtpsc.all=720; // 7200分频 72MHZ/72,00 72,000,000/72,00=10,000STM32_Tim3_Regs-&gtcr1.bit.CKD=0; // 时钟分频因子STM32_Tim3_Regs-&gtcr1.bit.DIR=0; // 0:计数器向上计数/* Clear TIM3 update pending flag[清除TIM3溢出中断标志] *///TIM_ClearFlag(TIM3, TIM_FLAG_Update);STM32_Tim3_Regs-&gtsr.bit.UIF=0; //更新中断标记由软件清0 ,例如当上溢或下溢时,软件对CNT重新初始化/* PWM1 Mode configuration: Channel1 Channel2 *///TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//TIM_OCInitStructure.TIM_Pulse = CCR1_Val;//TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//TIM_OC1Init(TIM3, &TIM_OCInitStructure);// timer3 的通道1 是 PC6 引脚, AFIO完全映射STM32_Tim3_Regs-&1P=0; // 输入/捕获1输出极性 0:OC1高电平有效 1:OC1低电平有效STM32_Tim3_Regs-&1E=1; // 输入/捕获1输出使能 1:开启- OC1信号输出到对应的输出引脚。

STM32一定时器产生不同频率的PWM

STM32一定时器产生不同频率的PWM

STM32一定时器产生不同频率的PWM(转载)2011-05-05 12:07平时记性实在太差,调试完的程序,过两天又忘了,往往需要一阵子才能想起来,有时以前的资料找不到了,更是恼火,不得不重复到网上搜索。

刚刚调试成功了一个类型的程序,立刻记下来,呵呵,不要又忘记了。

? ? STM32产生PWM是非常的方便的,要需要简单的设置定时器,即刻产生!当然,简单的设置对于新手来产,也是麻烦的,主要包括:(1)使能定时器时钟:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);(2)定义相应的GPIO:/* PA2,3,4,5,6输出->Key_Up,Key_Down,Key_Left,Key_Right,Key_Ctrl */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //下拉接地,检测输入的高电平GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度GPIO_Init(GPIOA, &GPIO_InitStructure);/* PA7用于发出PWM波,即无线数据传送 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;?GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度GPIO_Init(GPIOA, &GPIO_InitStructure);(3)如果是产生PWM(频率不变,占空比可变),记得打开PWM控制,在TIM_Configuration()中。

STM32之PWM波形输出配置复习总结.doc

STM32之PWM波形输出配置复习总结.doc

STM32之PWM波形输出配置总结1. TIMER 分类STM32中一共有11个定时器,其中TIM6、TIM7是基本定时器;TIM2、TIM3、TIM4、TIM5是通用定时器;TIM1和TIM8是高级定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。

其中系统嘀嗒定时器是前文中所描述的SysTick o其中TIM1和TIM8是能够产生3对PWM互补输出,常用于三相电机的驱动, 时钟由APB2的输岀产生oTIM2-TIM5是普通定时器,TIM6和TIM7是基本定时器,其时钟由APB1输出产生。

2. PWM波形产生的原理通用定时器可以利用GPI0引脚进行脉冲输岀,在配置为比较输岀、PWM输出功能时,捕获/比较寄存器TIMx_CCR被用作比较功能,下面把它简称为比较寄存器。

举例说明定时器的PWM输出工作过程:若配置脉冲计数器TIMx_CNT为向上计数,而重载等存器TI Mx_ARR被配置为N,即TI Mx_CNT的当前计数值数值X在TIMxCLK时钟源的驱动下不断累加,当TIMx_CNT的数值X大于N时,会重置TIMx_CNT数值为0重新计数。

而在TIMxCNT计数的同时,TIMxCNT的计数值X会与比较寄存器TIMx_CCR 预先存储了的数值A进行比较,当脉冲计数器TIMx_CNT的数值X小于比较等存器TIMx_CCR 的值A时,输岀高电平(或低电平),相反地,当脉冲计数器的数值X大于或等于比较寄存器的值A时,输岀低电平(或高电平)。

如此循环,得到的输出脉冲周期就为重载寄存器TIMx_ARR存储的数值(N+1) 乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器TIMx_CCR的值A乘以触发脉冲的时钟周期,即输出PWM的占空比为A/(N+1) o3. STM32产生PWM的配置方法1)配置GPIO 口不是每一个I0引脚都可以直接使用于PWM输出,下面是定时器的引脚重映像,其实就是引脚的复用功能选择:表定时器的引脚复用功能映像表定时器的引脚复用功能映像表3-4 定时器4的引脚复用功能映像根据以上重映像表,我们使用定时器3的通道2作为PWM的输出引脚,所以需要对PB5引脚进行配置,对10 口操作代码:2)初始化定时器3)设置TIM3_CH2的PWM模式.使能TIM3的CH2输出4)使能定时器3经过以上的操作,定时器3的第二通道已经可以正常工作并输出PWM波了,只是其占空比和频率都是固定的,我们可以通过改变TIM3_CCR2,则可以控制它的占空比。

stm32的pwm输出及频率计算方法

stm32的pwm输出及频率计算方法

stm32的pwm输出及频率计算方法
一、stm32的pwm输出引脚是使用的IO口的复用功能。

二、T2~T5这4个通用定时器均可输出4路PWM——CH1~CH4。

三、我们以tim3的CH1路pwm输出为例来进行图文讲解(其它类似),并在最后给出tim3的ch1和ch2两路pwm输出的c代码(已在STM32F103RBT6上测试成功,大家放心使用!)。

四、给出了PWM频率和占空比的计算公式。

步骤如下:
1、使能TIM3时钟
RCC->APB1ENR |= 1 2、配置对应引脚(PA6)的复用输出功能
GPIOA->CRL //PA6清0GPIOA->CRL |= 0X0B000000;//复用功能输出(推挽50MHz输出)GPIOA->ODR |= 1
3、设定计数器自动重装值及是否分频
TIM3->ARR = arr;//设定计数器自动重装值(决定PWM的频率)TIM3->PSC = psc;//预分频器,0为不分频
4、设置PWM的模式(有1和2两种模式,区别在于输出电平极性相反),根据需求选一种即可
注:TIMX_CCMR1决定CH1~CH2路,TIMX_CCMR2决定CH3~CH4路。

//TIM3->CCMR1 |= 6 TIM3->CCMR1 |= 7 TIM3->CCMR1 |= 1
5、输出使能设置
TIM3->CCER |= 1。

STM32HAL库学习系列第4篇定时器TIM-----开始定时器与PWM输出配置

STM32HAL库学习系列第4篇定时器TIM-----开始定时器与PWM输出配置

STM32HAL库学习系列第4篇定时器TIM-----开始定时器与PWM输出配置基本流程:1.配置定时器2.开启定时器3.动态改变pwm输出,改变值HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);函数总结:1 __HAL_TIM_SET_COMPARE()// 是设置CCRx,⼀般是⽤在PWM输出的,控制PWM占空⽐2 __HAL_TIM_GET_COMPARE // 是⽤来读取CCRx的,⼀般⽤于捕获处理PWM输出配置:频率设置:1static void MX_TIM2_Init(void)2 {3 TIM_MasterConfigTypeDef sMasterConfig;4 TIM_IC_InitTypeDef sConfigIC;5 TIM_OC_InitTypeDef sConfigOC;6 htim2.Instance = TIM2;7 htim2.Init.Prescaler = (36-1); //实际时钟频率为 72M/36=2MHz /40000=50H,-----490HZ,改变观察电机输出状态定时器预分频器8 htim2.Init.CounterMode = TIM_COUNTERMODE_UP;9 htim2.Init.Period = (4082-1); //定时器周期配置 PWM频率为 490KHz 定义定时器周期,PWM频率为:168MHz/ (L298N_TIMx_PRESCALER+1)/ (L298N_TIM_PERIOD+1)10//⾼级定时器重复计数寄存器值11 **⾼级才有12// 定义⾼级定时器重复计数寄存器值13//实际PWM频率为:72MHz/(L298N_TIMx_PRESCALER+1)/(L298N_TIM_PERIOD+1)/(L298N_TIM_REPETITIONCOUNTER+1)14#define L298N_TIM_REPETITIONCOUNTER 015 **刹车和死区配置:1/* 刹车和死区时间配置 */2 sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;3 sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;4 sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;5 sBreakDeadTimeConfig.DeadTime = 0;6 sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;7 sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;8 sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;9 HAL_TIMEx_ConfigBreakDeadTime(&htimx_L298N, &sBreakDeadTimeConfig);基于通信的pwm频率和脉宽的更新控制算法:1/*2** pwm是否需要更新,⽐较上⼀次的频率和脉宽值,如果不同,则更新3*/4void pwm_update_loop( void )5 {6/*1,第⼀路判断: 频率或占空⽐发⽣变化 */7if( (HLM_SOKO_I_FREQ != HLM_SOKO_I_FREQ_LAST ) ||8 HLM_SOKO_I_DUTY != HLM_SOKO_I_DUTY_LAST )9 {10/* 更新频率和占空⽐的记录值 */11 HLM_SOKO_I_FREQ_LAST = HLM_SOKO_I_FREQ;12 HLM_SOKO_I_DUTY_LAST = HLM_SOKO_I_DUTY;13/* 更新当前通道的PWM波形 */14 pwm_update( PWM_I,HLM_SOKO_I_FREQ, HLM_SOKO_I_DUTY );15 }1617/*2,第⼆路判断 */18if( (HLM_SOKO_II_FREQ != HLM_SOKO_II_FREQ_LAST ) ||19 HLM_SOKO_II_DUTY != HLM_SOKO_II_DUTY_LAST )20 {21/* 更新频率和占空⽐的记录值 */22 HLM_SOKO_II_FREQ_LAST = HLM_SOKO_II_FREQ;23 HLM_SOKO_II_DUTY_LAST = HLM_SOKO_II_DUTY;24/* 更新当前通道的PWM波形 */25 pwm_update( PWM_II,HLM_SOKO_II_FREQ, HLM_SOKO_II_DUTY );26 }2728/*3,第三路判断 */29if( (HLM_SOKO_III_FREQ != HLM_SOKO_III_FREQ_LAST ) ||30 HLM_SOKO_III_DUTY != HLM_SOKO_III_DUTY_LAST )31 {32/* 更新频率和占空⽐的记录值 */33 HLM_SOKO_III_FREQ_LAST = HLM_SOKO_III_FREQ;34 HLM_SOKO_III_DUTY_LAST = HLM_SOKO_III_DUTY;35/* 更新当前通道的PWM波形 */36 pwm_update( PWM_III,HLM_SOKO_III_FREQ, HLM_SOKO_III_DUTY );37 }38 }补充:开起定时器功能只要在相应的定时器下开始内部时钟源即可使⽤定时器功能定时器内部动能:定时器时钟配置:M是10的6次⽅微秒是10的-6次⽅内部时钟设置为不分频(CKD),则CK_PSC的时钟频率等于APB1的时钟频率108MHz,即108000 000Hz。

STM32 TIMER 产生PWM的具体操作方法

STM32 TIMER 产生PWM的具体操作方法

定时器的配置定时器用于PWM脉冲输出时的配置:(1)首先定义一个TIM_TimeBaseInitTypeDef的结构体变量用于配置TIME时基如下:TIM_TimeBaseInitTypeDefTIME_BaseConstructure;(2)再定义一个TIM_OCInitTypeDef的结构体变量用于配置定时器输出模式如下:TIM_OCInitTypeDefTIM_OCInitStructure;(3)调用定时器初始化函数将定时器初始化到默认模式如下:TIM_DeInit(TIMx);(4)配置TIME时基下的四个参数①TIM_Period即定时周期实际上是存储到重载寄存器TIMx_ARR的数值M;②TIM_Prescaler即对定时器时钟TIMx_CLK的预分频值也就是定时器时钟频率除以该值(N+1)③TIM_ClockDivision即时钟分频因子,使用内部时钟时配置为0,使用外部时钟可以配置为1,2,4用来对外部时钟进行滤波④TIM_CounterMode用来为脉冲计数器的计数模式,(有向上计数,向下计数,中央对齐模式);(5)填充好上面的配置参数后调用TIM_TimeBaseInit(TIMx,&TIME_BaseConstructure);把这些控制参数写到寄存器中,这样定时器时钟配置就基本完成了。

(6)现在开始配置定时器输出模式参数①TIM_OCMode:输出模式配置,总共6种模式参考资料选择(TIM_OCMode_Timing 输出比较时间模式,TIM_OCMode_Activ输出比较主动模式,TIM_OCMode_Inactive输出比较非主动模式,TIM_OCMode_Toggle 输出比较触发模式,TIM_OCMode_PWM1 向上计数时,当TIMx_CNT <TIMx_CCR*时,输出电平有效,否则为无效,向下计数时,当TIMx_CNT > TIMx_CCR*时,输出电平无效,否则为有效,TIM_OCMode_PWM2 与PWM1模式相反)②TIM_OutputState:(TIM_OutputState_Disable禁止OC*输出,TIM_OutputState_Enable 开启OC*输出到对应引脚)③TIM_OutputNState:(互补输出同上)④TIM_Pulse:(该成员值即为比较寄存器TIMx-CCR的数值,当脉冲计数器TIMx-CNT与TIMx-CCR的比较结果发生变化时,输出脉冲将发生变化)⑤TIM_OCPolarity:(有效电平的极性)⑥TIM_OCNPolarity:(有效电平的极性)⑦TIM_OCIdleState:(TIM_OCIdleState_Set 当MOE=0时,如果实现了OC*N,则死区后OC*=1,TIM_OCIdleState_Reset 当MOE=0时,如果实现了OC*N,则死区后OC*=0)⑧TIM_OCNIdleState:(同上) 注意:通过配置TIM_OutputState和TIM_OutputNState可使能或者失能主输出和互补输出,如果二路的极性配置(OCPolarity和OCNPolarity)相同,则输出互补;如果输出极性配置相反,则二路输出相同。

STM32定时器输出六路PWM

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)。

stm32的pwm输出及频率计算方法

stm32的pwm输出及频率计算方法
四、给出了PWM频率和占空比的计算公式。
步骤下:
1、使能TIM3时钟
RCC->APB1ENR |= 1 2、配置对应引脚(PA6)的复用输出功能
GPIOA->CRL&=0XF0FFFFFF;//PA6清0GPIOA->CRL|=
0X0B000000;//复用功能输出(推挽50MHz输出)GPIOA->ODR |= 1
stm32的pwm输出及频率计算方法
一、stm32的pwm输出引脚是使用的IO口的复用功能。
二、T2~T5这4个通用定时器均可输出4路PWM——CH1~CH4。
三、我们以tim3的CH1路pwm输出为例来进行图文讲解(其它类
似),并在最后给出tim3的ch1和ch2两路pwm输出的c代码(已在
STM32F103RBT6上测试成功,大家放心使用!)。
3、设定计数器自动重装值及是否分频
TIM3->ARR=arr;//设定计数器自动重装值(决定PWM的频率)TIM3-
>PSC = psc;//预分频器,0为不分频
4、设置PWM的模式(有1和2两种模式,区别在于输出电平极性相
反),根据需求选一种即可

STM32-主从定时器-输出固定数量脉冲

STM32-主从定时器-输出固定数量脉冲

在仪器仪表计量、步进电机驱动等领域,有时需要控制电路输出固定数量的PWM ,常规方法一般为中断计数法,即将单片机定时器配置成PWM 输出模式,然以在PWM 中断中对脉冲进行计数,当脉冲数量达到设定值时即关断PWM 输出,这种方法程序上比较简单,但是当输出频率较高时,计数中断会频繁打断系统的正常运行,对系统运行效率会产生一定影响。

另一种输出方式是利用主从定时器的原理,本文就介绍下该种方式。

1输出原理介绍STM32单片机具有定时器同步功能,可以配置多个定时器在内部相连,当一个定时器配置为主模式时,可以对另一个配置成从模式的定时器进行复位、启动、停止或提供时钟的操作。

而主从定时器输出固定脉冲就是利用了一个定时器充当另一个定时器的预分频的原理实现的。

1.1使用一个定时器作为另一个定时器的预分频器上图为基本框图,将定时器1配置成定时器2的预分频后,定时器1负责输出PWM ,每个输出脉冲的边沿在内部作为定时器2的输入时钟,通过配置定时器2的溢出值即可实现对定时器1脉冲输出个数的检测。

1.1.1配置思路:1)配置定时器1为主模式,它可以在每一个更新事件UEV 时输出一个周期性的触发信号。

在TIM1_CR2寄存器的MMS=’010’时,每当产生一个更新事件时在TRGO1上输出一个上升沿信号。

STM32-主从定时器-输出固定数量脉冲2)连接定时器1的TRGO1输出至定时器2,设置TIM2_SMCR 寄存器的TS=’000’,配置定时器2为使用ITR1作为内部触发的从模式。

3)把从模式控制器置于外部时钟模式1(TIM2_SMCR 寄存器的SMS=111),这样定时器2即可由定时器1周期性的上升沿(即定时器1的计数器溢出)信号驱动。

4)设置相应(TIMx_CR1寄存器)的CEN 位分别启动两个定时器。

摘录自手册P278。

1.1.2寄存器配置流程1)配置定时器1为主模式,送出它的更新事件UEV 做为触发输出(TIM1_CR2寄存器的MMS=’010’)。

STM32基础PWM输出

STM32基础PWM输出

STM32基础PWM输出a)目的:基础PWM输出,以及中断配合应用。

输出选用PB1,配置为TI M3_CH4,是目标板的LED6控制脚。

b)对于简单的PWM输出应用,暂时无需考虑TIM1的高级功能之区别。

c)初始化函数定义:void TIM_Configuration(void);//定义TIM初始化函数d)初始化函数调用:TIM_Configuration();//TIM初始化函数调用e)初始化函数,不同于前面模块,TIM的初始化分为两部分——基本初始化和通道初始化:void TIM_Configuration(void)//TIM初始化函数{TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;//定时器初始化结构TIM_OCInitTypeDefTIM_OCInitStructure;//通道输出初始化结构//TIM3初始化TIM_TimeBaseStructure.TIM_Period = 0xFFFF;//周期0~FFFFTIM_TimeBaseStructure.TIM_Prescaler = 5;//时钟分频TIM_TimeBaseStructure.TIM_ClockDivision = 0;//时钟分割TIM_TimeBaseStructure.TIM_Coun te rMode = TIM_CounterMode_Up;//模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);//基本初始化TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE);//打开中断,中断需要这行代码//TIM3通道初始化TIM_OCStructInit(& TIM_OCInitStructure);//默认参数TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//工作状态TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//设定为输出,需要PWM输出才需要这行代码TIM_OCInitStructure.TIM_Pulse = 0x2000;//占空长度TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//高电平TIM_OC4Init(TIM3, &TIM_OCInitStructure);//通道初始化TIM_Cmd(TIM3, ENABLE);//启动TIM3}f)RCC初始化函数中加入TIM时钟开启:RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM3, ENABLE);g)GPIO里面将输入和输出管脚模式进行设置。

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

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_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时通道1为有效电平,否则为无效电平。

由此看来,模式1和模式2正好互补,互为相反,所以在运用起来差别也并不太大。

而从计数模式上来看,PWM也和TIMx在作定时器时一样,也有向上计数模式、向下计数模式和中心对齐模式,关于3种模式的具体资料,可以查看《STM32参考手册》的“14.3.9 PWM模式”一节,在此就不详细赘述了。

1.2PWM输出管脚PWM的输出管脚是确定好的,具体的引脚功能可以查看《STM32参考手册》的“8.3.7定时器复用功能重映射”一节。

在此需要强调的是,不同的TIMx有分配不同的引脚,但是考虑到管脚复用功能,STM32提出了一个重映像的概念,就是说通过设置某一些相关的寄存器,来使得在其他非原始指定的管脚上也能输出PWM。

STM32学习笔记,定时器,PWM,ADC,UART,DMA

STM32学习笔记,定时器,PWM,ADC,UART,DMA
TIM_ClearITPendingBit(TIM1, TIM_IT_CC1 ); capture = TIM_GetCapture1(TIM1); TIM_SetCompare1(TIM1, capture + 2000); //这里解释下: //将 TIM1_CCR1 的值增加 2000,使得下一个 TIM 事件也需要 2000 个脉冲, //另一种方式是清零脉冲计数器 //TIM_SetCounter(TIM2,0x0000); }
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);
}
关于 TIM 的操作,要注意的是 STM32 处理器因为低功耗的需要,各模块需要分别独立开启时钟,所以, 一定不要忘记给用到的模块和管脚使能时钟,因为这个原因,浪费了我好多时间阿~~!
STM32 笔记(二)TIM 模块产生 PWM 这个是 STM32 的 PWM 输出模式,STM32 的 TIM1 模块是增强型的定时器模块,天生就是为电机控制而生,可 以产生 3 组 6 路 PWM,同时每组 2 路 PWM 为互补,并可以带有死区,可以用来驱动 H 桥。

STM32系列TIM定时器整理

STM32系列TIM定时器整理

1、PWM输出模式TIM_Period配置是代表波形的周期,因此其数值一定要比输出配置中TIM_OCInitStructure.TIM_Pulse的数值大。

(如TIM_Period = 0x3E7则波形频率为TIMCLK/(0x3E7+1))且只要TIM_Period 不为零,则其TIMCLK为系统频率的一半。

TIM_Prescaler是在上述基础上再分频(如TIM_TimeBaseStructure.TIM_Prescaler = 0x2,以1中配置为例,则输出波形频率变为TIMCLK/(0x3E7+1)/(0x2+1))。

若此时TIM_OCInitStructure.TIM_Pulse = CCR1_V al;(例如CCR1_V al=15则占空比为:CCR1_V al/(TIM_Period+1))所以TIM_Prescaler之改变输出波形的周期,并不改变占空比。

2、TIM_OCMode_Toggle TIM输出比较触发模式此项功能是用来控制一个输出波形,或者指示一段给定的的时间已经到时。

在输出比较模式下,更新事件UEV对OCxREF和OCx输出没有影响。

即TIM_TimeBaseStructure.TIM_Period配置大小对输出波形的频率没有影响(但是TIM_Period的值一定要大于TIM_OCInitStructure.TIM_Pulse,否则还没来得及更新时间就产生中断,这样结果肯定就会错误)例如下面程序:vu16 CCR2_Val = 0x4000;TIM_TimeBaseStructure.TIM_Period = 0xFFF5;TIM_TimeBaseStructure.TIM_Prescaler = 0x02;TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);/* Output Compare Toggle Mode configuration: Channel1 */TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;TIM_OCInitStructure.TIM_Channel = TIM_Channel_1;TIM_OCInitStructure.TIM_Pulse = CCR1_Val;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;TIM_OCInit(TIM2, &TIM_OCInitStructure);TIM2 Configuration: 输出比较模式:TIM2CLK = 36 MHz, Prescaler = 0x2, 所以TIM2 counter clock = 12 MHzCC1 update rate (更新频率)= TIM2 counter clock / CCR1_Val = 366.2 Hz3、TIM输出比较时间模式在这种模式下TIM的计数时钟频率为TIM2CLK/TIM_PrescalerConfig,且TIMCLK同前面一样,只要TIM_Period 不为零,就是系统时钟的一半。

stm32定时器定时器中断PWM输出输入捕获

stm32定时器定时器中断PWM输出输入捕获

stm32定时器定时器中断PWM输出输⼊捕获STM32F4 的通⽤定时器包含⼀个 16 位或 32 位⾃动重载计数器(CNT),该计数器由可编程预分频器(PSC)驱动。

STM32F4 的通⽤定时器可以被⽤于:测量输⼊信号的脉冲长度(输⼊捕获)或者产⽣输出波形(输出⽐较和 PWM)等。

使⽤定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在⼏个微秒到⼏个毫秒间调整。

STM32F4 的每个通⽤定时器都是完全独⽴的,没有互相共享的任何资源。

STM3 的通⽤ TIMx (TIM2~TIM5 和 TIM9~TIM14)定时器功能包括:1)16 位/32 位(仅 TIM2 和 TIM5)向上、向下、向上/向下⾃动装载计数器(TIMx_CNT),注意: TIM9~TIM14 只⽀持向上(递增)计数⽅式。

2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535 之间的任意数值。

3) 4 个独⽴通道(TIMx_CH1~4, TIM9~TIM14 最多 2 个通道),这些通道可以⽤来作为:A.输⼊捕获B.输出⽐较C. PWM ⽣成(边缘或中间对齐模式) ,注意: TIM9~TIM14 不⽀持中间对齐模式D.单脉冲模式输出4)可使⽤外部信号(TIMx_ETR)控制定时器和定时器互连(可以⽤ 1 个定时器控制另外⼀个定时器)的同步电路。

5)如下事件发⽣时产⽣中断/DMA(TIM9~TIM14 不⽀持 DMA):A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)B.触发事件(计数器启动、停⽌、初始化或者由内部/外部触发计数)C.输⼊捕获D.输出⽐较E.⽀持针对定位的增量(正交)编码器和霍尔传感器电路(TIM9~TIM14 不⽀持)F.触发输⼊作为外部时钟或者按周期的电流管理(TIM9~TIM14 不⽀持)下⾯我们介绍⼀下与我们这章的实验密切相关的⼏个通⽤定时器的寄存器(以下均以 TIM2~TIM5 的寄存器介绍, TIM9~TIM14 的略有区别,具体请看《STM32F4xx 中⽂参考⼿册》对应章节)。

stm32pwm输出三角波原理

stm32pwm输出三角波原理

stm32pwm输出三角波原理STM32是一种非常常见的微控制器,具有多功能、高性能和易用性的特点。

PWM输出是STM32的常用功能之一,可以通过调节PWM信号占空比来实现对电机、LED灯等器件的控制。

本文将介绍STM32的PWM输出三角波原理。

一、PWM输出简介PWM是脉宽调制技术的缩写,其基本原理是通过在一个固定周期内,改变高电平和低电平的时间比例,实现模拟电压的控制。

在STM32中,PWM输出主要是通过定时器来实现的。

定时器可以设置固定的计数周期,并进行比较,从而产生PWM信号。

PWM输出的占空比是通过改变TIMx_CCRx寄存器的值来实现的。

二、三角波产生原理三角波是一种周期性的信号,其波形为直角三角形。

三角波的周期是固定的,其幅值是连续变化的,幅值变化的速度可以通过调节PWM 输出的占空比来实现。

在STM32中,产生三角波的方法是将PWM输出模式设置为“中央对齐模式”,定时器的计数周期等于三角波周期的一半,占空比为50%。

然后,在定时器的比较寄存器中设置两个比较值,分别为上限值和下限值,当计数器计数到上限值时,PWM输出反转,PWM输出的占空比从50%变为0%,当计数器计数到下限值时,PWM输出恢复,PWM输出的占空比从0%变为50%。

这样一来,定时器的计数值就会在上限值和下限值之间往返,因此产生了三角波的形状,其中幅值的大小与上限值和下限值的差值大小有关。

三、代码实现下面是代码实现的具体步骤:1、配置TIMx时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMx,ENABLE);2、配置GPIO引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x;//配置为PWM输出引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(port,&GPIO_InitStructure);3、配置TIMx的定时器模式和PWM输出模式TIM_TimeBaseStructure.TIM_Period= period - 1;//计数周期TIM_TimeBaseStructure.TIM_Prescaler= prescaler-1;//预分频值TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_CenterA ligned1;//中央对齐模式TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//PWM输出模式1TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OCInitStructure.TIM_Pulse = (period-1) / 2;//占空比(50%)TIM_OC3Init(TIMx, &TIM_OCInitStructure);4、配置定时器的比较寄存器TIM_SetCompare1(TIMx, down_limit);//下限值TIM_SetCompare2(TIMx, up_limit);//上限值5、启动TIMx定时器TIM_Cmd(TIMx,ENABLE);通过以上步骤,就可以成功地输出一个三角波了。

stm32输出pwm占空比代码

stm32输出pwm占空比代码

stm32输出pwm占空比代码在使用STM32进行PWM输出时,需要先对定时器进行配置和初始化,然后设置PWM的占空比,最后开启PWM输出。

以下是一个简单的示例代码:1. 定时器配置和初始化:```TIM_HandleTypeDef htim;TIM_OC_InitTypeDef sConfigOC;htim.Instance = TIM1;htim.Init.Prescaler = 0;htim.Init.CounterMode = TIM_COUNTERMODE_UP;htim.Init.Period = 1000;htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;if (HAL_TIM_Base_Init(&htim) != HAL_OK){Error_Handler();}if (HAL_TIM_PWM_Init(&htim) != HAL_OK){Error_Handler();}sConfigOC.OCMode = TIM_OCMODE_PWM1;sConfigOC.Pulse = 0;sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;if (HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_1) != HAL_OK){Error_Handler();}```这里使用了TIM1作为定时器,设置周期为1000(即1ms)。

2. 设置PWM占空比:```HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1);HAL_TIM_PWM_Stop(&htim, TIM_CHANNEL_1);sConfigOC.Pulse = 500; // 设置占空比为50%HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC,TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1);```这里将占空比设置为50%,即脉冲宽度为500,使用函数HAL_TIM_PWM_ConfigChannel设置。

STM32-PWM输出总结

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让他的频率更低,但是不能再高了)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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_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时通道1为有效电平,否则为无效电平。

由此看来,模式1和模式2正好互补,互为相反,所以在运用起来差别也并不太大。

而从计数模式上来看,PWM也和TIMx在作定时器时一样,也有向上计数模式、向下计数模式和中心对齐模式,关于3种模式的具体资料,可以查看《STM32参考手册》的“14.3.9 PWM模式”一节,在此就不详细赘述了。

1.2PWM输出管脚PWM的输出管脚是确定好的,具体的引脚功能可以查看《STM32参考手册》的“8.3.7 定时器复用功能重映射”一节。

在此需要强调的是,不同的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-100int dutyfactor = 50;int main(){int Temp;RCC_cfg();GPIO_cfg();TIMER_cfg();PWM_cfg();//使能TIM3计时器,开始输出PWMTIM_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 = 72MHzRCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);//使能PLLRCC_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);//选择引脚5GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//输出频率最大50MHzGPIO_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的频率为72MHzTIM_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);}。

相关文档
最新文档