#include "hw_memmap.h" #include "hw_types.h" #include "ssi.h" #include "gpio.h" #include "sysctl.h" #include "systick.h" #include "timer.h" #include"interrupt.h" #define BitRate 9600 // 设定波特率 #define DataWidth 8 // 设定数据宽度 #define PINS1 GPIO_PIN_4 #define PINS2 GPIO_PIN_5 // 此表为7段数码管显示0~F的字模 unsigned char DISP_TAB[16] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E}; int i; //------------------------------------------------------------------------------------ // 函数名称 Timer0A // 函数功能 定时器0中断处理程序。工作在32位单次触发模式下。 // 输入参数 无。 // 输出参数 无。 //------------------------------------------------------------------------------------ void Timer0A(void) {
TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); // 清除定时器0中断。
TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet()); // 重载定时器的值。
GPIOPinWrite(GPIO_PORTB_BASE, PINS1,GPIOPinRead(GPIO_PORTB_BASE, PINS1) ^ PINS1); // 翻转GPIO B4 端口。 TimerEnable(TIMER0_BASE, TIMER_A); // 使能定时器0。 // 循环输出 0~F 的字模 SSIDataPut(SSI_BASE, DISP_TAB); i=i+1; if (i==16)i=0;
}
//------------------------------------------------------------------------------------ // 函数名称 Timer1A // 函数功能 定时器1中断处理程序。工作在32位周期触发模式下。 // 输入参数 无。 // 输出参数 无。 //------------------------------------------------------------------------------------ void Timer1A(void) { TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT); // 清除定时器1中断。
GPIOPinWrite(GPIO_PORTB_BASE, PINS2,GPIOPinRead(GPIO_PORTB_BASE, PINS2) ^ PINS2); // 翻转GPIO B5 端口 }
//------------------------------------------------------------------------------------ // // 该范例程序演示了如何使用定时器产生周期性中断。其中一个定时器被设置为每秒产生一次中 // 断,另一个定时器设置为每秒产生两次中断;每个中断处理器在每一次中断时都翻转一次相应 // 的GPIO(B4和B5端口);同时,LED指示灯会指示每次中断以及中断的速率。数码管也会在每次 //中断时依次从0~F翻数字 // 在本范例中,定时器0被设置为32位的可编程单次触发模式,定时器1则设置为32位的可编 // 程周期触发模式。 //这个程序是在EASYARM101实验板上做的 //------------------------------------------------------------------------------------ int main(void) { SysCtlClockSet( SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ ); // 设定晶振为时钟源。 SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER0 ); // 使能定时器0外设。 SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER1 ); // 使能定时器1外设。
SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOB ); // 使能GPIO B口外设。
IntMasterEnable(); // 处理器使能。 // 使能 SSI SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI); // 使能 GPIO A,B 口 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA|SYSCTL_PERIPH_GPIOB); //SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); // 配置 SSI SSIConfig(SSI_BASE, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, BitRate, DataWidth); // 使能 SSI SSIEnable(SSI_BASE); // 设定 GPIO A 2~5 引脚为使用外设功能(管脚由硬件控制) GPIODirModeSet(GPIO_PORTA_BASE, (GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5), GPIO_DIR_MODE_HW);
GPIODirModeSet(GPIO_PORTB_BASE, PINS1 | PINS2,GPIO_DIR_MODE_OUT); // 设置 GPIO B4和B5为输出口。 GPIOPinWrite( GPIO_PORTB_BASE, PINS1 | PINS2, 0 ); // 初始化IO口。
TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_OS); // 设置定时器0为单次触发模式。 TimerConfigure(TIMER1_BASE, TIMER_CFG_32_BIT_PER); // 设置定时器1为周期触发模式。
TimerLoadSet(TIMER0_BASE, TIMER_A, 2*SysCtlClockGet()); // 设置定时器装载值。定时1秒。 TimerLoadSet(TIMER1_BASE, TIMER_A, SysCtlClockGet()/2); // 设置定时器装载值。定时0.5秒。
TimerIntRegister(TIMER0_BASE,TIMER_A,Timer0A); TimerIntRegister(TIMER1_BASE,TIMER_A,Timer1A);
TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); // 使能定时器0为溢出中断。 TimerIntEnable(TIMER1_BASE, TIMER_TIMA_TIMEOUT); // 使能定时器1为溢出中断。
TimerEnable(TIMER0_BASE, TIMER_A); //使能定时器0 TimerEnable(TIMER1_BASE, TIMER_A); //使能定时器1 i=0;
while(1); //循环等待中断 } |