From 84fd09ae540e2de2149905be87c7853d1691a133 Mon Sep 17 00:00:00 2001 From: heck Date: Mon, 4 Sep 2023 19:23:36 +0200 Subject: [PATCH 1/2] add debug_suspend() / assert print works --- src/cppmain.cc | 27 ++++++++++++++++++--------- src/cppmain.h | 4 ++-- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/cppmain.cc b/src/cppmain.cc index 16e2f4a..7c74d5e 100644 --- a/src/cppmain.cc +++ b/src/cppmain.cc @@ -10,6 +10,12 @@ const double pi{ std::acos(-1) }; #define BUFFER_SIZE 512 namespace Heck { + bool debug_suspend_active = false; + + void debug_suspend_continue() { + debug_suspend_active = false; + } + // Serial Logging // -------------- void log(std::string msg) @@ -72,10 +78,7 @@ namespace Heck { // CALLBACKS void irq1_cb() { - if (!is_running) { - is_running = true; - return; - } + debug_suspend_continue(); } void timer2_cb() @@ -121,7 +124,7 @@ namespace Heck { { log("buffer_init_sin()"); for (int i = 0; i < BUFFER_SIZE; i++) { - float p = float(i) / (float)BUFFER_SIZE - 0.5; + float p = float(i) / (float)BUFFER_SIZE - 0.5 / 2.; u32 val = sin(p) * 4096; audio_buffer[i] = val; log(std::to_string(val)); @@ -149,9 +152,7 @@ namespace Heck { void main() { - while (!is_running) { - HAL_Delay(1); - } + heck_debug_suspend(); log("Starting..."); dac_start_dma(); @@ -177,6 +178,14 @@ namespace Heck { // C Linkage (Bridging) // ---------------------------------------------------------------------------------------------- +void heck_debug_suspend(void) { + Heck::debug_suspend_active = true; + while(Heck::debug_suspend_active == true) { + Heck::log("debug_suspend..."); + HAL_Delay(1000); + } +} + void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == GPIO_PIN_0) { @@ -238,7 +247,7 @@ void assert_failed(uint8_t *file, uint32_t line) ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ int str_size = 1024; char str[str_size]; - snprintf(str, str_size, "assert failed: %s:%d"); + snprintf(str, str_size, "assert failed: %s:%d",file,line); heck_log(str); } diff --git a/src/cppmain.h b/src/cppmain.h index 590d873..04698dd 100644 --- a/src/cppmain.h +++ b/src/cppmain.h @@ -12,6 +12,7 @@ extern "C" { void heck_cppmain(void); void heck_log(char* msg); + void heck_debug_suspend(void); void assert_failed(uint8_t* file, uint32_t line); void Error_Handler(void); @@ -32,8 +33,7 @@ extern "C" { using u32 = uint32_t; namespace Heck { - bool is_running{ false }; - + void debug_suspend_continue(); // Serial Logging void log(std::string msg); From 58cba0fbda4dc574e27f6e61cd0cbb4be16e0641 Mon Sep 17 00:00:00 2001 From: heck Date: Mon, 4 Sep 2023 19:25:42 +0200 Subject: [PATCH 2/2] restructure --- src/init.c | 129 +++++++++++++++++++++++++---------------------------- 1 file changed, 61 insertions(+), 68 deletions(-) diff --git a/src/init.c b/src/init.c index 14a5d1c..a22aaf7 100644 --- a/src/init.c +++ b/src/init.c @@ -1,7 +1,5 @@ #include "cppmain.h" -#include "usbd_cdc_if.h" #include "usb_device.h" -#include "cmsis_os.h" DAC_HandleTypeDef hdac1; DMA_HandleTypeDef hdma_dac1; @@ -53,11 +51,9 @@ void sysclk_init(void) // The RNG __HAL_RCC_RNG_CLK_ENABLE(); - // Configure the main internal regulator output voltage __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); - { // Initializes the RCC Oscillators according to the specified parameters // in the RCC_OscInitTypeDef structure. @@ -93,11 +89,8 @@ void sysclk_init(void) } } - -void gpio_init(void) +void debug_init() { - HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET); - { // Button Blue GPIO_InitTypeDef conf = { @@ -109,6 +102,16 @@ void gpio_init(void) HAL_GPIO_Init(GPIOA, &conf); } + HAL_NVIC_SetPriority(EXTI0_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(EXTI0_IRQn); + + MX_USB_DEVICE_Init(); // USB first, for logging over serial port +} + +void gpio_init(void) +{ + HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET); + { // LED Green GPIO_InitTypeDef conf = { @@ -134,51 +137,6 @@ void gpio_init(void) } } -void dac_init(void) -{ - hdac1.Instance = DAC1; - if (HAL_DAC_Init(&hdac1) != HAL_OK) { - Error_Handler(); - } - - DAC_ChannelConfTypeDef conf = { - .DAC_Trigger = DAC_TRIGGER_T6_TRGO, - .DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE, - }; - if (HAL_DAC_ConfigChannel(&hdac1, &conf, DAC_CHANNEL_1) != HAL_OK) { - Error_Handler(); - } -} - -void dma_init(void) -{ - hdma_dac1.Instance = DMA1_Stream5; - hdma_dac1.Init.Channel = DMA_CHANNEL_7; - hdma_dac1.Init.Direction = DMA_MEMORY_TO_PERIPH; - hdma_dac1.Init.PeriphInc = DMA_PINC_DISABLE; - hdma_dac1.Init.MemInc = DMA_MINC_ENABLE; - hdma_dac1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; - hdma_dac1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; - hdma_dac1.Init.Mode = DMA_NORMAL; - hdma_dac1.Init.Priority = DMA_PRIORITY_LOW; - hdma_dac1.Init.FIFOMode = DMA_FIFOMODE_DISABLE; - if (HAL_DMA_Init(&hdma_dac1) != HAL_OK) { - Error_Handler(); - } - - // Originally that was: - // __HAL_LINKDMA(&hdac1, DMA_Handle1, hdma_dac1); - // Exapanded to: - // hdma_dac1.Parent = &hdac1; - // hdac1.DMA_Handle1 = &hdma_dac1; - // But this seems to be enough: - hdac1.DMA_Handle1 = &hdma_dac1; -} - -// -------------------------------------------------------------------------------------------------- -// Timers -// -------------------------------------------------------------------------------------------------- - void timer_init(void) { { @@ -210,6 +168,9 @@ void timer_init(void) Error_Handler(); } } + + HAL_NVIC_SetPriority(TIM2_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(TIM2_IRQn); } { @@ -252,25 +213,52 @@ void timer_init(void) Error_Handler(); } } + + HAL_NVIC_SetPriority(TIM7_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(TIM7_IRQn); } } -void irq_init() +void dac_dma_init(void) { - // This is for RTOS i guess - // HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0); + hdac1.Instance = DAC1; + if (HAL_DAC_Init(&hdac1) != HAL_OK) { + Error_Handler(); + } + + DAC_ChannelConfTypeDef conf = { + .DAC_Trigger = DAC_TRIGGER_T6_TRGO, + .DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE, + }; + if (HAL_DAC_ConfigChannel(&hdac1, &conf, DAC_CHANNEL_1) != HAL_OK) { + Error_Handler(); + } - HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 1, 0); - HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn); - HAL_NVIC_SetPriority(TIM2_IRQn, 5, 0); - HAL_NVIC_EnableIRQ(TIM2_IRQn); + hdma_dac1.Instance = DMA1_Stream5; + hdma_dac1.Init.Channel = DMA_CHANNEL_7; + hdma_dac1.Init.Direction = DMA_MEMORY_TO_PERIPH; + hdma_dac1.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_dac1.Init.MemInc = DMA_MINC_ENABLE; + hdma_dac1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; + hdma_dac1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; + hdma_dac1.Init.Mode = DMA_NORMAL; + hdma_dac1.Init.Priority = DMA_PRIORITY_LOW; + hdma_dac1.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + if (HAL_DMA_Init(&hdma_dac1) != HAL_OK) { + Error_Handler(); + } - HAL_NVIC_SetPriority(TIM7_IRQn, 5, 0); - HAL_NVIC_EnableIRQ(TIM7_IRQn); + // Originally that was: + // __HAL_LINKDMA(&hdac1, DMA_Handle1, hdma_dac1); + // Exapanded to: + // hdma_dac1.Parent = &hdac1; + // hdac1.DMA_Handle1 = &hdma_dac1; + // But this seems to be enough: + hdac1.DMA_Handle1 = &hdma_dac1; - HAL_NVIC_SetPriority(EXTI0_IRQn, 5, 0); - HAL_NVIC_EnableIRQ(EXTI0_IRQn); + HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn); } void rng_init(void) @@ -281,16 +269,21 @@ void rng_init(void) } } +//void irq_init() +//{ +//// This is for RTOS i guess +// HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0); +//} void heck_init() { HAL_Init(); sysclk_init(); - MX_USB_DEVICE_Init(); // USB first, for logging over serial port + debug_init(); + heck_debug_suspend(); gpio_init(); - dac_init(); timer_init(); + dac_dma_init(); rng_init(); - irq_init(); - dma_init(); + }