STM32 TIM8 CH1 PWM输出问题: 
 
        原先做过的工程项目文件,使用的是STM32F103VCT6,LQFP-100的芯片。 
 
   使用PA0作为触摸屏的触摸中断输入;一共是4路PWM输出。 
 
   使用了TIM2的3个通道输出PWM(PA1,PA2,PA3),TIM8的1个通道输出PWM(PC7), 
 
   使用好长时间了,非常好,没有问题. 
 
       这一次有个项目,要用到5路PWM输出,原先设计的PCB板上也有预留PC6的输出, 
 
   所以就想着使用PC6作为1路 PWM输出,将原来的4路PWM输出扩展到5路输出。 
 
       结果事情就来了,开启PC6,也就是TIM8_CH1的输出,结果导致原来好用的触摸屏, 
 
  怎么点击,都没有反应了,就是挂接在SPI1总线上的flash芯片M25P16也是初始化识别, 
 
  读取的flash芯片的ID都变成0XFFFFFFFF了,研究了半天,也没有找到原因。 
 
      没有办法,就详细地看STM32F103VCT6的说明文档,特别是引脚定义那一块的东西。 
 
   应该是TIM8的开启,导致SPI1不好用了,也就是TIM8的引脚输出干扰SPI1,就找到了SPI1 
 
   的PA7引脚(SPI1_MOSI)。PA7引脚功能如下: SPI1_MOSI/TIM8_CH1N/ADC12_IN7/TIM3_CH2 
 
       原因就是TIM8_CH1N和SPI1_MOSI产生冲突了,干扰到SPI1的正常工作了。那就得必须关闭 
 
  TIM8_CH1N !!!, 那应该就正常了。尝试了一下,果然如同上述,问题解决了!!! 
 
        SPI1,TIM8_CH1都正常了. 
 
   具体的初始化程序如下所示: 
 
void TIM8_GPIO_Configeration( void ) 
{ 
         GPIO_InitTypeDef GPIO_InitStructure;  
 
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); 
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);    
          
        //PC.6,PC.7--->PWM Output; 
         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;  // T8OC1 引脚输出,T8OC2 引脚输出, 
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        
         GPIO_Init(GPIOC, &GPIO_InitStructure);   
} 
 
 
/****************************************************************************         
* 功    能:             定时器8初始化函数 
*----------------------------------------------------------------------------------------------------------* 
* 入口参数:duty----占空比[0~100]              
* 出口参数:nil 
****************************************************************************/         
void TIM8_PWM_Configuration(u8 duty) 
{ 
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 
        TIM_OCInitTypeDef TIM_OCInitStructure; 
         
        if(duty>100)  return; 
         
        TIM_TimeBaseStructure.TIM_Period = 65535;    //PWM周期=(65535+1)/2000000=30.5HZ 
        TIM_TimeBaseStructure.TIM_Prescaler = 36-1;  //72MHz/1=2MHz 
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
        TIM_TimeBaseInit(TIM8,&TIM_TimeBaseStructure);         
 
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //使用模式2 
         
        //PA7:SPI1_MOSI/TIM8_CH1N 
        //SPI1,TIM8_CH1同时使用时,必须关闭TIM8的互补通道:TIM8_CH1N 
        //不然的话,TIM8_CH1的输出会干扰SPI1的工作,也就是SPI1_MOSI 
        TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; //add!!! 
         
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;         //使能TIM输出 
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                 
         
        //TIM8的通道1[TIM8_CH1] 
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;         //使能TIM输出 
        TIM_OCInitStructure.TIM_Pulse = 65535*duty/100;  //占空比=duty*65535/(TIM_Period+1) 
        TIM_OC1Init(TIM8,&TIM_OCInitStructure);         
        TIM_OC1PreloadConfig(TIM8,TIM_OCPreload_Enable); //TIM_8---->通道1[PC6]                 
         
        //TIM8的通道2[TIM8_CH2]         
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;         //使能TIM输出 
        TIM_OCInitStructure.TIM_Pulse = 65535*duty/100;  //占空比=duty*65535/(TIM_Period+1) 
        TIM_OC2Init(TIM8,&TIM_OCInitStructure);         
        TIM_OC2PreloadConfig(TIM8,TIM_OCPreload_Enable);   //TIM_8---->通道2[PC7]         
         
         
        TIM_Cmd(TIM8,ENABLE);                 
        TIM_CtrlPWMOutputs(TIM8, ENABLE); //设置TIM2的PWM输出为使能 
 
} |   
     
  
 |