21ic电子技术开发论坛 单片机与嵌入式系统 ST MCU STM32 TIM8 CH1 PWM输出问题
发新帖我要提问
返回列表
打印
[STM32F1]

STM32 TIM8 CH1 PWM输出问题

[复制链接]
14014|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xfcjava2|  楼主 | 2015-2-6 13:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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输出为使能

}



沙发
mmuuss586| | 2015-2-6 22:40 | 只看该作者

引脚冲突了是这样;

使用特权

评论回复
板凳
cbsnitx| | 2015-2-12 10:34 | 只看该作者
学习了!

使用特权

评论回复
地板
搞IT的| | 2015-2-14 19:15 | 只看该作者
这个是引脚冲突的原因造成的吗??

使用特权

评论回复
5
sunhao5158| | 2015-9-25 09:28 | 只看该作者
mmuuss586 发表于 2015-2-6 22:40
引脚冲突了是这样;

敢问高手  这个引脚冲突了 怎么解决呢? TIM8和TIM3复用引脚,怎么设置到底复用TIM3还是TIM8呢?

使用特权

评论回复
6
android2| | 2015-9-25 10:08 | 只看该作者
应该是这些引脚有复用功能

使用特权

评论回复
7
371924221| | 2016-5-31 10:28 | 只看该作者
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);  

这里应该同时初始化引脚复用功能吧
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);

使用特权

评论回复
8
xmshao| | 2016-5-31 16:24 | 只看该作者
现在用STM32CUBEMX 就省事多了,尤其管脚复用和时钟安排这块省事多了。

使用特权

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

使用特权

评论回复
10
天灵灵地灵灵| | 2018-4-13 17:44 | 只看该作者
用图形工具配置。

使用特权

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

本版积分规则

26

主题

449

帖子

42

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