// TwoButtonVector.c // Runs on LM3S811 // Use vectored interrupts to respond to two button presses. Note // that button bouncing is not addressed. // Daniel Valvano // June 24, 2011 /* This example accompanies the book "Embedded Systems: Real Time Interfacing to the Arm Cortex M3", ISBN: 978-1463590154, Jonathan Valvano, copyright (c) 2011 Example 5.1, Program 5.7 Copyright 2011 by Jonathan W. Valvano, valvano@mail.utexas.edu You may use, edit, run or distribute this file as long as the above copyright notice remains THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. VALVANO SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. For more information about my classes, my research, and my books, see http://users.ece.utexas.edu/~valvano/ */ // user button connected to PC4 (trigger on falling edge) // momentary, negative logic button connected to PD4 (trigger on falling edge) #define NVIC_EN0_INT2 0x00000004 // Interrupt 2 enable #define NVIC_EN0_INT3 0x00000008 // Interrupt 3 enable #define NVIC_EN0_R (*((volatile unsigned long *)0xE000E100)) // IRQ 0 to 31 Set Enable Register #define NVIC_PRI0_R (*((volatile unsigned long *)0xE000E400)) // IRQ 0 to 3 Priority Register #define GPIO_PORTC_DIR_R (*((volatile unsigned long *)0x40006400)) #define GPIO_PORTC_IS_R (*((volatile unsigned long *)0x40006404)) #define GPIO_PORTC_IBE_R (*((volatile unsigned long *)0x40006408)) #define GPIO_PORTC_IEV_R (*((volatile unsigned long *)0x4000640C)) #define GPIO_PORTC_IM_R (*((volatile unsigned long *)0x40006410)) #define GPIO_PORTC_ICR_R (*((volatile unsigned long *)0x4000641C)) #define GPIO_PORTC_DEN_R (*((volatile unsigned long *)0x4000651C)) #define GPIO_PORTD_DIR_R (*((volatile unsigned long *)0x40007400)) #define GPIO_PORTD_IS_R (*((volatile unsigned long *)0x40007404)) #define GPIO_PORTD_IBE_R (*((volatile unsigned long *)0x40007408)) #define GPIO_PORTD_IEV_R (*((volatile unsigned long *)0x4000740C)) #define GPIO_PORTD_IM_R (*((volatile unsigned long *)0x40007410)) #define GPIO_PORTD_ICR_R (*((volatile unsigned long *)0x4000741C)) #define GPIO_PORTD_DEN_R (*((volatile unsigned long *)0x4000751C)) #define SYSCTL_RCGC2_R (*((volatile unsigned long *)0x400FE108)) #define SYSCTL_RCGC2_GPIOD 0x00000008 // port D Clock Gating Control #define SYSCTL_RCGC2_GPIOC 0x00000004 // port C Clock Gating Control void DisableInterrupts(void); // Disable interrupts void EnableInterrupts(void); // Enable interrupts long StartCritical (void); // previous I bit, disable interrupts void EndCritical(long sr); // restore I bit to previous value void WaitForInterrupt(void); // low power mode // global variables visible in Watch window of debugger // set when corresponding button pressed volatile unsigned char SW1, SW2; void VectorButtons_Init(void){ // activate port C and port D SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOC+SYSCTL_RCGC2_GPIOD; SW1 = 0; // clear semaphores SW2 = 0; GPIO_PORTC_DIR_R &= ~0x10; // make PC4 in (PC4 built-in button) GPIO_PORTC_DEN_R |= 0x10; // enable digital I/O on PC4 GPIO_PORTC_IS_R &= ~0x10; // PC4 is edge-sensitive (default setting) GPIO_PORTC_IBE_R &= ~0x10; // PC4 is not both edges (default setting) GPIO_PORTC_IEV_R &= ~0x10; // PC4 falling edge event (default setting) GPIO_PORTC_ICR_R = 0x10; // clear flag4 GPIO_PORTC_IM_R |= 0x10; // enable interrupt on PC4 // GPIO PortC=priority 2 NVIC_PRI0_R = (NVIC_PRI0_R&0xFF00FFFF)|0x00400000; // bits 21-23 GPIO_PORTD_DIR_R &= ~0x10; // make PD4 in (PD4 button) GPIO_PORTD_DEN_R |= 0x10; // enable digital I/O on PD4 GPIO_PORTD_IS_R &= ~0x10; // PD4 is edge-sensitive (default setting) GPIO_PORTD_IBE_R &= ~0x10; // PD4 is not both edges (default setting) GPIO_PORTD_IEV_R &= ~0x10; // PD4 falling edge event (default setting) GPIO_PORTD_ICR_R = 0x10; // clear flag4 GPIO_PORTD_IM_R |= 0x10; // enable interrupt on PD4 // GPIO PortD=priority 2 NVIC_PRI0_R = (NVIC_PRI0_R&0x00FFFFFF)|0x40000000; // bits 29-31 // enable interrupts 2 and 3 in NVIC NVIC_EN0_R |= (NVIC_EN0_INT2+NVIC_EN0_INT3); EnableInterrupts(); } void GPIOPortC_Handler(void){ GPIO_PORTC_ICR_R = 0x10; // acknowledge flag4 SW1 = 1; // signal SW1 occurred } void GPIOPortD_Handler(void){ GPIO_PORTD_ICR_R = 0x10; // acknowledge flag4 SW2 = 1; // signal SW2 occurred } //debug code int main(void){ VectorButtons_Init(); // initialize interrupts and ports while(1){ WaitForInterrupt(); } }