打印
[STM8]

开启PC7复用后PD4不能作为PWM使用

[复制链接]
1095|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 mr踏雪无痕 于 2018-3-9 17:25 编辑

用stm8s103做一个6路PWM输出的板子,用到TIM1的2、3、4通道和TIM2的1、2、3通道,PC7的复用功能是TIM1_CH2.当开启复用后PD4及TIM2_CH1不能输出PWM,关掉复用功能PD4又能输出PWM,且PC7也能作为PWM使用

无标题.jpg (358.96 KB )

无标题.jpg
沙发
mr踏雪无痕|  楼主 | 2018-3-9 17:25 | 只看该作者
void PWM_Init(void)
{
    GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);//TIM2_CH3
    GPIO_Init(GPIOC, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);//TIM1_CH3
    GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_FAST);//TIM1_CH4
    GPIO_Init(GPIOC, GPIO_PIN_7, GPIO_MODE_OUT_PP_LOW_FAST);//TIM1_CH2
    GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);//TIM2_CH2
    GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_FAST);//TIM2_CH1

    TIM2_DeInit();
    TIM2_TimeBaseInit(TIM2_PRESCALER_8, 4999);
    TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 0x0000, TIM2_OCPOLARITY_HIGH);
    TIM2_OC2Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 0x0000, TIM2_OCPOLARITY_HIGH);
    TIM2_OC3Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 0x0000, TIM2_OCPOLARITY_HIGH);
  
    TIM2_OC1PreloadConfig(ENABLE);
    TIM2_OC2PreloadConfig(ENABLE);
    TIM2_OC3PreloadConfig(ENABLE);
  
    TIM2_Cmd(ENABLE);
          
    TIM1_DeInit();
    TIM1_TimeBaseInit(8, TIM1_COUNTERMODE_UP, 4999, 0x00);
    TIM1_OC2Init(TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_ENABLE, 0x0000, TIM1_OCPOLARITY_HIGH, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_SET, TIM1_OCNIDLESTATE_RESET);
    TIM1_OC3Init(TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_ENABLE, 0x0000, TIM1_OCPOLARITY_HIGH, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_SET, TIM1_OCNIDLESTATE_RESET);
    TIM1_OC4Init(TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, 0x0000, TIM1_OCPOLARITY_HIGH, TIM1_OCIDLESTATE_SET);


    TIM1_OC2PreloadConfig(ENABLE);
    TIM1_OC3PreloadConfig(ENABLE);
    TIM1_OC4PreloadConfig(ENABLE);

    TIM1_Cmd(ENABLE);
          TIM1_CtrlPWMOutputs(ENABLE);


}


void main(void)
{
          Sys_Clock_Init();
          PWM_Init();
               
  /* Infinite loop */
  while (1)
  {
                TIM2_SetCompare1(4000);
                TIM2_SetCompare2(2499);
    TIM2_SetCompare3(1200);

    TIM1_SetCompare2(2499);
                TIM1_SetCompare3(3800);
                TIM1_SetCompare4(2499);
  }
  
}

使用特权

评论回复
板凳
yiyigirl2014| | 2018-3-10 09:35 | 只看该作者
这两个有冲突?会不会是库函数编写有错导致的。

使用特权

评论回复
地板
香水城| | 2018-3-12 15:51 | 只看该作者
你是用的STM8S103F吗?如果是20脚封装的。

PD4是TIM2_CH1的默认输出脚,若做重映射配置后会在pc5输出;
TIM1_CH2的输出需经过重映射后经PC7输出。

重映射后的结果是:TIM1_CH1==>PC6; TIM1_CH2==>PC7; TIM2_CH1==>PC5.

你再检查确认下。

使用特权

评论回复
5
FANSJ| | 2018-3-12 17:07 | 只看该作者
以前也遇到过

使用特权

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

本版积分规则

7

主题

64

帖子

1

粉丝