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.

TM4C123GH6PM定时器中断执行不了问题

#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
#include "driverlib/fpu.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/systick.h"
#include "driverlib/interrupt.h"
#include "driverlib/pwm.h"
#include "driverlib/timer.h"

#define uint unsigned int
const uint spwm[256] = {
0x4000,0x4405,0x4805,0x4BFE,0x4FEA,0x53C7,0x578F,0x5B40,0x5ED5,0x624A,
0x659E,0x68CB,0x6BCF,0x6EA7,0x714F,0x73C6,0x7609,0x7815,0x79E8,0x7B81,
0x7CDD,0x7DFC,0x7EDD,0x7F7E,0x7FDF,0x7FFF,0x7FDF,0x7F7E,0x7EDD,0x7DFC,
0x7CDD,0x7B81,0x79E8,0x7815,0x7609,0x73C6,0x714F,0x6EA7,0x6BCF,0x68CB,
0x659E,0x624A,0x5ED5,0x5B40,0x578F,0x53C7,0x4FEA,0x4BFE,0x4805,0x4405,
0x4000,0x3BFB,0x37FB,0x3402,0x3016,0x2C39,0x2871,0x24C0,0x212B,0x1DB6,
0x1A62,0x1735,0x1431,0x1159,0x0EB1,0x0C3A,0x09F7,0x07EB,0x0618,0x047F,
0x0323,0x0204,0x0123,0x0082,0x0021,0x0001,0x0021,0x0082,0x0123,0x0204,
0x0323,0x047F,0x0618,0x07EB,0x09F7,0x0C3A,0x0EB1,0x1159,0x1431,0x1735,
0x1A62,0x1DB6,0x212B,0x24C0,0x2871,0x2C39,0x3016,0x3402,0x37FB,0x3BFB
} ;
#define uint unsigned int
#define uchar unsigned char
uint i = 0;
//定时器中断处理程序
void Timer0IntHandler(void)
{
//清除定时器中断
TimerIntClear(TIMER0_BASE,TIMER_TIMA_TIMEOUT);

GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_2,GPIO_PIN_2);
i = 1;

//IntMasterDisable();
//IntMasterEnable();
}

//两路PWM输出,反相互补
void init_pwm()
{
SysCtlPWMClockSet(SYSCTL_PWMDIV_1);//设置PWM所使用的时钟
//InitConsole();//初始化UART
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM1);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);//使能F系列端口,供后置使用
GPIOPinConfigure(GPIO_PF3_M1PWM7);
GPIOPinConfigure(GPIO_PF2_M1PWM6);//配置GPIO口的输出状态
GPIOPinTypePWM(GPIO_PORTF_BASE,GPIO_PIN_2|GPIO_PIN_3);//配置F2为PWM模式

PWMGenConfigure(PWM1_BASE,PWM_GEN_3,PWM_GEN_MODE_UP_DOWN|PWM_GEN_MODE_NO_SYNC);//PWM1,发生器1,先增再减,异步模式

PWMGenPeriodSet(PWM1_BASE,PWM_GEN_3,6400);//周期为2500HZ(16M÷250 = 6400)
//设置PWM的占空比,设置模块1,输出6,获取PWM周期T,再T/4就是占空比为25%

//PWMPulseWidthSet(PWM1_BASE,PWM_OUT_6,(5*PWMGenPeriodGet(PWM1_BASE,PWM_GEN_3))/8);
// PWMPulseWidthSet(PWM1_BASE,PWM_OUT_7,(5*PWMGenPeriodGet(PWM1_BASE,PWM_GEN_3))/12);
PWMOutputState(PWM1_BASE,PWM_OUT_6_BIT,true);//PWM6bit,true

PWMOutputState(PWM1_BASE,PWM_OUT_7_BIT,true);

PWMGenEnable(PWM1_BASE,PWM_GEN_3);//发生器模块1

//while(1)
//{
// for(i = 10; i > 0;i--){
// PWMPulseWidthSet(PWM1_BASE,PWM_OUT_6,PWMGenPeriodGet(PWM1_BASE,PWM_GEN_3)/i);

// PWMOutputInvert(PWM1_BASE,PWM_OUT_6_BIT,false);
PWMOutputInvert(PWM1_BASE,PWM_OUT_6_BIT,true);//反相输出
}
int main()
{

//浮点型运算
FPULazyStackingEnable();

SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,GPIO_PIN_2);
//使能TIMER0使用的外设
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
// init_pwm();

//使能处理器中断
IntMasterEnable();
//配置定时器的属性为:全宽实时时钟定时器
TimerConfigure(TIMER0_BASE,TIMER_CFG_PERIODIC);



//PWMPulseWidthSet(PWM1_BASE,PWM_OUT_6,(5*PWMGenPeriodGet(PWM1_BASE,PWM_GEN_3))/8);
//配置装载值
TimerLoadSet(TIMER0_BASE,TIMER_A,SysCtlClockGet());
//配置定时器的超时中断
IntEnable(INT_TIMER0A);
TimerIntEnable(TIMER0_BASE,TIMER_TIMA_TIMEOUT);
//使能定时器0
TimerEnable(TIMER0_BASE,TIMER_A);

while(1)
{

}

------------------------------------------------------------------------------------------------------------------------------------------------------------

上面是代码部分,我设置一个GPIO输出想看看定时器中断的结果,后来发现根本进不去中断,而且在“DEBUG”模式中没办法在定时器中断处理程序中设置断点,求解答。本代码本来是想用来产生SPWM波的,但是定时器都不能使用了。。。求指点

  • 我只想问,你启动文件中添加中断函数了吗?

  • 就是在setup中添加吗

  • 启动文件是在startup_ccs.c这个文件中的,前提是你用的是ccs。

  • 我用的keil 5 里面有 startup.s文件,我想问的是直接添加进向量表就可以就行了嘛,还有就是我要用定时器捕获一个频率发生器的频率怎么做

  • 你的startup.s是官方提供的吗,是pack包提供的吗?贴上来看看。我建议你直接用tivaware中提供的startup_rvmdk.S这个文件,两者可能有区别。

  • 那个问题解决了,您能否帮我看一下为什么这个进不去一个上升沿中断,

    我设置的是从PB4角捕获上升沿,每捕获一次上升沿frequce+1最后经过一个周期,去计算一次频率,然后GPIOPinConfigure(设置的是 GPIO_PB4_T1CCP0)

     但是上升沿中断一直进不去,中断函数在.s里面有去添加,定时的中断进的去,
     不知道是配置的问题还是中断触发事件有问题 
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    #include <stdint.h>
    #include <stdbool.h>
    #include "inc/hw_memmap.h"
    #include "inc/hw_ints.h"
    #include "inc/hw_types.h"
    #include "driverlib/debug.h"
    #include "driverlib/timer.h"
    #include "driverlib/gpio.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/interrupt.h"
    #include "utils/uartstdio.h"
    #include "driverlib/uart.h"
    #include "driverlib/rom.h"

    #define uint unsigned int
    #define uchar unsigned char

    uint frequce = 0;
    uint frequce_temp = 0;
    void Timer0IntHandler()
    {
    //一次周期后进行频率计算
    TimerIntClear(TIMER0_BASE,TIMER_TIMA_TIMEOUT);
    frequce = frequce_temp/(SysCtlClockGet());
    UARTprintf("frequce = %d\n",frequce);
    }
    void Timer3IntHandler()
    {
    TimerIntClear(TIMER1_BASE,TIMER_CAPA_EVENT);
    //每进来一次,frequce+1;
    frequce_temp++;
    }
    void
    ConfigureUART(void)
    {
    //
    // Enable the GPIO Peripheral used by the UART.
    //
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

    //
    // Enable UART0
    //
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);

    //
    // Configure GPIO Pins for UART mode.
    //
    ROM_GPIOPinConfigure(GPIO_PA0_U0RX);
    ROM_GPIOPinConfigure(GPIO_PA1_U0TX);
    ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);

    //
    // Use the internal 16MHz oscillator as the UART clock source.
    //
    UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);

    //
    // Initialize the UART for console I/O.
    //
    UARTStdioConfig(0, 115200, 16000000);
    }

    /*******************************************************
    **系统的一些时钟和使能
    **时间:16MHZ,OSC,一分频
    **使能:
    *******************************************************/
    void sysctl_time()
    {
    SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);
    //使能TIMER0和TIMER4的外设
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1);
    //使用B5进行捕获
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    //设置B5为timer输入
    GPIOPinConfigure(GPIO_PB4_T1CCP0);
    GPIOPinTypeTimer(GPIO_PORTB_BASE,GPIO_PIN_4);

    }
    int main()
    {

    sysctl_time();
    ConfigureUART();
    //使能处理器的中断
    IntMasterEnable();
    //配置定时器的周期,为周期时钟
    TimerConfigure(TIMER0_BASE,TIMER_CFG_PERIODIC);
    //2个半宽定时器
    TimerConfigure(TIMER1_BASE,TIMER_CFG_SPLIT_PAIR);
    // TimerConfigure(TIMER1_BASE,TIMER_CFG_PERIODIC);

    //配置控件事件类型,TIMER (A_4),为上升沿捕获
    TimerControlEvent(TIMER1_BASE,TIMER_A,TIMER_EVENT_POS_EDGE);

    //设置定时器的装载值,一个周期进入一次
    TimerLoadSet(TIMER0_BASE,TIMER_A,SysCtlClockGet());

    //设置定时器的中断模式
    IntEnable(INT_TIMER0A);
    IntEnable(INT_TIMER1A);

    //一个为超时中断,一个为匹配中断
    TimerIntEnable(TIMER0_BASE,TIMER_TIMA_TIMEOUT);
    TimerIntEnable(TIMER1_BASE,TIMER_CAPA_EVENT);

    //使能定时器0和定时器1
    TimerEnable(TIMER0_BASE,TIMER_A);
    TimerEnable(TIMER1_BASE,TIMER_A);
    while(1);
    }

  • 兄弟 那个问题怎么解决的啊 我现在也是做频率计进不了中断 那个中断向量表要怎么加

  • 往.s文件添加,具体看.s文件中的中断向量表的位置

  • 往.s文件添加,具体看.s文件中的中断向量表的位置