23#include "px_gpio_init_port_a.h"
24#include "px_gpio_init_port_b.h"
25#include "px_gpio_init_port_c.h"
26#include "px_gpio_init_port_d.h"
27#include "px_gpio_init_port_h.h"
28#include "px_stm32cube.h"
32#ifndef PX_BOARD_PX_HERO
33#warning "Wrong 'board.h' has been included. Check that include path is correct."
37#warning "This BSP is for Piconomix STM32 Hero Board"
41#warning "This Board contains a different microcontroller"
53static void px_board_fatal_error(
void)
58static void px_board_clocks_init(
void)
61 LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG);
63 LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);
67 LL_FLASH_SetLatency(LL_FLASH_LATENCY_1);
68 if(LL_FLASH_GetLatency() != LL_FLASH_LATENCY_1)
70 px_board_fatal_error();
74 LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1);
78 while(!LL_RCC_HSI_IsReady()) {;}
80 LL_RCC_HSI_SetCalibTrimming(16);
83 LL_RCC_HSI48_Enable();
85 LL_SYSCFG_VREFINT_EnableHSI48();
86 while(!LL_RCC_HSI48_IsReady()) {;}
89 LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_CRS);
91 LL_CRS_ConfigSynchronization(LL_CRS_HSI48CALIBRATION_DEFAULT,
92 LL_CRS_ERRORLIMIT_DEFAULT,
93 LL_CRS_RELOADVALUE_DEFAULT,
94 LL_CRS_SYNC_DIV_1 | LL_CRS_SYNC_SOURCE_USB | LL_CRS_SYNC_POLARITY_RISING);
96 LL_CRS_EnableAutoTrimming();
98 LL_CRS_EnableFreqErrorCounter();
102 LL_PWR_EnableBkUpAccess();
105 LL_RCC_ForceBackupDomainReset();
106 LL_RCC_ReleaseBackupDomainReset();
109 LL_RCC_LSE_SetDriveCapability(LL_RCC_LSEDRIVE_LOW);
112 while(!LL_RCC_LSE_IsReady()) {;}
115 LL_RCC_SetRTCClockSource(LL_RCC_RTC_CLKSOURCE_LSE);
122 LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSI,
127 while(!LL_RCC_PLL_IsReady()) {;}
130 LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
132 LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1);
134 LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);
137 LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL);
138 while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) {;}
144 LL_RCC_SetUSARTClockSource(LL_RCC_USART1_CLKSOURCE_PCLK2);
145 LL_RCC_SetUSARTClockSource(LL_RCC_USART2_CLKSOURCE_PCLK1);
146 LL_RCC_SetI2CClockSource (LL_RCC_I2C1_CLKSOURCE_PCLK1);
147 LL_RCC_SetUSBClockSource (LL_RCC_USB_CLKSOURCE_HSI48);
150static void px_board_gpio_init(
void)
153 LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);
154 LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOB);
155 LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOC);
156 LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOD);
157 LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOH);
171 px_board_clocks_init();
173 LL_FLASH_EnablePreRead();
175 px_board_gpio_init();
207 LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM6);
213 TIM6->CR1 |= TIM_CR1_OPM;
219 LL_APB1_GRP1_DisableClock(LL_APB1_GRP1_PERIPH_TIM6);
225 TIM6->ARR = delay_us;
227 TIM6->EGR = TIM_EGR_UG;
229 TIM6->CR1 |= TIM_CR1_CEN;
231 while(TIM6->CR1 & TIM_CR1_CEN) {;}
249 LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM3);
252 LL_TIM_SetPrescaler(TIM3, psc);
254 LL_TIM_EnableARRPreload(TIM3);
256 LL_TIM_SetAutoReload(TIM3, arr);
258 LL_TIM_OC_SetMode(TIM3, LL_TIM_CHANNEL_CH1, LL_TIM_OCMODE_TOGGLE);
259 LL_TIM_OC_SetPolarity(TIM3, LL_TIM_CHANNEL_CH1, LL_TIM_OCPOLARITY_HIGH);
263 LL_TIM_OC_EnablePreload(TIM3, LL_TIM_CHANNEL_CH1);
264 LL_TIM_CC_EnableChannel(TIM3, LL_TIM_CHANNEL_CH1);
265 LL_TIM_EnableCounter(TIM3);
266 LL_TIM_GenerateEvent_UPDATE(TIM3);
274 LL_TIM_DisableCounter(TIM3);
275 LL_APB1_GRP1_DisableClock(LL_APB1_GRP1_PERIPH_TIM3);
282 px_gpio_pull_dn_enable(&px_gpio_swdck);
287 LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_DBGMCU);
288 LL_DBGMCU_EnableDBGSleepMode();
289 LL_DBGMCU_EnableDBGStopMode();
296 px_gpio_pull_disable(&px_gpio_swdck);
298 px_gpio_pull_disable(&px_gpio_swdio);
301 LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_DBGMCU);
302 LL_DBGMCU_DisableDBGStopMode();
303 LL_APB2_GRP1_DisableClock(LL_APB2_GRP1_PERIPH_DBGMCU);
309 bool systick_int_enabled;
312 primask = __get_PRIMASK();
316 if(LL_SYSTICK_IsEnabledIT())
319 systick_int_enabled =
true;
322 LL_SYSTICK_DisableIT();
327 systick_int_enabled =
false;
331 LL_PWR_EnableUltraLowPower();
333 LL_PWR_EnableFastWakeUp();
335 LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI);
337 LL_PWR_SetPowerMode(LL_PWR_MODE_STOP);
339 LL_PWR_SetRegulModeLP(LL_PWR_REGU_LPMODES_LOW_POWER);
341 LL_PWR_ClearFlag_WU();
343 LL_LPM_EnableDeepSleep();
352 while(!LL_RCC_PLL_IsReady()) {;}
354 LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL);
355 while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) {;}
358 LL_LPM_EnableSleep();
360 LL_PWR_SetRegulModeLP(LL_PWR_REGU_LPMODES_MAIN);
362 if(systick_int_enabled)
365 LL_SYSTICK_EnableIT();
368 __set_PRIMASK(primask);
void px_gpio_pull_up_enable(const px_gpio_handle_t *gpio)
Enable pull-up on GPIO pin.
@ PX_BOARD_SPI1_CS
Peripheral CS.
@ PX_BOARD_SPI1_CS_SD
SD Card.
@ PX_BOARD_SPI2_CS_SF
Adesto AT25S Serial FLASH.
@ PX_BOARD_SPI2_CS_LCD
JHD JHD12864-G176BSW 128x64 monochrome LCD.
void px_board_delay_init(void)
Initialise Timer 6 with 1 us clock ticks for delay use.
void px_board_delay_us(uint16_t delay_us)
Blocking delay for specified number of microseconds.
#define PX_BOARD_SYS_CLK_HZ
System clock frequency in Hz.
void px_board_init(void)
Initialise the board hardware.
void px_board_stop_mode(void)
Enter low power STOP mode and wait for interrupt to wake up core.
void px_board_dbg_enable(void)
Enable DBG module during SLEEP and STOP mode.
void px_board_delay_ms(uint16_t delay_ms)
Blocking delay for specified number of milliseconds.
void px_board_buzzer_on(uint16_t freq_hz)
Enable PWM output to piezo buzzer at specified frequency.
void px_board_spi_cs_hi(uint8_t cs_id)
Set specified SPI Chip Select high.
void px_board_dbg_disable(void)
Disable DBG module.
#define PX_BOARD_PER_CLK_HZ
Peripheral clock frequency in Hz.
void px_board_delay_deinit(void)
Disable Timer 6.
void px_board_spi_cs_lo(uint8_t cs_id)
Set specified SPI Chip Select low.
void px_board_buzzer_off(void)
Disable PWM output to piezo buzzer.
#define PX_UDIV_ROUND(dividend, divisor)
Calculate unsigned division with rounding to nearest integer value.
void px_gpio_port_init(const px_gpio_port_init_t *init)
Initialise a GPIO port.
#define PX_GPIO_OUT_SET_HI(gpio)
Set GPIO pin output high.
#define PX_GPIO_OUT_SET_LO(gpio)
Set GPIO pin output low.
@ PX_GPIO_MODE_AF
Set pin mode to alternative function.
@ PX_GPIO_MODE_ANA
Set pin mode to analog.