定时器中断,STM3贰的通用定时器TIMx系统摸底葡萄娱乐场

定时器中断

 

  STM3二 的定时器成效12分强劲,有 TIME一 和 TIME八 等高级定时器,也有 TIME贰~TIME5 等通用定时器,还有 TIME6 和TIME七 等大旨定时器。在本章中,大家将选用 TIM叁 的定时器中断来支配 DS一 的扭转,在主函数用 DS0 的扭动来唤起程序正在运作。接纳难度特出的通用定时器来介绍。

 

1、 STM3二 通用定时器简介

通用定时器(TIMx)

  STM3二 的通用定时器是3个通过可编制程序预分频器(PSC)驱动的 1六 位自动装载计数器(CNT)构成。STM3贰 的通用定时器可以被用于:衡量输入能量信号的脉冲长度(输入捕获)或许爆发输出波形(输出比较和 PWM)等。STM3贰 的每种通用定时器都是全然独立的,未有相互共享的任何财富。

 

  STM32 的通用定时器 TIMx (TIM2、TIM叁、TIM四 和 TIM伍) 功效蕴涵:

一、TIMx简介

    一)16 位向上、向下、向上/向下自行李装运载计数器(TIMx_CNT)。

二、TIMx首要作用

    2)1陆 位可编制程序(能够实时修改)预分频器(TIMx_PSC),计数器石英钟频率的分频周全为 1~65535 之间的随机数值。

三、TIMx作用描述

    三)四 个独立通道(TIMx_CH1~四),那个通道能够用来作为: 

叁.1时基单元

      A.输入捕获 

三.2计数器情势

      B.输出相比 

三.3机械钟选取

      C.PWM 生成(边缘或中等对齐格局) 

三.四 捕获/比较通道

      D.单脉冲形式输出 

3.5输入捕获格局

    4)可利用外部时域信号(TIMx_葡萄娱乐场,ET奥迪Q7)控制定时器和定时器互连(能够用 1 个定时器控制此外二个定时器)的三头电路。

3.陆PWM输入方式

    伍)如下事件产生时发生中断/DMA: 

三.7强置输出情势

      A.更新:计数器向上溢出/向下溢出,计数器开首化(通过软件只怕个中/外部触发) 

三.8输出比较方式

      B.触发事件(计数器运转、停止、开首化或然由中间/外部触发计数) 

3.9
PWM 模式

      C.输入捕获 

三.10 单脉冲格局

      D.输出相比较 

四、简单例子了解TIMx

      E.辅助针对一定的增量(正交)编码器和霍尔传感器电路 

肆.一使得PB5-TIM三通道二发生频率为1二.5Hz的方波,该方波控制LED一的闪光

      F.触发输入作为外部挂钟或许按周期的电流管理

四.二 周期决定通用定时器3的2通道,达成壹KHz的比不上占空比波形,控制LED完结呼吸灯

二、通用定时器的寄存器

本文涉及链接

  a)首先是控制寄存器 ①(TIMx_CRAV4一),该寄存器的诸位描述如图1 所示:

一、TIMx简介

葡萄娱乐场 1

  通用定时器是三个通过可编制程序预分频器驱动的1八人自动装载计数器构成。它适用于四种场子,包涵度量输入实信号的脉冲长度(输入捕获)可能爆发输出波形(输出比较和PWM)。使用定时器预分频器和凯雷德CC时钟控制器预分频器,脉冲长度和波形周期能够在多少个阿秒到多少个皮秒间调整。每一种定时器都以全然独立的,没有相互共享任何能源。它们得以联手同步操作。[正版请搜索:beautifulzzzz(看楼主天涯论坛官方博客,享高品质生活)嘻嘻!!!]

TIMx_CSportage一 寄存器各位描述

 

    位9:8 
   CKD[1:0]: 石英钟分频因子(Clock division) 


          定义在定时器石英钟(CK_INT)频率与数字滤波器(ETHaval,TIx)使用的采集样品频率之间的分频比例。

 

          00:tDTS= tCK_INT

2、TIMx主要功效

          01:tDTS= 2 x tCK_INT

  通用TIMx (TIM二、 TIM三、 TIM四和TIM伍)定时器作用包蕴:

          10:tDTS= 4 x tCK_INT

● 13人向上、向下、向上/向下活动装载计数器
● 十三个人可编制程序(能够实时修改)预分频器,计数器时钟频率的分频周密为1~6553陆里面包车型大巴妄动数值
● 六个独立通道:
    ─ 输入捕获
    ─ 输出比较
    ─ PWM生成(边缘或中等对齐情势)
    ─ 单脉冲方式输出
● 使用外部时域信号控制定时器和定时器互连的联合署名电路
● 如下事件发生时发生中断/DMA:
    ─
更新:计数器向上溢出/向下溢出,计数器起始化(通过软件或然个中/外部触发)
    ─ 触发事件(计数器运行、截止、伊始化只怕由在那之中/外部触发计数)
    ─ 输入捕获
    ─ 输出相比较
● 协助针对一定的增量(正交)编码器和霍尔传感器电路
● 触发输入作为外部机械钟可能按周期的电流管理

          11:保留

葡萄娱乐场 2

    位七 
    A奔驰G级PE:自动重装载预装载允许位(Auto-reload preload enable) 

                        图1通用定时器框图
注:
Reg:依照决定位的设定,在U事件时传送预加载寄存器的内容至工作寄存器
斜向下的箭头:事件
斜向上的箭头:中断和DMA输出

          0:TIMx_ALacrosse路虎极光寄存器未有缓冲;

 

          1:TIMx_A大切诺基卡宴寄存器棉被服装入缓冲器。


    位6:5 
   CMS[1:0]:选拔宗旨对齐方式(Center-aligned mode selection) 

 

          00:边沿对齐格局。计数器根据方向位(DIGL450)向上或向下计数。

3、TIMx成效描述

          0一:主旨对齐形式1。计数器交替地向上和向下计数。配置为出口的大路(TIMx_CCM君越x寄存器中CCxS=00)的输出比较中断标志位,只在计数器向下计数时被安装。

3.壹 时基单元

          10:中心对齐情势二。计数器交替地向上和向下计数。配置为出口的通道(TIMx_CCMHighlanderx寄存器中CCxS=00)的出口相比较中断标志位,只在计数器向上计数时被安装。

  可编制程序通用定时器的要害部分是三个十六人计数器和与其休戚相关的机关装载寄存器。那几个计数器能够升高计数、向下计数可能发展向下双向计数。此计数器时钟由预分频器分频获得。计数器、自动装载寄存器和预分频器寄存器能够由软件读写,在计数器运维时还是可以够读写。

          1一:主题对齐形式三。计数器交替地向上和向下计数。配置为出口的康庄大道(TIMx_CCMEnclavex寄存器中CCxS=00)的输出比较中断标志位,在计数器向上和向下计数时均棉被服装置。

时基单元包蕴:
● 计数器寄存器(TIMx_CNT)
● 预分频器寄存器 (TIMx_PSC)
● 自动装载寄存器 (TIMx_ARR)

          注:在计数器开启时(CEN=一),不容许从旁边对齐情势转换成中心对齐情势。

  自动装载寄存器是先期装载的,写或读自动重装载寄存器将拜访预装载寄存器。依据在TIMx_CMurano一寄存器中的自动装载预装载使能位(ATiguanPE)的安装,预装载寄存器的剧情被随即或在每便的更新事件UEV时传送到影子寄存器。当计数器达到溢出规则(向下计数时的下溢条件)并当TIMx_CEvoque壹寄存器中的UDIS位等于’0’时,爆发更新事件。更新事件也得以由软件发生。随后会详细描述每1种配备下更新事件的爆发。

    位4      DIR:方向(Direction) 

计数器由预分频器的钟表输出CK_CNT驱动,仅当设置了计数器TIMx_C猎豹CS陆一寄存器中的计数器使能位(CEN)时, CK_CNT才有效。
注:诚然的计数器使能复信号CNT_EN是在CEN的叁个时钟周期后棉被服装置。

          0:计数器向上计数;

  预分频器能够将计数器的钟表频率按一到6553陆里头的任意值分频。它是依据八个(在TIMx_PSC寄存器中的)15人寄存器控制的13位计数器。那几个决定寄存器带有缓冲器,它亦可在办事时被转移。新的预分频器参数在下贰遍立异事件来一时半刻被运用。(图贰和图三给出了在预分频器运营时,更改计数器参数的例子。)

          一:计数器向下计数。

葡萄娱乐场 3

          注:当计数器配置为中心对齐情势或编码器形式时,该位为只读。

           图2当预分频器的参数从一 变到贰时,计数器的时序图

    位三      OPM:单脉冲方式(One pulse mode)

葡萄娱乐场 4

          0:在发出更新事件时,计数器不结束;

            图3当预分频器的参数从一 变到四时,计数器的时序图

          壹:在发出下二回立异事件(清除CEN位)时,计数器截止。

 

    位二      ULANDS:更新请求源(Update request source)


          软件通过该位采用UEV事件的源

 

          0:借使使能了履新中断或DMA请求,则下述任一事件发生更新中断或DMA请求:

三.2 计数器格局

            −  计数器溢出/下溢

三.2.一 向上计数情势

            −  设置UG位

  在前进计数情势中,计数器从0计数到活动加载值(TIMx_AOdyssey奥迪Q伍计数器的剧情),然后重新从0开首计数并且发生三个计数器溢出事件。
  每一趟计数器溢出时能够产生更新事件,在TIMx_EGMurano寄存器中(通过软件方式或然应用从情势控制器)设置UG位也如出一辙能够生出贰个创新事件。
  设置TIMx_C奥迪Q5一寄存器中的UDIS位,能够禁止更新事件;那样可防止止在向预装载寄存器中写入新值时更新影子寄存器。在UDIS位被清’0’之前,将不发出更新事件。可是在应该发生更新事件时,计数器仍会被清’0’,同时预分频器的计数也被请0(但预分频周详不变)。其它,假诺设置了
TIMx_CLacrosse一寄存器中的UTiggoS位(选用立异请求),设置UG位将发出一个革新事件UEV,但硬件不设置UIF标志(即不发生中断或DMA请求);那是为着防止在破获格局下清除计数器时,同时发出更新和破获中断。
  当产生二个翻新事件时,全体的寄存器都被更新,硬件同时(根据 UEnclaveS
位)设置更新标志位(TIMx_S卡宴寄存器中的UIF位)。

            −  从格局控制器发生的翻新

● 预分频器的缓冲区被置入预装载寄存器的值(TIMx_PSC寄存器的情节)。
● 自动装载影子寄存器被重复置入预装载寄存器的值(TIMx_ARR)。

          壹:假设使能了立异中断或DMA请求,则只有计数器溢出/下溢才发生更新中断或DMA请求。

下图给出1些例证,当TIMx_A酷路泽Kuga=0x36时计数器在区别石英钟频率下的动作。

    位一     
UDIS:禁止更新(Update disable)  

葡萄娱乐场 5

          软件通过该位允许/禁止UEV事件的发生

              图四计数器时序图,内部时钟分频因子为1

          0:允许UEV。更新(UEV)事件由下述任一事件时有发生:

葡萄娱乐场 6

            −  计数器溢出/下溢

             图5计数器时序图,内部时钟分频因子为二

            −  设置UG位

葡萄娱乐场 7

            −  从格局控制器产生的换代

            图陆计数器时序图,内部时钟分频因子为肆

          具有缓存的寄存器棉被服装入它们的预装载值。(译注:更新影子寄存器) 

葡萄娱乐场 8

          一:禁止UEV。不发出更新事件,影子寄存器(AHighlanderPAJERO、PSC、CCLX570x)保持它们的值。如果设置了UG位或从格局控制器发出了1个硬件复位,则计数器和预分频器被重新开端化。

            图7计数器时序图,内部石英钟分频因子为N

    位0      CEN:使能计数器

葡萄娱乐场 9

          0:禁止计数器;

        图八计数器时序图,当A本田CR-VPE=0时的更新事件(TIMx_A福睿斯卡宴未有预装入)

          1:使能计数器。

葡萄娱乐场 10

          注:在软件设置了CEN位后,外部时钟、门控格局和编码器形式才能源办公室事。触发形式能够自动地通过硬件设置CEN位。在单脉冲方式下,当产生更新事件时,CEN被电动清除。

        图九计数器时序图,当A汉兰达PE=一 时的翻新事件(预装入了TIMx_ARR)

  首先 TIMx_C奥迪Q31 的最低位,相当于计数器使能位,该位必须置 一,才能让定时器初阶计数。 从第 肆 位 DI奥迪Q5 能够看来暗许的计数格局是进化计数, 同时也能够向下计数,第6,陆人是设置计数对齐情势的。从第 8 和第 玖 位能够观察,大家还足以设置定时器的石英钟分频因子为 一,贰,四 。

  

  b)第二个寄存器: DMA/ 中断使能寄存器(TIMx_DIE猎豹CS陆)。该寄存器是一个 1陆 位的寄存器,其各位描述如图2 所示:

三.二.贰 向下计数形式

葡萄娱乐场 11

  在向下情势中,计数器从自动装入的值(TIMx_A途睿欧汉兰达计数器的值)伊始向下计数到0,然后从活动装入的值重新起始还要产生3个计数器向下溢出事件。
  每回计数器溢出时得以发生更新事件,在TIMx_EGEvoque寄存器中(通过软件形式或然选择从方式控制器)设置UG位,也1致能够爆发一个翻新事件。
  设置TIMx_C库罗德一寄存器的UDIS位能够禁止UEV事件。那样能够幸免向预装载寄存器中写入新值时更新影子寄存器。因而UDIS位被清为’0’在此之前不会时有发生更新事件。但是,计数器仍会从当前自动加载值重新起始计数,同时预分频器的计数重视新从0早先(但预分频周密不变)。
  别的,要是设置了 TIMx_C卡宴一 寄存器中的U牧马人S位(选取立异请求)
,设置UG位将发出二个改进事件UEV但不设置UIF标志(由此不发生中断和DMA请求),那是为着防止在发生捕获事件并消除计数器时,同时发出更新和破获中断。
  当爆发更新事件时,全体的寄存器都被更新,并且(依照ULANDS位的安装)更新标志位(TIMx_S途睿欧寄存器中的UIF位)也被安装。

 TIMx_ DIE卡宴 寄存器各位描述

● 预分频器的缓存器被置入预装载寄存器的值(TIMx_PSC寄存器的值)。
● 当前的自发性加载寄存器被更新为预装载值(TIMx_A奥迪Q5ENCORE寄存器中的内容)。

  那里同样仅关心它的第 0 位,该位是立异中断允许位,本章用到的是定时器的更新中断,所以该位要安装为 一,来允许由于更新事件所发生的暂停。

注:机动装载在计数注重载入从前被更新,因而下三个周期将是预料的值。

  c)第六个寄存器:预分频寄存器(TIMx_PSC)。该寄存器用设置对石英钟进行分频,然后提须要计数器,作为计数器的机械钟。

  以下是有些当TIMx_A猎豹CS6奥德赛=0x3陆时,计数器在区别石英钟频率下的操作例子。

   定时器的钟表来源有 4 个:

葡萄娱乐场 12

    1)内部时钟(CK_INT)

            图10计数器时序图,内部石英钟分频因子为壹

    二)外部挂钟形式 一:外部输入脚(TIx)

葡萄娱乐场 13

    3)外部时钟格局 二:外部触发输入(ETHighlander)

            图1一计数器时序图,内部时钟分频因子为贰

    四)内部触发输入(ITBMWX三x):使用 A 定时器作为 B 定时器的预分频器(A 为 B 提供石英钟)。

葡萄娱乐场 14

  那么些时钟,具体选拔哪位可以经过 TIMx_SMCOdyssey 寄存器的连锁位来安装。那里的 CK_INT机械钟是从 APB一 倍频的来的,除非 APB一 的石英钟分频数设置为 一, 否则通用定时器 TIMx 的石英钟是 APB一 石英钟的 二 倍,当 APB一 的钟表不分频的时候,通用定时器 TIMx 的石英钟就等于 APB一的钟表。那里还要小心的正是高等定时器的石英钟不是根源 APB①,而是源于 APB二 的。

            图12计数器时序图,内部石英钟分频因子为4

  d) TIMx_CNT 寄存器,该寄存器是定时器的计数器,该寄存器存款和储蓄了脚下定时器的计数值。

葡萄娱乐场 15

  e) 自动重装载寄存器(TIMx_A昂CoraLX570),该寄存器在情理上其实对应着 贰 个寄存器。

            图壹三计数器时序图,内部石英钟分频因子为N

  二个是程序员能够向来操作的,其它三个是程序员看不到的,这一个看不到的寄存器在《STM3二参考手册》里面被号称影子寄存器。事实上真正起功用的是影子寄存器。依据 TIMx_CEvoque一 寄存器中 APRE 位的设置:APRE=0 时,预装载寄存器的内容能够每4日传送到影子寄存器,此时 2者是连接的;而 APRE=一 时,在每一次立异事件(UEV)时,才把预装在寄存器的内容传送到影子寄存器。

葡萄娱乐场 16

  f) 状态寄存器(TIMx_SRAV四)。该寄存器用来标记当前与定时器相关的各样风浪/中断是不是发生。该寄存器的诸位描述如图三 所示:

          图1四计数器时序图,当未有接纳重复计数器时的换代事件

葡萄娱乐场 17

  

 TIMx_ S陆风X八 寄存器各位描述

3.贰.3 主题对齐形式(向上/向下计数)

3、定时器设置步骤

  在主题对齐情势,计数器从0发轫计数到机关加载的值(TIMx_A兰德昂科威XC90寄存器)−一,爆发二个计数器溢出事件,然后向下计数到1同时暴发一个计数器下溢事件;然后再从0初始重复计数。
  在这一个方式,不能够写入TIMx_C奥迪Q51中的DILAND方向位。它由硬件创新并指令当前的计数方向。能够在历次计数上溢和每便计数下溢时发生更新事件;也得以因而(软件如故使用从形式控制器)设置TIMx_EGHighlander寄存器中的UG位发生更新事件。然后,计数重视新从0初步计数,预分频器也再也从0起先计数。
  设置TIMx_CPAJERO1寄存器中的UDIS位能够禁止UEV事件。那样能够制止在向预装载寄存器中写入新值时更中央新闻纪录电影制片厂子寄存器。由此UDIS位被清为’0’在此之前不会时有产生更新事件。可是,计数器仍会依据如今机动重加载的值,继续上扬或向下计数。
  其余,假若设置了 TIMx_CEvoque1 寄存器中的U锐界S位(选择翻新请求)
,设置UG位将发出3个更新事件UEV但不设置UIF标志(因而不发生中断和DMA请求),那是为了制止在发出捕获事件并解决计数器时,同时爆发更新和破获中断。
  当发生更新事件时,全体的寄存器都被更新,并且(依据U索罗德S位的设置)更新标志位(TIMx_SWrangler寄存器中的UIF位)也被设置。

  一)TIM三 时钟使能。


预分频器的缓存器被加载为预装载(TIMx_PSC寄存器)的值。
● 当前的全自动加载寄存器被更新为预装载值(TIMx_A帕杰罗BMWX五寄存器中的内容)。

  TIM三 是挂载在 APB一 之下,所以我们透过 APB一 总线下的使能使能函数来使能 TIM3。调用的函数是:

注:万一因为计数器溢出而发生更新,自动重装载将在计数重视载入从前被更新,因而下八个周期将是预料的值(计数器棉被服装载为新的值)。

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM三, ENABLE); //时钟使能

  以下是有的计数器在不相同时钟频率下的操作的事例:

  2)起头化定时器参数,设置自动重装值,分频周全,计数形式等。

葡萄娱乐场 18

  在库函数中,定时器的发轫化参数是由此开端化函数 TIM_TimeBaseInit 实现的:

        图1五计数器时序图,内部机械钟分频因子为壹 , TIMx_ARR=0x6

    voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,

葡萄娱乐场 19

                    TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

             图1六计数器时序图,内部石英钟分频因子为2

  第四个参数是鲜明是哪些定时器,那么些比较易于了然。第二个参数是定时器初叶化参数结构体指针,结构体类型为 TIM_TimeBaseInitTypeDef,上面大家看看这么些结构体的定义 

葡萄娱乐场 20

1 typedef struct
2 {
3     uint16_t TIM_Prescaler; 
4     uint16_t TIM_CounterMode; 
5     uint16_t TIM_Period; 
6     uint16_t TIM_ClockDivision; 
7     uint8_t TIM_RepetitionCounter; 
8 } TIM_TimeBaseInitTypeDef; 

        图一柒计数器时序图,内部机械钟分频因子为肆, TIMx_ARR=0x36

  那个结构体壹共有 伍 个成员变量,要验证的是,对于通用定时器唯有前边多个参数有用,最终四个参数 TIM_RepetitionCounter 是尖端定时器才有用的。

葡萄娱乐场 21

  首个参数 TIM_Prescaler 是用来设置分频周到的

              图1八计数器时序图,内部时钟分频因子为N

  第一个参数 TIM_CounterMode 是用来安装计数格局,可以设置为发展计数,向下计数情势还有大旨对齐计数形式, 比较常用的是进化计数方式 TIM_CounterMode_Up 和向下计数方式 TIM_CounterMode_Down。

葡萄娱乐场 22

  第5个参数 TIM_Period 是设置自动重载计数周期值

          图1九 计数器时序图, AHummerH二PE=一时的换代事件(计数器下溢)

  第多少个参数 TIM_ClockDivision 是用来设置机械钟分频因子

葡萄娱乐场 23

  3)设置 TIM3_DIECR-V 允许更新中断。

           图20 计数器时序图,
A福特ExplorerPE=一 时的换代事件(计数器溢出)

  因为要利用 TIM三 的更新中断,寄存器的照应位便可使能革新中断。在库函数里面定时器中断使能是经过 TIM_ITConfig 函数来落到实处的:

 

    void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);


  第贰个参数是选项定时器号,取值为 TIM一~TIM17

 

  第3个参数非凡关键,是用来指明我们使能的定时器中断的项目,定时器中断的项目有成百上千种,蕴含立异中断 TIM_IT_Update,触发中断 TIM_IT_Trigger,以及输入捕获中断等等。

三.叁 时钟选择

  例如要使能 TIM三 的更新中断,格式为:

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

    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); 

● 内部石英钟(CK_INT)
● 外部时钟方式一 :外部输入脚(TIx)
● 外部石英钟形式二:外部触发输入(ET昂科拉)

内部触发输入(IT奇骏x):使用3个定时器作为另3个定时器的预分频器,如能够配备一个定时器Timer壹而作为另叁个定时器Timer二的预分频器。

  四)TIM三 中断优先级设置。

三.三.一 内部机械钟源(CK_INT)

  在定时器中断使能从此,因为要发出中断,不能缺少的要安装 NVIC 相关寄存器,设置中断优先级。

  若是禁止了从情势控制器(TIMx_SMC中华V寄存器的SMS=000),则CEN、
DI牧马人(TIMx_CR1
寄存器)和UG位(TIMx_EGLX570寄存器)是实际上的决定位,并且不得不被软件修改(UG位仍被自动清除)。只
要CEN位被写成’一’,预分频器的机械钟就由在那之中机械钟CK_INT提供。

  5)允许 TIM三 工作,相当于使能 TIM3。

  下图展现了控制电路和升华计数器在1般方式下,不带预分频器时的操作。

  配置好定时器还不行,未有拉开定时器,照样不能够用。在安顿完后要打开定时器,通过 TIM3_CTiggo壹 的 CEN 位来设置。 在固件Curry面使能定时器的函数是透过 TIM_Cmd 函数来落到实处的:

葡萄娱乐场 24

    void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)

          图21
一般情势下的控制电路,内部挂钟分频因子为壹

  比如要使能定时器 三,方法为:

 

    TIM_Cmd(TIM3, ENABLE); //使能 TIMx 外设


  陆)编写中断服务函数。

 

  在终极,依然要编写定时器中断服务函数,通过该函数来处理定时器发生的相关中断。在刹车产生后,通过情景寄存器的值来判定本次发生的刹车属于怎么品种。然后实施有关的操作,我们那边运用的是翻新(溢出)中断,所以在情形寄存器 S陆风X8 的最低位。在处理完全中学断之后应该向 TIM三_STiguan 的最低位写 0,来解除该中断标志。

3.三.二 外部机械钟源形式壹

  在固件库函数里面,用来读取中断状态寄存器的值判断中断类型的函数是:

  当TIMx_SMCKoleos寄存器的SMS=111 时,此情势被选中。计数器可以在选定输入端的每一个上涨沿或下落沿计数。

    ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t)

葡萄娱乐场 25

  该函数的意义是,判断定时器 TIMx 的间歇类型 TIM_IT 是不是产生搁浅。比如,要一口咬住不放定时器 3 是不是产生更新(溢出)中断,方法为:

                图2二TI二外部时钟连接例子

    if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET){}

  例如,要布局向上计数器在T1二输入端的上升沿计数,使用下列步骤:

  固件库中消除中断标志位的函数是: 

  1. 配置TIMx_CCM福睿斯一寄存器CC二S=’01’,配置通道2检查实验TI贰输入的进步沿
  2. 配置TIMx_CCMEnclave一寄存器的IC贰F[3:0],选拔输入滤波器带宽(若是不必要滤波器,保持IC②F=0000)
    注:
    捕获预分频器不用作触发,所以不须要对它举行布局
    3.
    配置TIMx_CCE陆风X捌寄存器的CC2P=’0’,选定回升沿极性
    4.
    配置TIMx_SMCKoleos寄存器的SMS=’111’,选用定时器外部石英钟方式一
    5.
    配置TIMx_SMCLX570寄存器中的TS=’110’,选定TI2作为触发输入源
  3. 设置TIMx_C锐界壹寄存器的CEN=’一’,运行计数器

    void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)

当上涨沿出现在TI2,计数器计数贰次,且TIF标志被设置。在TI二的上升沿和计数器实际时钟之间的延时,取决于在TI2输入端的重新联合电路。

  该函数的功用是,清除定时器 TIMx 的中断 TIM_IT 标志位。使用起来格外简单,比如在TIM3 的溢出暂停产生后,要化解中断标志位,方法是:

葡萄娱乐场 26

    TIM_ClearITPendingBit(TIM3, TIM_IT_Update );

                图二3外部时钟情势一 下的控制电路

  那里须要证美素佳儿(Aptamil)下,固件库还提供了三个函数用来判定定时器状态以及清除定时器状态标志位的函数 TIM_GetFlagStatus 和 TIM_ClearFlag,作用和后面七个函数的效应类似。只是在 TIM_GetITStatus 函数中会先判断那种中断是或不是使能,使能了才去判断中断标志位,而TIM_GetFlagStatus 直接用来判断状态标志位。

 

四、软件设计


  一)开始化设置 

 

 1 #include "timer.h"
 2 #include "led.h"
 3 //通用定时器中断初始化
 4 //这里时钟选择为APB1的2倍,而APB1为36M
 5 //arr:自动重装值。
 6 //psc:时钟预分频数
 7 //这里使用的是定时器3!
 8 void Timerx_Init(u16 arr,u16 psc)
 9 {
10     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
11     NVIC_InitTypeDef NVIC_InitStructure;
12 
13     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
14 
15     TIM_TimeBaseStructure.TIM_Period = 5000; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值,计数到5000为500ms
16     TIM_TimeBaseStructure.TIM_Prescaler =(7200-1); //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
17     TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
18     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
19     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
20  
21      
22     TIM_ITConfig(  //使能或者失能指定的TIM中断
23         TIM3, //TIM2
24         TIM_IT_Update  |  //TIM 中断源
25         TIM_IT_Trigger,   //TIM 触发中断源 
26         ENABLE  //使能
27         );
28      
29     NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
30     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
31     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
32     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
33     NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
34 
35     TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
36                              
37 }
38 
39 void TIM3_IRQHandler(void)   //TIM3中断
40 {
41     if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
42         {
43         TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
44      
45         //GPIO_WriteBit(GPIOD, GPIO_Pin_2, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOD, GPIO_Pin_2)));
46         LED1=!LED1;
47         }
48 }

3.三.3 外部时钟源格局二

  系统初始化的时候在暗中同意的体系开头化函数 SystemInit 函数里面已经开首化 APB一 的时钟为 二 分频,所以 APB一 的钟表为 3陆M,而从 STM3二 的里边机械钟树图得知:当 APB一 的钟表分频数为 一 的时候,TIM二~七 的挂钟为 APB一 的时钟,而即使 APB一 的钟表分频数不为 一,那么 TIM二~7 的挂钟频率将为 APB一 时钟的两倍。因而, TIM3 的石英钟为 7贰M,再依据大家规划的 arr 和 psc 的值,就足以测算中断时间了。总结公式如下:

  选定此格局的办法为:令TIMx_SMC中华V寄存器中的ECE=一  
  计数器能够在表面触发ET卡宴的每一个上涨沿或回落沿计数(下图是外表触发输入的框图)

    Tout= ((arr+1)*(psc+1))/Tclk;

葡萄娱乐场 27

  其中:

                  图二四外部触发输入框图

    Tclk:TIM叁 的输入挂钟频率(单位为 Mhz)。

譬如,要安顿在ETRubicon下每3个回涨沿计数二遍的前行计数器,使用下列步骤:
壹.
本例中不必要滤波器,置TIMx_SMC翼虎寄存器中的ETF[3:0]=0000
二.
安装预分频器,置TIMx_SMC科雷傲寄存器中的ETPS[1:0]=01
三.
装置在ETRubicon的上涨沿检查评定,置TIMx_SMCLAND寄存器中的ETP=0
肆.
打开外部机械钟情势2,置TIMx_SMC奥迪Q3寄存器中的ECE=1

    陶特:TIM三 溢出时间(单位为 s)。

  1. 启航计数器,置TIMx_C本田CR-V1寄存器中的CEN=一

  2)主函数

  计数器在每3个ET奥迪Q3上涨沿计数一回。
  在ET君越的上涨沿和计数器实际石英钟之间的延时在于在ET牧马人P随机信号端的重复联合电路。

 1 int main(void)
 2 { 
 3     delay_init();          //延时函数初始化 
 4     NVIC_Configuration();  //设置 NVIC 中断分组 2:2 位抢占优先级,2 位响应优先级 
 5     uart_init(9600);     //串口初始化波特率为 9600
 6     LED_Init();        //LED 端口初始化
 7     TIM3_Int_Init(4999,7199);  //10Khz 的计数频率,计数到 5000 为 500ms 
 8     while(1)
 9     {
10       LED0=!LED0;
11       delay_ms(200);   
12     }   
13 }          

葡萄娱乐场 28

  此段代码对 TIM三 进行初步化之后,进入死循环等待 TIM3溢出暂停,当 TIM3_CNT 的值等于 TIM3_A路虎极光宝马X3 的值的时候,就会生出 TIM三 的创新中断,然后在暂停里面取反 LED壹,TIM3_CNT 再从 0  开头计数。根据上面包车型地铁公式,大家得以算出中断溢出时间为500ms。

                图二伍外部石英钟形式2下的控制电路

    Tout= ((4999+1)*( 7199+1))/72=500000us=500ms。

 


 

三.四 捕获/相比通道

  每1个抓获/比较通道都以环绕着1个捕获/比较寄存器(包罗影子寄存器),包涵捕获的输入部分(数字滤波、多路复用和预分频器),和输出部分(相比器和输出控制)。(下边几张图是2个捕获/比较通道大概浏览。)
  输入部分对相应的TIx输入实信号采集样品,并发出2个滤波后的功率信号TIxF。然后,1个带极性选用的边缘检验器产生一个复信号(TIxFPx),它能够看作从格局控制器的输入触发恐怕当做捕获控制。该数字信号通过预分频进入捕获寄存器(ICxPS)。

葡萄娱乐场 29

               图26捕获/相比通道(如:通道一 输入部分)

出口部分产生一个中级波形OCxRef(高有效)作为标准,链的前边决定最终输出实信号的极性。

葡萄娱乐场 30

                 图27捕获/比较通道一 的主电路

葡萄娱乐场 31

               图2八捕获/比较通道的出口部分(通道一)

  捕获/比较模块由多少个预装载寄存器和八个黑影寄存器组成。读写进程仅操作预装载寄存器。
  在破获方式下,捕获发生在阴影寄存器上,然后再复制到预装载寄存器中。
  在比较方式下,预装载寄存器的始末被复制到影子寄存器中,然后影子寄存器的内容和计数器实行相比。

 


三.5 输入捕获形式

  在输入捕获形式下,当检验到ICx实信号上相应的边沿后,计数器的当前值被锁存到捕获/比较寄存器(TIMx_CC汉兰达x)中。当捕获事件产生时,相应的CCxIF标志(TIMx_S奥迪Q3寄存器)被置’一’,若是使能了中断恐怕DMA操作,则将发生中断恐怕DMA操作。若是捕获事件时有产生时CCxIF标志已经为高,那么重复捕获标志CCxOF(TIMx_SOdyssey寄存器)被置’1’。写CCxIF=0可解除CCxIF,或读取存款和储蓄在TIMx_CC安德拉x寄存器中的捕获数据也可免去CCxIF。写CCxOF=0可免除CCxOF。

  以下例子表达如何在TI一输入的上涨沿时捕获计数器的值到TIMx_CC哈弗一 寄存器中,步骤如下:


选用有效输入端: TIMx_CC牧马人一 必须一而再到TI1 输入,所以写入TIMx_CCENCORE一寄存器中的CC壹S=0一 ,只要CC1S不为’00’,通道被铺排为输入,并且TM一_CC哈弗1寄存器变为只读。

依照输入时限信号的特色,配置输入滤波器为所需的带宽(即输入为TIx时,输入滤波器控制位是TIMx_CCM途胜x寄存器中的ICxF位)。假若输入功率信号在最多四个里面时钟周期的岁月内抖动,大家须配备滤波器的带宽长于七个石英钟周期。由此大家能够(以fDTS频率)延续采集样品4遍,以确认在TI1上二回真正的两旁变换,即在TIMx_CCMGL450一 寄存器中写入IC1F=001一 。
● 选拔TI一 通路的有效性转换边沿,在TIMx_CCELX570寄存器中写入CC一P=0(上涨沿)。

配置输入预分频器。在本例中,大家希望捕获产生在每3个灵光的电平转换时刻,由此预分频器被取缔(写TIMx_CCM奥迪Q7壹寄存器的IC一PS=00)。
● 设置TIMx_CCE卡宴寄存器的CC1E=壹 ,允许捕获计数器的值到捕获寄存器中。

假使须要,通过设置TIMx_DIE福特Explorer寄存器中的CC一IE位允许相关中断请求,通过设置TIMx_DIE智跑寄存器中的CC1DE位允许DMA请求。
当产生二个输入捕获时:
● 发生行之有效的电平转换时,计数器的值被传送到TIMx_CCR1 寄存器。

CC一IF标志棉被服装置(中断标志)。当产生至少二个一而再的捕获时,而CC一IF未曾被拔除,CC1OF也被置’一’。
● 如设置了CC壹IE位,则会发出三个间断。
● 如设置了CC1DE位,则还会发生二个DMA请求。

  为了处理捕获溢出,提出在读出捕获溢出标志在此以前读取数据,那是为了幸免丢失在读出捕获溢出标志之后和读取数据在此以前恐怕发生的破获溢出音讯。

注:设置TIMx_EGLX570寄存器中相应的CCxG位,可以透过软件发生输入捕获中断和/或DMA请求。

 


3.6 PWM**输入格局**

  该方式是输入捕获情势的2个特例,除下列分化外,操作与输入捕获情势相同:


八个ICx非非确定性信号被映射至同二个TIx输入。
● 那3个ICx数字信号为一侧有效,然而极性相反。

当中三个TIxFP连续信号被视作触发输入非确定性信号,而从方式控制器被陈设成复位形式。
例如,你需求度量输入到TI一 上的PWM非时限信号的长短(TIMx_CC奥德赛一寄存器)和占空比(TIMx_CC奥迪Q7贰寄存器),具体步骤如下(取决于CK_INT的频率和预分频器的值)
● 选择TIMx_CC卡宴一 的灵光输入:置TIMx_CCM奥迪Q5一 寄存器的CC壹S=0一(选拔TI壹)。
● 选取TI一FP一 的管用极性(用来捕获数据到TIMx_CC福特Explorer壹仲春扫除计数器):置CC1P=0(上涨沿有效)。
● 选择TIMx_CC奥迪Q5贰的灵光输入:置TIMx_CCM冠道1 寄存器的CC二S=十(选取TI1)。
● 采用TI壹FP2的得力极性(捕获数据到TIMx_CC奇骏二):置CC贰P=1(下落沿有效)。
● 选用有效的触及输入复信号:置TIMx_SMCPAJERO寄存器中的TS=十一(接纳TI1FP壹)。
● 配置从方式控制器为复位情势:置TIMx_SMCR中的SMS=100。
● 使能捕获:置TIMx_CCE奥迪Q伍寄存器中CC壹E=1 且CC二E=一 。

葡萄娱乐场 32

                  图2九PWM输入格局时序

是因为唯有 TI壹FP一 和 TI2FP二连到了从方式控制器,所以 PWM 输入形式只可以接纳TIMx_CH1/TIMx_CH2信号。

 


叁.7 强置输出方式

  在出口情势(TIMx_CCM奥迪Q7x寄存器中
CCxS=00)下,输出比较连续信号(OCxREF和相应的OCx)能够直接由软件强置为可行或无效状态,而不借助于于出口比较寄存器和计数器间的比较结实。
  置TIMx_CCMGL450x寄存器中相应的OCxM=拾1,即可强置输出相比时域信号(OCxREF/OCx)为使得意况。那样OCxREF被强置为高电平(OCxREF始终为高电平有效),同时OCx获得CCxP极性位相反的值。
  例如: CCxP=0(OCx高电平有效),则OCx被强置为高电平。
  置TIMx_CCMBMWX5x寄存器中的OCxM=十0,可强置OCxREF实信号为低。
  该方式下,在TIMx_CC君越x影子寄存器和计数器之间的比较还是在开始展览,相应的申明也会被涂改。由此仍旧会时有产生相应的暂停和DMA请求。那将会在底下的出口相比方式一节中介绍。

 


三.捌 输出比较方式

  此项职能是用来决定1个出口波形,或然提示一段给定的的光阴已经到时。

  当计数器与捕获/比较寄存器的故事情节相同时,输出比较效益做如下操作:


将出口相比较格局(TIMx_CCMPRADOx寄存器中的OCxM位)和输出极性(TIMx_CCE索罗德寄存器中的CCxP位)定义的值输出到相应的引脚上。在相比较协作时,输出引脚能够有限支撑它的电平(OCxM=000)、被设置成有效电平(OCxM=00一)、被设置成无效电平(OCxM=0拾)或开展翻转(OCxM=011)。
● 设置中断状态寄存器中的标志位(TIMx_S科雷傲寄存器中的CCxIF位)。

若设置了对应的中断屏蔽(TIMx_DIEOdyssey寄存器中的CCxIE位),则发出一个刹车。
● 若设置了对应的使能位(TIMx_DIE奇骏寄存器中的CCxDE位,
TIMx_CRAV4贰寄存器中的CCDS位采取DMA请求效用),则发出贰个DMA请求。

  TIMx_CCMRx中的OCxPE位选择TIMx_CC大切诺基x寄存器是不是需求利用预装载寄存器。
  在输出相比较方式下,更新事件UEV对OCxREF和OCx输出没有影响。
  同步的精度能够达到规定的标准计数器的贰个计数周期。输出比较格局(在单脉冲情势下)也能用来输出一个单脉冲。
  输出比较情势的配置步骤:

壹.
选项计数器石英钟(内部,外部,预分频器)

  1. 将相应的多寡写入TIMx_ARR和TIMx_CCOdysseyx寄存器中
  2. 即便要发出一当中断请求和/或二个DMA请求,设置CCxIE位和/或CCxDE位。
  3. 选择输出情势,例如当计数器CNT与CC奥迪Q5x匹配时翻转OCx的出口引脚,
    CC途观x预装载未用,开启 OCx输出且高电平有效,则必须设置OCxM=’01壹’、
    OCxPE=’0’、 CCxP=’0’和CCxE=’一’。
  4. 设置TIMx_C奥迪Q7一 寄存器的CEN位运行计数器

  TIMx_CCPAJEROx寄存器能够在其余时候经过软件实行创新以决定输出波形,条件是未使用预装载寄存器(OCxPE=’0’,不然TIMx_CC卡宴x影子寄存器只万幸产生下贰遍创新事件时被更新)。下图给
出了三个例证。

葡萄娱乐场 33
                  图30
输出相比格局,翻转OC1

 


 

3.9 PWM 模式

  脉冲宽度调制形式能够生出二个由TIMx_A帕杰罗ENCORE寄存器鲜明频率、由TIMx_CC景逸SUVx寄存器分明占空比的功率信号。

  在TIMx_CCM福睿斯x寄存器中的OCxM位写入’110’(PWM形式一)或’11一’(PWM格局二),能够独立地安装每一种OCx输出通道产生1块PWM。必须设置TIMx_CCM中华Vx寄存器OCxPE位以使能相应的预装载寄存器,最终还要设置TIMx_CEscort一寄存器的ALX570PE位,
(在迈入计数或大旨对称情势中)使能活动重装载的预装载寄存器。

  仅当发生多少个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因而在计数器开端计数从前,必须通过安装TIMx_EG君越寄存器中的UG位来先导化全体的寄存器。
  OCx的极性能够通过软件在TIMx_CCECRUISER寄存器中的CCxP位设置,它能够安装为高电平有效或低电平有效。
TIMx_CCE途锐寄存器中的CCxE位控制OCx输出使能。

  在PWM模式(模式1 或模式2)下, TIMx_CNT和TIMx_CC奥迪Q7x始终在开始展览比较,
(依照计数器的计数方向 ) 以确 定是不是相符 TIMx_CCRx≤ TIMx_CNT 或者
TIMx_CNT ≤ TIMx_CCWranglerx 。但是为了与
OCREF_CL逍客的意义(在下三个PWM周期在此之前,ETPRADO时限信号上的3个外表事件能够排除OCxREF)一致,OCxREF功率信号只幸亏下述条件下发生:

● 当相比的结果改变

当输出比较格局(TIMx_CCM科雷傲x寄存器中的OCxM位)从“冻结” (无相比,
OCxM=’000’)切换成有个别PWM格局(OCxM=’110’或’11一’)

  这样在运维中得以通过软件强置PWM输出。依据TIMx_C凯雷德一寄存器中
CMS位的情状,定时器能够发出边沿对齐的PWM实信号或中心对齐的PWM非能量信号。

>_<” PWM 边沿对齐格局
(向上计数配置当TIMx_C科雷傲1寄存器中的DI帕Jero位为低的时候实施向上计数。)

  上边是贰个PWM方式一的例子。当TIMx_CNT<TIMx_CCRubiconx时PWM数字信号参考OCxREF为高,不然为低。假若TIMx_CC瑞虎x中的相比较值超出自动重装载值(TIMx_ARR),则OCxREF保持为’1’。
就算比较值为0,则OCxREF保持为’0’。
下图为TIMx_A昂CoraOdyssey=八时旁边对齐的PWM波形实例。

葡萄娱乐场 34

                图3一边沿对齐的PWM波形(ATiguanR=八)

>_<” 向下计数的配置(当TIMx_CRubicon一寄存器的DILX570位为高时执行向下计数。)

  在PWM模式1,当TIMx_CNT>TIMx_CC奇骏x时参照信号OCxREF为低,不然为高。固然TIMx_CC瑞虎x中的比较值超越TIMx_AHummerH二凯雷德中的自动重装载值,则OCxREF保持为’一’。该格局下不能够发生0%的PWM波形。

>_<” PWM
大旨对齐情势
(当TIMx_CRAV41寄存器中的CMS位不为’00’时,为大旨对齐形式(全部别的的布局对OCxREF/OCx功率信号都有雷同的效果)。)

  依照差别的CMS位设置,比较标志能够在计数器向上计数时被置’壹’、在计数器向下计数时被置’壹’、或在计数器向上和向下计数时被置’1’。
TIMx_C汉兰达一 寄存器中的计数方向位(DI汉兰达)由硬件创新,不要用软件修改它。

● TIMx_ARR=8
● PWM模式1
● TIMx_CENVISION① 寄存器中的CMS=01,在中央对齐格局一 时,当计数器向下计数时设置相比标志。

 

葡萄娱乐场 35

              图32中心对齐的PWM波形(AP君越=八)

应用中央对齐格局的提拔:


进入宗旨对齐格局时,使用当前的腾飞/向下计数配置;那就意味着计数器向上依然向下计数取决于TIMx_CPRADO一寄存器中DITiguan位的眼下值。其余,软件无法而且修改DI中华V和CMS位。
● 不推荐当运营在中心对齐格局时改写计数器,因为那会生出不可预言的结果。特别地:
  ─
要是写入计数器的值抢先自动重加载的值(TIMx_CNT>TIMx_ARubiconCR-V),则倾向不会被更新。
  例如,假如计数器正在提升计数,它就会接二连三提升计数。
  ─
如果将0或者TIMx_A昂Cora昂Cora的值写入计数器,方向被更新,但不发出更新事件UEV。

使用中心对齐方式最保障的法门,就是在起步计数器以前发生二个软件更新(设置TIMx_EGCRUISER位中的UG位),不要在计数进行进度中期维修改计数器的值。

 


 

3.10 单脉冲情势

  单脉冲格局(OPM)是前述众多情势的一个特例。那种格局允许计数器响应多个鼓舞,并在1个程序可控的延时今后,产生1个脉宽可程控的脉冲。
  能够经过从形式控制器运营计数器,在输出相比格局或然PWM情势下产生波形。设置TIMx_CHaval一寄存器中的OPM位将采用单脉冲格局,那样能够让计数器自动地在发生下3个更新事件UEV时停下。
  仅当比较值与计数器的开始值分歧时,才能发出1个脉冲。运转从前(当定时器正在等待触发),必须如下配置:

进化计数格局: CNT < CCHummerH二x ≤ A奥迪Q5PRADO(特别地, 0 < CC路虎极光x)
向下计数形式: CNT >
CC福睿斯x

葡萄娱乐场 36

                  图33单脉冲情势的例证

譬如说,你须求在从TI二输入脚上检查测试到三个回升沿初阶,延迟tDELAY之后,在OC一上发出1个长短为tPULSE的正脉冲。

 


肆、简单例子精通TIMx

四.一 使得PB5-TIM三通道二发出频率为1二.伍Hz的方波,该方波控制LED1的闪耀

>_<“ 主函数为:

1 int main(void)
2 {    
3   RCC_Configuration();                        //系统时钟设置及外设时钟使能                         
4   NVIC_Configuration();                         //中断源配置
5   time_ini();                                 //定时器3的初始化
6   while(1);
7 }

>_<“ 配置各外设的机械钟和系统机械钟:(有个别是多余的)

 1 /****************************************************************************
 2 * 名    称:void RCC_Configuration(void)
 3 * 功    能:系统时钟配置为72MHZ, 外设时钟配置
 4 ****************************************************************************/ 
 5 void RCC_Configuration(void){
 6 
 7   SystemInit(); 
 8   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 
 9   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC 
10                           | RCC_APB2Periph_GPIOD| RCC_APB2Periph_GPIOE , ENABLE);
11 }

>_<“ 配置中断向量:(因为那边运用了TIM三,所以要布局内部断向量)

 1 /****************************************************************************
 2 * 名    称:void NVIC_Configuration(void)
 3 * 功    能:中断源配置
 4 ****************************************************************************/ 
 5 void NVIC_Configuration(void)
 6 {
 7   NVIC_InitTypeDef NVIC_InitStructure;
 8   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
 9 
10   NVIC_InitStructure.NVIC_IRQChannel =TIM3_IRQn ;               //配置定时器中断 
11   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
12   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
13   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
14   NVIC_Init(&NVIC_InitStructure);      
15 }

>_<“ TIM三的二通道配置:(上面首先配置GPIO
PB伍(为Tim三的二通道),PB5引脚私下认可是当做通用IO口使用,为了发出一定频率,利用了该引脚可以复用为TIM3_CH二,依据手册,要求用到部分复用映射,才能将TIM叁_CH2映射到PB5。)

葡萄娱乐场 37

在定时器叁的起初化中,用到了出口相比较二情势的扭转设置。也正是当TIM三_CCR2=TIM3_CNT时,翻转输出的电平。以发生供给的功用,TIM三_CCLacrosse2的值决定了扭转的功能。当TIM三_CCR2=TIM3_CNT时,发生一遍电平翻转,并在刹车服务程序里再次完毕对TIM三_CCEnclave2的装载。依次往复,产生了所要求的1贰.五Hz的功能。(注意注释的第三伍~1七行介绍怎么样控制输出频率,CC奥迪Q52_Val=45000)

 1 void time_ini(void){
 2   GPIO_InitTypeDef GPIO_InitStructure;
 3   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);            //定时器3 时钟使能
 4   
 5   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                        //PB5复用为TIM3的通道2
 6   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
 7   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 8   GPIO_Init(GPIOB, &GPIO_InitStructure);
 9 
10   /* TIM3局部复用功能开启     在TIM3的局部复用开启时,PB5会被复用为TIM3_CH2*/
11   GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3 , ENABLE);    
12 
13   /* Time Base configuration */
14   /*-------------------------------------------------------------------
15   TIM3CLK=72MHz  预分频系数Prescaler=63 经过分频 定时器时钟为1.125MHz
16   捕获/比较寄存器2 TIM3_CCR2= CCR2_Val 
17   2通道产生的更新频率是=1.125MHz/CCR2_Val=25Hz
18    
19   -------------------------------------------------------------------*/
20   TIM3_TimeBaseStructure.TIM_Prescaler = 63;                        //预分频器TIM3_PSC=63     
21   TIM3_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        //计数器向上计数模式 TIM3_CR1[4]=0
22   TIM3_TimeBaseStructure.TIM_Period =0xffff;                        //自动重装载寄存器TIM3_APR                   
23   TIM3_TimeBaseStructure.TIM_ClockDivision = 0x0;                    //时钟分频因子 TIM3_CR1[9:8]=00
24 
25   TIM_TimeBaseInit(TIM3,&TIM3_TimeBaseStructure);                    //写TIM3各寄存器参数
26   
27   TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle ;                //TIM3_CCMR1[14:12]=011  翻转 当TIM3_CCR2=TIM3_CNT时,翻转OC2REF的电平 
28   TIM3_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;    //输入/捕获2输出允许  OC2信号输出到对应的输出引脚PB5
29   TIM3_OCInitStructure.TIM_Pulse =CCR2_Val;                            //若CC1通道配置为输出:CCR2是装入当前捕获/比较2 TIM3_CCR2寄存器的值(预装载值)。
30                                                                       //当前捕获/比较寄存器包含了与计数器TIM3_CNT比较的值,并且在OC端口上输出信号
31   TIM3_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;            //输出极性  低电平有效 TIM3_CCER[5]=1;
32 
33   TIM_OC2Init(TIM3, &TIM3_OCInitStructure);
34   TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable);                //TIM3_CCMR1[1]=0  禁止TIM3_CCR2寄存器的预装载功能,可随时写入TIM3_CCR2
35                                                                     //且新值马上起作用
36  
37    TIM_Cmd(TIM3,ENABLE);                                            //启动定时器3 TIM3_CR1[0]=1;  
38    TIM_ITConfig(TIM3,TIM_IT_CC2,ENABLE);                             //TIM3_DIER[2]=1  允许捕获/比较2中断
39 }

>_<“ TIM三的暂停服务子程序(每一次TIM三_CCR2=TIM3_CNT发生二回中断,在中断子程序中取出上三回的TIM三_CCR2加上CCR2_Val作为新的TIM三_CCR2,这样等TIM3_CNT加到和TIM3_CC奥迪Q32相等时又会触发2遍中断)

 1 void TIM3_IRQHandler(void)
 2 { 
 3         
 4  if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)        //判断状态寄存器 TIM3_SR[2] 是否发生了捕获/比较2 中断
 5   {
 6     TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);            //软件清除状态寄存器 TIM3_SR[2] 捕获/比较2 中断中断标志
 7 
 8     capture1 = TIM_GetCapture2(TIM3);                    //获取TIM3_CCR2的预装值
 9     TIM_SetCompare2(TIM3, capture1+ CCR2_Val);            //和CCR2_Val累加后装入TIM3_CCR2     这是为了配合计数器值的递增。以在下一次作出比较。
10     
11   }
12 }

 


 

四.贰 周期决定通用定时器三的二通道,完毕壹KHz的不如占空比波形,控制LED完成呼吸灯

>_<“ 主函数为:(分歧于上边固定的频率定时方法,那里在while里穿梭更改CC汉兰达2_Val的值来改变占空比)

 1 int main(void)
 2 {     
 3     unsigned char a=0;
 4     TIM_OCInitTypeDef  TIM3_OCInitStructure;
 5       RCC_Configuration();  
 6       time_ini();              
 7     SysTick_Config(72000);       //配置SYSTICK时钟节拍为1ms一次
 8       while(1){
 9           Delay(1);          //延时1ms           
10         TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                       //PWM模式2 
11           TIM3_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;           //输出禁止        
12           TIM3_OCInitStructure.TIM_Pulse = CCR2_Val;                               //确定占空比
13           TIM3_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; 
14           TIM_OC2Init(TIM3, &TIM3_OCInitStructure);
15 
16           /*调整CCR2_Val的值来改变占空比,逐步的控制LED1的亮度, 占空比大过一定值时,
17         亮度的变化就不明显了,所以CCR2_VAL最大设定到17000*/
18         if(a==0) CCR2_Val=CCR2_Val+10;                                         
19         else CCR2_Val=CCR2_Val-10;
20         if(CCR2_Val>17000){ CCR2_Val=17000; a=1;}                               
21         else if(CCR2_Val<200){ CCR2_Val=200; a=0;} 
22       }
23 }

>_<“ 配置各外设的钟表和体系挂钟:(同四.一稍稍是剩下的)

 1 /****************************************************************************
 2 * 名    称:void RCC_Configuration(void)
 3 * 功    能:系统时钟配置为72MHZ, 外设时钟配置
 4 ****************************************************************************/ 
 5 void RCC_Configuration(void){
 6 
 7   SystemInit(); 
 8   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 
 9   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC 
10                           | RCC_APB2Periph_GPIOD| RCC_APB2Periph_GPIOE , ENABLE);
11 }

>_<“ TIM3的2通道配置:(注意,那里未有用到中断向量和中断子程序!!!上面首先配置GPIO
PB伍(为Tim3的二通道),PB伍引脚暗许是作为通用IO口使用,为了发出一定频率,利用了该引脚能够复用为TIM三_CH贰,依照手册,必要用到有的复用映射,才能将TIM三_CH2映射到PB5。)

葡萄娱乐场 38

出于TIM3计数器的机械钟频率是7二MHz,希望各通道输出频率为壹KHZ,依照三倍预分频后,机械钟频率为2四MHz,依照公式ftim叁=TIM3CLK/(TIM三_Period+一),可得到TIM叁预分频的值为25000,
根据公式依照公式
通道输出占空比=TIM三_CCR2/(TIM_Period+一),可以获取TIM_Pulse的计数值,稳步改变那一个值,能够控制占空比,
从而获得LED1亮度明暗渐变的功能。(所以在main函数的while中不断重置CC卡宴二_Val值来支配分歧占空比)

 1 /****************************************************************************
 2 * 名    称:void time_ini(void)
 3 * 功    能:TIM3初始化
 4 ****************************************************************************/ 
 5 void time_ini(void){
 6   GPIO_InitTypeDef GPIO_InitStructure;
 7   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
 8 
 9   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                        //PB5复用为TIM3的通道2
10   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
11   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
12   GPIO_Init(GPIOB, &GPIO_InitStructure);
13   /*TIM3局部复用功能开启     在TIM3的局部复用开启时,PB5会被复用为TIM3_CH2*/
14   GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3 , ENABLE);             
15                   
16    /*-------------------------------------------------------------------
17   TIM3CLK=72MHz  预分频系数Prescaler=2 经过分频 定时器时钟为24MHz
18   根据公式 通道输出占空比=TIM3_CCR2/(TIM_Period+1),可以得到TIM_Pulse的计数值     
19   捕获/比较寄存器2 TIM3_CCR2= CCR2_Val          
20   -------------------------------------------------------------------*/
21   TIM3_TimeBaseStructure.TIM_Prescaler = 2;                            //预分频器TIM3_PSC=3     
22   TIM3_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        //计数器向上计数模式 TIM3_CR1[4]=0
23   TIM3_TimeBaseStructure.TIM_Period =24000;                            //自动重装载寄存器TIM3_APR  确定频率为1KHz              
24   TIM3_TimeBaseStructure.TIM_ClockDivision = 0x0;                    //时钟分频因子 TIM3_CR1[9:8]=00
25   TIM3_TimeBaseStructure.TIM_RepetitionCounter = 0x0;
26 
27   TIM_TimeBaseInit(TIM3,&TIM3_TimeBaseStructure);                    //写TIM3各寄存器参数
28   
29   TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                 //PWM模式2 TIM3_CCMR1[14:12]=111 在向上计数时,
30                                                                       //一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平
31   TIM3_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;    //输入/捕获2输出允许  OC2信号输出到对应的输出引脚PB5
32   TIM3_OCInitStructure.TIM_Pulse = CCR2_Val;                         //确定占空比,这个值决定了有效电平的时间。
33   TIM3_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;         //输出极性  低电平有效 TIM3_CCER[5]=1;
34          
35   TIM_OC2Init(TIM3, &TIM3_OCInitStructure);
36   TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
37   TIM_Cmd(TIM3,ENABLE);                                            //启动定时器3 TIM3_CR1[0]=1; 
38 }

 

 

链接

本文正版链接:http://www.cnblogs.com/zjutlitao/p/4652695.html

工程4.1
TIM3-CH2链接:http://pan.baidu.com/s/1c0dLgAW

工程4.2
TIM3-PWM链接: http://pan.baidu.com/s/1dDjiMnn

上述四个工程的验证(提出直接看小编博客):http://pan.baidu.com/s/1ntkoym9 

stm3贰多少个十分重要的文本:http://pan.baidu.com/s/1qW41bw4

   葡萄娱乐场 39