问题出在 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语言怎么理解、标准库定时器及中断等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)