标准库定时器及中断

标准库定时器及中断,第1张

问题出在 TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIMx在CCR2上的预装载寄存器

因为我使用的是比较输出,并且在中断里面设置频率,所以利用TIM_SetCompare1(TIM2,capture + 32767)这个函数来改变比较寄存器的值,

所以当预装载寄存器被使能后,没中断一次,比较寄存器的值就被重新赋值了,这和中断里面设定频率有冲突,

所以解决方法是TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable)

这样就可以利用一个定时器产生4种不同频率,不同占空比的方波了,如有不对的地方,希望大家指点

如果你要用

TIMx->SR = (uint16_t)~TIM_FLAG;

表述

TIMx->SR=0xFFF7;

则需要

#define TIM_FLAG ((uint16_t)0x0008)

用你提供的两个flag 定义是不行的,再查查。

1利用定时器公式计算出TIMx_ARR(计数个数(自动重载寄存器(TIMx_ARR)))和TIMx_psc(分频系数)(例如:72Mhz  ARR=9999,PSC=7199)

2初始化定时器:TIM_TimeBaseInit()

3打开时钟RCC

4清除标志位 :TIM_ClearFlag()   (时间由高电平到低电平)

5使能定时器:TIM_Cmd()  (打开定时器)

6判断是否定时完毕:TIM_GetFlagStatus()  (判断是否高电平)

例如:

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7,ENABLE);//打开TIM6的外设时钟  改时钟在这里改,改成要求的时钟

TIM_TimeBaseStructureTIM_Prescaler = 4799;

TIM_TimeBaseStructureTIM_CounterMode = TIM_CounterMode_Up;//向上计数    改计数模式在这里改  改为  TIM_CounterMode_Down  向下计数

TIM_TimeBaseStructureTIM_Period = 1999;//秒数在这里改  05秒对应4999  1秒对应9999  两秒对应19999

TIM_TimeBaseInit(TIM7,&TIM_TimeBaseStructure);//这里改为对应的TIM

TIM_ClearFlag(TIM7, TIM_FLAG_Update);//这里改为对应的TIM

TIM_ITConfig(TIM7, TIM_IT_Update,ENABLE);//这里改为对应的TIM使能定时器中断

TIM_Cmd(TIM7, ENABLE);//使能或者失能TIMx外设

TIM_GetFlagStatus(TIM7, TIM_FLAG_Update);//检查指定的TIM标志位设置与否

注意:mainc文件中一定要添加头文件名   #include"stm32f10xh"

1设置外部中断初始化函数 :EXTI_Init()

2打开复用功能时钟(AFIO)(AFIO属于APB2)

3设置管脚中断函数:GPIO_EXTILineConfig()

4设置优先级初始化函数NVIC_Config()

5设置中断信号输入管脚初始化函数:GPIO_con()

6编写中断服务函数

中断服务函数列表:

1EXTI0_IRQHandler

2EXTI2_IRQHandler

3EXTI3_IRQHandler

4EXTI4_IRQHandler

5EXTI9_5_IRQHandler

1EXTI15_10_IRQHandler

我看了一下代码

#define TIM_IT_Update ((uint16_t)0x0001)

#define TIM_FLAG_Update ((uint16_t)0x0001)

这两个值是一样的,用起来不会错但是代码不规范,两处地方都应该改用TIM_IT_Update,这样不会让人误解。

FlagStatus TIM_GetFlagStatus(TIM_TypeDef TIMx, uint16_t TIM_FLAG)

ITStatus TIM_GetITStatus(TIM_TypeDef TIMx, uint16_t TIM_IT)

这两个函数唯一的区别是中断函数TIM_GetITStatus()中多出来的itenable = TIMx->DIER & TIM_IT;

if ((itstatus != (uint16_t)RESET) && (itenable != (uint16_t)RESET))

对TIM的DIER寄存器额外进行了判断,才能执行time++

参考了一下源代码

02600 void TIM_ClearFlag(TIM_TypeDef TIMx, uint16_t TIM_FLAG)

02601 {

02602 / Check the parameters /

02603 assert_param(IS_TIM_ALL_PERIPH(TIMx));

02604 assert_param(IS_TIM_CLEAR_FLAG(TIM_FLAG));

02605

02606 / Clear the flags /

02607 TIMx->SR = (uint16_t)~TIM_FLAG;

02676 void TIM_ClearITPendingBit(TIM_TypeDef TIMx, uint16_t TIM_IT)

02677 {

02678 / Check the parameters /

02679 assert_param(IS_TIM_ALL_PERIPH(TIMx));

02680 assert_param(IS_TIM_IT(TIM_IT));

02681 / Clear the IT pending Bit /

02682 TIMx->SR = (uint16_t)~TIM_IT;

02683 }

都是对同一个寄存器进行相同 *** 作。。完全一样的……

就是说。。两个函数实现的功能是一样的。。

大概是为了适应不同的编程风格写成了两个函数吧。。我的理解……

uint-16是一种数据类型,就像int一样,这里的意思是将TIM_FLAG按位取反,然后将所得值通过强制类型转换成uint16_t所代表的数据类型,最后将值给TIMx—>SR。这里涉及到了数据的强制类型转换,你可以到书上或网上查查关于强制类型转换的内容,看了你就知道了!

以上就是关于求助,关于TIM输出比较的问题全部的内容,包括:求助,关于TIM输出比较的问题、大家看看这段c语言怎么理解、标准库定时器及中断等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/8872282.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-22
下一篇 2023-04-22

发表评论

登录后才能评论

评论列表(0条)

保存