datasheet

STM32小白入门(第七天)-------定时器

2019-07-10来源: eefocus关键字:STM32  定时器  PWM

今天的定时器也是我们常用的一个32外设,PWM更不用说,电机的转速调节,家里的电灯亮度调节基本上用到的就是通过PWM。


一、定时器

1.定义

设置等待时间,到达后则执行指定操作的硬件。


2.STM32F407的定时器有以下特征

   具有基本的定时功能,也有PWM输出(灯光亮度控制、电机的转速)、脉冲捕获功能(红外捕捉)。


 2个高级控制定时器、10个通用定时器和2个基本定时器


a.高级控制定时器(TIM1和TIM8)


   具有16位定时器功能,也具有PWM输出高级控制功能,一个定时器支持多路的PWM输出。


b.通用定时器(TIM2到TIM5)

   具有16位定时功能,也具有PWM输出控制功能,一个定时器支持1路的PWM输出。


c.通用定时器(TIM9到TIM14)

  具有16位定时功能,也具有PWM输出控制功能,一个定时器支持1路的PWM输出。


d.基本定时器(TIM6和TIM7)

  具有16位定时功能

注:TIM是TIMER英文的缩写。


二、定时器初始化

1.选择时钟源,并初始化定时器分频值与定时时间


/* TIM3 clock enable ,定时器3时钟使能*/

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);


/* Time base configuration ,定时器基本配置*/

TIM_TimeBaseStructure.TIM_Period = (10000/1000)-1;         //定时时间的设置[非常重要],中断频率为1000Hz,也就是定时时间为1ms

TIM_TimeBaseStructure.TIM_Prescaler = 8400-1;                   //预分频值

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;         //时钟分频,也称之为二次分频,当前是1分频,说白了不分频,不降低频率

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数的方法

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化


2. 中断的配置


/* TIM Interrupts enable,使能定时器3更新中断事件,也代表说定时已经到达的事件 */


TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);


/* TIM3 enable counter,使能定时器3工作 */


TIM_Cmd(TIM3, ENABLE);

3. 中断服务函数的编写


void TIM3_IRQHandler(void)

{

    static uint32_t cnt=0;


    //是否已经有更新中断事件

    if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)

    {

        //添加用户代码

        cnt++;

        if(cnt>=500)

        {

            cnt =0;

            PFout(9)^=1;

        }

    //清空标志位,告诉CPU我已经完成中断处理

    TIM_ClearITPendingBit(TIM3, TIM_IT_Update);

}

三、PWM概述


1、定义

PWM(Pulse Width Modulation),脉冲宽度调制。

脉冲:方波,频率(freq)

宽度:高电平的宽度,占空比(duty)


详细波形如下图。

2、用途

控制灯光的亮度(手机/平板/显示器背光灯)

电机的转速

....

3、灯光的控制细节

频率要大于25Hz,灯光的亮度的变化是跟着占空比而变化,占空比越大,灯光越暗;占空比越小,灯光越亮。


四、程序设计


1.原理图



不同的定时器,输出通道的数目都有所不一样。在高级定时器输出多路的PWM,输出频率是一样的,但是占空比可以是不一样的,能够由TIM_SetComparex[1-3]来进行设置不同的通道占空比!



2.配置频率


/* TIM14 clock enable ,定时器14时钟使能*/

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);


/* Time base configuration ,定时器基本配置,TIM_Period是计数值*/

TIM_TimeBaseStructure.TIM_Period = (10000/100)-1; //输出频率为100Hz,(10000/100)-1得到的结果就是计数值。


TIM_TimeBaseStructure.TIM_Prescaler = 8400-1; //预分频值

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分频,也称之为二次分频,当前是1分频,说白了不分频,不降低频率


TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数的方法


TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure); //初始化


/* PWM1 Mode configuration: Channel1 ,让PWM的通道1工作在模式1*/

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;    //PWM模式1,在递增模式下,只要 TIMx_CNT < TIMx_CCR1,通道 1 便为有效状态(高电平),否则为无效状态(低电平)。


TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //允许输出


TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //有效的时候,输出高电平


TIM_OC1Init(TIM14, &TIM_OCInitStructure);


TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); //自动重载初值,不断输出PWM脉冲


TIM_ARRPreloadConfig(TIM14, ENABLE); //自动重载初值使能


/* TIM14 enable counter,使能定时器14工作 */

TIM_Cmd(TIM14, ENABLE);

4.配置引脚的复用功能


RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);


/* 配置PF9引脚为输出模式 */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //第9根引脚

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能模式,使用引脚的第二功能

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽模式,增加驱动电流

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //设置IO的速度为100MHz,频率越高性能越好,频率越低,功耗越低

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //不需要上拉电阻

GPIO_Init(GPIOF, &GPIO_InitStructure);

//将PF9引脚连接到定时器14

GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_TIM14);

2. 计数值与比较值之间的关系




void tim14_init(void)

{

/* TIM14 clock enable ,定时器14的时钟使能*/

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);


/* Time base configuration ,定时器的基本配置,用于配置定时器14输出方波的频率为100Hz*/

TIM_TimeBaseStructure.TIM_Period = (10000/100)-1; //10000是10KHz,是定时器3的时钟源,100就是定时器14输出方波的频率

TIM_TimeBaseStructure.TIM_Prescaler = 8400-1; //预分频,也就是说第一次分频,降低频率

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //第二次分频,当前是实现1分频,也就是不降低频率

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数方法,从0开始计算

TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);

/* Output Compare Timing Mode configuration: Channel1 ,让PWM工作是模式1*/

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM1模式1:只要 TIMx_CNT < TIMx_CCR1,通道 1 便为有效状态,否则为无效状态。

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //允许输出PWM

//TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //待会有专门的函数用于设置比较值,说白就是设置占空比

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //通道1有效的状态为高电平

TIM_OC1Init(TIM14, &TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); //定时器14自动重装载初值,那个初值指的是TIM_TimeBaseStructure.TIM_Period,当计数值加到99的时候,又重新从0加到99.

TIM_ARRPreloadConfig(TIM14, ENABLE); //自动重装载初值使能

/* TIM14 enable counter,使能定时器14工作,开始计数 */

TIM_Cmd(TIM14, ENABLE);

}

int main(void)

{

uint32_t pwm_cmp=0;

/* GPIOA GPIOE GPIOF硬件时钟使能,就是让GPIOA GPIOE GPIOF工作 */

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

/* 配置PF9 为复用功能模式 */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //第9 引脚

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //输出模式

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出,增强驱动能力,引脚的输出电流更大

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //引脚的速度最大为100MHz

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //没有使用内部上拉电阻

GPIO_Init(GPIOF, &GPIO_InitStructure);

/* Connect TIM14 pins to AF9 */  

GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_TIM14);//PF9引脚连接到TIM14

//配置系统定时器基于168MHz进行8分频,得到21MHz

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);

//设置中断优先级的分组为2,那么支持设置4个中断抢占优先级、4个中断响应优先级

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

tim14_init();

while(1)

{

//不断增加比较值,渐亮还是渐灭?答案:这是渐灭过程

for(pwm_cmp=0; pwm_cmp<=100; pwm_cmp++)

{

TIM_SetCompare1(TIM14,pwm_cmp);

delay_ms(20);

}

}

}



关键字:STM32  定时器  PWM

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic467314.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32小白入门(第八天)-------低功耗蓝牙模块
下一篇:STM32小白入门(第六天)-------串口通信

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32解决:st-link连接下载程序的问题

STM32解决:Error: Flash Download failed - "Cortex-M3"本人由于使用普中科技的stm32 的开发板的 USB的下载的地方坏了,所以不得不使用arm仿真器 st-link 进行下载。鼓捣了半天下面总结一下几个问题:1、st-link的驱动下载首先你插上st-link的时候,电脑的设备管理器这个地方是有感叹号的,说明还没有装好驱动,所以我就在网上找啊找。终于根据:win8【笔者没这个系统,无法测试,请大家测试后报告】:http://pan.baidu.com/s/1sjJQxZn(转载来自:https://blog.csdn.net/imxiangzi/article
发表于 2019-07-19
STM32解决:st-link连接下载程序的问题

解决stm32f103通过stlink不能烧录程序问题

问题:   stm32(stm32f103c8T6)开发板只能通过串口烧录程序,而st—link居然不行描述:解决:st-link固件升级用stm32cubemx快速开发时没有配置好调试模式重新生成代码就可以了如果还是不行的话,就得升级一下stlink固件了,具体升级方法可百度
发表于 2019-07-19
解决stm32f103通过stlink不能烧录程序问题

STM32下载不成功问题汇总

在某宝上买了五个最小系统核心板是STM32F103C8T6的芯片,刚拿到手准备下载程序调试,上电后板子自带LED闪烁,这是商家自己下载的示例程序,说明芯片工作着,用KEIL4进行下载自己程序,把自己编译好的程序下载。用的JLINK的四线下载调试下载口,SW的调试接口,点击下载后发现擦除成功,下载失败,提示:Load "..\Output\STM32-DEMO.axf" Set JLink Project File to "F:文件RFID程序电机USERJLinkSettings.ini"* JLink Info: Device "STM32
发表于 2019-07-19
STM32下载不成功问题汇总

STM32高级开发(11)-使用GDB调试你的工程

/scripts/target/stm32f4x_stlink.cfg在执行完此条指令后该终端就会一直执行OpenOCD的程序了,不要关闭它,我们再打开一个终端界面,进入我们的工程目录,比如我这里进入的就是我的libopencm3样例工程下的blink子工程目录。$ cd '/home/yangliu/workspace/libopencm3-my-example/blink'然后我们使用指令输入调试文件并打开GDB程序。$ arm-none-eabi-gdb blink.elf 然后我们在GDB的指令界面中,输入连接指令,连接本地的3333端口。(gdb)target remote localhost:3333此时
发表于 2019-07-19
STM32高级开发(11)-使用GDB调试你的工程

STM32F4标准外设库模板工程建立与使用

SW4STM32安装其实固件库安装过程很简单,在第一次新建工程时会提示选择使用Stdperiph 驱动还是Cube HAL,由于Stm32官方大力推行Cube HAL固件库,所以Cube HAL的固件库直接可以从网上直接一键下载安装。然而对于老的StdPeriph固件库不能一键式下载安装,会提示出错。所以,我们需要自己下载一个.zip固件包,放在C:UsersLYAppDataRoamingAc6SW4STM32firmwares文件夹下,其中的LY就是计算机的用户名。然后新建工程时在选择Stdperiph固件时会自动解压缩,这样就能使用该库进行编译了。界面如下所示:工程配置器件与时钟或者,修改晶振与时钟,根据注释可以算得
发表于 2019-07-19
STM32F4标准外设库模板工程建立与使用

基于STM32的外设的GPIO外设设置总结

1、背景外设驱动的寄存器设置对于外设功能正常运行异常重要。现在对GPIO的配置进行总结。2、GPIO的配置总结复用GPIO配置GPIO设置为输出或者是复用模式时,需要设置输出速度;而无论设置为什么模式,都要对GPIO的内部上下拉进行设置。注意:在输入模式(普通输入/模拟输入)下,OTYPE和OSPEED参数无效!!
发表于 2019-07-19
基于STM32的外设的GPIO外设设置总结

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved