aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal/ports/TIVA/TM4C129x/hal_lld.c
diff options
context:
space:
mode:
Diffstat (limited to 'os/hal/ports/TIVA/TM4C129x/hal_lld.c')
-rw-r--r--os/hal/ports/TIVA/TM4C129x/hal_lld.c152
1 files changed, 152 insertions, 0 deletions
diff --git a/os/hal/ports/TIVA/TM4C129x/hal_lld.c b/os/hal/ports/TIVA/TM4C129x/hal_lld.c
new file mode 100644
index 0000000..4f2a968
--- /dev/null
+++ b/os/hal/ports/TIVA/TM4C129x/hal_lld.c
@@ -0,0 +1,152 @@
+/*
+ Copyright (C) 2014 Marco Veeneman
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+/**
+ * @file TIVA/TM4C129x/hal_lld.c
+ * @brief TM4C129x HAL Driver subsystem low level driver source.
+ *
+ * @addtogroup HAL
+ * @{
+ */
+
+#include "hal.h"
+
+/*===========================================================================*/
+/* Driver local definitions. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver exported variables. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver local variables and types. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver local functions. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver interrupt handlers. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver exported functions. */
+/*===========================================================================*/
+
+/**
+ * @brief Low level HAL driver initialization.
+ *
+ * @notapi
+ */
+void hal_lld_init(void)
+{
+}
+
+/**
+ * @brief TM4C129x clocks and PLL initialization.
+ * @note All the involved constants come from the file @p board.h and
+ * @p mcuconf.h.
+ * @note This function should be invoked just after the system reset.
+ *
+ * @special
+ */
+void tiva_clock_init(void)
+{
+ uint32_t moscctl, rsclkcfg;
+
+ /*
+ * 1. Once POR has completed, the PIOSC is acting as the system clock.
+ */
+
+ /*
+ * 2. Power up the MOSC by clearing the NOXTAL bit in the MOSCCTL register.
+ */
+ moscctl = SYSCTL->MOSCCTL;
+ moscctl &= ~MOSCCTL_NOXTAL;
+
+ /*
+ * 3. If single-ended MOSC mode is required, the MOSC is ready to use. If crystal mode is required,
+ * clear the PWRDN bit and wait for the MOSCPUPRIS bit to be set in the Raw Interrupt Status
+ * (RIS), indicating MOSC crystal mode is ready.
+ */
+#if TIVA_MOSC_SINGLE_ENDED
+ SYSCTL->MOSCCTL = moscctl;
+#else
+ moscctl &= ~MOSCCTL_PWRDN;
+ SYSCTL->MOSCCTL = moscctl;
+
+ while (!(SYSCTL->RIS & SYSCTL_RIS_MOSCPUPRIS));
+#endif
+
+ /*
+ * 4. Set the OSCSRC field to 0x3 in the RSCLKCFG register at offset 0x0B0.
+ */
+ rsclkcfg = SYSCTL->RSCLKCFG;
+
+ rsclkcfg |= TIVA_RSCLKCFG_OSCSRC;
+
+ /*
+ * 5. If the application also requires the MOSC to be the deep-sleep clock source, then program the
+ * DSOSCSRC field in the DSCLKCFG register to 0x3.
+ */
+
+ /*
+ * 6. Write the PLLFREQ0 and PLLFREQ1 registers with the values of Q, N, MINT, and MFRAC to
+ * the configure the desired VCO frequency setting.
+ */
+ SYSCTL->PLLFREQ1 = (0x04 << 0); // 5 - 1
+ SYSCTL->PLLFREQ0 = (0x60 << 0) | PLLFREQ0_PLLPWR;
+
+ /*
+ * 7. Write the MEMTIM0 register to correspond to the new system clock setting.
+ */
+ SYSCTL->MEMTIM0 = (MEMTIM0_FBCHT_3_5 | MEMTIM0_FWS_5 | MEMTIM0_EBCHT_3_5 | MEMTIM0_EWS_5 | MEMTIM0_MB1);
+
+ /*
+ * Wait for the PLLSTAT register to indicate the PLL has reached lock at the new operating point
+ * (or that a timeout period has passed and lock has failed, in which case an error condition exists
+ * and this sequence is abandoned and error processing is initiated).
+ */
+ while (!SYSCTL->PLLSTAT & PLLSTAT_LOCK);
+
+ /*
+ * 9. Write the RSCLKCFG register's PSYSDIV value, set the USEPLL bit to enabled, and MEMTIMU
+ * bit.
+ */
+
+ rsclkcfg = SYSCTL->RSCLKCFG;
+
+ rsclkcfg |= (RSCLKCFG_USEPLL | (0x03 << 0) | (0x03 << 20) | (0x03 << 24));
+
+ //rsclkcfg |= ((0x03 << 0) | (1 << 28) | (0x03 << 20));
+
+ rsclkcfg |= RSCLKCFG_MEMTIMU;
+
+ // set new configuration
+ SYSCTL->RSCLKCFG = rsclkcfg;
+
+#if HAL_USE_PWM
+#if TIVA_PWM_USE_PWM0
+ PWM0->CC = TIVA_PWM_FIELDS;
+#endif
+#endif
+}
+
+/**
+ * @}
+ */