打印
[STM32F1]

STM32 TIM8 CH1 PWM输出问题

[复制链接]
2100|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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呢?

使用特权

评论回复
5
ousj| | 2019-10-18 20:27 | 只看该作者
应该是这些引脚有复用功能

使用特权

评论回复
6
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);

使用特权

评论回复
7
zyf部长| | 2019-10-18 20:32 | 只看该作者
现在用STM32CUBEMX 就省事多了,尤其管脚复用和时钟安排这块省事多了。

使用特权

评论回复
8
llljh| | 2019-10-18 20:35 | 只看该作者
楼主,我也遇到了STM32  TIM8_CH1 无法输出PWM波的问题,但是同样作为高级定时器的TIM1_CH1就可以输出PWM波。我看了一下是PC6不仅作为TIM8_CH1 ,还有重定义功能TIM3_CH1,而PA8只有TIM1_CH1,而没有重定义功能。请问具体该怎么解决呢?不胜感激!

使用特权

评论回复
9
pangb| | 2019-10-18 20:40 | 只看该作者
用图形工具配置。

使用特权

评论回复
10
xiaoqizi| | 2019-11-14 09:57 | 只看该作者
是不是需要重新初始化一下呢

使用特权

评论回复
11
wowu| | 2019-11-14 10:00 | 只看该作者
即便用工具生成了  具体的时序还是要自己写

使用特权

评论回复
12
wakayi| | 2019-11-14 10:03 | 只看该作者
什么时候用 什么时候配置一下

使用特权

评论回复
13
renzheshengui| | 2019-11-14 10:06 | 只看该作者
可以自己试试看

使用特权

评论回复
14
paotangsan| | 2019-11-14 10:09 | 只看该作者
前提条件是对时间要求不那么严格

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

768

主题

9410

帖子

2

粉丝