device.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. //#############################################################################
  2. //
  3. // FILE: device.c
  4. //
  5. // TITLE: Device setup for examples.
  6. //
  7. //#############################################################################
  8. // $TI Release: F2837xD Support Library v3.05.00.00 $
  9. // $Release Date: Tue Jun 26 03:15:23 CDT 2018 $
  10. // $Copyright:
  11. // Copyright (C) 2013-2018 Texas Instruments Incorporated - http://www.ti.com/
  12. //
  13. // Redistribution and use in source and binary forms, with or without
  14. // modification, are permitted provided that the following conditions
  15. // are met:
  16. //
  17. // Redistributions of source code must retain the above copyright
  18. // notice, this list of conditions and the following disclaimer.
  19. //
  20. // Redistributions in binary form must reproduce the above copyright
  21. // notice, this list of conditions and the following disclaimer in the
  22. // documentation and/or other materials provided with the
  23. // distribution.
  24. //
  25. // Neither the name of Texas Instruments Incorporated nor the names of
  26. // its contributors may be used to endorse or promote products derived
  27. // from this software without specific prior written permission.
  28. //
  29. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  30. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  31. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  32. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  33. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  34. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  35. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  36. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  37. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  38. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  39. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  40. // $
  41. //#############################################################################
  42. //
  43. // Included Files
  44. //
  45. #include "device.h"
  46. #include "driverlib.h"
  47. #ifdef __cplusplus
  48. using std::memcpy;
  49. #endif
  50. //*****************************************************************************
  51. //
  52. // Function to initialize the device. Primarily initializes system control to a
  53. // known state by disabling the watchdog, setting up the SYSCLKOUT frequency,
  54. // and enabling the clocks to the peripherals.
  55. //
  56. //*****************************************************************************
  57. void Device_init(void)
  58. {
  59. //
  60. // Disable the watchdog
  61. //
  62. SysCtl_disableWatchdog();
  63. #ifdef _FLASH
  64. //
  65. // Copy time critical code and flash setup code to RAM. This includes the
  66. // following functions: InitFlash();
  67. //
  68. // The RamfuncsLoadStart, RamfuncsLoadSize, and RamfuncsRunStart symbols
  69. // are created by the linker. Refer to the device .cmd file.
  70. //
  71. memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
  72. //
  73. // Call Flash Initialization to setup flash waitstates. This function must
  74. // reside in RAM.
  75. //
  76. Flash_initModule(FLASH0CTRL_BASE, FLASH0ECC_BASE, DEVICE_FLASH_WAITSTATES);
  77. #endif
  78. #ifdef CPU1
  79. //
  80. // Set up PLL control and clock dividers
  81. //
  82. SysCtl_setClock(DEVICE_SETCLOCK_CFG);
  83. //
  84. // Make sure the LSPCLK divider is set to the default (divide by 4)
  85. //
  86. SysCtl_setLowSpeedClock(SYSCTL_LSPCLK_PRESCALE_4);
  87. //
  88. // These asserts will check that the #defines for the clock rates in
  89. // device.h match the actual rates that have been configured. If they do
  90. // not match, check that the calculations of DEVICE_SYSCLK_FREQ and
  91. // DEVICE_LSPCLK_FREQ are accurate. Some examples will not perform as
  92. // expected if these are not correct.
  93. //
  94. ASSERT(SysCtl_getClock(DEVICE_OSCSRC_FREQ) == DEVICE_SYSCLK_FREQ);
  95. ASSERT(SysCtl_getLowSpeedClock(DEVICE_OSCSRC_FREQ) == DEVICE_LSPCLK_FREQ);
  96. #endif
  97. //
  98. // Turn on all peripherals
  99. //
  100. Device_enableAllPeripherals();
  101. }
  102. //*****************************************************************************
  103. //
  104. // Function to turn on all peripherals, enabling reads and writes to the
  105. // peripherals' registers.
  106. //
  107. // Note that to reduce power, unused peripherals should be disabled.
  108. //
  109. //*****************************************************************************
  110. void Device_enableAllPeripherals(void)
  111. {
  112. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CLA1);
  113. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_DMA);
  114. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TIMER0);
  115. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TIMER1);
  116. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TIMER2);
  117. #ifdef CPU1
  118. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_HRPWM);
  119. #endif
  120. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
  121. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_GTBCLKSYNC);
  122. #ifdef CPU1
  123. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EMIF1);
  124. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EMIF2);
  125. #endif
  126. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM1);
  127. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM2);
  128. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM3);
  129. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM4);
  130. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM5);
  131. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM6);
  132. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM7);
  133. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM8);
  134. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM9);
  135. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM10);
  136. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM11);
  137. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM12);
  138. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP1);
  139. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP2);
  140. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP3);
  141. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP4);
  142. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP5);
  143. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP6);
  144. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EQEP1);
  145. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EQEP2);
  146. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EQEP3);
  147. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SD1);
  148. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SD2);
  149. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCIA);
  150. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCIB);
  151. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCIC);
  152. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCID);
  153. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SPIA);
  154. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SPIB);
  155. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SPIC);
  156. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_I2CA);
  157. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_I2CB);
  158. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CANA);
  159. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CANB);
  160. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_MCBSPA);
  161. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_MCBSPB);
  162. #ifdef CPU1
  163. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_USBA);
  164. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_UPPA);
  165. #endif
  166. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCA);
  167. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCB);
  168. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCC);
  169. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCD);
  170. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS1);
  171. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS2);
  172. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS3);
  173. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS4);
  174. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS5);
  175. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS6);
  176. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS7);
  177. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS8);
  178. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_DACA);
  179. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_DACB);
  180. SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_DACC);
  181. }
  182. //*****************************************************************************
  183. //
  184. // Function to disable pin locks on GPIOs.
  185. //
  186. //*****************************************************************************
  187. void Device_initGPIO(void)
  188. {
  189. //
  190. // Disable pin locks.
  191. //
  192. GPIO_unlockPortConfig(GPIO_PORT_A, 0xFFFFFFFF);
  193. GPIO_unlockPortConfig(GPIO_PORT_B, 0xFFFFFFFF);
  194. GPIO_unlockPortConfig(GPIO_PORT_C, 0xFFFFFFFF);
  195. GPIO_unlockPortConfig(GPIO_PORT_D, 0xFFFFFFFF);
  196. GPIO_unlockPortConfig(GPIO_PORT_E, 0xFFFFFFFF);
  197. GPIO_unlockPortConfig(GPIO_PORT_F, 0xFFFFFFFF);
  198. //
  199. // Enable GPIO Pullups
  200. //
  201. Device_enableUnbondedGPIOPullups();
  202. }
  203. //*****************************************************************************
  204. //
  205. // Function to enable pullups for the unbonded GPIOs on the 176PTP package:
  206. // GPIOs Grp Bits
  207. // 95-132 C 31
  208. // D 31:0
  209. // E 4:0
  210. // 134-168 E 31:6
  211. // F 8:0
  212. //
  213. //*****************************************************************************
  214. void Device_enableUnbondedGPIOPullupsFor176Pin(void)
  215. {
  216. EALLOW;
  217. HWREG(GPIOCTRL_BASE + GPIO_O_GPCPUD) = ~0x80000000U;
  218. HWREG(GPIOCTRL_BASE + GPIO_O_GPDPUD) = ~0xFFFFFFF7U;
  219. HWREG(GPIOCTRL_BASE + GPIO_O_GPEPUD) = ~0xFFFFFFDFU;
  220. HWREG(GPIOCTRL_BASE + GPIO_O_GPFPUD) = ~0x000001FFU;
  221. EDIS;
  222. }
  223. //*****************************************************************************
  224. //
  225. // Function to enable pullups for the unbonded GPIOs on the 100PZ package:
  226. // GPIOs Grp Bits
  227. // 0-1 A 1:0
  228. // 5-9 A 9:5
  229. // 22-40 A 31:22
  230. // B 8:0
  231. // 44-57 B 25:12
  232. // 67-68 C 4:3
  233. // 74-77 C 13:10
  234. // 79-83 C 19:15
  235. // 93-168 C 31:29
  236. // D 31:0
  237. // E 31:0
  238. // F 8:0
  239. //
  240. //*****************************************************************************
  241. void Device_enableUnbondedGPIOPullupsFor100Pin(void)
  242. {
  243. EALLOW;
  244. HWREG(GPIOCTRL_BASE + GPIO_O_GPAPUD) = ~0xFFC003E3U;
  245. HWREG(GPIOCTRL_BASE + GPIO_O_GPBPUD) = ~0x03FFF1FFU;
  246. HWREG(GPIOCTRL_BASE + GPIO_O_GPCPUD) = ~0xE10FBC18U;
  247. HWREG(GPIOCTRL_BASE + GPIO_O_GPDPUD) = ~0xFFFFFFF7U;
  248. HWREG(GPIOCTRL_BASE + GPIO_O_GPEPUD) = ~0xFFFFFFFFU;
  249. HWREG(GPIOCTRL_BASE + GPIO_O_GPFPUD) = ~0x000001FFU;
  250. EDIS;
  251. }
  252. //*****************************************************************************
  253. //
  254. // Function to enable pullups for the unbonded GPIOs on the 100PZ or
  255. // 176PTP package.
  256. //
  257. //*****************************************************************************
  258. void Device_enableUnbondedGPIOPullups(void)
  259. {
  260. //
  261. // bits 8-10 have pin count
  262. //
  263. uint16_t pinCount = ((HWREG(DEVCFG_BASE + SYSCTL_O_PARTIDL) &
  264. (uint32_t)SYSCTL_PARTIDL_PIN_COUNT_M) >>
  265. SYSCTL_PARTIDL_PIN_COUNT_S);
  266. /*
  267. * 5 = 100 pin
  268. * 6 = 176 pin
  269. * 7 = 337 pin
  270. */
  271. if(pinCount == 5)
  272. {
  273. Device_enableUnbondedGPIOPullupsFor100Pin();
  274. }
  275. else if(pinCount == 6)
  276. {
  277. Device_enableUnbondedGPIOPullupsFor176Pin();
  278. }
  279. else
  280. {
  281. //
  282. // Do nothing - this is 337 pin package
  283. //
  284. }
  285. }
  286. //*****************************************************************************
  287. //
  288. // Error handling function to be called when an ASSERT is violated
  289. //
  290. //*****************************************************************************
  291. void __error__(char *filename, uint32_t line)
  292. {
  293. //
  294. // An ASSERT condition was evaluated as false. You can use the filename and
  295. // line parameters to determine what went wrong.
  296. //
  297. ESTOP0;
  298. }