PWM功能复用的问题



我的产品要用到PWM,我编写以下程序:

void PWM_Init()

{

 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);                        /*  使能PWM输出所在GPIO  */

   SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM);                         /*  使能PWM模块                 */

   SysCtlPWMClockSet(SYSCTL_PWMDIV_1);                                 /*  PWM时钟配置:不分频         */

 GPIOPinConfigure(GPIO_PF0_PWM);

   GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_0);                        /*  PF0配置为PWM功能  D7          */

   GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_1);                        /*  PF1配置为PWM功能  D6          */

   GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_2);                        /*  PF2配置为PWM功能  D5          */

  GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_3);                        /*  PF3配置为PWM功能  D4          */

   PWMGenConfigure(PWM_BASE, PWM_GEN_3,                                /*  配置PWM发生器1:加减计数    */

                   PWM_GEN_MODE_DOWN );

   PWMGenPeriodSet(PWM_BASE, PWM_GEN_3, 6000);                         /*  设置PWM发生器1的周期        */

   PWMPulseWidthSet(PWM_BASE, PWM_OUT_4, 4200);                        /*  设置PWM4输出的脉冲宽度      */

   PWMPulseWidthSet(PWM_BASE, PWM_OUT_5, 1800);                        /*  设置PWM5输出的脉冲宽度      */

 PWMPulseWidthSet(PWM_BASE, PWM_OUT_6, 1000);                        /*  设置PWM6输出的脉冲宽度      */

 PWMPulseWidthSet(PWM_BASE, PWM_OUT_7, 500);                         /*  设置PWM7输出的脉冲宽度      */

   PWMOutputState(PWM_BASE, (PWM_OUT_4_BIT | PWM_OUT_5_BIT | PWM_OUT_6_BIT | PWM_OUT_7_BIT), true);    /*  使能PWM输出 */

   PWMGenEnable(PWM_BASE, PWM_GEN_3);                                  /*  使能PWM发生器1,            */

                                                                       /*  开始产生PWM方波             */

// while(1);

}

在编译的时候这句编译不过.

GPIOPinConfigure(GPIO_PF0_PWM);提示没有定义.请问GPIO_PF0_PWM是在哪个文件定义的呢?我加的头文件有:

#include "inc/hw_ints.h"

#include "inc/hw_memmap.h"

#include "inc/hw_pwm.h"

#include "inc/hw_sysctl.h"

#include "inc/hw_types.h"

#include "driverlib/debug.h"

#include "driverlib/interrupt.h"

#include "driverlib/pwm.h"

#include "led-test.h"

#include "driverlib/gpio.h"

要怎么解决?谢谢!!!

  • #include "driverlib/pin_map.h"

    在此头文件中定义。

  • void PWM_Init()

    {

     SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);                       /*  使能PWM输出所在GPIO  */

       SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM);                         /*  使能PWM模块                 */

       SysCtlPWMClockSet(SYSCTL_PWMDIV_1);                                 /*  PWM时钟配置:不分频         */

       GPIOPinConfigure(GPIO_PF3_M1PWM7);

     GPIOPinConfigure(GPIO_PF2_M1PWM6);

     GPIOPinConfigure(GPIO_PF1_M1PWM5);

     GPIOPinConfigure(GPIO_PF0_M1PWM4);

       GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_0);                        /*  PF0配置为PWM功能  D7          */

       GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_1);                        /*  PF1配置为PWM功能  D6          */

       GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_2);                        /*  PF2配置为PWM功能  D5          */

      GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_3);                        /*  PF3配置为PWM功能  D4          */

       PWMGenConfigure(PWM_BASE, PWM_GEN_3,                                /*  配置PWM发生器1:加减计数    */

                       PWM_GEN_MODE_DOWN );

       PWMGenPeriodSet(PWM_BASE, PWM_GEN_3, 6000);                         /*  设置PWM发生器1的周期        */

       PWMPulseWidthSet(PWM_BASE, PWM_OUT_4, 4200);                        /*  设置PWM4输出的脉冲宽度      */

       PWMPulseWidthSet(PWM_BASE, PWM_OUT_5, 1800);                        /*  设置PWM5输出的脉冲宽度      */

     PWMPulseWidthSet(PWM_BASE, PWM_OUT_6, 1000);                        /*  设置PWM6输出的脉冲宽度      */

     PWMPulseWidthSet(PWM_BASE, PWM_OUT_7, 500);                         /*  设置PWM7输出的脉冲宽度      */

       PWMOutputState(PWM_BASE, (PWM_OUT_4_BIT | PWM_OUT_5_BIT | PWM_OUT_6_BIT | PWM_OUT_7_BIT), true);    /*  使能PWM输出 */

       PWMGenEnable(PWM_BASE, PWM_GEN_3);                                  /*  使能PWM发生器1,            */

                                                                           /*  开始产生PWM方波             */

    while(1);

    }

    奇怪,为什么PWM没有输出呢?能帮我看看配置有没有问题吗?

  • andy chang :

     在你看的DATASHEET的查PF0,应该是PF0有复用NMI管脚功能,要做点其他操作才能用作PWM功能

  •  你可以将下面的代码加上试下,PF0默认情况下是不能作为常规外设功能使用,需要将其解锁并设置为相关外设使用。

        //配置PF0为GPIO功能,PF0默认为NMI功能;          

        HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY_DD;

            HWREG(GPIO_PORTF_BASE + GPIO_O_CR) = 0x01;

            HWREG(GPIO_PORTF_BASE + GPIO_O_AFSEL) &= 0xfe;

            HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = 0;

  • 问题解决!

    把SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM);            改为SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM1);              后面所有PWM_BASE    改为PWM1_BASE.

    还是要谢谢技术工程师的帮助.          

  • andy chang :

      那是因为PWM1并未占用NMI管脚