赞
踩
本学习教程,参考B站江科大自化协STM32视频,型号为STM32F103C8T6。
从代码层面理解定时中断
System下新建Timer.c和.h文件,定时器非外围硬件,所以放到System下。
标准步骤程序。
按照上图配置,把每个模块都打通。
(1)开启RCC时钟。
(2)选择时基单元的时钟源,定时中断就选择内部时钟源。
(3)配置时基单元,用一个结构体就可完成配置。
(4)配置输出中断控制,允许更新中断输出到NVIC。
(5)配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级。
(6)运行控制,整个模块配置完成后,还需要使能计数器,要不然计数器不运行,定时器使能后,计数器就会开始计数,当计数器更新时,触发中断。
(7)定时器的中断函数,中断函数每隔一段时间就能自动执行一次。
实际操作:
先找到定时器的库函数文件,在Library里tim.h,拖到最后
(1)TIM_DeInit恢复缺省配置。
(2)TIM_TimeBaseInit时基单元初始化,配置时基单元。参数TIMx选择某个定时器,参数TIM_TimeBaseInitStruct为结构体,里面包含了配置时基单元的一些参数。(蓝色为书签,仅作为标记,方便查找代码)
(3)TIM_TimeBaseStructInit把结构体变量赋一个默认值。
(4)TIM_Cmd用来使能计数器,对应第六步,结构图中的运行控制。两个参数:先择定时器和使能还是失能。
(5)TIM_ITConfig使能中断输出信号,对应的就是中断输出控制,参数1选择定时器,参数2选择要配置哪个中断输出,参数3新的状态使能还是失能。ITConfig后面会经常遇到,就是使能外设的中断输出。
(6)这6个函数对应,时基单元的时钟选择,可选择RCC、ETR、ITRx、Tix这些。
TIM_InternalClockConfig选择内部时钟,参数只有选择定时器;
TIM_ITRxExternalClockConfig,选择ITRx其他定时器的时钟,参数1选择要配置的定时器,参数2选择要接入哪个其他定时器;
TIM_TIxExternalClockConfig,选择TIx捕获通道的时钟,参数1选择要配置的定时器,参数2 TIM_TIxExternalCLKSource,选择TIx具体的某个引脚,TIM_ICPolarity输入极性,ICFilter输入的滤波器,对于外部引脚的波形,一般都会有极性选择器和滤波器,这样更灵活一些;
TIM_ETRClockMode1Config,选择ETR通过外部时钟模式1输入的时钟,参数1选择要配置的定时器,参数2 TIM_ExtTRGPrescaler外部触发预分频器(可对ETR外部时钟再提前做一个分频),参数3 TIM_ExtTRGPolarity、参数4 ExtTRGFilter为极性选择器、滤波器,滤波器配置如下图;
TIM_ETRClockMode2Config,选择ETR通过外部时钟模式2输入的时钟,与上一个函数是可以等效的,如果不需要触发输入的功能,两个函数可以互换。
TIM_ETRConfig,与选择时钟无关,主要用来单独配置ETR引脚的预分频器、极性、滤波器这些参数。
(7)TIM_PrescalerConfig,单独用来写预分频值,参数3为写入的模式,前文提到,预分频器有一个缓冲器,写入的值是在更新时间发生后才有效,所以这个写入的模式可以选择听从安排,在更新事件生效,或者是,在写入后,手动产生一个更新事件,让这个值立刻生效。
(8)TIM_CounterModeConfig,用来改变计数器的计数模式,参数CounterMode,选择新的计数模式。
(9)TIM_ARRPreloadConfig,自动重装器预装功能配置,前文计数器有/无预装时序提到过,这里让他有无,就是调用函数让其使能还是失能。
(10)TIM_SetCounter,给计数器写入一个值,想手动给一个计数值,就可以用这个函数。
(11)TIM_SetAutoreload,给自动重装器写一个值,想手动给一个重装,就可以用这个函数。
(12)TIM_GetCounter获取当前计数器的值。
(13)TIM_GetPrescaler获取当前预分频器的值。
(14)这四个函数用来获取标志位和清除标志位的。
(1)TIM_ClockDivision。在这个定时器的外部信号输入引脚,一般都会有一个输入滤波器,滤波器可以滤掉信号的抖动干扰,工作原理就是在一个固定的时钟频率f下进行采样,连续n个采样点都为相同电平,那就代表输入信号稳定了,就把这个采样值输出出去,如果这n个采样值不全都相同,那就说明信号有抖动,这时就保持上一次的输出,或者直接输出低电平也行。这里的采样频率f和采样点数n都是滤波器的参数,频率越低,采样点数越多,那滤波效果就越好,相应的信号延迟就越大,这就是这个滤波器的工作原理。但是采样频率f从哪来,手册里写的是可以由内部时钟直接而来,也可以是内部时钟加一个分频而来,分频多少就是由这个参数确定的。这个参数和时基单元关系并不大。DIV1就是1分频,即不分频,DIV2就是2分频,DIV4就是4分频。选择一分频。
(2)TIM_CounterMode 计数模式,有向上、向下、三种中央对齐模式,这里选择向上。
(3)TIM_Period放的是ARR自动重装器的值,取值在0~65535之间。
(4)TIM_Prescaler就是PSC预分频器的值,取值在0~65535之间。
(5)TIM_RepetitionCounter就是重复计数器的值,高级定时器才有,不要直接0就好了。
TIM_Period和TIM_Prescaler的值,若想定1s则参考公式:
计数器溢出频率CK_CNT_OV = CK_CNT / (ARR + 1) = CK_PSC / (PSC + 1) / (ARR + 1)
1s即定时频率为1Hz,即1Hz=72MHz/(PSC + 1) / (ARR + 1)
预分频器给少值,自动重装值给多,这样就是以一个比较高的频率计比较多的数;也可以预分频器给多点,自动重装给少点,这样就是以一个比较低的频率计比较少的数。
在这里给预分频是对72M进行7200分频,得到就是10k的计数频率,在10k的计数频率下,计10000个数,就是1s的时间。
找到启动文件TIM2_IRQHandler就是定时器2的中断函数。
既然有用外部时钟,则需要配置GPIO,先给GPIOA使能
GPIO_Mode选择参考手册8.1.11 外设的GPIO配置,显示是浮空输入,但是我们用上拉输入,什么时候用浮空输入,当外部的输入信号功率很小,内部的上拉电阻可能会影响到这个输入信号,此时就可以用浮空输入,防止影响外部输入的电平。这里还是用上拉输入。
TIM_Period放的是ARR自动重装器的值,改小10,手动模拟每那么快
TIM_Prescaler就是PSC预分频器的值,该为1,手动模拟每那么快
记得在.h文件声明这个函数。
本节主要是定时中断代码和内外时钟源选择的代码,下一节将介绍TIM输出比较输出PWM波形。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。