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.

[参考译文] CCS/TM4C1294NCPDT:TM4C1294NCPDT

Guru**** 2445440 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/631985/ccs-tm4c1294ncpdt-tm4c1294ncpdt

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

这是用于 PWM 的驱动程序。  我找到了如下错误。

#include
#include
#include "inc/hw_types.h"
#include "inc/hw_gpio.h"
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/pwm.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
#include "drivers/pinout.h"
#include "driverlib/rom_map.h"


//系统时钟变量
uint32_t g_ui32SysClock;

int main (void){

//1. 将时钟设置为以25MHz 的频率从晶体运行
G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN \
| SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);

//2. 使用启用系统控制中的 PWM 模块
//启用外设(端口 F)
SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);

//2b. 机密级别;解锁端口 F0以便我们可以使用它!!! >=O
while (!(SysCtlPeripheralReady (SYSCTL_Periph_GPIOF)));
HWREG (GPIO_PORTF_AHB_BAS+GPIO_O_LOCK)= GPIO_LOCK_KEY;
HWREG (GPIO_PORTF_AHB_BAS+GPIO_O_CR)|= GPIO_PIN_0;

//将引脚配置为 PWM 引脚
GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_0 | GPIO_PIN_1);
GPIOPinConfigure (GPIO_PF0_M0PWM0);

//3. 将 PWM 时钟设置为系统时钟/64
PWMClockSet (PWM0_BASE、PWM_SYSCLK_DIV_64);

//4. 配置 PWM 发生器
PWMGenConfigure (PWM0_BASE、PWM_GEN_0、(PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);

//5. 设置发生器的周期
//将 PWM 设置为以100Hz 的频率运行。 (n =(1 / f)* SYSCLK);(1 / 100Hz)*(120MHz/64)= 18750个周期
无符号长整型周期= 18750;
PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、PERIOD);

//6. 启用 PWM 输出
//启用 PWM1位0 (PF1)和位1 (PF2)输出信号。
PWMOutputState (PWM0_BASE、(PWM_OUT_0_BIT | PWM_OUT_1_BIT)、true);

//7. 设置脉冲宽度
PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0、(周期/2));

//8. 启用 PWM 发生器
PWMGenEnable (PWM0_BASE、PWM_GEN_0);

错误是这样的  

在程序的这个区域中标记错误、如下所示。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Azim、
    如果我将无符号长整型周期= 18750移动到 main()的正下方、则它的编译正常。

    int main (void){

    无符号长整型周期= 18750;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     此外、这是我遇到错误的死区 PWM 示例代码。

    //

    //

    // deat_band.c -演示死区发生器的示例。

    //

    //版权所有(c) 2010-2017 Texas Instruments Incorporated。  保留所有权利。

    //软件许可协议

    //

    // 以源代码和二进制形式重新分发和使用,有无

    // 如果满足以下条件,则允许进行修改

    // 满足:

    //

    // 重新分发源代码必须保留上述版权

    // 注意、此条件列表和以下免责声明。

    //

    // 二进制形式的重新分发必须复制上述版权

    // 注意、中的条件列表和以下免责声明

    // 随提供的文档和/或其他材料  

    // 分布。

    //

    // 德州仪器公司的名称和的名称都不是

    // 其贡献者可用于认可或推广衍生产品

    // 未经特定的事先书面许可,从该软件下载。

    //

    //本软件由版权所有者和作者提供

    //“原样”以及任何明示或暗示的保证,包括但不包括

    //限于对适销性和适用性的暗示保证

    //一个特定的目的是免责的。 在任何情况下、版权均不得

    //所有者或贡献者应对任何直接、间接、偶然、

    //特殊、典型或必然的损害(包括但不包括)

    //仅限于采购替代货物或服务;

    //数据或利润;或业务中断)

    //责任理论,无论是合同责任、严格责任还是侵权行为

    //(包括疏忽或其他)以任何方式因使用而产生

    //此软件,即使已被告知可能会发生此类损坏。

    //

    //这是 Tiva 固件开发包的修订版2.1.4.178的一部分。

    //

    //

    #include

    #include

    #include "inc/hw_memmap.h"

    #include "driverlib/gpio.h"

    #include "driverlib/pin_map.h"

    #include "driverlib/pwm.h"

    #include "driverlib/sysctl.h"

    #include "driverlib/uart.h"

    #include "utils/uartstdio.h"

    //

    //

    //! 添加组 PWM_Examples_list

    //!

    PWM 死区(死区)

    //!

    //! 此示例展示了如何使用死区生成来设置 PWM0模块。

    //!

    //! 此示例使用以下外设和 I/O 信号。  您必须执行的操作

    //! 查看这些内容并根据您自己的董事会的需要进行更改:

    //! - GPIO 端口 B 外设(用于 PWM 引脚)

    //! - M0PWM0 - PB6

    //! - M0PWM1 - PB7

    //!

    //! 以下 UART 信号仅配置为显示控制台

    //! 消息。  操作时不需要这些

    //! PWM。

    //! UART0外设

    //! - GPIO 端口 A 外设(用于 UART0引脚)

    //! - UART0RX - PA0

    //! - UART0TX - PA1

    //!

    //! 此示例使用以下中断处理程序。  来使用该示例

    //! 在您自己的应用程序中、您必须将这些中断处理程序添加到

    //! 矢量表。

    //! -无。

    //

    //

    //

    //

    //变量 g_ui32SysClock 包含系统时钟频率

    //

    //

    #if defined (target_IS_TM4C129_RA0)||                     \

      已定义(TARGET_IS_TM4C129_RA1)||                     \

      已定义(TARGET_IS_TM4C129_RA2)

    uint32_t g_ui32SysClock;

    #endif

    //

    //

    //此函数将 UART0设置为用于控制台显示信息

    //因为示例正在运行。

    //

    //

    无效

    InitConsole (空)

      //

      //启用用于 UART0引脚的 GPIO 端口 A。

      // TODO:将其更改为您正在使用的 GPIO 端口。

      //

      SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);

      //

      //为端口 A0和 A1上的 UART0功能配置引脚复用。

      //如果您的器件不支持引脚复用、则无需执行此步骤。

      // TODO:更改此选项以选择您正在使用的端口/引脚。

      //

      GPIOPinConfigure (GPIO_PA0_U0RX);

      GPIOPinConfigure (GPIO_PA1_U0TX);

      //

      //启用 UART0以便我们可以配置时钟。

      //

      SysCtlPeripheralEnable (SYSCTL_Periph_UART0);

      //

      //使用内部16MHz 振荡器作为 UART 时钟源。

      //

      UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC);

      //

      //为这些引脚选择替代(UART)功能。

      // TODO:更改此选项以选择您正在使用的端口/引脚。

      //

      GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);

      //

      //初始化控制台 I/O 的 UART

      //

      UARTStdioConfig (0、115200、16000000);

    //

    //

    //打印出5个“”。 每次打印后出现第二次延迟。  此函数将会

    //然后退格,清除先前打印的点,然后退格

    //这样您就可以在同一行上连续打印输出。  的目的

    //此函数用于向用户指示程序正在运行。

    //

    //

    无效

    PrintRunningDots (空)

      UARTprintf ("。 ");

    #if defined (target_IS_TM4C129_RA0)||                     \

      已定义(TARGET_IS_TM4C129_RA1)||                     \

      已定义(TARGET_IS_TM4C129_RA2)

      SysCtlDelay (g_ui32SysClock / 3);

    其他

      SysCtlDelay (SysCtlClockGet ()/3);

    #endif

      UARTprintf ("。 ");

    #if defined (target_IS_TM4C129_RA0)||                     \

      已定义(TARGET_IS_TM4C129_RA1)||                     \

      已定义(TARGET_IS_TM4C129_RA2)

      SysCtlDelay (g_ui32SysClock / 3);

    其他

      SysCtlDelay (SysCtlClockGet ()/3);

    #endif

      UARTprintf ("。 ");

    #if defined (target_IS_TM4C129_RA0)||                     \

      已定义(TARGET_IS_TM4C129_RA1)||                     \

      已定义(TARGET_IS_TM4C129_RA2)

      SysCtlDelay (g_ui32SysClock / 3);

    其他

      SysCtlDelay (SysCtlClockGet ()/3);

    #endif

      UARTprintf ("。 ");

    #if defined (target_IS_TM4C129_RA0)||                     \

      已定义(TARGET_IS_TM4C129_RA1)||                     \

      已定义(TARGET_IS_TM4C129_RA2)

      SysCtlDelay (g_ui32SysClock / 3);

    其他

      SysCtlDelay (SysCtlClockGet ()/3);

    #endif

      UARTprintf ("。 ");

    #if defined (target_IS_TM4C129_RA0)||                     \

      已定义(TARGET_IS_TM4C129_RA1)||                     \

      已定义(TARGET_IS_TM4C129_RA2)

      SysCtlDelay (g_ui32SysClock / 3);

    其他

      SysCtlDelay (SysCtlClockGet ()/3);

    #endif

      UARTprintf ("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");

      UARTprintf ("      ");

      UARTprintf ("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");

    #if defined (target_IS_TM4C129_RA0)||                     \

      已定义(TARGET_IS_TM4C129_RA1)||                     \

      已定义(TARGET_IS_TM4C129_RA2)

      SysCtlDelay (g_ui32SysClock / 3);

    其他

      SysCtlDelay (SysCtlClockGet ()/3);

    #endif

    //

    //

    //将 PWM0模块配置为死区生成。  该示例进行配置

    // PWM0模块在带死区的 PD0上生成25%占空比信号

    //生成。  这将在 PD1上生成 PD0的补码(75%占空比)。

    //死区发生器设置为具有10us 或160个周期延迟

    PD0 PWM 上升沿和下降沿上的//(160个周期/16MHz = 10us)

    //信号。

    //

    //

    内部

    main (空)

      //

      //将时钟设置为直接从外部晶振/振荡器运行。

      // TODO:必须更改 SYSCTL_XTAL_VALUE 以匹配的值

      板上的//晶体。

      //

    #if defined (target_IS_TM4C129_RA0)||                     \

      已定义(TARGET_IS_TM4C129_RA1)||                     \

      已定义(TARGET_IS_TM4C129_RA2)

      G_ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |

                        SYSCTL_OSC_MAIN |

                        SYSCTL_USE_OSC)、25000000);

    其他

      SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |

             SYSCTL_XTAL_16MHz);

    #endif

      //

      //将 PWM 时钟设置为系统时钟。

      //

      SysCtlPWMClockSet (SYSCTL_PWMDIV_1);

      //

      //设置用于显示消息的串行控制台。  这只是

      //对于此示例程序,PWM 操作不需要。

      //

      InitConsole();

      //

      //在控制台上显示设置。

      //

      UARTprintf ("PWM ->\n");

      UARTprintf (" 模块:PWM0\n");

      UARTprintf (" 引脚:PD0和 PD1\n");

      UARTprintf (" 特性:死区生成\n");

      UARTprintf (" 占空比:PD0为25%、PD1为75%);

      UARTprintf (" 死区长度:上升沿和下降沿上160个周期)\n\n";

      UARTprintf ("在 PWM0 (PD0)上生成 PWM ->");

      //

      //必须启用 PWM 外设才能使用。

      //

      SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);

      //

      //对于此示例、PWM0与 PortB 引脚6和7一起使用。  实际端口

      //和使用的引脚可能在您的器件上有所不同、请参阅的数据表

      //更多信息。  GPIO 端口 B 需要启用、以便可以启用这些引脚

      //已使用。

      // TODO:将其更改为您正在使用的 GPIO 端口。

      //

      SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);

      SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);

      //

      //配置 GPIO 引脚复用以选择这些引脚的 PWM 功能。

      //此步骤选择可用于这些引脚的替代功能。

      //如果您的器件支持 GPIO 引脚功能多路复用、这是必需的。

      //请查阅数据表以查看每个引脚分配的函数。

      // TODO:更改此选项以选择您正在使用的端口/引脚。

      //

      GPIOPinConfigure (GPIO_PF1_M0PWM1);

      GPIOPinConfigure (GPIO_PF2_M0PWM2);

      //

      //在引脚 PB6和 PB7上为 PWM 功能配置 GPIO 引脚。  请参阅

      //数据表以查看每个引脚分配的函数。

      // TODO:更改此选项以选择您正在使用的端口/引脚。

      //

      GPIOPinTypePWM (GPIO_PORTB_BASE、GPIO_PIN_6);

      GPIOPinTypePWM (GPIO_PORTB_BASE、GPIO_PIN_7);

      //

      //将 PWM0配置为在不同步的情况下进行递增/递减计数。

      //注意:启用死区发生器会自动将2耦合

      // PWM 模块的输出、因此我们不使用 PWM 同步。

      //

      PWMGenConfigure (PWM0_BASE、PWM_GEN_0、PWM_GEN_MODE_UP_DOWN |

              PWM_GEN_MODE_NO_SYNC);

      //

      //将 PWM 周期设置为250Hz。  以计算适当的参数

      //使用以下公式:n =(1 / f)* SYSCLK。  其中 N 是

      //函数参数、f 是所需的频率、SYSCLK 是

      //系统时钟频率。

      //在本例中、您得到:(1/250Hz)* 16MHz = 64000个周期。  请注意

      //可以设置的最大周期为2^16-1。

      // TODO:修改此计算以使用您当前的时钟频率

      //使用。

      //

      PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、64000);

      //

      //将 PWM0 PD0设置为25%的占空比。  您将占空比设置为

      //周期的函数。  由于周期是在上面设置的、因此您可以使用

      // PWMGenPeriodGet ()函数。  在本示例中、PWM 将为高电平

      // 25%的时间或16000个时钟周期(64000 /4)。

      //

      PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0、

              PWMGenPeriodGet (PWM0_BASE、PWM_GEN_0)/ 4);

      //

      //启用 PWM0输出信号上的死区生成。  PWM 位0

      //(PD0)将具有25%的占空比(在上面设置)、而 PWM 位1将具有该占空比

      //占空比为75%。  这些信号之间将有10us 的间隙

      //上升沿和下降沿。  这意味着、在 PWM 位1变为高电平之前、

      // PWM 位0至少已处于低电平160个周期(或10us)、也是如此

      //在 PWM 位0变为高电平之前。  死区发生器允许您指定

      // PWM 之前"死区"延迟的宽度、以 PWM 时钟周期为单位

      //信号在 PWM 信号下降后变为高电平。  在本示例中、我们

      //将在的上升沿和下降沿使用160个周期(或10us)

      // PD0。  有关死区的更多信息、请参阅数据表

      //生成。

      //

      PWMDeadBandEnable (PWM0_BASE、PWM_GEN_0、160、160);

      //

      //启用 PWM0位0 (PD0)和位1 (PD1)输出信号。

      //

      PWMOutputState (PWM0_BASE、PWM_OUT_1_BIT | PWM_OUT_0_BIT、TRUE);

      //

      //启用 PWM 发生器模块的计数器。

      //

      PWMGenEnable (PWM0_BASE、PWM_GEN_0);

      //

      //在生成 PWM 信号时永久循环。

      //

      while (1)

      {

        //

        //控制台上显示程序正在运行的打印输出指示。

        //

        PrintRunningDots();

      }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们是否可以注意到这一(最后)代码发布是最常见的、"对于帮助者的读取/审查、是困难和不友好的?"
    所有这些"注释掉"代码行"耗尽读者的兴趣并使其无聊"-它们不是吗?   

    您是否在演示文稿中将您的"易用性和速度"交易为"帮手帮手"?   (答案:显然是!)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Azim、

    对于您报告的第二个错误,您似乎在同一个项目中包含了两个 main()函数。 在给定的项目中只能有一个 main()函数。 找到您不需要的两个选项中的哪一个、将其删除、然后重试。