你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

TIM8捕获,TIM1pwm输出问题

[复制链接]
shouliudan 提问时间:2015-1-24 13:30 /
  1. #include "stm32f10x.h"
  2. void RCC_Configuration(void);
  3. void GPIO_Configuration(void);
  4. void TIM8_Configuration(void);  
  5. void TIM1_Configuration(void);

  6. int main(void)
  7. {
  8.           RCC_Configuration();
  9.           GPIO_Configuration();
  10.           TIM8_Configuration();  
  11.     TIM1_Configuration();
  12.           while(1);
  13. }

  14. void GPIO_Configuration()
  15. {
  16.   GPIO_InitTypeDef GPIO_InitStructure;
  17.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
  18.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                  
  19.         GPIO_Init(GPIOC , &GPIO_InitStructure);
  20.         GPIO_InitStructure.GPIO_Pin =GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;
  21.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                 
  22.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  23.         GPIO_Init(GPIOA , &GPIO_InitStructure);        
  24. }

  25. void RCC_Configuration(void)
  26. {
  27.         ErrorStatus HSEStartUpStatus;
  28.           RCC_DeInit();
  29.           RCC_HSEConfig(RCC_HSE_ON);
  30.           HSEStartUpStatus = RCC_WaitForHSEStartUp();
  31.           if(HSEStartUpStatus == SUCCESS)
  32.           {
  33.             RCC_HCLKConfig(RCC_SYSCLK_Div1);
  34.             RCC_PCLK2Config(RCC_HCLK_Div1);
  35.             RCC_PCLK1Config(RCC_HCLK_Div2);
  36.                         RCC_ADCCLKConfig(RCC_PCLK2_Div6);
  37.             FLASH_SetLatency(FLASH_Latency_2);
  38.       FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
  39.             RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
  40.             RCC_PLLCmd(ENABLE);
  41.             while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
  42.             RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  43.             while(RCC_GetSYSCLKSource() != 0x08);
  44.           }
  45.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA, ENABLE);
  46.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1|RCC_APB2Periph_TIM8, ENABLE);
  47. }



  48. void TIM8_Configuration(void)
  49. {
  50.         TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  51.         TIM_ICInitTypeDef  TIM_ICInitStructure;
  52.   TIM_TimeBaseStructure.TIM_Period = 65000;                                            
  53.         TIM_TimeBaseStructure.TIM_Prescaler=1000-1;                                                  
  54.         TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;                                 
  55.         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;   
  56.         TIM_TimeBaseInit(TIM8,&TIM_TimeBaseStructure);                                             
  57.         TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising ;                          
  58.         TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;                       
  59.   TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;                                 
  60.         TIM_ICInitStructure.TIM_ICFilter = 0xF;                                                   //这句即使放在本函数的最后TIM1也没有输出
  61.         TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
  62.         TIM_ICInit(TIM8, &TIM_ICInitStructure);
  63.         TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
  64.         TIM_ICInit(TIM8, &TIM_ICInitStructure);
  65.         TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;
  66.         TIM_ICInit(TIM8, &TIM_ICInitStructure);
  67.         TIM_ITConfig(TIM8, TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3,ENABLE);
  68.         TIM_Cmd(TIM1,ENABLE);
  69. }

  70. void TIM1_Configuration(void)
  71. {
  72.         TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  73.         TIM_OCInitTypeDef TIM_OCInitStructure;
  74.         TIM_TimeBaseStructure.TIM_Period = 90-1;                                             
  75.         TIM_TimeBaseStructure.TIM_Prescaler=10000-1;                                            
  76.         TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  77.         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_CenterAligned1;               
  78.         TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
  79.         TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
  80.         TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
  81.         TIM_OCInitStructure.TIM_OutputNState=TIM_OutputState_Disable;
  82.         TIM_OCInitStructure.TIM_Pulse=0;                             
  83.         TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;        
  84.         TIM_OC1Init(TIM1,&TIM_OCInitStructure);
  85.         TIM_OC2Init(TIM1,&TIM_OCInitStructure);
  86.         TIM_OC3Init(TIM1,&TIM_OCInitStructure);
  87.         TIM_OC4Init(TIM1,&TIM_OCInitStructure);
  88.         TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
  89.         TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);                                                                  
  90.         TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
  91.         TIM_SetCompare1(TIM1,10);  
  92.         TIM_SetCompare2(TIM1,20);  
  93.         TIM_SetCompare3(TIM1,30);  
  94.         TIM_CtrlPWMOutputs(TIM1,ENABLE);
  95.         TIM_Cmd(TIM1,ENABLE);
  96.         
  97. }
复制代码
这个程序是设置TIM8进行捕获,TIM1进行PWM输出。TIM1没有输出。如果在主程序中先写TIM1在写TIM8,TIM1输出正常。如果在TIM8的配置中设置滤波为0x0;TIM1有输出。如果在TIM1中取消通道1的设置,TIM1有输出。如果在TIM1设置最后重新设置TIM1->CR2=0x0;TIM1有输出。以上情况都可以使TIM1有输出,调试过程中观察TIM1寄存器,TIM->CR2和TIM1->CRC会被意外改变。不能解释以上各种原因。
收藏 评论8 发布时间:2015-1-24 13:30

举报

8个回答
Dylan疾风闪电 回答时间:2015-1-24 13:51:52
本帖最后由 Dylan疾风闪电 于 2015-1-24 13:53 编辑

   73     TIM_ITConfig(TIM8, TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3,ENABLE);
   74     TIM_Cmd(TIM1,ENABLE); //这里的寄存器错了!!!

第74行代码写错了,你TIM8没有被使能。-----------------------------------------------------
其他问题没有细看,大致浏览了一下,先找到了这一处。
shouliudan 回答时间:2015-1-24 14:22:37
那个可能是写错了,主要是TIM1的问题困扰着我。
shouliudan 回答时间:2015-1-24 14:26:38
是这样的,在一个程序里单独出现高级定时器的PWM输出或者捕获功能都是没有问题的,但是如果在同一个程序里用到两个定时器的话就出现问题了,如以上描述。
shouliudan 回答时间:2015-1-24 18:12:59
还有就是直接写寄存器就不会出现问题。 TIM_ICInitStructure.TIM_ICFilter = 0xF; 这句无论出现在void TIM8_Configuration(void)的任何位置都会使TIM1没有输出。刚把TIM1改为TIM2,没有出现问题。
真的很无解为什么会这样。
zzz111xxx 回答时间:2015-1-24 22:56:09
赞一个
数码小叶 回答时间:2015-1-25 14:49:42
支持一下
qimeiya 回答时间:2015-5-13 15:59:24

支持一下
mark0668 回答时间:2015-5-13 16:13:24
TIM1  和 TIM8  断路和死区寄存器 (TIMx_BDTR)

位 15 MOE:主输出使能 (Main output enable)
只要断路输入变为有效状态,此位便由硬件异步清零。此位由软件置 1,也可根据 AOE 位状
态自动置 1。此位仅对配置为输出的通道有效。
0:OC 和 OCN 输出禁止或被强制为空闲状态。
1:如果 OC 和 OCN 输出的相应使能位(TIMx_CCER 寄存器中的 CCxE 和 CCxNE 位)均
置 1,则使能 OC 和 OCN 输出。
有关详细信息,请参见 OC/OCN 使能说明( 第 379  页的第 14.4.9  节: TIM1  和 TIM8  捕获 /
比较使能寄存器 (TIMx_CCER))。

要使能PWM 才会有输出的

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版