Skip to content

Commit 53b66c2

Browse files
author
Owen
authored
Merge pull request #144 from stephenf7072/Updated_UART_Pad_Mapping
Updated uart pad mapping
2 parents 246b9ff + 8776265 commit 53b66c2

File tree

5 files changed

+177
-11
lines changed

5 files changed

+177
-11
lines changed

cores/arduino/am_sdk_ap3/mcu/apollo3/hal/am_hal_pin.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
#define AM_HAL_PIN_1_MSPI5 (5)
7171
#define AM_HAL_PIN_1_NCE1 (7)
7272

73+
#define AM_HAL_PIN_2_UART1RX (0)
7374
#define AM_HAL_PIN_2_SLMISO (1)
7475
#define AM_HAL_PIN_2_UART0RX (2)
7576
#define AM_HAL_PIN_2_GPIO (3)
@@ -89,7 +90,7 @@
8990
#define AM_HAL_PIN_4_SLINT (1)
9091
#define AM_HAL_PIN_4_NCE4 (2)
9192
#define AM_HAL_PIN_4_GPIO (3)
92-
#define AM_HAL_PIN_4_UART0RX (5)
93+
#define AM_HAL_PIN_4_UART1RX (5)
9394
#define AM_HAL_PIN_4_CTIM17 (6)
9495
#define AM_HAL_PIN_4_MSPI2 (7)
9596

@@ -129,6 +130,7 @@
129130
#define AM_HAL_PIN_9_SCCIO (4)
130131
#define AM_HAL_PIN_9_UART1RX (6)
131132

133+
#define AM_HAL_PIN_10_UART1TX (0)
132134
#define AM_HAL_PIN_10_M1MOSI (1)
133135
#define AM_HAL_PIN_10_NCE10 (2)
134136
#define AM_HAL_PIN_10_GPIO (3)
@@ -437,7 +439,7 @@
437439
#define AM_HAL_PIN_44_CTIM20 (2)
438440
#define AM_HAL_PIN_44_GPIO (3)
439441
#define AM_HAL_PIN_44_M4MOSI (5)
440-
#define AM_HAL_PIN_44_M5nCE6 (6)
442+
#define AM_HAL_PIN_44_UART0TX (6)
441443

442444
#if defined (AM_PACKAGE_BGA)
443445
#define AM_HAL_PIN_45_UART1CTS (0)

cores/arduino/ard_sup/ap3_uart_types.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ SOFTWARE.
2525

2626
#define AP3_UART_PIN_UNUSED 0xFF
2727

28-
#define AP3_UART0_NUM_TX_PADS 11
29-
#define AP3_UART0_NUM_RX_PADS 13
28+
#define AP3_UART0_NUM_TX_PADS 12
29+
#define AP3_UART0_NUM_RX_PADS 12
3030
#define AP3_UART0_NUM_RTS_PADS 8
3131
#define AP3_UART0_NUM_CTS_PADS 8
3232

33-
#define AP3_UART1_NUM_TX_PADS 11
34-
#define AP3_UART1_NUM_RX_PADS 11
33+
#define AP3_UART1_NUM_TX_PADS 12
34+
#define AP3_UART1_NUM_RX_PADS 13
3535
#define AP3_UART1_NUM_RTS_PADS 8
3636
#define AP3_UART1_NUM_CTS_PADS 8
3737

cores/arduino/ard_sup/uart/ap3_uart_structures.c

+6-3
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,12 @@ const ap3_uart_pad_map_elem_t ap3_uart0_tx_map[AP3_UART0_NUM_TX_PADS] = {
3535
{.pad = 30, .funcsel = AM_HAL_PIN_30_UART0TX},
3636
{.pad = 39, .funcsel = AM_HAL_PIN_39_UART0TX},
3737
{.pad = 41, .funcsel = AM_HAL_PIN_41_UART0TX},
38+
{.pad = 44, .funcsel = AM_HAL_PIN_44_UART0TX},
3839
{.pad = 48, .funcsel = AM_HAL_PIN_48_UART0TX},
3940
};
4041

4142
const ap3_uart_pad_map_elem_t ap3_uart0_rx_map[AP3_UART0_NUM_RX_PADS] = {
4243
{.pad = 2, .funcsel = AM_HAL_PIN_2_UART0RX},
43-
{.pad = 4, .funcsel = AM_HAL_PIN_4_UART0RX},
4444
{.pad = 11, .funcsel = AM_HAL_PIN_11_UART0RX},
4545
{.pad = 17, .funcsel = AM_HAL_PIN_17_UART0RX},
4646
{.pad = 21, .funcsel = AM_HAL_PIN_21_UART0RX},
@@ -72,12 +72,13 @@ const ap3_uart_pad_map_elem_t ap3_uart0_cts_map[AP3_UART0_NUM_CTS_PADS] = {
7272
{.pad = 24, .funcsel = AM_HAL_PIN_24_UART0CTS},
7373
{.pad = 29, .funcsel = AM_HAL_PIN_29_UART0CTS},
7474
{.pad = 33, .funcsel = AM_HAL_PIN_33_UART0CTS},
75-
{.pad = 26, .funcsel = AM_HAL_PIN_36_UART0CTS},
75+
{.pad = 36, .funcsel = AM_HAL_PIN_36_UART0CTS},
7676
{.pad = 38, .funcsel = AM_HAL_PIN_38_UART0CTS},
7777
};
7878

7979
const ap3_uart_pad_map_elem_t ap3_uart1_tx_map[AP3_UART1_NUM_TX_PADS] = {
8080
{.pad = 8, .funcsel = AM_HAL_PIN_8_UART1TX},
81+
{.pad = 10, .funcsel = AM_HAL_PIN_10_UART1TX},
8182
{.pad = 12, .funcsel = AM_HAL_PIN_12_UART1TX},
8283
{.pad = 14, .funcsel = AM_HAL_PIN_14_UART1TX},
8384
{.pad = 18, .funcsel = AM_HAL_PIN_18_UART1TX},
@@ -91,7 +92,9 @@ const ap3_uart_pad_map_elem_t ap3_uart1_tx_map[AP3_UART1_NUM_TX_PADS] = {
9192
};
9293

9394
const ap3_uart_pad_map_elem_t ap3_uart1_rx_map[AP3_UART1_NUM_RX_PADS] = {
94-
{.pad = 9, .funcsel = AM_HAL_PIN_9_UART1RX},
95+
{.pad = 2, .funcsel = AM_HAL_PIN_2_UART1RX},
96+
{.pad = 4, .funcsel = AM_HAL_PIN_4_UART1RX},
97+
{.pad = 9, .funcsel = AM_HAL_PIN_9_UART1RX},
9598
{.pad = 13, .funcsel = AM_HAL_PIN_13_UART1RX},
9699
{.pad = 15, .funcsel = AM_HAL_PIN_15_UART1RX},
97100
{.pad = 19, .funcsel = AM_HAL_PIN_19_UART1RX},

docs/ACKNOWLEDGEMENTS.md

+3-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ Thank you to everyone who has contributed!
88

99
Contributors
1010
============
11-
* Jim Lindblom
11+
* Stephen Fordyce
1212
* Kenny Hora
13+
* Jim Lindblom
1314
* Owen Lyke
1415
* Aaron Micyus
15-
* Nathan Seidle
16+
* Nathan Seidle
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
/*
2+
LowPower_WithWorkAndGPIOInterrupt
3+
Adapted by Stephen Fordyce 2020-03-23 from:
4+
Artemis Low Power: How low can we go?
5+
By: Nathan Seidle
6+
SparkFun Electronics
7+
Date: February 26th, 2020
8+
License: This code is public domain.
9+
*/
10+
11+
uint32_t msToSleep = 5000; //This is the user editable number of ms to sleep between RTC checks
12+
#define TIMER_FREQ 32768L //Counter/Timer 6 will use the 32kHz clock
13+
uint32_t sysTicksToSleep = msToSleep * TIMER_FREQ / 1000;
14+
15+
const byte STATUS_LED = 14;//13 for Redboard onboard LED, 19 for Nano onboard LED
16+
const byte INPUT_BUTTON = 19;//You'll have to add one, it needs to connect to GND for active
17+
18+
bool awakeFlag = true; //Stops wakeFromSleep() being run if the system is already awake
19+
20+
21+
// GPIO Interrupt Service Routine
22+
void myGPIO_ISR(void)
23+
{
24+
detachInterrupt(digitalPinToInterrupt(INPUT_BUTTON)); //Stop interrupt from being triggered again
25+
wakeFromSleep(); //Without waking the processor properly, nothing more will happen. This means wakeFromSleep() is called twice though.
26+
// am_hal_stimer_compare_delta_set(6, 0); //Or, force the timer to run out, and resume from where you left off.
27+
}
28+
29+
30+
void setup(void) {
31+
Serial.begin(115200);
32+
Serial.println("Artemis Low Power (with timer & GPIO wakeup) Example");
33+
pinMode(STATUS_LED, OUTPUT);
34+
pinMode(INPUT_BUTTON, INPUT_PULLUP);
35+
//Initialise stuff like I2C/Wire/SPI here
36+
}
37+
38+
39+
void loop(void) {
40+
Serial.println("Starting loop, and flashing LED");
41+
digitalWrite(STATUS_LED, HIGH);
42+
delay(200);
43+
digitalWrite(STATUS_LED, LOW);
44+
Serial.println("Phew, that was hard work, sleep for 4 seconds");
45+
msToSleep = 4000;
46+
sysTicksToSleep = msToSleep * TIMER_FREQ / 1000;
47+
goToSleep();
48+
}
49+
50+
51+
//Power everything down and wait for interrupt wakeup
52+
void goToSleep()
53+
{
54+
attachInterrupt(digitalPinToInterrupt(INPUT_BUTTON), myGPIO_ISR, FALLING);
55+
56+
//End stuff like I2C/Wire/SPI here
57+
58+
power_adc_disable(); //Power down ADC. It it started by default before setup().
59+
60+
Serial.println("Going to sleep");
61+
delay(50); //Wait for serial to finish
62+
Serial.end(); //Power down UART(s)
63+
awakeFlag = false;
64+
65+
//Disable all pads except the interrupt button
66+
for (int x = 0 ; x < 50 ; x++)
67+
{
68+
if(x != INPUT_BUTTON)
69+
am_hal_gpio_pinconfig(x , g_AM_HAL_GPIO_DISABLE);
70+
}
71+
72+
//We use counter/timer 6 to cause us to wake up from sleep but 0 to 7 are available
73+
//CT 7 is used for Software Serial. All CTs are used for Servo.
74+
am_hal_stimer_int_clear(AM_HAL_STIMER_INT_COMPAREG); //Clear CT6
75+
am_hal_stimer_int_enable(AM_HAL_STIMER_INT_COMPAREG); //Enable C/T G=6
76+
77+
//Use the lower power 32kHz clock. Use it to run CT6 as well.
78+
am_hal_stimer_config(AM_HAL_STIMER_CFG_CLEAR | AM_HAL_STIMER_CFG_FREEZE);
79+
am_hal_stimer_config(AM_HAL_STIMER_XTAL_32KHZ | AM_HAL_STIMER_CFG_COMPARE_G_ENABLE);
80+
81+
//Setup interrupt to trigger when the number of ms have elapsed
82+
am_hal_stimer_compare_delta_set(6, sysTicksToSleep);
83+
84+
//Power down Flash, SRAM, cache
85+
am_hal_pwrctrl_memory_deepsleep_powerdown(AM_HAL_PWRCTRL_MEM_CACHE); //Turn off CACHE
86+
am_hal_pwrctrl_memory_deepsleep_powerdown(AM_HAL_PWRCTRL_MEM_FLASH_512K); //Turn off everything but lower 512k
87+
am_hal_pwrctrl_memory_deepsleep_powerdown(AM_HAL_PWRCTRL_MEM_SRAM_64K_DTCM); //Turn off everything but lower 64k
88+
//am_hal_pwrctrl_memory_deepsleep_powerdown(AM_HAL_PWRCTRL_MEM_ALL); //Turn off all memory (doesn't recover)
89+
90+
// Enable interrupts to the core.
91+
am_hal_interrupt_master_enable();
92+
93+
//Enable the timer interrupt in the NVIC.
94+
NVIC_EnableIRQ(STIMER_CMPR6_IRQn);
95+
96+
//Go to Deep Sleep.
97+
am_hal_sysctrl_sleep(AM_HAL_SYSCTRL_SLEEP_DEEP);
98+
99+
/////////////////////////////////////////////////////////////////////
100+
//<Pause here while sleeping> (and/or while interrupt routines run)//
101+
/////////////////////////////////////////////////////////////////////
102+
103+
//Turn off timer interrupt
104+
NVIC_DisableIRQ(STIMER_CMPR6_IRQn);
105+
106+
//Turn off GPIO interrupt
107+
detachInterrupt(digitalPinToInterrupt(INPUT_BUTTON));
108+
109+
//We're BACK!
110+
wakeFromSleep();
111+
Serial.println("End of goToSleep()");
112+
Serial.println();
113+
}
114+
115+
116+
//Power everything up gracefully
117+
void wakeFromSleep()
118+
{
119+
if(awakeFlag) //Already awake
120+
return;
121+
122+
//Power up SRAM, turn on entire Flash
123+
am_hal_pwrctrl_memory_deepsleep_powerdown(AM_HAL_PWRCTRL_MEM_MAX);
124+
125+
//Go back to using the main clock
126+
am_hal_stimer_int_enable(AM_HAL_STIMER_INT_OVERFLOW);
127+
NVIC_EnableIRQ(STIMER_IRQn);
128+
am_hal_stimer_config(AM_HAL_STIMER_CFG_CLEAR | AM_HAL_STIMER_CFG_FREEZE);
129+
am_hal_stimer_config(AM_HAL_STIMER_HFRC_3MHZ);
130+
131+
//Turn on ADC
132+
ap3_adc_setup();
133+
134+
//Set any pinModes
135+
pinMode(STATUS_LED, OUTPUT);
136+
pinMode(INPUT_BUTTON, INPUT_PULLUP);
137+
138+
//Optional - start again (will never reach the end of goToSleep() or wakeFromSleep() though)
139+
//Note - global variables will be preserved if you don't power down SRAM (comment out the line)
140+
//setup();
141+
142+
//Restart Serial
143+
Serial.begin(115200);
144+
delay(10);
145+
Serial.println("Back on");
146+
awakeFlag = true;
147+
148+
//Initialise stuff like I2C/Wire/SPI here
149+
}
150+
151+
152+
//Called once number of milliseconds has passed
153+
extern "C" void am_stimer_cmpr6_isr(void)
154+
{
155+
uint32_t ui32Status = am_hal_stimer_int_status_get(false);
156+
if (ui32Status & AM_HAL_STIMER_INT_COMPAREG)
157+
{
158+
am_hal_stimer_int_clear(AM_HAL_STIMER_INT_COMPAREG);
159+
}
160+
}

0 commit comments

Comments
 (0)