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.

[参考译文] TM4C1290NCZAD:PWM 中断未被处理

Guru**** 2442090 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/597301/tm4c1290nczad-pwm-interrupt-not-handled

器件型号:TM4C1290NCZAD

您好!

我尝试使用我已获得社区但 PWM 中断例程未处理的代码生成 PWM。 附加了代码。 请求查看并告知可能出现的问题。

我也更新了启动文件。

请不要考虑这些评论、因为它们与代码没有正确的关联。

//
//
// reload _interrupt.c -演示 PWM 中断的示例。
//
//版权所有(c) 2010-2014 Texas Instruments Incorporated。  保留所有权利。
//软件许可协议
//
//  以源代码和二进制形式重新分发和使用,有无
//  如果满足以下条件,则允许进行修改
//  满足:
//
//  重新分发源代码必须保留上述版权
//  注意、此条件列表和以下免责声明。
//
//  二进制形式的重新分发必须复制上述版权
//  注意、中的条件列表和以下免责声明
//  随提供的文档和/或其他材料
//  分布。
//
//  德州仪器公司的名称和的名称都不是
//  其贡献者可用于认可或推广衍生产品
//  未经特定的事先书面许可,从该软件下载。
//
//本软件由版权所有者和作者提供
//“原样”以及任何明示或暗示的保证,包括但不包括
//限于对适销性和适用性的暗示保证
//一个特定的目的是免责的。 在任何情况下、版权均不得
//所有者或贡献者应对任何直接、间接、偶然、
//特殊、典型或必然的损害(包括但不包括)
//仅限于采购替代货物或服务;
//数据或利润;或业务中断)
//责任理论,无论是合同责任、严格责任还是侵权行为
//(包括疏忽或其他)以任何方式因使用而产生
//此软件,即使已被告知可能会发生此类损坏。
//
//这是 Tiva 固件开发包的版本2.1.0.12573的一部分。
//
//

#include
#include
#include "C:/ti/TivaWare_C_Series-2.1.4.178/inc/hw_gpio.h "
#include "C:/ti/TivaWare_C_Series-2.1.4.178/inc/hw_ints.h "
#include "C:/ti/TivaWare_C_Series-2.1.4.178/inc/hw_memmap.h "
#include "C:/ti/TivaWare_C_Series-2.1.4.178/inc/hw_types.h "
#include "C:/ti/TivaWare_C_Series-2.1.4.178/driverlib/gpio.h "
#include "C:/ti/TivaWare_C_Series-2.1.4.178/driverlib/interrupt.h "
#include "C:/ti/TivaWare_C_Series-2.1.4.178/driverlib/pin_map.h "
#include "C:/ti/TivaWare_C_Series-2.1.4.178/driverlib/pwm.h "
#include "C:/ti/TivaWare_C_Series-2.1.4.178/driverlib/sysctl.h "
#include "C:/ti/TivaWare_C_Series-2.1.4.178/driverlib/uart.h "
#include "C:/ti/TivaWare_C_Series-2.1.4.178/utils/uartstdio.h "

uint32_t ui32SysClock;
//
//
//! 添加组 PWM_Examples_list
//!

PWM 重载中断(RELOAD_INTERRUPT)


//!
//! 此示例展示了如何在 PWM0上设置中断。  此示例
//! 演示了如何在 PWM 计时器计时时在 PWM 上设置中断
//! 等于可配置的 PWM0LOAD 寄存器。
//!
//! 此示例使用以下外设和 I/O 信号。  您必须执行的操作
//! 查看这些内容并根据您自己的董事会的需要进行更改:
//! - GPIO 端口 B 外设(用于 PWM0引脚)
//! PWM0 - PB6
//!
//! 以下 UART 信号仅配置为显示控制台
//! 消息。  操作时不需要这些
//! PWM。
//! UART0外设
//! - GPIO 端口 A 外设(用于 UART0引脚)
//! - UART0RX - PA0
//! - UART0TX - PA1
//!
//! 此示例使用以下中断处理程序。  来使用该示例
//! 在您自己的应用程序中、您必须将这些中断处理程序添加到
//! 矢量表。
//! - INT_PWM0_0 - PWM0IntHandler
//
//

//
//
//此函数将 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 ("。 ");
   SysCtlDelay (ui32SysClock / 3);
   UARTprintf ("。 ");
   SysCtlDelay (ui32SysClock / 3);
   UARTprintf ("。 ");
   SysCtlDelay (ui32SysClock / 3);
   UARTprintf ("。 ");
   SysCtlDelay (ui32SysClock / 3);
   UARTprintf ("。 ");
   SysCtlDelay (ui32SysClock / 3);
   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");
   SysCtlDelay (ui32SysClock / 3);


//
//
// PWM0中断的中断处理程序。
//
//
无效
PWM0IntHandler (空)



   //清除 PWM0装载中断标志。  该标志在 PWM 时置1
   //计数器重新加载。
   //
   PWMGenIntClear (PWM0_BASE、PWM_GEN_0、PWM_INT_CNT_LOAD);
   //SysCtlPeripheralEnable (SYSCTL_Periph_GPIOQ);
   //GPIOPinWrite (GPIO_PORTQ_BASE、GPIO_PIN_7、GPIO_PIN_7);
   //
   //如果占空比小于或等于75%,则将0.1%添加到占空比中
   //循环。  否则、将占空比重置为0.1%周期。  请注意、64是
   //周期的0.01%(64000个周期)。
   //
   if ((PWMPulseWidthGet (PWM0_BASE、PWM_OUT_1)+ 64)<=
      ((PWMGenPeriodGet (PWM0_BASE、PWM_GEN_0)* 3)/ 4))
   {
       PWMPulseWidthSet (PWM0_BASE、PWM_OUT_1、
                        PWMPulseWidthGet (PWM0_BASE、PWM_OUT_1)+ 64);
   }
   其他
   {
       PWMPulseWidthSet (PWM0_BASE、PWM_OUT_1、64);
   }


//
//
//为加载中断配置 PWM0。  该中断将每次触发
//重新加载 PWM0计数器。  在中断中、0.1%将被添加到中
//当前占空比。  这将一直持续到75%的占空比
//接收到、则占空比将重置为0.1%。
//
//
内部
main (空)

   //
   //从 PLL 以120MHz 运行。
   //
   ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
                                          SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
                                          SYSCTL_CFG_VCO_480)、120000000);

   //
   //设置用于显示消息的串行控制台。  这是
   //仅针对此示例程序,PWM0操作不需要。
   //
   InitConsole();

   //
   //在控制台上显示设置。
   //
   UARTprintf ("PWM ->\n");
   UARTprintf (" 模块:PWM0\n");
   UARTprintf (" 引脚:PD0\n");
   UARTprintf (" 占空比:变量->");
   UARTprintf ("0.1%至75%、增量为0.1%。\n"\});
   UARTprintf (" 功能:");
   UARTprintf ("使用重新加载中断完成的可变脉冲宽度。\n\n");
   UARTprintf ("在 PWM0 (PF0)上生成 PWM ->");
   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   // GPIO 设置//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

   SysCtlPeripheralEnable (SYSCTL_Periph_GPIOQ);

      //
      //检查是否启用了外设访问。
      //
      while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOQ))
      {
      }

      //
      //为 LED 启用 GPIO 引脚(PQ7)。  将方向设置为输出、然后
      //启用 GPIO 引脚以实现数字功能。
      //

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

     // GPIOPinWrite (GPIO_PORTQ_BASE、GPIO_PIN_7、GPIO_PIN_7);
   //
   //必须启用 PWM 外设才能使用。
   //
   SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);
   //
   //对于此示例、PWM0与 PortB 引脚6一同使用。  实际端口和引脚
   //您的器件上使用的可能不同、请参阅数据表以了解更多信息
   //信息。  GPIO 端口 B 需要启用、以便可以使用这些引脚。
   // TODO:将其更改为您正在使用的 GPIO 端口。
   //
   SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
   while (!SysCtlPeripheralReady (SYSCTL_Periph_PWM0))
   {
   }

   SysCtlDelay (10);

   //
   //配置 GPIO 引脚复用以选择这些引脚的 PWM00功能。
   //此步骤选择可用于这些引脚的替代功能。
   //如果您的器件支持 GPIO 引脚功能多路复用、这是必需的。
   //请查阅数据表以查看每个引脚分配的函数。
   // TODO:更改此选项以选择您正在使用的端口/引脚。
   //
   HWREG (GPIO_PORTF_BASE + GPIO_LO_LOCK)= GPIO_LOCK_KEY;

   HWREG (GPIO_PORTF_BASE + GPIO_O_CR) = 0x01;

   GPIOPinConfigure (GPIO_PF1_M0PWM1);

   //
   //为此引脚配置 PWM 功能。
   //请查阅数据表以查看每个引脚分配的函数。
   // TODO:更改此选项以选择您正在使用的端口/引脚。
   //
   GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_1);

   //
   //将 PWM 时钟设置为系统时钟。
   //
   PWMClockSet (PWM0_BASE、PWM_SYSCLK_DIV_1);

   //
   //将 PWM0配置为在不同步的情况下递减计数。
   //
   PWMGenConfigure (PWM0_BASE、PWM_GEN_0、
                   PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);

   //
   //将 PWM 周期设置为250Hz。  以计算适当的参数
   //使用以下公式:n =(1 / f)* SYSCLK。  其中 N 是
   //函数参数、f 是所需的频率、SYSCLK 是
   //系统时钟频率。
   //在本例中、您得到:(1/250Hz)* 16MHz = 64000个周期。  请注意
   //可以设置的最大周期为2^16。
   //
   PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、64000);

   //
   //对于此示例、PWM0占空比将是可变的。  占空比
   //将从0.1%开始(0.01 * 64000个周期= 640个周期)并将增加
   //至75%(0.5 * 64000个周期= 32000个周期)。  在75%的占空比后
   //、它被重置为0.1%。  脉冲的动态调整
   //宽度在 PWM0装载中断中完成、这会增加占空比
   //每次收到重新加载中断时,循环0.1%。
   //
   PWMPulseWidthSet (PWM0_BASE、PWM_OUT_1、64);

   IntEnable (INT_PWM0_1);

   //
   //允许 PWM0产生中断。  此配置是针对完成的
   //区分故障中断与其他 PWM0相关的中断。
   //
   PWMIntEnable (PWM0_BASE、PWM_INT_GEN_0);
   IntMasterEnable();
   //
   //启用处理器中断。
   //
   PWMGenIntTrigEnable (PWM0_BASE、PWM_GEN_0、PWM_INT_CNT_LOAD);

   //
    //在处理器(NVIC)上启用 PWM0中断。
    //

   //
   //在 PWM0上启用 PWM0装载中断。
   //





   //
   //启用 PWM0输出信号(PD0)。
   //


   PWMOutputState (PWM0_BASE、PWM_OUT_1_BIT、TRUE);

   //
   //启用 PWM 发生器模块。
   //
  PWMGenEnable (PWM0_BASE、PWM_GEN_0);
   //UARTprintf ("17/n");
   //
   //在 PWM 信号生成和 PWM0中断时永久循环
   //接收。
   //
   while (1)
   {
       //
       //控制台上显示程序正在运行的打印输出指示。
       //
      //PWMIntEnable (PWM0_BASE、PWM_INT_GEN_0);
      //UARTprintf ("中断\n");
      PrintRunningDots();
   }


感谢你的帮助

Shijin

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

    您尚未解释 PWM 中断的必要性-这(真的)是必需的吗?

    您应该通过采用供应商的示例 PWM 代码来实现适当的 PWM 输出-这是"更快、更容易"的。   (示例/外设/PWM)

    提供的代码跳跃-需要您的帮助者投入大量时间/精力-并且它不能(真正)保证它能够正常工作。   (或适合您使用!)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您尚未解释 PWM 中断的必要性-是(真正)必需的。

    如果您可以(暂时)放弃 PWM 中断、则采用供应商的示例 PWM 代码应该会"更快、更容易"(而不是这种跳线)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    同意您的观点、即在不执行中断的情况下工作。

    感谢您的支持。