embkernel
 All Classes Functions Variables Typedefs Groups Pages
Hw.cpp
1 //------------------------------------------------------------------------------
2 //This file is part of embKernel.
3 //See license.txt for the full license governing this code.
4 //------------------------------------------------------------------------------
5 
6 #include "Hw.hpp"
7 #include "stm32f30x.h"
8 
9 DrvGpio Hw::sLed3;
10 DrvGpio Hw::sLed4;
11 DrvGpio Hw::sLed5;
12 DrvGpio Hw::sLed6;
13 DrvGpio Hw::sLed7;
14 DrvGpio Hw::sLed8;
15 DrvGpio Hw::sLed9;
16 DrvGpio Hw::sLed10;
17 DrvI2cMaster Hw::sI2cLsm303dlhc;
18 LSM303DLHC Hw::sLsm303dlhc(&sI2cLsm303dlhc);
19 
20 void Hw::init() {
22  //Clock configuration.
23  //PLLCLK=72MHz, SYSCLK=72MHz, HCLK=72MHz, APB1CLK=36MHz, APB2CLK=72MHz
25  RCC ->CFGR = 0; //Reset all clock config
26 
27  RCC ->CR |= ((uint32_t) RCC_CR_HSEON ); //Enable HSE
28 
29  while (!(RCC ->CR & RCC_CR_HSERDY )) { //Wait HSE ready
30  }
31 
32  FLASH ->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY_1; // Prefetch Buffer Enable, Flash 2 wait state
33 
34  RCC ->CFGR = RCC_CFGR_HPRE_DIV1 | //HLCK prescaler = 1 (72MHz)
35  RCC_CFGR_PPRE2_DIV1 | //APB high-speed prescaler = 1 (72MHz)
36  RCC_CFGR_PPRE1_DIV2 | //APB low-speed prescaler = 2 (36MHz)
37  RCC_CFGR_PLLSRC_PREDIV1 | //HSE/PREDIV selected as PLL input clock
38  RCC_CFGR_PLLXTPRE_PREDIV1 | //HSE input to PLL not divided
39  RCC_CFGR_PLLMULL9; //PLL multiplication factor = 9 (72MHz)
40 
41  RCC ->CFGR2 = RCC_CFGR2_ADCPRE12_DIV1 | RCC_CFGR2_ADCPRE34_DIV1;
42  RCC ->CR |= ((uint32_t) RCC_CR_PLLON ); //Enable PLL
43 
44  while (!(RCC ->CR & RCC_CR_PLLRDY )) { //Wait PLL ready
45  }
46 
47  RCC ->CFGR |= RCC_CFGR_SW_PLL; //Switch to PLL clock
48 
49  while (!(RCC ->CFGR & RCC_CFGR_SWS_PLL )) { //Wait for system to switch to PLL
50  }
51 
52  RCC ->CFGR3 = RCC_CFGR3_TIM1SW | RCC_CFGR3_TIM8SW; //Clock source for TIM1 and TIM8 is PLLCLK x 2
53 
55  //Enable peripherals
57 #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
58  SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); // set CP10 and CP11 Full Access
59 #endif
60 
61  RCC ->AHBENR = //RCC_AHBENR_DMA1EN | // DMA1 clock enable
62  //RCC_AHBENR_DMA2EN | // DMA2 clock enable
63  //RCC_AHBENR_SRAMEN | // SRAM interface clock enable
64  //RCC_AHBENR_FLITFEN | // FLITF clock enable
65  //RCC_AHBENR_CRCEN | // CRC clock enable
66  RCC_AHBENR_GPIOAEN | // GPIOA clock enable
67  RCC_AHBENR_GPIOBEN | // GPIOB clock enable
68  RCC_AHBENR_GPIOCEN | // GPIOC clock enable
69  RCC_AHBENR_GPIODEN | // GPIOD clock enable
70  RCC_AHBENR_GPIOEEN | // GPIOE clock enable
71  RCC_AHBENR_GPIOFEN; // | // GPIOF clock enable
72  //RCC_AHBENR_TSEN | // TS clock enable
73  //RCC_AHBENR_ADC12EN | // ADC1/ ADC2 clock enable
74  //RCC_AHBENR_ADC34EN; // ADC1/ ADC2 clock enable
75 
76  RCC ->APB1ENR = //RCC_APB1ENR_TIM2EN | // Timer 2 clock enable
77  //RCC_APB1ENR_TIM3EN | // Timer 3 clock enable
78  //RCC_APB1ENR_TIM4EN | // Timer 4 clock enable
79  //RCC_APB1ENR_TIM6EN | // Timer 6 clock enable
80  //RCC_APB1ENR_TIM7EN | // Timer 7 clock enable
81  //RCC_APB1ENR_WWDGEN | // Window Watchdog clock enable
82  //RCC_APB1ENR_SPI2EN | // SPI2 clock enable
83  //RCC_APB1ENR_SPI3EN | // SPI3 clock enable
84  //RCC_APB1ENR_USART2EN | // USART 2 clock enable
85  //RCC_APB1ENR_USART3EN | // USART 3 clock enable
86  //RCC_APB1ENR_UART3EN | // UART 3 clock enable
87  //RCC_APB1ENR_UART4EN | // UART 4 clock enable
88  RCC_APB1ENR_I2C1EN | // I2C 1 clock enable
89  //RCC_APB1ENR_I2C2EN | // I2C 2 clock enable
90  RCC_APB1ENR_USBEN | // USB clock enable
91  //RCC_APB1ENR_CAN1EN | // CAN clock enable
92  RCC_APB1ENR_PWREN; // | // PWR clock enable
93  //RCC_APB1ENR_DACEN; // DAC clock enable
94 
95  RCC ->APB2ENR = RCC_APB2ENR_SYSCFGEN; // | // SYSCFG clock enable
96  //RCC_APB2ENR_TIM1EN | // TIM1 clock enable
97  //RCC_APB2ENR_SPI1EN | // SPI1 clock enable
98  //RCC_APB2ENR_TIM8EN | // TIM8 clock enable
99  //RCC_APB2ENR_USART1EN; // | // USART1 clock enable
100  //RCC_APB2ENR_TIM15EN | // TIM15 clock enable
101  //RCC_APB2ENR_TIM16EN | // TIM16 clock enable
102  //RCC_APB2ENR_TIM17EN // TIM17 clock enable
103 
104  DrvGpio::setPinFuncMode(DrvTypes::DRV_PORTA, DrvTypes::DRV_PIN12, DrvTypes::DRV_FUNC0, DrvTypes::DRV_MODE_OUTPUT_PUSH_PULL); //USB D+
105 
106  sLed3.init(DrvTypes::DRV_PORTE, DrvTypes::DRV_PIN9, DrvTypes::DRV_FUNC0, DrvTypes::DRV_MODE_OUTPUT_PUSH_PULL);
107  sLed4.init(DrvTypes::DRV_PORTE, DrvTypes::DRV_PIN8, DrvTypes::DRV_FUNC0, DrvTypes::DRV_MODE_OUTPUT_PUSH_PULL);
108  sLed5.init(DrvTypes::DRV_PORTE, DrvTypes::DRV_PIN10, DrvTypes::DRV_FUNC0, DrvTypes::DRV_MODE_OUTPUT_PUSH_PULL);
109  sLed6.init(DrvTypes::DRV_PORTE, DrvTypes::DRV_PIN15, DrvTypes::DRV_FUNC0, DrvTypes::DRV_MODE_OUTPUT_PUSH_PULL);
110  sLed7.init(DrvTypes::DRV_PORTE, DrvTypes::DRV_PIN11, DrvTypes::DRV_FUNC0, DrvTypes::DRV_MODE_OUTPUT_PUSH_PULL);
111  sLed8.init(DrvTypes::DRV_PORTE, DrvTypes::DRV_PIN14, DrvTypes::DRV_FUNC0, DrvTypes::DRV_MODE_OUTPUT_PUSH_PULL);
112  sLed9.init(DrvTypes::DRV_PORTE, DrvTypes::DRV_PIN12, DrvTypes::DRV_FUNC0, DrvTypes::DRV_MODE_OUTPUT_PUSH_PULL);
113  sLed10.init(DrvTypes::DRV_PORTE, DrvTypes::DRV_PIN13, DrvTypes::DRV_FUNC0, DrvTypes::DRV_MODE_OUTPUT_PUSH_PULL);
114 
115  DrvGpio::setPinFuncMode(DrvTypes::DRV_PORTA, DrvTypes::DRV_PIN11, DrvTypes::DRV_FUNC14, DrvTypes::DRV_MODE_ALTERNATE_FUNCTION); //USB D-
116  DrvGpio::setPinFuncMode(DrvTypes::DRV_PORTA, DrvTypes::DRV_PIN12, DrvTypes::DRV_FUNC14, DrvTypes::DRV_MODE_ALTERNATE_FUNCTION); //USB D+
117 
118  sI2cLsm303dlhc.init(DrvTypes::DRV_I2C1);
119  DrvGpio::setPinFuncMode(DrvTypes::DRV_PORTB, DrvTypes::DRV_PIN6, DrvTypes::DRV_FUNC4, DrvTypes::DRV_MODE_ALTERNATE_FUNCTION); //Lsm303dlhc SCL
120  DrvGpio::setPinFuncMode(DrvTypes::DRV_PORTB, DrvTypes::DRV_PIN7, DrvTypes::DRV_FUNC4, DrvTypes::DRV_MODE_ALTERNATE_FUNCTION); //Lsm303dlhc SDA
121 }