新手入门
- 积分
- 9
- 金钱
- 9
- 注册时间
- 2019-8-12
- 在线时间
- 1 小时
|
2金钱
最近做一个脉冲发生器,使用到了TIM2的32位定时器,但是很奇怪32位定时器在给定16位以内的数时执行的都是正确的,但是只要数值超过16位,数据就不准了
是不是使用的时候有什么细节没注意,还是说不要使用32位的定时器
现在不知道问题出在哪里
IDE 是keil 5.30
以下是配置代码
- //脉冲通道1 --> TIM1做主定时器,输出通道CH1,TIM2做从定时器
- void TIM1_Init(u32 Cycle)
- {
- TIM_OCInitTypeDef TIM_OCInitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); // 开启定时器时钟,即内部时钟CK_INT=72M
-
- TIM_TimeBaseStructure.TIM_Period=Cycle-1; // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
- TIM_TimeBaseStructure.TIM_Prescaler= 3; // 时钟预分频数
- TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; // 时钟分频因子 ,没用到不用管
- TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; // 计数器计数模式,设置为向上计数
- TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); // 根据结构体,初始化定时器
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
- TIM_OCInitStructure.TIM_Pulse=Cycle/2; //设置占空比时间
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性
- TIM_OC1Init(TIM1, &TIM_OCInitStructure); //PWM输出引脚
- /*TIM1主模式设置*/
- TIM_SelectMasterSlaveMode(TIM1,TIM_MasterSlaveMode_Enable);
- TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_Update);
- /*从模式设置,指定从定时器*/
- TIM_SelectInputTrigger(TIM2, TIM_TS_ITR0); //连接关系请查表
- TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_External1); //设置从模式寄存器
- TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能CCR预装载寄存器
-
- TIM_ARRPreloadConfig(TIM1, ENABLE); //使能或者失能 TIMx 在 ARR 上的预装载寄存器
-
- TIM_CtrlPWMOutputs(TIM1, ENABLE); //主输出使能
- }
- /***定时器2从模式***/
- void TIM2_Config(u32 PulseNum)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
-
- TIM_TimeBaseStructure.TIM_Period = PulseNum-1; //设置自动重装载周期值
- TIM_TimeBaseStructure.TIM_Prescaler =0;
- TIM_TimeBaseStructure.TIM_ClockDivision = 0;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
- TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);
- }
- /***定时器2从模式***/
- void TIM2_Init(u32 PulseNum)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
-
- TIM2_Config(PulseNum);
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
- NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //全局中断
-
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
复制代码 以上是配置代码
下面的是计数完成后的中断
- //通道1中断 --> TIM1主TIM2从
- void TIM2_IRQHandler(void) //Pulse通道1计数器中断
- {
- if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) // TIM_IT_CC1
- {
- TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清除中断标志位
- TIM_Cmd(TIM1, DISABLE); // 关闭定时器
- TIM_Cmd(TIM2, DISABLE); // 关闭定时器
- F_PulseBusy1 = 0;
- TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE);
- }
- }
复制代码
|
|