This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TM4C123g,在使用PWM例程时,头文件处出错打不开

Other Parts Discussed in Thread: TM4C123GH6PM

//PWM实验程序解析
//头文件
#include <stdint.h>
#include <stdbool.h>

#include "inc/hw_memmap.h"  
#include "inc/hw_types.h"
#include "driverlib/sysctl.h"
#include "driverlib/rom.h"
#include "driverlib/gpio.h"
#include "driverlib/pwm.h"
#include "driverlib/fpu.h"
#include "driverlib/pin_map.h"




#include "math.h"


int main (void)
{
  //使能FPU
  FPUEnable();
  FPULazyStackingEnable();

  //设置系统时钟为50MHz
  SysCtlClockSet(SYSCTL_SYSDIV_4 |SYSCTL_USE_PLL
|SYSCTL_OSC_MAIN |SYSCTL_XTAL_16MHZ);

  //使能PWM模块
  ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM);
  //使能PWM2和PWM3输出所在GPIO
  ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);
  //配置PH0/PH1为PWM功能
  ROM_GPIOPinTypePWM(GPIO_PORTH_BASE, GPIO_PIN_0);
  ROM_GPIOPinTypePWM(GPIO_PORTH_BASE, GPIO_PIN_1);

  // PWM时钟配置:不分频
  ROM_SysCtlPWMClockSet(SYSCTL_PWMDIV_1);
  //配置PWM发生器1:加减计数
  ROM_PWMGenConfigure(PWM_BASE,
                    PWM_GEN_0,PWM_GEN_MODE_UP_DOWN
| PWM_GEN_MODE_NO_SYNC);
   //设置PWM发生器1的周期
  ROM_PWMGenPeriodSet(PWM_BASE, PWM_GEN_0, 6000);
  //设置PWM2/PWM3输出的脉冲宽度
  ROM_PWMPulseWidthSet(PWM_BASE, PWM_OUT_0, 4200);
  ROM_PWMPulseWidthSet(PWM_BASE, PWM_OUT_1, 1800);
  //使能PWM2和PWM3的输出
  ROM_PWMOutputState(PWM_BASE, (PWM_OUT_0_BIT |
                       PWM_OUT_1_BIT), true);
  //使能PWM发生器1
  ROM_PWMGenEnable(PWM0_BASE, PWM_GEN_0);

while(1);
   {
   }
}



配置了路径,其他程序能正常运行,使用这个的时候,显示“#include "inc/hw_memmap.h"”错误打不开,我特意找了下,在包含的路径下啊。

 

                     

  • 那个芯片的宏定义在CCS中配置了没有。估计是那里没有配置。

  • /*******************************************
    开发坏境:CCSv5
    程序功能:利用PWM模块产生占空比自动从0.1%到100%循环调节的PWM波
    程序说明:使用PWM模块0,PWM发生器0,输出为PWM0管脚,PB6 利用PWM中断
    编程者:Linchpin
    ********************************************/
    #include <stdbool.h>
    #include <stdint.h>
    #include "inc/hw_ints.h"
    #include "inc/hw_memmap.h"
    #include "driverlib/gpio.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/pwm.h"
    #include "driverlib/sysctl.h"
    
    unsigned int PWM_Value=1852; //PWM占空比调节
    
    void PWM0IntHandler(void)
    {
        PWMGenIntClear(PWM0_BASE, PWM_GEN_0, PWM_INT_CNT_LOAD);
    
        if((PWMPulseWidthGet(PWM0_BASE, PWM_OUT_0) + 64) <=
           (PWMGenPeriodGet(PWM0_BASE, PWM_GEN_0) ))
        {
            PWMPulseWidthSet(PWM0_BASE, PWM_OUT_0,
                             PWMPulseWidthGet(PWM0_BASE, PWM_OUT_0) + 64);
        }
        else
        {
            PWMPulseWidthSet(PWM0_BASE, PWM_OUT_0, 64);
        }
    }
    
    int main(void)
    {
        SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
        SysCtlPWMClockSet(SYSCTL_PWMDIV_1);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM0);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
        GPIOPinConfigure(GPIO_PB6_M0PWM0);
        GPIOPinTypePWM(GPIO_PORTB_BASE, GPIO_PIN_6);
    
        PWMGenConfigure(PWM0_BASE, PWM_GEN_0, PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);
        PWMGenPeriodSet(PWM0_BASE, PWM_GEN_0, PWM_Value);//250HZ
    
        PWMPulseWidthSet(PWM0_BASE, PWM_OUT_0, PWM_Value/2);//占空比0.1%
    
        IntMasterEnable();
        PWMIntEnable(PWM0_BASE, PWM_INT_GEN_0);
        // Enable the PWM0 LOAD interrupt on PWM0.
        PWMGenIntTrigEnable(PWM0_BASE, PWM_GEN_0, PWM_INT_CNT_LOAD);
        IntEnable(INT_PWM0_0);
    
        PWMOutputState(PWM0_BASE, PWM_OUT_0_BIT, true);
        PWMGenEnable(PWM0_BASE, PWM_GEN_0);
        while(1);
    }

    想做一个占空比可变的PWM波,在网上找到一个,可是运行后占空比没有变化啊。。。。。

    是我管脚找错了吗。。。?

  • 第一个已经解决、、、

    忘记预定义了、、、

    PART_TM4C123GH6PM
  • 看看我发表的那个帖子,清华大学的那个PWM的例程。

  • 建立工程了,请问PWM_BASE和SYSCTL_PERIPH_PWM应该定义什么?

  • /*******************************************
     开发坏境:CCSv5
     程序功能:利用PWM模块产生两路方波
     程序说明:使用PWM模块0,PWM发生器0,输出为PWM0和PWM1管脚,分别为PB6,PB7
     编程者:Linchpin
     ********************************************/
     #include <stdint.h>
     #include <stdbool.h>
     #include "inc/hw_memmap.h"
     #include "inc/hw_types.h"
     #include "driverlib/sysctl.h"
     #include "driverlib/rom.h"
     #include "driverlib/gpio.h"
     #include "driverlib/pwm.h"
     #include "driverlib/fpu.h"
     #include "driverlib/pin_map.h"
    
    int main (void)
     {
             //使能FPU
             FPUEnable();
             FPULazyStackingEnable();
             //设置系统时钟为80MHz
             SysCtlClockSet(SYSCTL_SYSDIV_2_5 |SYSCTL_USE_PLL|SYSCTL_OSC_MAIN |SYSCTL_XTAL_16MHZ);
             SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM0);//使能PWM0模块
             SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//使能PWM0和PWM1输出所在GPIO
             GPIOPinTypePWM(GPIO_PORTB_BASE, GPIO_PIN_6);
             GPIOPinTypePWM(GPIO_PORTB_BASE, GPIO_PIN_7);//配置PH0/PH1为PWM功能
             GPIOPinConfigure(GPIO_PB6_M0PWM0);    //#define GPIO_PB6_M0PWM0         0x00011804
             GPIOPinConfigure(GPIO_PB7_M0PWM1);    //#define GPIO_PB7_M0PWM1         0x00011C04
             SysCtlPWMClockSet(SYSCTL_PWMDIV_1);     // PWM时钟配置:不分频
             //配置PWM发生器0:加减计数,不同步
             PWMGenConfigure(PWM0_BASE,PWM_GEN_0,PWM_GEN_MODE_UP_DOWN| PWM_GEN_MODE_NO_SYNC);
             //设置PWM发生器1的频率,时钟频率/PWM分频数/n,80M/1/800=100KHZ
             PWMGenPeriodSet(PWM0_BASE, PWM_GEN_0, 800);
             //设置PWM0/PWM1输出的脉冲宽度
             PWMPulseWidthSet(PWM0_BASE, PWM_OUT_0, 400);//50%占空比
             PWMPulseWidthSet(PWM0_BASE, PWM_OUT_1, 200);//25%占空比
             //使能PWM0和PWM1的输出
             PWMOutputState(PWM0_BASE, (PWM_OUT_0_BIT |PWM_OUT_1_BIT), true);
             //使能PWM发生器
             PWMGenEnable(PWM0_BASE, PWM_GEN_0);
             while(1);
     }
    

    在网上找到的,

    听说是因为之前(我直接用的清华教材板教程例题里的C文件)没有加“pin_map”?

  • 你那些提示没定义的,应该就是都在pin_map中定义了。

  • 你好!

    很谢谢你的回复~~不过能顺便帮忙看看PWM占空比自动调节是哪儿写得有问题吗?能正确编译,运行后测PB6脚,占空比为50%没有变化。想做一个自动调节的程序。谢谢了!

    /*******************************************
    开发坏境:CCSv5
    程序功能:利用PWM模块产生占空比自动从0.1%到100%循环调节的PWM波
    程序说明:使用PWM模块0,PWM发生器0,输出为PWM0管脚,PB6 利用PWM中断
    编程者:Linchpin
    ********************************************/
    #include <stdbool.h>
    #include <stdint.h>
    #include "inc/hw_ints.h"
    #include "inc/hw_memmap.h"
    #include "driverlib/gpio.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/pwm.h"
    #include "driverlib/sysctl.h"
    
    unsigned int PWM_Value=1852; //PWM占空比调节
    
    void PWM0IntHandler(void)
    {
        PWMGenIntClear(PWM0_BASE, PWM_GEN_0, PWM_INT_CNT_LOAD);
    
        if((PWMPulseWidthGet(PWM0_BASE, PWM_OUT_0) + 64) <=
           (PWMGenPeriodGet(PWM0_BASE, PWM_GEN_0) ))
        {
            PWMPulseWidthSet(PWM0_BASE, PWM_OUT_0,
                             PWMPulseWidthGet(PWM0_BASE, PWM_OUT_0) + 64);
        }
        else
        {
            PWMPulseWidthSet(PWM0_BASE, PWM_OUT_0, 64);
        }
    }
    
    int main(void)
    {
        SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
        SysCtlPWMClockSet(SYSCTL_PWMDIV_1);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM0);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
        GPIOPinConfigure(GPIO_PB6_M0PWM0);
        GPIOPinTypePWM(GPIO_PORTB_BASE, GPIO_PIN_6);
    
        PWMGenConfigure(PWM0_BASE, PWM_GEN_0, PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);
        PWMGenPeriodSet(PWM0_BASE, PWM_GEN_0, PWM_Value);//250HZ
    
        PWMPulseWidthSet(PWM0_BASE, PWM_OUT_0, PWM_Value/2);//占空比0.1%
    
        IntMasterEnable();
        PWMIntEnable(PWM0_BASE, PWM_INT_GEN_0);
        // Enable the PWM0 LOAD interrupt on PWM0.
        PWMGenIntTrigEnable(PWM0_BASE, PWM_GEN_0, PWM_INT_CNT_LOAD);
        IntEnable(INT_PWM0_0);
    
        PWMOutputState(PWM0_BASE, PWM_OUT_0_BIT, true);
        PWMGenEnable(PWM0_BASE, PWM_GEN_0);
        while(1);
    }

  • 看了看,程序大体是没什么问题的,建议你单步调试如下

    1.PWM中断进去了没

    2.PWM中断进去,为什么该改变的值没有改变呢,这个跟踪寄存器看看

  • 单步调试不了、、、、每次只要单步调试、就会跳出一堆的错误,说某些文件的路径找不到,有的还能在电脑里找到,有次给的.h我都不知道应该到哪儿找,搜索都没搜到、、、

  • 明显工程就没建好,PWM能运行才怪。。。先建好工程去,看看俺发表的那个帖子。