diff --git a/src/cm4/Makefile b/src/cm4/Makefile index 458d1afe6..66344e329 100755 --- a/src/cm4/Makefile +++ b/src/cm4/Makefile @@ -17,6 +17,7 @@ SRC_C += $(addprefix $(HAL_DIR)/src/, \ stm32h7xx_hal_rcc_ex.c \ stm32h7xx_hal_rtc.c \ stm32h7xx_hal_rtc_ex.c \ + stm32h7xx_hal_hsem.c \ ) #SRCS += $(addprefix $(HAL_DIR)/src/, $(notdir $(wildcard ../$(HAL_DIR)/src/*.c))) diff --git a/src/cm4/src/main.c b/src/cm4/src/main.c index 29b67b80e..128ae3999 100644 --- a/src/cm4/src/main.c +++ b/src/cm4/src/main.c @@ -1,14 +1,64 @@ #include STM32_HAL_H +#define HSEM_ID_0 (0U) /* HW semaphore 0*/ +#define LED_RED GPIO_PIN_5 +#define LED_GREEN GPIO_PIN_6 +#define LED_BLUE GPIO_PIN_7 + +void blink_led(uint32_t led) +{ + __GPIOK_CLK_ENABLE(); + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.Pin = led; + GPIO_InitStructure.Pull = GPIO_PULLDOWN; + GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStructure.Speed = GPIO_SPEED_LOW; + HAL_GPIO_Init(GPIOK, &GPIO_InitStructure); + HAL_GPIO_WritePin(GPIOK, led, GPIO_PIN_SET); + + for (int i=0; i<5; i++) { + HAL_GPIO_WritePin(GPIOK, led, GPIO_PIN_RESET); + HAL_Delay(100); + HAL_GPIO_WritePin(GPIOK, led, GPIO_PIN_SET); + HAL_Delay(100); + } + __GPIOK_CLK_DISABLE(); +} int main(void) { - __disable_irq(); + HAL_Init(); + + blink_led(LED_GREEN); + + // HW semaphore Clock enable + __HAL_RCC_HSEM_CLK_ENABLE(); + + // Configure the NVIC HSEM notification interrupt for CM4 + HAL_NVIC_SetPriority(HSEM2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(HSEM2_IRQn); + + // Activate HSEM notification for Cortex-M4 + HAL_HSEM_ActivateNotification(__HAL_HSEM_SEMID_TO_MASK(HSEM_ID_0)); - // Add Cortex-M4 code here. HAL_PWREx_ClearPendingEvent(); HAL_PWREx_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFE, PWR_D2_DOMAIN); + HAL_PWREx_ClearPendingEvent(); + + // Deactivate HSEM notification for Cortex-M4 + HAL_HSEM_DeactivateNotification(__HAL_HSEM_SEMID_TO_MASK(HSEM_ID_0)); + + // HW semaphore Clock disable + __HAL_RCC_HSEM_CLK_DISABLE(); + + // Enter D3 domain to DStandby mode + HAL_PWREx_EnterSTANDBYMode(PWR_D3_DOMAIN); + + // Enter D2 domain to DStandby mode + HAL_PWREx_EnterSTANDBYMode(PWR_D2_DOMAIN); + + HAL_Init(); while (1) { - __WFI(); + blink_led(LED_RED); } } diff --git a/src/cm4/src/stm32h7xx_it.c b/src/cm4/src/stm32h7xx_it.c index c5bcf44b3..8b25ef6e0 100644 --- a/src/cm4/src/stm32h7xx_it.c +++ b/src/cm4/src/stm32h7xx_it.c @@ -125,9 +125,13 @@ void SysTick_Handler(void) */ void HSEM2_IRQHandler(void) { - + HAL_HSEM_IRQHandler(); } +void RTC_WKUP_IRQHandler(void) +{ + +} /** * @} */ diff --git a/src/hal/stm32/h7/Makefile b/src/hal/stm32/h7/Makefile index f7be82056..92126708f 100644 --- a/src/hal/stm32/h7/Makefile +++ b/src/hal/stm32/h7/Makefile @@ -24,6 +24,7 @@ stm32h7xx_hal_flash.c\ stm32h7xx_hal_flash_ex.c\ stm32h7xx_hal_gpio.c\ stm32h7xx_hal_hcd.c\ +stm32h7xx_hal_hsem.c\ stm32h7xx_hal_i2c.c\ stm32h7xx_hal_i2c_ex.c\ stm32h7xx_hal_ltdc.c\ diff --git a/src/omv/ports/stm32/omv_portconfig.mk b/src/omv/ports/stm32/omv_portconfig.mk index 08d20ba22..55be68a74 100644 --- a/src/omv/ports/stm32/omv_portconfig.mk +++ b/src/omv/ports/stm32/omv_portconfig.mk @@ -68,6 +68,11 @@ endif ifeq ($(OMV_ENABLE_CM4), 1) CFLAGS += -DM4_APP_ADDR=$(M4_APP_ADDR) +ifeq ($(DEBUG), 1) +CM4_CFLAGS += -Og -ggdb3 -Wno-maybe-uninitialized +else +CM4_CFLAGS += -O2 -DNDEBUG +endif CM4_CFLAGS += -std=gnu99 -Wall -Werror -Warray-bounds -mthumb -nostartfiles -fdata-sections -ffunction-sections CM4_CFLAGS += -D$(MCU) -D$(CFLAGS_MCU) -D$(ARM_MATH) -DARM_NN_TRUNCATE -DCORE_CM4\ -fsingle-precision-constant -Wdouble-promotion -mcpu=cortex-m4 -mtune=cortex-m4 -mfpu=$(FPU) -mfloat-abi=hard