]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - i3-mote/i3-mote.git/blobdiff - Basic-Test-Package/MSP432/Test_MSP432_ClockSystem/main.c
Added Test Wake-Up
[i3-mote/i3-mote.git] / Basic-Test-Package / MSP432 / Test_MSP432_ClockSystem / main.c
old mode 100644 (file)
new mode 100755 (executable)
index 3ba4325..f9264a0
@@ -15,7 +15,7 @@
  * Starts the DCO
  * Sources SMCLK from DCO
  *
- * Blinks an LED using SysTick (which is sourced from MCLK).
+ * Blinks LEDs using SysTick (which is sourced from MCLK).
  *
  *
  *
  * Author: Timothy Logan
  * Rev: B.Martinez
  ******************************************************************************/
-#include "i3mote.h"
+#include <MSP432_I3M_driverlib.h>
 
 /* DriverLib Includes */
 #include "driverlib.h"
 
 /* Standard Includes */
+#include <stdio.h>
+#include <stdlib.h>
 #include <stdint.h>
-
 #include <stdbool.h>
 
+#define DEBUG_UART
+
+#ifdef UART_BAUD_9600
+       const eUSCI_UART_Config uartConfig =
+       {
+               EUSCI_A_UART_CLOCKSOURCE_SMCLK,          // SMCLK Clock Source
+               78,                                      // BRDIV = 78
+               2,                                       // UCxBRF = 2
+               0,                                       // UCxBRS = 0
+               EUSCI_A_UART_NO_PARITY,                  // No Parity
+               EUSCI_A_UART_LSB_FIRST,                  // LSB First
+               EUSCI_A_UART_ONE_STOP_BIT,               // One stop bit
+               EUSCI_A_UART_MODE,                       // UART mode
+               EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION  // Oversampling
+       };
+#endif
+
+#ifdef UART_BAUD_115200
+       const eUSCI_UART_Config uartConfig =
+       {
+               EUSCI_A_UART_CLOCKSOURCE_SMCLK,          // SMCLK Clock Source
+               6,                                       // BRDIV = 78
+               8,                                       // UCxBRF = 2
+               0,                                       // UCxBRS = 0
+               EUSCI_A_UART_NO_PARITY,                  // No Parity
+               EUSCI_A_UART_LSB_FIRST,                  // LSB First
+               EUSCI_A_UART_ONE_STOP_BIT,               // One stop bit
+               EUSCI_A_UART_MODE,                       // UART mode
+               EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION  // Oversampling
+       };
+#endif
+
+
+
+/*
+ *  Timer_A0 (Fast)
+ *  UpMode Configuration Parameter
+ */
+const Timer_A_UpModeConfig upConfigA0 =
+{
+       TIMER_A_CLOCKSOURCE_SMCLK,             // SMCLK Clock Source
+       TIMER_A_CLOCKSOURCE_DIVIDER_1,         // SMCLK/1 = 3MHz
+       6000-1,                                // 6000000/12000 > 1ms tick period
+       TIMER_A_TAIE_INTERRUPT_DISABLE,        // Disable Timer interrupt
+       TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE ,   // Enable CCR0 interrupt
+       TIMER_A_DO_CLEAR                       // Clear value
+};
+
+
+/*
+ *  Timer_A (Slow)
+ *  UpMode Configuration Parameter
+ */
+const Timer_A_UpModeConfig upConfigA1 =
+{
+       TIMER_A_CLOCKSOURCE_ACLK,              // ACLK Clock Source
+       TIMER_A_CLOCKSOURCE_DIVIDER_1,         // ACLK/1 = 3MHz
+       32768-1,
+       //32-1,                                // 32768/32=1024 tick period
+       TIMER_A_TAIE_INTERRUPT_DISABLE,        // Disable Timer interrupt
+       TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE ,   // Enable CCR0 interrupt
+       TIMER_A_DO_CLEAR                       // Clear value
+};
+
+
+uint16_t count;
+uint16_t count_tmp;
+
+#define MAXLEN 32
+char tmp[MAXLEN];
+
 int main(void)
 {
+
+       int i=0;
+
     /* Halting the Watchdog */
     MAP_WDT_A_holdTimer();
     
     /* Configuring pins for peripheral/crystal usage*/
     /* LFXTAL */
-    MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_PJ,
-            GPIO_PIN0 | GPIO_PIN1, GPIO_PRIMARY_MODULE_FUNCTION);
+    MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(LFXTAL_PORT,
+               LFXTAL_PINS, GPIO_PRIMARY_MODULE_FUNCTION);
 
     /* HFXTL */
-    MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_PJ,
-            GPIO_PIN2 | GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION);
+    MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(HFXTAL_PORT,
+               HFXTAL_PINS, GPIO_PRIMARY_MODULE_FUNCTION);
 
     /* Clocks Output */
-    GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P4,
-               GPIO_PIN2|GPIO_PIN3|GPIO_PIN4, GPIO_PRIMARY_MODULE_FUNCTION);
-    GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P7,
-           GPIO_PIN0, GPIO_PRIMARY_MODULE_FUNCTION);
+    GPIO_setAsPeripheralModuleFunctionOutputPin(ACLK_OUT_PORT,
+               ACLK_OUT_PIN, GPIO_PRIMARY_MODULE_FUNCTION);
+    GPIO_setAsPeripheralModuleFunctionOutputPin(MCLK_OUT_PORT,
+               MCLK_OUT_PIN, GPIO_PRIMARY_MODULE_FUNCTION);
+    GPIO_setAsPeripheralModuleFunctionOutputPin(HSMCLK_OUT_PORT,
+            HSMCLK_OUT_PIN, GPIO_PRIMARY_MODULE_FUNCTION);
+    GPIO_setAsPeripheralModuleFunctionOutputPin(SMCLK_OUT_PORT,
+               SMCLK_OUT_PIN, GPIO_PRIMARY_MODULE_FUNCTION);
 
     /* LEDs */
     MAP_GPIO_setAsOutputPin(HID_PORT,LEDG|LEDR);
-    MAP_GPIO_setOutputHighOnPin(HID_PORT, LEDG|LEDR);
+    MAP_GPIO_setOutputHighOnPin(HID_PORT,LEDG|LEDR);
 
     /* Setting the external clock frequency. This API is optional */
-    CS_setExternalClockSourceFrequency(32000,12000000);
+    CS_setExternalClockSourceFrequency(32768,48000000);
 
     /* Starting HFXT in non-bypass mode without a timeout. Before we start
      * we have to change VCORE to 1 to support the 48MHz frequency */
@@ -86,39 +165,130 @@ int main(void)
     MAP_FlashCtl_setWaitState(FLASH_BANK1, 2);
     CS_startHFXT(false);
 
-    /* Initializing MCLK to HFXT (effectively 48/4 MHz) */
-    MAP_CS_initClockSignal(CS_MCLK, CS_HFXTCLK_SELECT, CS_CLOCK_DIVIDER_4);
+
+    /* Initializes other Clocks with DCO */
+    MAP_CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_48);
+
+    /* Initializing MCLK DCO/4 = 12 */
+    MAP_CS_initClockSignal(CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_4);
+
+    /* Initializing SMCLK to HFXT (effectively 48/8=6 MHz) */
+    MAP_CS_initClockSignal(CS_SMCLK,CS_HFXTCLK_SELECT,CS_CLOCK_DIVIDER_8);
 
     /* Initializing ACLK to LFXT */
     CS_startLFXT(false);
     MAP_CS_initClockSignal(CS_ACLK, CS_LFXTCLK_SELECT, CS_CLOCK_DIVIDER_1);
 
+    /* HSMCLK DCO/16 = 3 */
+    MAP_CS_initClockSignal(CS_HSMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_16);
 
-    /* Initializes Aux. Clocks System with DCO */
-    MAP_CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_48);
-    MAP_CS_initClockSignal(CS_HSMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_8);
-    MAP_CS_initClockSignal(CS_SMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_8);
+
+
+#ifdef DEBUG_UART
+
+    /* Selecting P1.2 and P1.3 in UART mode */
+    MAP_GPIO_setAsPeripheralModuleFunctionInputPin(UART_PORT,UART_RX_PIN | UART_TX_PIN, GPIO_PRIMARY_MODULE_FUNCTION);
+    /* Configuring UART Module */
+    MAP_UART_initModule(EUSCI_A0_BASE, &uartConfig);
+    /* Enable UART module */
+    MAP_UART_enableModule(EUSCI_A0_BASE);
+
+    /* Enabling UART interrupts
+     * MAP_UART_enableInterrupt(EUSCI_A0_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);
+     * MAP_Interrupt_enableInterrupt(INT_EUSCIA0);
+     */
+#endif
+
+#ifdef DEBUG_UART
+
+    /* Set Clock to DCO */
+    MAP_CS_initClockSignal(CS_SMCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_4);
+
+    /* Launch test */
+    while(MAP_UART_receiveData(EUSCI_A0_BASE)!='g');
+    MAP_GPIO_setOutputLowOnPin(HID_PORT,LEDG);
+    MAP_GPIO_setOutputHighOnPin(HID_PORT,LEDR);
+
+
+    /* Set SMCLK to test HFXTAL from Timer */
+    MAP_CS_initClockSignal(CS_SMCLK,CS_HFXTCLK_SELECT,CS_CLOCK_DIVIDER_8);
+
+#endif
 
     /*
-     * Configuring SysTick to trigger at 6000000
-     * MCLK is 12MHz so this will make it toggle every 0.5s
-     * */
+     * Configuring SysTick to trigger at 12000000
+     * MCLK is 12MHz so this will make it toggle every 1s
+     *
+               MAP_SysTick_enableModule();
+               MAP_SysTick_setPeriod(12000000);
+               MAP_SysTick_enableInterrupt();
+       */
+
+    /* Configuring Timer_A0 for Up Mode, with SMCLK (HFXTAL) */
+    MAP_Timer_A_configureUpMode(TIMER_A0_BASE, &upConfigA0);
+    /* Enabling interrupts and starting the timer */
+    MAP_Interrupt_enableInterrupt(INT_TA0_0);
+    MAP_Timer_A_startCounter(TIMER_A0_BASE, TIMER_A_UP_MODE);
+
+    /* Configuring Timer_A1 for Up Mode with ACLK (LFXTAL) */
+    MAP_Timer_A_configureUpMode(TIMER_A1_BASE, &upConfigA1);
+    /* Enabling interrupts and starting the timer */
+    MAP_Interrupt_enableInterrupt(INT_TA1_0);
+    MAP_Timer_A_startCounter(TIMER_A1_BASE, TIMER_A_UP_MODE);
 
-    MAP_SysTick_enableModule();
-    MAP_SysTick_setPeriod(6000000);
     MAP_Interrupt_enableSleepOnIsrExit();
-    MAP_SysTick_enableInterrupt();
-    
-    /* Enabling MASTER interrupts */
-    MAP_Interrupt_enableMaster();   
+    MAP_Interrupt_enableMaster();
+    MAP_GPIO_setOutputLowOnPin(HID_PORT,LEDG);
 
-    while (1)
-    {
-        MAP_PCM_gotoLPM0();
+       MAP_PCM_gotoLPM0();
+
+       /* Restore DCLK for UART */
+       MAP_CS_initClockSignal(CS_SMCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_4);
+       sprintf(tmp,"Timer-A Ticks: %d\r\n",count_tmp);
+       while(tmp[i]!='\0'){
+               MAP_UART_transmitData(EUSCI_A0_BASE,tmp[i]);
+               i++;
+       }
+
+       /* Do Nothing */
+    while(1){
+        MAP_PCM_gotoLPM0();
+        MAP_GPIO_toggleOutputOnPin(HID_PORT,LEDR);
     }
+
 }
 
+
 void SysTick_Handler(void)
 {
-    MAP_GPIO_toggleOutputOnPin(HID_PORT, LEDG|LEDR);
+    //MAP_UART_transmitData(EUSCI_A0_BASE, (count_tmp>>8)&0xFF);
+    //MAP_UART_transmitData(EUSCI_A0_BASE, (count_tmp)&0xFF);
+}
+
+//******************************************************************************
+// TIMER
+//******************************************************************************
+void TA0_0_IRQHandler(void)
+{
+    MAP_Timer_A_clearCaptureCompareInterrupt(TIMER_A0_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_0);
+    MAP_GPIO_toggleOutputOnPin(HID_PORT, LEDR);
+    count++;
+}
+
+void TA1_0_IRQHandler(void)
+{
+    MAP_Timer_A_clearCaptureCompareInterrupt(TIMER_A1_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_0);
+    MAP_GPIO_toggleOutputOnPin(HID_PORT,LEDG);
+
+       count_tmp=count;
+       count=0;
+
+       /* Disable Ints */
+    MAP_Interrupt_disableInterrupt(INT_TA1_0);
+    MAP_Interrupt_disableInterrupt(INT_TA0_0);
+    /* Return Control to Main Program */
+    MAP_Interrupt_disableSleepOnIsrExit();
+
 }
+
+