123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- //#############################################################################
- //
- // FILE: device.c
- //
- // TITLE: Device setup for examples.
- //
- //#############################################################################
- // $TI Release: F2837xD Support Library v3.05.00.00 $
- // $Release Date: Tue Jun 26 03:15:23 CDT 2018 $
- // $Copyright:
- // Copyright (C) 2013-2018 Texas Instruments Incorporated - http://www.ti.com/
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions
- // are met:
- //
- // Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- //
- // Redistributions in binary form must reproduce the above copyright
- // notice, this list of conditions and the following disclaimer in the
- // documentation and/or other materials provided with the
- // distribution.
- //
- // Neither the name of Texas Instruments Incorporated nor the names of
- // its contributors may be used to endorse or promote products derived
- // from this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- // $
- //#############################################################################
- //
- // Included Files
- //
- #include "device.h"
- #include "driverlib.h"
- #ifdef __cplusplus
- using std::memcpy;
- #endif
- //*****************************************************************************
- //
- // Function to initialize the device. Primarily initializes system control to a
- // known state by disabling the watchdog, setting up the SYSCLKOUT frequency,
- // and enabling the clocks to the peripherals.
- //
- //*****************************************************************************
- void Device_init(void)
- {
- //
- // Disable the watchdog
- //
- SysCtl_disableWatchdog();
- #ifdef _FLASH
- //
- // Copy time critical code and flash setup code to RAM. This includes the
- // following functions: InitFlash();
- //
- // The RamfuncsLoadStart, RamfuncsLoadSize, and RamfuncsRunStart symbols
- // are created by the linker. Refer to the device .cmd file.
- //
- memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
- //
- // Call Flash Initialization to setup flash waitstates. This function must
- // reside in RAM.
- //
- Flash_initModule(FLASH0CTRL_BASE, FLASH0ECC_BASE, DEVICE_FLASH_WAITSTATES);
- #endif
- #ifdef CPU1
- //
- // Set up PLL control and clock dividers
- //
- SysCtl_setClock(DEVICE_SETCLOCK_CFG);
- //
- // Make sure the LSPCLK divider is set to the default (divide by 4)
- //
- SysCtl_setLowSpeedClock(SYSCTL_LSPCLK_PRESCALE_4);
- //
- // These asserts will check that the #defines for the clock rates in
- // device.h match the actual rates that have been configured. If they do
- // not match, check that the calculations of DEVICE_SYSCLK_FREQ and
- // DEVICE_LSPCLK_FREQ are accurate. Some examples will not perform as
- // expected if these are not correct.
- //
- ASSERT(SysCtl_getClock(DEVICE_OSCSRC_FREQ) == DEVICE_SYSCLK_FREQ);
- ASSERT(SysCtl_getLowSpeedClock(DEVICE_OSCSRC_FREQ) == DEVICE_LSPCLK_FREQ);
- #endif
- //
- // Turn on all peripherals
- //
- Device_enableAllPeripherals();
- }
- //*****************************************************************************
- //
- // Function to turn on all peripherals, enabling reads and writes to the
- // peripherals' registers.
- //
- // Note that to reduce power, unused peripherals should be disabled.
- //
- //*****************************************************************************
- void Device_enableAllPeripherals(void)
- {
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CLA1);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_DMA);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TIMER0);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TIMER1);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TIMER2);
- #ifdef CPU1
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_HRPWM);
- #endif
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_GTBCLKSYNC);
- #ifdef CPU1
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EMIF1);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EMIF2);
- #endif
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM1);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM2);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM3);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM4);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM5);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM6);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM7);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM8);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM9);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM10);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM11);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM12);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP1);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP2);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP3);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP4);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP5);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP6);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EQEP1);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EQEP2);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EQEP3);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SD1);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SD2);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCIA);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCIB);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCIC);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCID);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SPIA);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SPIB);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SPIC);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_I2CA);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_I2CB);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CANA);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CANB);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_MCBSPA);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_MCBSPB);
- #ifdef CPU1
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_USBA);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_UPPA);
- #endif
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCA);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCB);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCC);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCD);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS1);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS2);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS3);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS4);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS5);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS6);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS7);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS8);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_DACA);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_DACB);
- SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_DACC);
- }
- //*****************************************************************************
- //
- // Function to disable pin locks on GPIOs.
- //
- //*****************************************************************************
- void Device_initGPIO(void)
- {
- //
- // Disable pin locks.
- //
- GPIO_unlockPortConfig(GPIO_PORT_A, 0xFFFFFFFF);
- GPIO_unlockPortConfig(GPIO_PORT_B, 0xFFFFFFFF);
- GPIO_unlockPortConfig(GPIO_PORT_C, 0xFFFFFFFF);
- GPIO_unlockPortConfig(GPIO_PORT_D, 0xFFFFFFFF);
- GPIO_unlockPortConfig(GPIO_PORT_E, 0xFFFFFFFF);
- GPIO_unlockPortConfig(GPIO_PORT_F, 0xFFFFFFFF);
- //
- // Enable GPIO Pullups
- //
- Device_enableUnbondedGPIOPullups();
- }
- //*****************************************************************************
- //
- // Function to enable pullups for the unbonded GPIOs on the 176PTP package:
- // GPIOs Grp Bits
- // 95-132 C 31
- // D 31:0
- // E 4:0
- // 134-168 E 31:6
- // F 8:0
- //
- //*****************************************************************************
- void Device_enableUnbondedGPIOPullupsFor176Pin(void)
- {
- EALLOW;
- HWREG(GPIOCTRL_BASE + GPIO_O_GPCPUD) = ~0x80000000U;
- HWREG(GPIOCTRL_BASE + GPIO_O_GPDPUD) = ~0xFFFFFFF7U;
- HWREG(GPIOCTRL_BASE + GPIO_O_GPEPUD) = ~0xFFFFFFDFU;
- HWREG(GPIOCTRL_BASE + GPIO_O_GPFPUD) = ~0x000001FFU;
- EDIS;
- }
- //*****************************************************************************
- //
- // Function to enable pullups for the unbonded GPIOs on the 100PZ package:
- // GPIOs Grp Bits
- // 0-1 A 1:0
- // 5-9 A 9:5
- // 22-40 A 31:22
- // B 8:0
- // 44-57 B 25:12
- // 67-68 C 4:3
- // 74-77 C 13:10
- // 79-83 C 19:15
- // 93-168 C 31:29
- // D 31:0
- // E 31:0
- // F 8:0
- //
- //*****************************************************************************
- void Device_enableUnbondedGPIOPullupsFor100Pin(void)
- {
- EALLOW;
- HWREG(GPIOCTRL_BASE + GPIO_O_GPAPUD) = ~0xFFC003E3U;
- HWREG(GPIOCTRL_BASE + GPIO_O_GPBPUD) = ~0x03FFF1FFU;
- HWREG(GPIOCTRL_BASE + GPIO_O_GPCPUD) = ~0xE10FBC18U;
- HWREG(GPIOCTRL_BASE + GPIO_O_GPDPUD) = ~0xFFFFFFF7U;
- HWREG(GPIOCTRL_BASE + GPIO_O_GPEPUD) = ~0xFFFFFFFFU;
- HWREG(GPIOCTRL_BASE + GPIO_O_GPFPUD) = ~0x000001FFU;
- EDIS;
- }
- //*****************************************************************************
- //
- // Function to enable pullups for the unbonded GPIOs on the 100PZ or
- // 176PTP package.
- //
- //*****************************************************************************
- void Device_enableUnbondedGPIOPullups(void)
- {
- //
- // bits 8-10 have pin count
- //
- uint16_t pinCount = ((HWREG(DEVCFG_BASE + SYSCTL_O_PARTIDL) &
- (uint32_t)SYSCTL_PARTIDL_PIN_COUNT_M) >>
- SYSCTL_PARTIDL_PIN_COUNT_S);
- /*
- * 5 = 100 pin
- * 6 = 176 pin
- * 7 = 337 pin
- */
- if(pinCount == 5)
- {
- Device_enableUnbondedGPIOPullupsFor100Pin();
- }
- else if(pinCount == 6)
- {
- Device_enableUnbondedGPIOPullupsFor176Pin();
- }
- else
- {
- //
- // Do nothing - this is 337 pin package
- //
- }
- }
- //*****************************************************************************
- //
- // Error handling function to be called when an ASSERT is violated
- //
- //*****************************************************************************
- void __error__(char *filename, uint32_t line)
- {
- //
- // An ASSERT condition was evaluated as false. You can use the filename and
- // line parameters to determine what went wrong.
- //
- ESTOP0;
- }
|