|
| 1 | +#include "mbed.h" |
| 2 | + |
| 3 | +// Port A0: 0x40004000 GPIO0 to GPIO7 |
| 4 | +// Port A1: 0x40005000 GPIO8 to GPIO15 Use GPIO13 (SW2) as input, GPIO9(D10 Red) as output |
| 5 | +// Port A2: 0x40006000 GPIO16 to GPIO23 |
| 6 | +// Port A3: 0x40007000 GPIO24 to GPIO31 |
| 7 | + |
| 8 | +#define WAIT_CYCLES_LONG 10000000 |
| 9 | +#define WAIT_CYCLES_SHORT 1000000 |
| 10 | +#define INPUT_PIN_PORTA1 5 |
| 11 | +#define OUTPUT_PIN_PORTA1 1 |
| 12 | +#define GPIO_PORTA1_ADDRESS 0x40005000 |
| 13 | +#define GPIO_PAD_CONFIG_9_ADDRESS 0x4402E0C4 |
| 14 | +#define OFFSET_DIR 0x400 |
| 15 | +#define OFFSET_DATA 0 |
| 16 | +#define ARCM_BASE 0x44025000 |
| 17 | +#define PRCM_RUN_MODE_CLK 0x00000001 |
| 18 | +#define PRCM_SLP_MODE_CLK 0x00000100 |
| 19 | +#define GPIO_PAD_CONFIG_9 0x4402E0C4 |
| 20 | +#define PAD_MODE_MASK 0x0000000F |
| 21 | + |
| 22 | +static void set_gpio_dir() |
| 23 | +{ |
| 24 | + // Configure direction Bit 7:0 DIR, 0 = input, 1 = output |
| 25 | + *((volatile unsigned long*)(GPIO_PORTA1_ADDRESS + OFFSET_DIR)) &= ~0x20; // Configure SW2 as input |
| 26 | + *((volatile unsigned long*)(GPIO_PORTA1_ADDRESS + OFFSET_DIR)) |= 0x2; // Configure D10 as output |
| 27 | + |
| 28 | +} |
| 29 | + |
| 30 | +static const unsigned long g_ulPinToPadMap[64] = |
| 31 | +{ |
| 32 | + 10,11,12,13,14,15,16,17,255,255,18, |
| 33 | + 19,20,21,22,23,24,40,28,29,25,255, |
| 34 | + 255,255,255,255,255,255,255,255,255,255,255, |
| 35 | + 255,255,255,255,255,255,255,255,255,255,255, |
| 36 | + 31,255,255,255,255,0,255,32,30,255,1, |
| 37 | + 255,2,3,4,5,6,7,8,9 |
| 38 | +}; |
| 39 | + |
| 40 | +void PinModeSet(unsigned long ulPin,unsigned long ulPinMode) |
| 41 | +{ |
| 42 | + unsigned long ulPad; |
| 43 | + |
| 44 | + // Get the corresponding Pad |
| 45 | + ulPad = g_ulPinToPadMap[ulPin & 0x3F]; |
| 46 | + |
| 47 | + // Calculate the register address |
| 48 | + ulPad = ((ulPad << 2) + (0x4402E000+0x000000A0)); |
| 49 | + |
| 50 | + // Set the mode. |
| 51 | + *((volatile unsigned long*)(ulPad)) = (((*((volatile unsigned long*)(ulPad))) & ~PAD_MODE_MASK) | ulPinMode) & ~(3<<10); |
| 52 | +} |
| 53 | + |
| 54 | +int main() |
| 55 | +{ |
| 56 | + PinModeSet(0x0000003F,0x000000000); |
| 57 | + *((volatile unsigned long*)(ARCM_BASE + 0x58)) |= PRCM_RUN_MODE_CLK || PRCM_SLP_MODE_CLK; |
| 58 | + |
| 59 | + unsigned long wait_cycles_in_use = WAIT_CYCLES_SHORT; |
| 60 | + volatile unsigned long delay = 0; |
| 61 | + |
| 62 | + set_gpio_dir(); |
| 63 | + *((volatile unsigned long*)(GPIO_PAD_CONFIG_9))|= 0x220; |
| 64 | + |
| 65 | + while (true) |
| 66 | + { |
| 67 | + |
| 68 | + // Check if SW2 is pressed |
| 69 | + if (*(volatile unsigned long *)(GPIO_PORTA1_ADDRESS + OFFSET_DATA + ((1 << INPUT_PIN_PORTA1) << 2))) |
| 70 | + { |
| 71 | + wait_cycles_in_use = WAIT_CYCLES_LONG; |
| 72 | + } |
| 73 | + |
| 74 | + *(volatile unsigned long *)(GPIO_PORTA1_ADDRESS + OFFSET_DATA + ((1 << OUTPUT_PIN_PORTA1) << 2)) = (OUTPUT_PIN_PORTA1 << 1); |
| 75 | + delay = wait_cycles_in_use; |
| 76 | + while (delay--); |
| 77 | + *(volatile unsigned long *)(GPIO_PORTA1_ADDRESS + OFFSET_DATA + ((1 << OUTPUT_PIN_PORTA1) << 2)) = 0; |
| 78 | + delay = wait_cycles_in_use; |
| 79 | + while (delay--); |
| 80 | + } |
| 81 | +} |
| 82 | + |
0 commit comments