您好!
我尝试使用我已获得社区但 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