在startup.c中已注册Timer0AIntHandler中断,但调试时进不了中断
#include "C:/StellarisWare/inc/hw_ints.h"
#include "C:/StellarisWare/inc/hw_memmap.h"
#include "C:/StellarisWare/inc/hw_types.h"
// #include "C:/StellarisWare/driverlib/debug.h"
#include "C:/StellarisWare/driverlib/interrupt.h"
#include "C:/StellarisWare/driverlib/sysctl.h"
#include "C:/StellarisWare/driverlib/timer.h"
#include "C:/StellarisWare/grlib/grlib.h"
#include "C:/Program Files/IAR Systems\Embedded Workbench 6.0 Kickstart/arm/examples/TexasInstruments/Stellaris/boards/dk-lm3s9b96/drivers/kitronix320x240x16_ssd2119_8bit.h"
#include "C:/Program Files/IAR Systems\Embedded Workbench 6.0 Kickstart/arm/examples/TexasInstruments/Stellaris/boards/dk-lm3s9b96/drivers/set_pinout.h"
#include "C:/Program Files/IAR Systems\Embedded Workbench 6.0 Kickstart/arm/examples/TexasInstruments/Stellaris/driverlib/gpio.h"
#include "C:/StellarisWare/driverlib/ssi.h"
#include "C:/StellarisWare/inc/hw_ssi.h"
#include "C:/StellarisWare/driverlib/can.h"
#include "C:/StellarisWare/inc/hw_can.h"
#include "C:/StellarisWare/driverlib/udma.h"
#include "C:/StellarisWare/inc/hw_gpio.h"
#include "C:/StellarisWare/driverlib/gpio.h"
// 定时器的中断服务函数
void Timer0AIntHandler(void)
{
unsigned char ucVal;
unsigned long ulStatus;
ulStatus = TimerIntStatus(TIMER0_BASE, true); // 读取中断状态
TimerIntClear(TIMER0_BASE, ulStatus); // 清除中断状态,重要!
if (ulStatus & TIMER_TIMA_TIMEOUT) // 如果是Timer超时中断
{
ucVal = GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_4 ); // 反转LED
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_4, ~ucVal);
}
}
main(void)
{
//jtagWait();
//
//
//设置系统时钟为50Mhz
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_16MHZ);
SysCtlClockGet();
PinoutSet();
SysCtlPeripheralReset(SYSCTL_PERIPH_TIMER0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); // 使能Timer模块
TimerConfigure(TIMER0_BASE, TIMER_CFG_16_BIT_PAIR | // 配置Timer为16位周期定时器
TIMER_CFG_A_PERIODIC);
GPIOPinTypeTimer(TIMER0_BASE,TIMER_A);//GPIO_PIN_4,GPIO_DIR_MODE_OUT);
GPIODirModeSet(GPIO_PORTD_BASE, GPIO_PIN_4, GPIO_DIR_MODE_OUT);
GPIOPadConfigSet(GPIO_PORTD_BASE, GPIO_PIN_4, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_4, 0xff);
TimerLoadSet(TIMER0_BASE, TIMER_A, 300000); // 设置Timer初值,定时500ms
TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); // 使能Timer超时中断
IntEnable(INT_TIMER0A); // 使能Timer中断
IntMasterEnable(); // 使能处理器中断
TimerEnable(TIMER0_BASE, TIMER_A); // 使能Timer计数
while(1)
{}
}
头文件引用好怪,这个是运行在LM3S9B96上面的么?
GPIOPinTypeTimer(TIMER0_BASE,TIMER_A); ??? 你这个是要做什么?
SysCtlPeripheralEnable(GPIO_PORTD_BASE); ??? 你使用PD4点亮LED, 可是怎么没有看到时能GPIO_PORTD_BASE
你确定在startup.c中注册的Timer0AIntHandler没有问题? 又没有用过默认的 Timer0A_ISR( )?
SysCtlPeripheralEnable(GPIO_PORTD_BASE); 在pinoutset()中设置了。
Timer0AIntHandler注册没有问题。(函数说明了,也注册了)
回复 6楼 hb22s 的帖子
GPIOPinTypeTimer(TIMER0_BASE,TIMER_A); ??? 你这个是要做什么?你只是用定时中断没有用捕捉功能? 看看底下如何使用这个函数
GPIOPinTypeTimer(unsigned long ulPort, unsigned char ucPins);
//! \param ulPort is the base address of the GPIO port.
//! \param ucPins is the bit-packed representation of the pin(s).
函数原型:
void
GPIOPinTypeTimer(unsigned long ulPort,
unsigned char ucPins)
参数:
ulPort是GPIO端口的基址。
ucPins是管脚的位组合(bit-packed)表示。
描述:
CCP管脚必须正确配置,以便定时器外设能够正常工作。这个函数为这些管脚提供了典型配置;其它配置也能正常工作,这取决于板的设置(例如使用了片内上拉)。
管脚用一个位组合(bit-packed)的字节来指定,在这个字节中,置位的位用来识别被访问的管脚,字节的位0代表GPIO端口管脚0、位1代表GPIO端口管脚1等等。
注:这个函数不能将任意管脚都变成一个定时器管脚;它只配置一个定时器管脚来进行正确操作
该如何配置?
自带的TIMER例程可没有GPIOPinTypeTimer函数设置!
GPIOPinTypeTimer(TIMER0_BASE,TIMER_A); 是从周立功的例程中COPY的
回复 9楼 hb22s 的帖子
你只是用超时中断,根本不需要GPIOPinTypeTimer()
//GPIOPinTypeTimer()试试
你的头文件很tricky 你可以copy一个9b96的官方例程到别的文件夹然后试着修改 这样会省去你很多烦恼
谢谢tekkon!
可惜现在在家,试不了!明天接着试吧。