[STM32F1] STM32 TIM8 CH1 PWM输出问题

[复制链接]
 楼主| gongche 发表于 2019-10-18 20:13 | 显示全部楼层 |阅读模式
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输出为使能

}
llljh 发表于 2019-10-18 20:17 | 显示全部楼层
引脚冲突了是这样;
yinxiangh 发表于 2019-10-18 20:20 | 显示全部楼层
这个是引脚冲突的原因造成的吗??
llljh 发表于 2019-10-18 20:24 | 显示全部楼层
敢问高手  这个引脚冲突了 怎么解决呢? TIM8和TIM3复用引脚,怎么设置到底复用TIM3还是TIM8呢?
ousj 发表于 2019-10-18 20:27 | 显示全部楼层
应该是这些引脚有复用功能
llljh 发表于 2019-10-18 20:29 | 显示全部楼层
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);  

这里应该同时初始化引脚复用功能吧
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);
zyf部长 发表于 2019-10-18 20:32 | 显示全部楼层
现在用STM32CUBEMX 就省事多了,尤其管脚复用和时钟安排这块省事多了。
llljh 发表于 2019-10-18 20:35 | 显示全部楼层
楼主,我也遇到了STM32  TIM8_CH1 无法输出PWM波的问题,但是同样作为高级定时器的TIM1_CH1就可以输出PWM波。我看了一下是PC6不仅作为TIM8_CH1 ,还有重定义功能TIM3_CH1,而PA8只有TIM1_CH1,而没有重定义功能。请问具体该怎么解决呢?不胜感激!
pangb 发表于 2019-10-18 20:40 | 显示全部楼层
用图形工具配置。
xiaoqizi 发表于 2019-11-14 09:57 | 显示全部楼层
是不是需要重新初始化一下呢
wowu 发表于 2019-11-14 10:00 | 显示全部楼层
即便用工具生成了  具体的时序还是要自己写
wakayi 发表于 2019-11-14 10:03 | 显示全部楼层
什么时候用 什么时候配置一下
renzheshengui 发表于 2019-11-14 10:06 | 显示全部楼层
可以自己试试看
paotangsan 发表于 2019-11-14 10:09 | 显示全部楼层
前提条件是对时间要求不那么严格
您需要登录后才可以回帖 登录 | 注册

本版积分规则

768

主题

9410

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

768

主题

9410

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部