OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 15163|回复: 11

定时器同步问题

[复制链接]

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-8-2
在线时间
0 小时
发表于 2013-8-2 13:15:28 | 显示全部楼层 |阅读模式
u8 TIM2_CCR4_Val = 4 ;
u16 TIM3_CCR3_Val = 30000 ;
u8 TIM4_CCR3_Val = 30 ;

void TIMER_Configuration()

{
    #define PrescalerValue  10 - 1 
#define PrescalerValue1  2000 - 1 
#define PrescalerValue2  2 - 1 
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;     
          
    // time2  channel 4 100k/2/4/2=6250Hz  Toggle  slave */
// time3  channel 3 60M/2000/30000/2=0.5Hz timing */
    // time4  channel 3 60M/10/30/2= 100KHz  Toggle master     */
    TIM_DeInit(TIM2);
TIM_DeInit(TIM3);
    TIM_DeInit(TIM4);
    TIM_InternalClockConfig(TIM3);
TIM_InternalClockConfig(TIM4);
      //* time3 channel 3  B13 */
      TIM_TimeBaseStructure.TIM_Prescaler = 0;
      TIM_TimeBaseStructure.TIM_ClockDivision = 0;
      TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
    TIM_TimeBaseStructure.TIM_Period = 65536 - 1;
              TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
TIM_PrescalerConfig(TIM3, PrescalerValue1, TIM_PSCReloadMode_Immediate);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
TIM_OCInitStructure.TIM_Pulse = TIM3_CCR3_Val ;                           
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
TIM_OC3Init(TIM3, &TIM_OCInitStructure); 
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Disable);
//* time2 channel 4 PA3*/
TIM_TimeBaseStructure.TIM_Prescaler = 0;
      TIM_TimeBaseStructure.TIM_ClockDivision = 0;
      TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
    TIM_TimeBaseStructure.TIM_Period = 65536 - 1;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
TIM_PrescalerConfig(TIM2, PrescalerValue2, TIM_PSCReloadMode_Immediate);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; 
TIM_OCInitStructure.TIM_Pulse = TIM2_CCR4_Val ;                           
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;  
TIM_OC4Init(TIM2, &TIM_OCInitStructure); 
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Disable);
TIM_SelectInputTrigger(TIM2, TIM_TS_ITR3);
              TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Trigger);
              
//* time4 channel 3 PB8 模式 输出比较触发   */
TIM_TimeBaseStructure.TIM_Prescaler = 0;
      TIM_TimeBaseStructure.TIM_ClockDivision = 0;
      TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
    TIM_TimeBaseStructure.TIM_Period = 65536 - 1;
    TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);
TIM_PrescalerConfig(TIM4, PrescalerValue, TIM_PSCReloadMode_Immediate);  
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; 
TIM_OCInitStructure.TIM_Pulse = TIM4_CCR3_Val ;             // 捕获比较值               
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;  
TIM_OC3Init(TIM4, &TIM_OCInitStructure); 
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Disable); // 禁止预装值 
 
TIM_SelectOutputTrigger(TIM4, TIM_TRGOSource_Update);
TIM_SelectMasterSlaveMode(TIM4, TIM_MasterSlaveMode_Enable);
// 清除中断标志,避免开启中断就产生中断 
TIM_ClearITPendingBit(TIM2,TIM_IT_CC4); 
TIM_ITConfig(TIM2, TIM_IT_CC4, ENABLE);
TIM_ClearITPendingBit(TIM3,TIM_IT_CC3); 
TIM_ITConfig(TIM3, TIM_IT_CC3, ENABLE);
TIM_ClearITPendingBit(TIM4,TIM_IT_CC3); 
TIM_ITConfig(TIM4, TIM_IT_CC3, ENABLE);

TIM_Cmd(TIM4, ENABLE);
TIM_Cmd(TIM2, ENABLE);
TIM_Cmd(TIM3, ENABLE);
}

第一次使用STM32,使用定时器产生两个同步时钟信号,tim4输出100KHz信号正确,但tim2输出6.25KHz信号怎么也不对?



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-8-2
在线时间
0 小时
 楼主| 发表于 2013-8-2 13:19:01 | 显示全部楼层
回复【楼主位】william_zeng:
---------------------------------
请原子指点......
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-2 15:58:26 | 显示全部楼层
回复【2楼】william_zeng:
---------------------------------
TIM2输出现在是多少?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-8-2
在线时间
0 小时
 楼主| 发表于 2013-8-2 16:38:30 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
回复【3楼】正点原子:
---------------------------------
输出为200Hz左右
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-8-2
在线时间
0 小时
 楼主| 发表于 2013-8-2 16:41:50 | 显示全部楼层
回复【4楼】william_zeng:
---------------------------------
回复【3楼】正点原子:

回复【2楼】william_zeng:
---------------------------------
TIM2输出现在是多少?

---------------------------------
回复【3楼】正点原子:
---------------------------------
但改变slave为门控或外部时钟1,输出就变为2Hz左右,很奇怪?

TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Trigger);
修改为 TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Gated);或 TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_External1)
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-2 16:45:20 | 显示全部楼层
回复【4楼】william_zeng:
---------------------------------
看你的时钟频率60M,你用的是什么芯片啊???
你试下不用slave模式,直接输出6.25Khz的方波,OK 不?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-8-2
在线时间
0 小时
 楼主| 发表于 2013-8-2 16:53:49 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
芯片为STM32F103ZET6,之前没有定时器同步,tim4输出100KHz,tim2输出为6.25KHz,都正常,只是应用中要求两个时钟同步,
将时钟级联后就遇到这个问题了。
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-8-2
在线时间
0 小时
 楼主| 发表于 2013-8-2 16:54:49 | 显示全部楼层
回复【7楼】william_zeng:
---------------------------------
其中时钟配置为:
void RCC_Configuration(void)
{
/* 定义枚举类型变量 HSEStartUpStatus */
ErrorStatus HSEStartUpStatus;
   /* 复位系统时钟设置*/
   RCC_DeInit();
   /* 开启HSE*/
   RCC_HSEConfig(RCC_HSE_ON);
   /* 等待HSE起振并稳定*/
   HSEStartUpStatus = RCC_WaitForHSEStartUp();
/* 判断HSE起是否振成功,是则进入if()内部 */
   if(HSEStartUpStatus == SUCCESS)
   {
     /* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */
     RCC_HCLKConfig(RCC_SYSCLK_Div1); 
     /* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */
     RCC_PCLK2Config(RCC_HCLK_Div1); 
     /* 选择PCLK1时钟源为 HCLK(AHB) 2分频 */
     RCC_PCLK1Config(RCC_HCLK_Div2);
     /* 设置FLASH延时周期数为2 */
     FLASH_SetLatency(FLASH_Latency_2);
     /* 使能FLASH预取缓存 */
     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
     /* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为5,则PLL输出频率为 12MHz * 5 = 60MHz */
     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_5);
     /* 使能PLL */ 
     RCC_PLLCmd(ENABLE);
     /* 等待PLL输出稳定 */
     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
     /* 选择SYSCLK时钟源为PLL */
     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
     /* 等待PLL成为SYSCLK时钟源 */
     while(RCC_GetSYSCLKSource() != 0x08);
   } 

   /* 打开APB2总线上的GPIOA和GPIOB、UART时钟、复用功能时钟 */
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB| RCC_APB2Periph_GPIOD | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4 , ENABLE);

//启动DMA时钟  
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); 
}
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-8-2
在线时间
0 小时
 楼主| 发表于 2013-8-2 17:47:35 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
不使用定时器同步,// time2  channel 4 60M/1200/4/2=6250Hz  Toggle  */  tim2输出6.25KHz频率信号正常
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-2 17:50:12 | 显示全部楼层
哦,这个同步模式我还没研究过,呵呵.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-8-2
在线时间
0 小时
 楼主| 发表于 2013-8-3 16:45:17 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
问题找到,原来tim输出比较模式下不能给从tim提供时钟,将主tim修改为PWM模式,其余不变就ok了,谢谢原子。
应用手册中写到:In output compare mode, the update event UEV has no effect on ocxref and OCx output.
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-3 17:10:35 | 显示全部楼层
回复【11楼】william_zeng:
---------------------------------
感谢分享.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-15 21:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表