stm32f407通用定时器输入捕获_第1页
stm32f407通用定时器输入捕获_第2页
stm32f407通用定时器输入捕获_第3页
stm32f407通用定时器输入捕获_第4页
stm32f407通用定时器输入捕获_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、通用定时器输入捕获通用定时器作为输入捕获的使用。我们用 TIM5 的通道 1( PA0)来做输入捕获,捕获 PA0 上高 电平的脉宽(用 KEY_UP按键输入高电平) ,通过 串口来打印高电平脉宽时间 。 输入捕获模式可以用来 测量脉冲宽度或者测量频率 。 我们以测量脉宽为例,用一个简图来说明输入捕获的原理:,图中 t1t2Word 文档时间,就是我们需要测量的高电平时间。测量方法如下:首先设置 定时器通道 x 为上升沿捕获 ,这样, t1 时刻,就会捕获到当前的 CNT 值,然后立即清零 CNT,并 设置 通道 x 为 下降沿捕获 , 这样到 t2 时刻,又会发生捕获事件,得到此时的 CNT

2、 值,记为 CCRx2。这样,根据定时器的计 数频率,我们就可以算出 t1t2 的时间,从而得到高电平脉宽。在 t1t2 之间,可能产生 N 次定 时器溢出, 这就要求我们对定时器溢出, 做处理, 防止高电平太长, 导致数据不准确。 如图所示, t1t2 之间, CNT 计数的次数等于: N*ARR+CCRx2 ,有了这个计数次数,再乘以 CNT 的计数周 期,即可得到 t2-t1 的时间长度,即高电平持续时间。STM32F4 的定时器,除了 TIM6 和 TIM7 ,其他定时器都有输入捕获功能。 STM32F4 的输入捕 获,简单的说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发

3、生跳变(比如上升沿 / 下降 沿)的时候, 将当前定时器的值 ( TIMx_CNT )存放到对应的通道的捕获 / 比较寄存器 (TIMx_CCRx) 里面,完成一次捕获。同时还可以配置捕获时是否触发中断 /DMA 等。这里我们用 TIM5_CH1 来捕获高电平脉宽TIMx_ARR、 TIMx_PSC、接下来介绍我们需要用到的一些寄存器配置,需要用到的寄存器:TIMx_CCMR1、TIMx_CCER、TIMx_DIER、TIMx_CR1、TIMx_CCR1 (这里的 x=5)。 首先 TIMx_ARR 和 TIMx_PSC,这两个寄存器用来设自动重装载值和TIMx 的时钟分频捕获/比较模式寄存器

4、 1:TIMx_CCMR1 ,这个寄存器在输入捕获的时候,非常有用:TIMx 捕获 /比较模式寄存器 1 (TIMx_CCMR1)TIMx capture/compare mode register 1 偏移地址: 0x18 复位值: 0x0000当在输入捕获模式下使用的时候,对应图的第二行描述,从图中可以看出, TIMx_CCMR1 是针 对 2 个通道的配置,低八位 7 : 0用于捕获 /比较通道 1 的控制,而高八位 15 :8则用于捕获 / 比较通道 2 的控制,因为 TIMx 还有 CCMR2 这个寄存器,所以可以知道 CCMR2 是用来控制通 道 3 和通道 4 (详见 STM32

5、F4xx 中文参考手册 435 页, 15.4.8 节)。这里我们用到的是 TIM5 的捕获 /比较通道 1,我们重点介绍 TIMx_CCMR1 的7:0位(其高 8 位配置类似) ,TIMx_CCMR1 的7:0位详细描述见图所示:位 7:4 IC1F :输入捕获 1 滤波器 (Input capture 1 filter)此位域可定义 TI1 输入的采样频率和适用于 TI1 的数字滤波器带宽。数字滤波器由事件计数器组成,每 N 个事件才视为一个有效边沿:0000 :无滤波器,按 fDTS 频率进行采样1000: fSAMPLING=f DTS/8 , N=60001:fSAMPLING=f

6、 CK_INT,N=20010:fSAMPLING=f CK_INT,N=40011:fSAMPLING=f CK_INT,N=80100:fSAMPLING=f DTS/2 ,N=60101:fSAMPLING=f DTS/2 ,N=80110:fSAMPLING=f DTS/4 ,N=60111:fSAMPLING=f DTS/4 ,N=81001 :f SAMPLING=f DTS/8, N=81010 :fSAMPLING=f DTS/16 ,N=51011 :fSAMPLING=f DTS/16 ,N=61100: fSAMPLING=f DTS/16 , N=81101: fSAM

7、PLING=f DTS/32 , N=51110: fSAMPLING=f DTS/32 , N=61111: fSAMPLING=f DTS/32 , N=8注意:在当前硅版本中,当ICxF3:0= 1、2或 3时,将用 CK INT代替公式中的 fDTS。输入捕获 1 滤波器 IC1F3:0 ,这个用来设置输入采样频 率和数字滤波器长度。其中, f CK_INT 是定时器的输入频 率( TIMxCLK ),一般为 84Mhz/168Mhz (看该定时器 在哪个总线上) ,而 fDTS 则是根据 TIMx_CR1 的 CKD1:0 的设 置来 确 定的 ,如 果 CKD1:0 设 置 为 0

8、0 ,那 么 fDTS=fCK_INT。N 值就是滤波长度,举个简单的例子:假 设 IC1F3:0=0011 ,并设置 IC1 映射到通道 1 上,且为 上升沿触发,那么在捕获到上升沿的时候,再以fCK_INT的频率,连续采样到 8 次通道 1 的电平,如果都是高电 平,则说明却是一个有效的触发,就会触发输入捕获中 断(如果开启了的话) 。这样可以滤除那些高电平脉宽低 于 8 个采样周期的脉冲信号,从而达到滤波的效果。这 里,我们不做滤波处理,所以设置 IC1F3:0=0000 ,只 要采集到上升沿,就触发捕获。位 3:2 IC1PSC:输入捕获 1 预分频器 (Input capture 1

9、 prescaler) 此位域定义 CC1输入 (IC1)的预分频比。只要 CC1E=0( TIMx_CCER寄存器),预分频器便立即复位。 00:无预分频器,捕获输入上每检测到一个边沿便执行捕获 01:每发生 2 个事件便执行一次捕获10:每发生 4 个事件便执行一次捕获11:每发生 8 个事件便执行一次捕获输入捕获 1 预分频器 IC1PSC1:0 ,我们是 1 次边沿就触 发 1 次捕获,所以选择 00 。此位域定义通道方向(输入 00: CC1 通道配置为输出 01 : CC1 通道配置为输入, 10: CC1 通道配置为输入, 11:CC1 通道配置为输入,/输出)以及所使用的输入I

10、C1 映射到 TI1 上 IC1映射到 TI2 上IC1 映射到 TRC 上。此模式仅在通位 1:0 CC1S:捕获 / 比较 1 选择 (Capture/Compare 1 selection)过 TS位( TIMx_SMCR 寄存器)选择内部触发输入时有效 注意:仅当通道关闭时( TIMx_CCER中的 CC1E = 0),才 可向 CC1S位写入数据。其中 CC1S1:0 ,这两个位用于 CCR1 的通道配置,这里 我们设置 IC1S1:0=01 ,也就是配置 IC1 映射在 TI1 上。TIMx 捕获 / 比较使能寄存器 (TIMx_CCER)TIMx capture/compare

11、enable register 偏移地址: 0x20 复位值: 0x0000位 1 CC1P:捕获/比较 1输出极性 (Capture/Compare 1 output Polarity) 。CC1 通道配置为输出: 0:OC1高电平有效1:OC1 低电平有效CC1 通道配置为输入: CC1NP/CC1P 位可针对触发或捕获 操作选择 TI1FP1 和 TI2FP1的极性。00 :非反相 /上升沿触发电路对 TIxFP1 上升沿敏感(在复位模式、外部时钟模式或 触发模式下执行捕获或触发操作) ,TIxFP1 未反相(在门控 模式或编码器模式下执行触发操作) 。01:反相 /下降沿触发电路对 T

12、IxFP1 下降沿敏感 (在复位模式、外部时钟模式或 触发模式下执行捕获或触发操作) ,TIxFP1 反相(在门控模 式或编码器模式下执行触发操作) 。10 :保留,不使用此配置。11 :非反相 /上升沿和下降沿均触发电路对 TIxFP1 上升沿和下降沿都敏感(在复位模式、外部时钟模式或触发模式下执行捕获或触发操作)位0 CC1E:捕获/比较 1输出使能 (Capture/Compare 1 output enable) 。CC1 通道配置为输出:0 :关闭 OC1 未激活1 :开启 在相应输出引脚上输出 OC1 信号CC1 通道配置为输入:此位决定了是否可以实际将计数器值捕获到输入捕获/比较

13、寄存器 1 (TIMx_CCR1) 中。0:禁止捕获 1:使能捕获所以要 使能输入捕获,必须设置 CC1E=1 ,而 CC1P 则根据自己的需要来配置。接下来我们再看看 DMA/ 中断使能寄存器: TIMx DIER,该寄存器的各位描述见图TIMx_ DIER 寄存器各位描述我们需要用到中断来处理捕获数据,所以必须 开启通道 1 的捕获比较中断 ,即 CC1IE 设置为 1控制寄存器: TIMx_CR1,我们只用到了它的最低位,也就是用来使能定时器的 控制寄存器 1 (TIMx CR1)位 9:8 CKD :时钟分频 (Clock division)此位域指示定时器时钟 (CK_INT) 频率

14、与数字滤波器所使用的采样时钟( ETR、 TIx 之间的分频比, 00: tDTS = t CK_INT01: tDTS = 2 × t CK_INT10: tDTS = 4 × t CK_INT11:保留最后再来看看捕获 / 比较寄存器 1:TIMx_CCR1,该寄存器用来存储捕获发生时, TIMx_CNT 的值, 我们从 TIMx_CCR1 就可以读出通道 1 捕获发生时刻的 TIMx_CNT 值,通过两次捕获(一次上升 沿捕获,一次下降沿捕获)的差值,就可以计算出高电平脉冲的宽度(注意,对于脉宽太长的情 况,还要计算定时器溢出的次数) 。= 输入捕获库函数配置:1)开

15、启 TIM5 时钟,配置 PA0 为复用功能( AF2 ),并开启下拉电阻。要使用 TIM5 ,我们必须先开启 TIM5 的时钟。 同时我们要捕获 TIM5_CH1 上面的高电平脉宽, 所 以先配置 PA0 为带下拉的复用功能,同时,为了让 PA0 的复用功能选择连接到 TIM5 ,所以设置 PA0 的复用功能为 AF2,即连接到 TIM5 上面。开启 IM5 时钟的方法为: RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); /TIM5 时钟使能 当然,这里我们也要开启 PA0 对应的 GPIO 的时钟。配置 PA0 为复用功能,所以我们首

16、先要设置 PA0 引脚映射 AF2,方法为: GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5);最后,我们还要初始化 GPIO 的模式为复用功能,同时这里我们还要设置为开启下拉。方法为: GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /GPIOA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;/ 复用功能 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; / 速度 100MHz GPIO_InitStruct

17、ure.GPIO_OType = GPIO_OType_PP; / 推挽复用输出 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; / 下拉 GPIO_Init(GPIOA,&GPIO_InitStructure); / 初始化 PA0 跟上一讲 PWM 输出类似,这里我们使用的是定时器 5 的通道 1 ,所以我们从 STM32F4 对应的 数据手册可以查看到对应的 IO 口为 PA0:2 )初始化 TIM5, 设置 TIM5 的 ARR 和 PSC。在开启了 TIM5 的时钟之后,我们要设置 ARR 和 PSC 两个寄存器的值来设置输入捕获

18、的自动重 装载值和计数频率。 这在库函数中是通过 TIM_TimeBaseInit 函数实现的, TIM_TimeBaseStructure.TIM_Prescaler=psc; / 定时器分频TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; /向上计数模式TIM_TimeBaseStructure.TIM_Period=arr; / 自动重装载值TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM5,&TIM_TimeBas

19、eStructure);/ 初始化 TIM53 )设置 TIM5 的输入捕获参数,开启输入捕获。TIM5_CCMR1 寄存器控制着输入捕获 1 和 2 的模式,包括映射关系,滤波和分频等。这里我们 需要设置通道 1 为输入模式, 且 IC1 映射到 TI1(通道 1)上面,并且不使用滤波器 (提高响应速度) 。 库函数是通过 TIM_ICInit 函数来初始化输入比较参数的:void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct) 同样,我们来看看参数设置结构体 TIM_ICInitTypeDef 的定义:

20、typedef structuint16_t TIM_Channel; / 通道 uint16_t TIM_ICPolarity; / 捕获极性 uint16_t TIM_ICSelection;/ 映射 uint16_t TIM_ICPrescaler;/ 分频系数 uint16_t TIM_ICFilter; / 滤波器长度 TIM_ICInitTypeDef;参数 TIM_Channel 很好理解,用来设置通道。我们设置为通道1 ,为 TIM_Channel_1 。参 数 TIM_ICPolarit 是 用 来 设 置 输 入 信 号 的 有 效 捕 获 极 性 , 这 里 我 们 设

21、置 为 TIM_ICPolarity_Rising ,上升沿捕获。同时库函数还提供了单独设置通道 1 捕获极性的函数为: TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);这表示通道 1 为上升沿捕获,我们后面会用到,同时对于其他三个通道也有一个类似的函数, 使用的时候一定要分清楚使用的是哪个通道该调用哪个函数,格式为 TIM_OCxPolarityConfig() 。 参数 TIM_ICSelection 是用来设置映射关系,我们配置IC1 直接映射在 TI1 上,选择TIM_ICSelection_DirectTI 。参 数 TIM_IC

22、Prescaler 用来设置输入捕获分频系数, 我们这里不分频, 所以选中 TIM_ICPSC_DIV1, 还有 2,4,8 分频可选。参数 TIM_ICFilter 设置滤波器长度,这里我们不使用滤波器,所以设置为0 。我们的配置代码是:TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; / 选择输入端 IC1 映射到 TI1 上 TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; / 上升沿捕获 TIM5_ICInitStructure.TIM_ICSelection =

23、TIM_ICSelection_DirectTI; /映射到 TI1 上TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; / 配置输入分频 ,不分频 TIM5_ICInitStructure.TIM_ICFilter = 0x00;/IC1F=0000 配置输入滤波器不滤波 TIM_ICInit(TIM5, &TIM5_ICInitStructure);4 )使能捕获和更新中断(设置 TIM5 的 DIER 寄存器) 因为我们要捕获的是高电平信号的脉宽,所以,第一次捕获是上升沿, 第二次捕获时下降沿, 必 须在捕获上升沿之后,

24、设置捕获边沿为下降沿,同时,如果脉宽比较长,那么定时器就会溢出, 对溢出必须做处理,否则结果就不准了,不过,由于 STM32F4 的 TIM5 是 32 位定时器,假设计 数周期为 1us ,那么需要 4294 秒才会溢出一次,这基本上是不可能的。这两件事,我们都在中 断里面做,所以必须开启捕获中断和更新中断。这里我们使用定时器的开中断函数 TIM_ITConfig 即可使能捕获和更新中断: TIM_ITConfig( TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);/ 允许更新中断和捕获中断 5)设置中断优先级,编写中断服务函数因为我们要使用到中断, 所以我们在系

25、统初始化之后, 需要先设置中断优先级分组, 这里方法跟 我们前面讲解一致,调用 NVIC_PriorityGroupConfig() 函数即可,我们系统默认设置都是分组 2 。 设置中断优先级的方法前面多次提到这里我们不做讲解,主要是通过函数 NVIC_Init() 来完成。 设置优先级完成后, 我们还需要在中断函数里面完成数据处理和捕获设置等关键操作, 从而实现 高电平脉宽统计。在中断服务函数里面,跟以前的外部中断和定时器中断实验中一样, 我们在中断开始的时候要进行中断类型判断,在中断结束的时候要清除中断标志位。使用到的 函数在上面的实验已经讲解过,分别为 TIM_GetITStatus()

26、 函数和 TIM_ClearITPendingBit() 函数。 if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)/ 判断是否为更新中断 if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)/ 判断是否发生捕获事件 TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update);/ 清除中断和捕获标志位 在我们实验的中断服务函数中,我们还使用到了一个设置计数器值的函数为: TIM_SetCounter(TIM5,0);上面语句的意思是将 TIM5 的计数值设

27、置为 0。这个相信是比较好理解的。6 )使能定时器(设置 TIM5 的 CR1 寄存器) 最后,必须打开定时器的计数器开关, 启动 TIM5 的计数器,开始输入捕获。 TIM_Cmd(TIM5,ENABLE ); / 使能定时器 5通过以上 6 步设置,定时器 5 的通道 1 就可以开始输入捕获了,同时因为还用到了串口输出结 果,所以还需要配置一下串口。我们在 timer.c 和 timer.h 中主要是添加了输入捕获初始化函数 TIM5_CH1_Cap_Init 以及中断服 务函数 TIM5_IRQHandler 。接下来我们来看看 timer.c 文件中,我们添加的两个函数的内容:TIM_

28、ICInitTypeDef TIM5_ICInitStructure;/定时器 5通道 1 输入捕获配置/arr :自动重装值 (TIM2,TIM5 是 32 位的 !) psc :时钟预分频数void TIM5_CH1_Cap_Init(u32 arr,u16 psc)GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENA

29、BLE); /TIM5 时钟使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); / 使能 PORTA 时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /GPIOA0 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;/ 复用功能 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; / 速度 100MHz GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; / 推挽复

30、用输出 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; / 下拉 GPIO_Init(GPIOA,&GPIO_InitStructure); / 初始化 PA0GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5); /PA0 复用位定时器 5TIM_TimeBaseStructure.TIM_Prescaler=psc; / 定时器分频 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; / 向上计数模式 TIM_TimeBa

31、seStructure.TIM_Period=arr; / 自动重装载值 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; /选择输入端 IC1 映射到 TI1 上TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; / 上升沿捕获 TIM5_ICInitStructure.

32、TIM_ICSelection = TIM_ICSelection_DirectTI; /映射到 TI1 上TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; / 配置输入分频 ,不分频 TIM5_ICInitStructure.TIM_ICFilter = 0x00;/IC1F=0000 配置输入滤波器不滤波 TIM_ICInit(TIM5, &TIM5_ICInitStructure); / 初始化 TIM5 输入捕获参数TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);/

33、 允许更新和捕获中断 TIM_Cmd(TIM5,ENABLE ); / 使能定时器 5NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;/ 抢占优先级 2 NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;/ 响应优先级 0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /IRQ 通道使能 NVIC_Init(&NVIC_InitStr

34、ucture); / 根据指定的参数初始化 VIC 寄存器、/ 捕获状态/7:0, 没有成功的捕获 ;1,成功捕获到一次 ./6:0, 还没捕获到低电平 ;1,已经捕获到低电平了 ./5:0: 捕获低电平后溢出的次数 (对于 32 位定时器来说 ,1us 计数器加 1,溢出时间 :4294 秒 ) u8 TIM5CH1_CAPTURE_STA=0; / 输入捕获状态u32 TIM5CH1_CAPTURE_VAL; / 输入捕获值 (TIM2/TIM5 是 32 位 )/ 定时器 5 中断服务程序void TIM5_IRQHandler(void)if(TIM5CH1_CAPTURE_STA&a

35、mp;0X80)=0)/ 还未成功捕获if(TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)/ 溢出if(TIM5CH1_CAPTURE_STA&0X40)/ 已经捕获到高电平了if(TIM5CH1_CAPTURE_STA&0X3F)=0X3F)/ 高电平太长了TIM5CH1_CAPTURE_STA|=0X80;/ 标记成功捕获了一次 TIM5CH1_CAPTURE_VAL=0XFFFFFFFF;else TIM5CH1_CAPTURE_STA+;if(TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESE

36、T)/ 捕获 1 发生捕获事件if(TIM5CH1_CAPTURE_STA&0X40) / 捕获到一个下降沿TIM5CH1_CAPTURE_STA|=0X80;/ 标记成功捕获到一次高电平脉宽 TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);/ 获取当前的捕获值 .TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); /CC1P=0 设为上升沿捕获else/ 还未开始 ,第一次捕获上升沿TIM5CH1_CAPTURE_STA=0;/ 清空TIM5CH1_CAPTURE_VAL=0;TIM5CH1_CAP

37、TURE_STA|=0X40;/ 标记捕获到了上升沿TIM_Cmd(TIM5,DISABLE ); / 关闭定时器 5 TIM_SetCounter(TIM5,0);TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);/CC1P=1 设为下降沿捕获TIM_Cmd(TIM5,ENABLE ); / 使能定时器 5TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); / 清除中断标志位此部分代码包含两个函数,其中 TIM5_CH1_Cap_Init 函数用于 TIM5 通道 1 的输入捕获设

38、置,其设置和我们上面讲的步骤是一样的,这里就不多说, 特别注意: TIM5 是 32 位定时器, 所以 arr 是 u32 类型的 。接下来,重点来看看第二个函数。 TIM5_IRQHandler 是 TIM5 的中断服 务函数, 该函数用到了两个全局变量, 用于辅助实现高电平捕获。 其中 TIM5CH1_CAPTURE_STA, 是用来记录捕获状态, 该变量类似我们在 usart.c 里面自行定义的 USART_RX_STA 寄存器 (其实就 是个变量,只是我们把它当成一个寄存器那样来使用)。 TIM5CH1_CAPTURE_STA 各位描述如表所示:TIM5CH1 CAPTURE STAbit7bit6bit50捕获完成标志捕获到高电平标志捕获高电平后定时器溢出的次数另外一个变量 TIM5CH1_CAPTURE_VAL ,则用来记录捕获到下降沿的时候,TIM5_CNT 的值。现在介绍一下, 捕获高电平脉宽的思路: 首先, 设置 TIM5_CH1 捕获上升沿, 这在 TIM5_Cap_Init 函数执行的时候就设置好了,然后等待上升沿中断到来,当捕获到上升沿中断,此时如果 T

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论