#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 charuint 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波的,但是定时器都不能使用了。。。求指点

xyz549040622:
我只想问,你启动文件中添加中断函数了吗?
jinjie chen:
回复 xyz549040622:
就是在setup中添加吗
xyz549040622:
回复 jinjie chen:
启动文件是在startup_ccs.c这个文件中的,前提是你用的是ccs。
jinjie chen:
回复 xyz549040622:
我用的keil 5 里面有 startup.s文件,我想问的是直接添加进向量表就可以就行了嘛,还有就是我要用定时器捕获一个频率发生器的频率怎么做
xyz549040622:
回复 jinjie chen:
你的startup.s是官方提供的吗,是pack包提供的吗?贴上来看看。我建议你直接用tivaware中提供的startup_rvmdk.S这个文件,两者可能有区别。
jinjie chen:
回复 xyz549040622:
那个问题解决了,您能否帮我看一下为什么这个进不去一个上升沿中断,
我设置的是从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++; }voidConfigureUART(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);}
user5813287:
回复 jinjie chen:
兄弟 那个问题怎么解决的啊 我现在也是做频率计进不了中断 那个中断向量表要怎么加
jinjie chen:
回复 user5813287:
往.s文件添加,具体看.s文件中的中断向量表的位置
jinjie chen:
回复 user5813287:
往.s文件添加,具体看.s文件中的中断向量表的位置
TI中文支持网
