1.1 定时器简介 定时器,字面意思上理解,它是个定时的机器,比如我们的闹钟,定时几小时之后叫醒我们,不过在单片机上,定时只是一个最最最基本的功能,当然还有其他更复杂的功能。就像低配标配和高配一样,单片机的定时器也有基本定时器、通用定时器和高级定时器。
定时器实际上就是一个计数器。定时器最最核心的概念:计数。这个计数可不是你自己念的1、2、3,而是规律跳变的数字,也就是时基。因此定时器的定时功能依赖时间的变化、时间的变化依赖计数、计数依赖基本的时基。比如光传播约299792458米的时间或者铯原子震荡9192631770次就是一秒。 定时器的核心功能依托计数实现,具体表现就是计数器,那计数器有什么用呢,比如你想从七点半定时到七点三十一分,需要的计数值就是60,同理定时到七点三十二分所需的计数是120,所以计数器的值直接决定了我们需要的定时时间。
1.2 定时器的作用 单片机定时器具有多种应用,例如:
- 精确定时:可以使用单片机定时器制作高精度计时器、闹钟、倒计时等。
- 生成周期性信号:可以利用单片机定时器产生方波、正弦波、三角波等各种波形。
- 延时控制:可以利用单片机定时器实现各种延时控制,例如启动、停止、暂停操作等。
1.3 单片机定时器工作方式单片机定时器的工作方式有多种,其中常见的几种包括:
• 定时模式:在这种模式下,计数器从0开始计数,当计数值达到预设的计数器上限时触发中断或输出信号,并自动清零重新开始计数。
• 计数模式:在这种模式下,计数器从预设值开始计数,每次计数完成都触发一次中断或输出信号,直到计数器溢出后重新从预设值开始计数。
• 输入捕获模式:在这种模式下,可以测量外部事件的时间间隔,例如脉冲宽度、脉冲周期等,并生成相应的中断或输出信号。
• 输出比较模式:在这种模式下,可以比较计数器的计数值与预设比较值,当两者相等时触发中断或输出信号。
二、TIM14 基本定时器2.1 简介 基本定时器 TIM14 由一个 16 位的自动装载计数器组成,它由一个可编程的预分频器驱动。它适合 多种用途,包含测量输入信号的脉冲宽度 (输入捕获),或者产生输出波形 (输出比较和 PWM)。 使用定时器预分频器和 RCC 时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫 秒的调节。 基本定时器 TIM14 是完全独立的,不共享任何资源。
2.2 主要特征• 16 位自动装载计数器
• 16 位可编程 (可以实时修改) 预分频器,计数器时钟频率的分频系数为 1 ~ 65536 之间的任意 数值
• 独立通道
• 输入捕获
• 输出比较
• PWM 生成 (边缘对齐模式)
• 如下事件发生时产生中断
• 更新:计数器溢出,计数器初始化 (通过软件)
• 输入捕获
• 输出比较
基本定时器框图:
2.3 功能描述2.3.1 时基单元 可编程基本定时器的主要部分是一个 16 位计数器和与其相关的自动装载寄存器。这个计数器可以向 上计数。此计数器时钟由预分频器分频得到。计数器、自动装载寄存器和预分频器寄存器可以由软件读写, 在计数器运行时仍可以读写,时基单元包含:
• 计数器寄存器 (TIM14_CNT)
• 预分频器寄存器 (TIM14_PSC)
• 自动装载寄存器 (TIM14_ARR)
自动装载寄存器是预先装载的,写或读自动重装载寄存器将访问预装载寄存器。根据在 TIM14_CR1 寄存器中的自动装载预装载使能位 (ARPE) 的设置,预装载寄存器的内容被立即或在每次的更新事件 UEV 时传送到影子寄存器。当计数器达到溢出条件并当 TIM14_CR1 寄存器中的 UDIS 位等于 0 时, 产生更新事件。更新事件也可以由软件产生。随后会详细描述每一种配置下更新事件的产生。
计数器由预分频器的时钟输出 CK_CNT 驱动,仅当设置了计数器 TIM14_CR1 寄存器中的计数器使 能位 (CEN) 时, CK_CNT 才有效。 (有关计数器使能的细节,请参见控制器的从模式描述)。
注:真正的计数器使能信号 CNT_EN 是在 CEN 的一个时钟周期后被设置。
2.3.2 预分频器描述 预分频器可以将计数器的时钟频率按 1 ~ 65536 之间的任意值分频。它是基于一个 (在 TIM14_PSC 寄存器中的)16 位寄存器控制的 16 位计数器。这个控制寄存器带有缓冲器,它能够在工作 时被改变。新的预分频器的参数在下一次更新事件到来时被采用。
下面几张图分别给出了在预分频器运行时,更改计数器参数的例子。
当预分频器的参数从 1 变到 2 时,计数器的时序图:
当预分频器的参数从 1 变到 4 时,计数器的时序图:
2.3.3 计数模式2.3.3.1 向上计数模式 在向上计数模式中,计数器从 0 计数到自动加载值 (TIM14_ARR 计数器的内容),然后重新从 0 开 始计数并且产生一个计数器溢出事件。
在 TIM14_EGR 寄存器中设置 UG 位也同样可以产生一个更新事件。
设置 TIM14_CR1 寄存器中的 UDIS 位,可以禁止更新事件;这样可以避免在向预装载寄存器中写 入新值时更新影子寄存器。在 UDIS 位被清 0 之前,将不产生更新事件。但是在应该产生更新事件时, 计数器仍会被清 0,同时预分频器的计数也被请 0(但预分频器的数值不变)。此外,如果设置了 TIM14_CR1 寄存器中的 URS 位 (选择更新请求),设置 UG 位将产生一个更新事件 UEV,但硬件不设 置 UIF 标志 (即不产生中断): 这是为了避免在捕获模式下清除计数器时,同时产生更新和捕获中断。
当发生一个更新事件时,所有的寄存器都被更新,硬件同时 (依据 URS 位) 设置更新标志位 ( TIM14_SR 寄存器中的 UIF 位)。
• 自动装载影子寄存器被重新置入预装载寄存器的值 (TIM14_ARR)
• 预分频器的缓冲区被置入预装载寄存器的值 (TIM14_PSC 寄存器的内容)
下图给出一些例子,当 TIM14_ARR = 0x36 时计数器在不同时钟频率下的动作:
计数器时序图,内部时钟分频因子为 1:
计数器时序图,内部时钟分频因子为 2:
计数器时序图,当 ARPE = 0 时的更新事件 (TIM14_ARR 没有预装载):
计数器时序图,当 ARPE = 1 时的更新事件 (预装载了 TIM14_ARR):
2.3.4 时钟源 计数器时钟由内部时钟 (CK_INT) 提供.
CEN(TIM14_CR1 寄存器) 和 UG 位 (TIM14_EGR 寄存器) 是事实上的控制位,并且只能被软件修 改 (除了 UG 位仍被自动清除)。只要 CEN 位被写成‘1’,预分频器的时钟就由内部时钟 CK_INT 提供。
下图显示了控制电路和向上计数器在一般模式下,不带预分频器时的操作。
一般模式下的控制电路,内部时钟分频因子为 1:
2.3.5 捕获/比较通道 每一个捕获/比较通道都是围绕着一个捕获/比较寄存器 (包含影子寄存器),包括捕获的输入部分 (数 字滤波、多路复用和预分频器),和输出部分 (比较器和输出控制)。
下面几张图是一个捕获/比较通道概览。输入部分对相应的 TIx 输入信号采样,并产生一个滤波后的 信号 TIxF。然后,一个带极性选择的边缘检测器产生一个信号 (TIxFPx),它可以作为从模式控制器的输 入触发或者作为捕获控制。该信号通过预分频进入捕获寄存器(ICxPS)。
捕获/比较通道 (如:通道 1 输入部分):
输出部分产生一个中间波形 OCxREF(高有效) 作为基准,链的末端决定最终输出信号的极性。
捕获/比较通道 1 的主电路:
捕获/比较通道的输出部分 (通道 1):
捕获/比较模块由一个预装载寄存器和一个影子寄存器组成。读写过程仅操作预装载寄存器。在捕获模 式下,捕获发生在影子寄存器上,然后再复制到预装载寄存器中。
在比较模式下,预装载寄存器的内容被复制到影子寄存器中,然后影子寄存器的内容和计数器进行比 较。
2.3.6 输入捕获模式 在输入捕获模式下,当检测到 ICx 信号上相应的边沿后,计数器的当前值被锁存到捕获/比较寄存器 (TIM14_CCRx) 中。当捕获事件发生时,相应的 CCxIF 标志 (TIM14_SR 寄存器)被置 1,如果开放了中 断,则将产生中断。如果捕获事件发生时 CCxIF 标志已经为高,那么重复捕获标志 CCxOF(TIM14_SR 寄存器) 被置 1。写 CCxIF = 0 可清除 CCxIF,或读取存储在 TIM14_CCRx 寄存器中的捕获数据也可 清除 CCxIF。写 CCxOF = 0 可清除 CCxOF。
以下例子说明如何在 TI1 输入的上升沿时捕获计数器的值到 TIM14_CCR1 寄存器中,步骤如下:
• 选择有效输入端: TIM14_CCR1 必须连接到 TI1 输入,所以写入 TIM14_CCMR1 寄存器中的 CC1S = 01,当 CC1S 不为 00 时,通道被配置为输入,并且 TIM14_CCR1 寄存器变为只读。
• 根据输入信号的特点,配置输入滤波器为所需的带宽 (即输入为 TIx 时,输入滤波器控制位是 TIM14_CCMRx 寄存器中的 ICxF 位)。假设输入信号在最多 5 个时钟周期的时间内抖动,我们 须配置滤波器的带宽长于 5 个时钟周期。因此我们可以 (以 fDTS 频率)连续采样 8 次,以确 认在 TI1 上一次真实的边沿变换,即在 TIM14_CCMR1 寄存器中写入 IC1F = 0011。
• 选择 TI1 通道的有效转换边沿,在 TIM14_CCER 寄存器中写入 CC1P = 0 和 CC1NP= 0(上 升沿)。
• 配置输入预分频器。在本例中,我们希望捕获发生在每一个有效的电平转换时刻,因此预分频器 被禁止 (写 TIM14_CCMR1 寄存器的 IC1PS = 00)。
• 设置 TIM14_CCER 寄存器的 CC1E = 1,允许捕获计数器的值到捕获寄存器中。
• 如果需要,通过设置 TIM14_DIER 寄存器中的 CC1IE 位允许相关中断请求。
当一个输入捕获时:
• 产生有效的电平转换时,计数器的值被传送到 TIM14_CCR1 寄存器。 CC1IF 标志被设置 (中 断标志)。当发生至少 2 个连续的捕获时,而 CC1IF 未曾被清除,CC1OF 也被置 1。
• 如设置了 CC1IE 位,则会产生一个中断。
为了处理捕获溢出,建议在读出捕获溢出标志之前读取数据,这是为了避免丢失在读出捕获溢出标志 之后和读取数据之前可能产生的捕获溢出信息。
注:设置 TIM14_EGR 寄存器中相应的 CCxG 位,可以通过软件产生输入捕获中断请求。
2.3.7 强制输出模式 在输出模式 (TIM14_CCMRx 寄存器中 CCxS = 00) 下,输出比较信号 (OCxREF 和相应的 OCx) 能够直接由软件强置为有效或无效状态,而不依赖于输出比较寄存器和计数器间的比较结果。
置 TIM14_CCMRx 寄存器中相应的 OCxM = 101,即可强置输出比较信号 (OCxREF/OCx)为有效 状态。这样 OCxREF 被强置为高电平 (OCxREF 始终为高电平有效),同时 OCx 得到 CCxP 极性位相 反的值。例如: CCxP = 0(OCx 高电平有效),则 OCx 被强置为高电平。
置 TIM14_CCMRx 寄存器中的 OCxM = 100,可强置 OCxREF 信号为低。该模式下,在 TIM14_CCRx 影子寄存器和计数器之间的比较仍然在进行,相应的标志也会被修改。因此仍然会产生相 应的中断请求。这将会在下面的输出比较模式一节中介绍。
2.3.8 输出比较模式 此功能是用来控制一个输出波形或者指示何时一段给定的的时间已经到时。
当计数器与捕获/比较寄存器的内容相同时,输出比较功能做如下操作:
• 将输出比较模式 (TIM14_CCMRx 寄存器中的 OCxM 位) 和输出极性 (TIM14_CCER 寄存器 中的 CCxP 位) 定义的值输出到对应的管脚上。在比较匹配时,输出管脚可以保持它的电平 (OCxM = 000)、被设置成有效电平 (OCxM = 001)、被设置成无有效电平(OCxM = 010) 或进行 翻转 (OCxM = 011)。
• 设置中断状态寄存器中的标志位 (TIM14_SR 寄存器中的 CCxIF 位)。
• 若设置了相应的中断屏蔽 (TIM14_DIER 寄存器中的 CCXIE 位),则产生一个中断。
TIM14_CCMRx 中的 OCxPE 位选择 TIM14_CCRx 寄存器是否需要使用预装载寄存器。在输出比 较模式下,更新事件 UEV 对 OCxREF 和 OCx 输出没有影响。同步的精度可以达到计数器的一个计数 周期。输出比较模式 (在单脉冲模式下) 也能用来输出一个单脉冲。
输出比较模式的配置步骤:
• 选择计数器时钟 (内部,外部,预分频器)
• 将相应的数据写入 TIM14_ARR 和 TIM14_CCRx 寄存器中
• 如果要产生一个中断请求,设置 CCxIE 位
• 选择输出模式,
• 写 OCxM = ‘011’,当计数器 CNT 与 CCRx 匹配时翻转 OCx 的输出引脚
• 写 OCxPE = ‘0’,禁止预装载
• 写 CCxP = ‘0’,选择高电平有效
• 写 CCxE = ‘1’,允许输出
• 设置 TIM14_CR1 寄存器的 CEN 位启动计数器
TIM14_CCRx 寄存器能够在任何时候通过软件进行更新以控制输出波形,条件是未使用预装载寄存 器 (OCxPE = ‘0’,否则 TIM14_CCRx 影子寄存器只能在发生下一次更新事件时被更新)。下图给出了一 个例子。
输出比较模式,翻转 OC1:
2.3.9 PWM 模式 脉冲宽度调制模式可以产生一个由 TIM14_ARR 寄存器确定频率、由 TIM14_CCRx 寄存器确定占 空比的信号。
在 TIM14_CCMRx 寄存器中的 OCxM 位写入‘110’ (PWM 模式 1) 或‘111’ (PWM 模式 2),能够独 立地设置每个 OCx 输出通道产生一路 PWM。必须设置 TIM14_CCMRx 寄存器 OCxPE 位以使能相应 的预装载寄存器,最后还要设置 TIM14_CR1 寄存器的 ARPE 位使能自动重装载的预装载寄存器 (在向 上计数模式中)。
仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计数之前, 必须通过设置 TIM14_EGR 寄存器中的 UG 位来初始化所有的寄存器。
OCx 的极性可以通过软件在 TIM14_CCER 寄存器中的 CCxP 位设置,它可以设置为高电平有效或 低电平有效。 TIM14_CCER 寄存器中的 CCxE 位控制 OCx 输出使能。详见 TIM14_CCERx 寄存器的 描述。
在 PWM 模式 (模式 1 或模式 2) 下, TIM14_CNT 和 TIM14_CCRx 始终在进行比较是否符合 TIM14_CNT ≤ TIM14_CCRx 。
因为本计数器是向上计数只能产生边沿对齐的 PWM 模式。
2.3.10 PWM 边沿对齐模式 下面是一个 PWM 模式 1 的例子。当 TIM14_CNT < TIM14_CCRx 时 PWM 信号参考 OCxREF 为高,否则为低。如果 TIM14_CCRx 中的比较值大于自动重装载值 (TIM14_ARR),则 OCxREF 保持为‘1’。如果比较值为 0,则 OCxREF 保持为‘0’。下图为 TIM14_ARR = 8 时边沿对齐的 PWM 波形实 例。
边沿对齐的 PWM 波形 (ARR = 8):
2.3.11 调试模式 当微控制器进入调试模式 (CPU 核心停止),根据 DBG 模块中 DBG_TIM14_STOP 的 设置, TIM14 计数器或者继续正常操作,或者停止。
2.4 寄存器2.4.1 寄存器预览2.4.2 TIMx_CR1 控制寄存器 1偏移地址:0x00
复位值:0x0000
2.4.3 TIMx_DIER 中断使能寄存器偏移地址:0x0C
复位值:0x0000
2.4.4 TIMx_SR 状态寄存器偏移地址:0x10
复位值:0x0000
2.4.5 TIMx_EGR 事件产生寄存器偏移地址:0x14
复位值:0x0000
2.4.6 TIMx_CCMR1 捕获/比较模式寄存器 1偏移地址:0x18
复位值:0x0000
通道可用于输入(捕获模式)或输出(比较模式),通道的方向由相应的 CC1S 定义。该寄存器 CC1S 以外其它位的作用在输入模式和输出模式下不同。OC1x 描述了通道在输出模式下的功能,IC1x 描述了通 道在输入模式下的功能。
比较输出模式:
Bit | Field | Description | 15:7 | Reserved | 保留,必须保持复位值。 | 6:4 | OC1M | 通道 1 比较输出模式(Output compare 1 mode)
该位定义了输出参考信号 OC1REF 的动作,而 OC1REF 决定了 OC1 的值。
OC1REF 是高电平有效,而 OC1 的有效电平取决于 CC1P 位。
000:冻结。TIMx_CCR1 与 TIMx_CNT 间的比较结果对 OC1REF 不起作用。
001:匹配时设置为高。当 TIMx_CNT 的值与 TIMx_CCR1 的值相 同时,强制
OC1REF 为高电平。
010:匹配时设置为低。当 TIMx_CNT 的值与 TIMx_CCR1 的值相 同时,强制
OC1REF 为低电平。
011:匹配时翻转,当 TIMx_CCR1=TIMx_CNT 时,翻转 OC1REF 的电平。
100:强制为低。强制 OC1REF 为低电平。 101:强制为高。强制 OC1REF 为高电平。
110:PWM 模式 1。在递增计数时,当 TIMx_CNT<TIMx_CCR1 时强制 OC1REF
为高电平,否则为低电平。
111:PWM 模式 2。在递增计数时,当 TIMx_CNT<TIMx_CCR1时 通道 1 为强制
OC1REF 为低电平,否则为高电平。
注:在 PWM 模式 1 或 PWM 模式 2 中,只有当比较结果改变了 或在比较输出模式中
从冻结模式切换到 PWM 模式时,OC1REF 电 平才改变。
| 3 | OC1PE | 通道 1 比较输出预装载使能(Output compare 1 preload enable)
0:禁止 TIMx_CCR1 寄存器的预装载功能,写入 TIMx_CCR1 寄 存器的数值立即生效。
1:开启 TIMx_CCR1 寄存器的预装载功能,读写操作仅对预装载 寄存器操作,
TIMx_CCR1 的预装载值在更新事件到来时生效。
注:若该位置 1,在单脉冲模式下(TIMx_CR1 寄存器的 OPM= 1), 是否设定预装载
寄存器无影响;其它情况下,需要设定预装载寄存 器,否则后续动作不确定。
| 2 | Reserved | 保留,必须保持复位值。 | 1:0 | CC1S | 通道 1 捕获/比较选择(Capture/Compare 1 selection) 该位定义通道的方向和输入信号
的选择,只有在通道关闭时这些位 才可写入:
00:通道 1 被配置为输出
01:通道 1 被配置为输入
10:保留
11:保留
| 输入捕获模式:
Bit | Field | Description | 15:8 | Reserved | 保留,必须保持复位值。 | 7:4 | IC1F | 通道 1 输入捕获滤波器(Input capture 1 filter) 数字滤波器由一个事件计数器组成,它
记录 N 个输入事件后会产 生一个输出的跳变。这些位定义了 IC1 输入信号的采样频率
和数 字滤波器的长度。
0000:无滤波器,以 fDTS 采样
0001:采样频率 fsampling=fINT_CK,N=2
0010:采样频率 fsampling=fINT_CK,N=4
0011:采样频率 fsampling=fINT_CK,N=8
0100:采样频率 fsampling=fDTS /2,N=6
0101:采样频率 fsampling=fDTS /2,N=8
0110:采样频率 fsampling=fDTS /4,N=6
0111:采样频率 fsampling=fDTS /4,N=8
1000:采样频率 fsampling=fDTS /8,N=6
1001:采样频率 fsampling=fDTS /8,N=8
1010:采样频率 fsampling=fDTS /16,N=5
1011:采样频率 fsampling=fDTS /16,N=6
1100:采样频率 fsampling=fDTS /16,N=8
1101:采样频率 fsampling=fDTS /32,N=5
1110:采样频率 fsampling=fDTS /32,N=6
1111:采样频率 fsampling=fDTS /32,N=8
| 3:2 | IC1PSC | 通道 1 输入/捕获预分频器(Input capture 1 prescaler) 该位定义了 IC1 的预分频系数。
当 CC1E=0(TIMx_CCER 寄存 器中) 时,预分频器复位。
00:无预分频器,捕获输入口上检测到的每一个边沿都触发一次 捕获
01:每 2 个事件触发一次捕获
10:每 4 个事件触发一次捕获
11:每 8 个事件触发一次捕获
| 1:0 | CC1S | 通道 1 捕获/比较选择(Capture/Compare 1 selection) 该位定义通道的方向和输入信号
的选择,只有在通道关闭时这些 位才可写入:
00:通道 1 被配置为输出
01:通道 1 被配置为输入
10:保留
11:保留
| 2.4.7 TIMx_CCER 捕获/比较使能寄存器偏移地址:0x20
复位值:0x0000
Bit | Field | Description | 15:4 | Reserved | 保留,必须保持复位值。 | 3 | CC1NP | 通道 1 输入捕获极性(Capture 1 polarity)
通道 1 配置为输出时,此位无效。
通道 1 配置为输入时,CC1P/CC1NP 配合使用定义了输入信号极 性和电平,详细参考
IC1 极性/电平选择表。
| 2 | Reserved | 保留,必须保持复位值。 | 1 | CC1P | 通道 1 输入/捕获输出极性(Capture/Compare 1 output polarity)
通道 1 配置为输出时,此位定义了输出信号极性:
0:OC1 高电平有效
1:OC1 低电平有效
通道 1 配置为输入时,CC1P/CC1NP 配合使用定义了输入信号极 性和电平,详细参考 IC1 极性/电平
选择表。
| 0 | CC1E | 通道 1 输入/捕获输出使能(Capture/Compare 1 output enable)
通道 1 配置为输出时:
0:关闭。OC1 禁止输出
1:开启。OC1 信号输出到对应的输出引脚
CC1 通道配置为输入:
该位决定了输入捕获功能是否启用。
0:捕获禁止
1:捕获使能
| 输入模式下,IC1 的极性/电平选择如下表所示:
2.4.8 TIMx_CNT 计数器偏移地址:0x24
复位值:0x0000
2.4.9 TIMx_PSC 预分频器偏移地址:0x28
复位值:0x0000
2.4.10 TIMx_ARR 自动预装载寄存器偏移地址:0x2C
复位值:0x0000
2.4.11 TIMx_CCR1 捕获/比较寄存器 1偏移地址:0x34
复位值:0x0000
2.4.12 TIMx_BDTR 刹车和死区寄存器偏移地址:0x44
复位值:0x0000
三、用基本定时器TIM14使LED灯闪烁3.1 定时器初始化void TIM14_Configure(void){ NVIC_InitTypeDef NVIC_InitStruct; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; RCC_APB1PeriphClockCmd(RCC_APB1ENR_TIM14, ENABLE); TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct); TIM_TimeBaseInitStruct.TIM_Prescaler = (TIM_GetTIMxClock(TIM14) / 10000 - 1); TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStruct.TIM_Period = (5000 - 1); TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_Div1; TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM14, &TIM_TimeBaseInitStruct); TIM_ClearFlag(TIM14, TIM_FLAG_Update); TIM_ITConfig(TIM14, TIM_IT_Update, ENABLE); NVIC_InitStruct.NVIC_IRQChannel = TIM14_IRQn; NVIC_InitStruct.NVIC_IRQChannelPriority = 0x01; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); TIM_Cmd(TIM14, ENABLE);}3.2 main主函数int main(void){ //printf("\r\nTest %s", __FUNCTION__); TIM14_UpdateFlag = 0; TIM14_Configure(); while (1) { if (0 != TIM14_UpdateFlag) { TIM14_UpdateFlag = 0; PLATFORM_LED_Toggle(LED1); } }}
|