/*
* user.c
*
* Created on: 2018年8月6日
* Author: Peng
*/
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/timer.h"
#include "inc/hw_memmap.h"
#include "inc/hw_timer.h"
#include "inc/tm4c123gh6pm.h"
#define LED_R(n) (n?GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1,GPIO_PIN_1):GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1,~GPIO_PIN_1))
#define LED_B(n) (n?GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_2,GPIO_PIN_2):GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_2,~GPIO_PIN_2))
#define LED_G(n) (n?GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3,GPIO_PIN_3):GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3,~GPIO_PIN_3))
void TIMER1A_Interrupt(void);
void TIMER1B_Interrupt(void);
int main(void)
{
uint32_t TheSysClock=0;
uint8_t R_flag=0;
SysCtlClockSet(SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);
TheSysClock=SysCtlClockGet();
//使能F引脚
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
SysCtlDelay(TheSysClock/3000);
//配置三色LED引脚为输出
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
SysCtlDelay(TheSysClock/3000);
LED_R(1);
LED_B(1);
LED_G(1);
SysCtlDelay(TheSysClock/3000);
LED_R(0);
LED_B(0);
LED_G(0);
SysCtlDelay(TheSysClock/3000);
//定时器使能
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1);
//TIMER1A B中断注册
TimerIntRegister(TIMER1_BASE,TIMER_A,TIMER1A_Interrupt);
TimerIntRegister(TIMER1_BASE,TIMER_B,TIMER1B_Interrupt);
//TIMER1A B中断配置
TimerConfigure(TIMER1_BASE,TIMER_CFG_A_PERIODIC);
TimerLoadSet(TIMER1_BASE,TIMER_A,TheSysClock/2-1); //500ms
TimerConfigure(TIMER1_BASE,TIMER_CFG_B_PERIODIC);
TimerLoadSet(TIMER1_BASE,TIMER_B,TheSysClock/4-1); //250ms
TimerEnable(TIMER1_BASE, TIMER_BOTH);
IntEnable(INT_TIMER1B);
TimerIntEnable(TIMER1_BASE, TIMER_TIMB_TIMEOUT);
IntEnable(INT_TIMER1A);
TimerIntEnable(TIMER1_BASE, TIMER_TIMA_TIMEOUT);
IntMasterEnable();
while(1)
{
SysCtlDelay(TheSysClock/3/2);
LED_R(R_flag);
R_flag = ~R_flag;
}
}
void TIMER1A_Interrupt(void)
{
static uint8_t B_flag=0;
// Clear the timer interrupt
TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT);
B_flag=~B_flag;
LED_B(B_flag);
}
void TIMER1B_Interrupt(void)
{
static uint8_t G_flag=0;
// Clear the timer interrupt
TimerIntClear(TIMER1_BASE, TIMER_TIMB_TIMEOUT);
G_flag=~G_flag;
LED_G(G_flag);
}