logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

STM32U5 NUCLEO U575ZI-Q LPBAM: ADC4/LPDMA - brak akwizycji danych do bufora i przerwań

pawelr98 20 Maj 2026 16:45 135 3
REKLAMA
  • #1 21906996
    pawelr98
    Poziom 39  
    Posty: 6463
    Pomógł: 413
    Ocena: 1154
    Dzień Dobry

    Usiłuję zbudować prostą aplikację w trybie LPBAM na procesor z rodziny STM32U5. Mam płytkę NUCLEO U575ZI-Q.
    Wzoruje się na poniższych źródłach:
    https://www.st.com/resource/en/application_no...mcus-using-stm32cubemx-stmicroelectronics.pdf
    https://rristm.github.io/tomas_materials_v2/RRISTM/stm32u5_workshop/master/handson4.md/2
    https://www.youtube.com/watch?v=_GW2qZrIjms
    https://www.youtube.com/watch?v=NQep_EYf1po

    Aplikacja ma być prosta, chcę zebrać dane z ADC (PC0, kanał pierwszy ADC4), 128 próbek w trybie STOP2, a następnie policzyć sobie z tego średnią wartość.
    Chcę temat poćwiczyć i potem zrobić coś bardziej rozbudowanego.

    LPTIM1 generuje mi sygnał 2kHz, który jest triggerem dla ADC4, by wykonał konwersję.

    Generalnie problem jest taki.
    LPTIM1 wstaje i generuje sygnał, to działa, wyprowadzenie wyjścia na pin daje sygnał. Natomiast akwizycja na ADC4 oraz przerwania nie są obserwowane.
    Wchodzi w tryb STOP2 i w nim zostaje.

    W trybie debuggera jeśli przerwę stan STOP2 i z niego wyjdę to danych jest brak.

    Zgodnie z poradnikami, ustawiam kanał 1 LPDMA w trybie zwykłym, tak by mógł obsługiwać aplikację LPBAM.

    STM32U5 NUCLEO U575ZI-Q LPBAM: ADC4/LPDMA - brak akwizycji danych do bufora i przerwań

    STM32U5 NUCLEO U575ZI-Q LPBAM: ADC4/LPDMA - brak akwizycji danych do bufora i przerwań


    Zakładam że:
    Kanał 0 LPDMA - transfer danych ADC4 do pamięci
    Kanał 1 LPDMA - wykonywanie kodu LPBAM

    Aplikacja LPBAM wygląda tak:


    STM32U5 NUCLEO U575ZI-Q LPBAM: ADC4/LPDMA - brak akwizycji danych do bufora i przerwań
    STM32U5 NUCLEO U575ZI-Q LPBAM: ADC4/LPDMA - brak akwizycji danych do bufora i przerwań

    Czyli uruchamiamy LPDMA kanał 0 do przerzucenia danych.
    I skaczemy do wykonania drugiej kolejki.
    Tutaj uruchamiamy LPTIM1 i każemy ADC4 wykonać konwersję 128 próbek.


    STM32U5 NUCLEO U575ZI-Q LPBAM: ADC4/LPDMA - brak akwizycji danych do bufora i przerwań

    STM32U5 NUCLEO U575ZI-Q LPBAM: ADC4/LPDMA - brak akwizycji danych do bufora i przerwań

    STM32U5 NUCLEO U575ZI-Q LPBAM: ADC4/LPDMA - brak akwizycji danych do bufora i przerwań

    Konfiguracja LPDMA w trybie LPBAM

    STM32U5 NUCLEO U575ZI-Q LPBAM: ADC4/LPDMA - brak akwizycji danych do bufora i przerwań

    Konfiguracja ADC4 w trybie LPBAM.

    STM32U5 NUCLEO U575ZI-Q LPBAM: ADC4/LPDMA - brak akwizycji danych do bufora i przerwań

    Generalnie, jestem trochę w kropce, bo męczę temat i nie mogę się dokopać przyczyny.
    Konsekwentnie patrząc w debugger widzę tylko:

    STM32U5 NUCLEO U575ZI-Q LPBAM: ADC4/LPDMA - brak akwizycji danych do bufora i przerwań

    Jakie miałem pomysły:

    A)Zegar ADC4 nie istnieje
    Ze względu na to:

    STM32U5 NUCLEO U575ZI-Q LPBAM: ADC4/LPDMA - brak akwizycji danych do bufora i przerwań


    Co prawda nie mogę wyprowadzić zegara żeby to zweryfikować ale dałem jako enabled.

    STM32U5 NUCLEO U575ZI-Q LPBAM: ADC4/LPDMA - brak akwizycji danych do bufora i przerwań
    STM32U5 NUCLEO U575ZI-Q LPBAM: ADC4/LPDMA - brak akwizycji danych do bufora i przerwań

    B) Tajemniczy komunikat:

    Tego nie rozumiem bo w LPBAM nie ma takiej opcji w oknie:

    STM32U5 NUCLEO U575ZI-Q LPBAM: ADC4/LPDMA - brak akwizycji danych do bufora i przerwań

    Nie ma też niczego w internecie co wskazywałoby na źródło tego komunikatu.
    I jeśli już, to gdzieś tutaj widziałbym źródło problemu.

    RAM też przestawiony na SRAM4, zgodnie z poradnikami.
    Jeśli wierzyć adresowi, jest okej, adc_buffer siedzi w dostępnej dla LPBAM przestrzeni.

    
    
    /* USER CODE BEGIN Header */
    /**
      ******************************************************************************
      * @file           : main.c
      * @brief          : Main program body
      ******************************************************************************
      * @attention
      *
      * Copyright (c) 2026 STMicroelectronics.
      * All rights reserved.
      *
      * This software is licensed under terms that can be found in the LICENSE file
      * in the root directory of this software component.
      * If no LICENSE file comes with this software, it is provided AS-IS.
      *
      ******************************************************************************
      */
    /* USER CODE END Header */
    /* Includes ------------------------------------------------------------------*/
    #include "main.h"
    
    /* Private includes ----------------------------------------------------------*/
    /* USER CODE BEGIN Includes */
    #include "lpbam_adc4_dma.h"
    /* USER CODE END Includes */
    
    /* Private typedef -----------------------------------------------------------*/
    /* USER CODE BEGIN PTD */
    
    /* USER CODE END PTD */
    
    /* Private define ------------------------------------------------------------*/
    /* USER CODE BEGIN PD */
    //uint16_t adc_buffer[ADC_SAMPLES] __attribute__((section(".sram4"))) = {0};
    //volatile uint8_t adc_data_ready __attribute__((section(".sram4"))) = 0 ;
    
    uint16_t adc_buffer[ADC_SAMPLES]  = {0};
    volatile uint8_t adc_data_ready  = 0 ;
    volatile uint8_t calculation 	= 0;
    /* USER CODE END PD */
    
    /* Private macro -------------------------------------------------------------*/
    /* USER CODE BEGIN PM */
    
    /* USER CODE END PM */
    
    /* Private variables ---------------------------------------------------------*/
    
    ADC_HandleTypeDef hadc4;
    
    CORDIC_HandleTypeDef hcordic;
    
    DMA_HandleTypeDef handle_LPDMA1_Channel1;
    
    LPTIM_HandleTypeDef hlptim1;
    
    DMA_HandleTypeDef handle_LPDMA1_Channel0;
    /* USER CODE BEGIN PV */
    
    /* USER CODE END PV */
    
    /* Private function prototypes -----------------------------------------------*/
    void SystemClock_Config(void);
    static void SystemPower_Config(void);
    static void MX_GPIO_Init(void);
    static void MX_LPDMA1_Init(void);
    static void MX_CORDIC_Init(void);
    static void MX_ICACHE_Init(void);
    static void MX_LPTIM1_Init(void);
    static void MX_ADC4_Init(void);
    /* USER CODE BEGIN PFP */
    
    /* USER CODE END PFP */
    
    /* Private user code ---------------------------------------------------------*/
    /* USER CODE BEGIN 0 */
    
    /* USER CODE END 0 */
    
    /**
      * @brief  The application entry point.
      * @retval int
      */
    int main(void)
    {
    
      /* USER CODE BEGIN 1 */
    
      /* USER CODE END 1 */
    
      /* MCU Configuration--------------------------------------------------------*/
    
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();
    
      /* USER CODE BEGIN Init */
    
      /* USER CODE END Init */
    
      /* Configure the System Power */
      SystemPower_Config();
    
      /* Configure the system clock */
      SystemClock_Config();
    
      /* USER CODE BEGIN SysInit */
    
      /* USER CODE END SysInit */
    
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_LPDMA1_Init();
      MX_CORDIC_Init();
      MX_ICACHE_Init();
      MX_LPTIM1_Init();
      MX_ADC4_Init();
      /* USER CODE BEGIN 2 */
      /* LpbamAp1 application initialization */
      MX_ADC4_DMA_Init();
    
        /* LpbamAp1 application Scenario scenario initialization */
      MX_ADC4_DMA_Scenario_Init();
    
        /* LpbamAp1 application Scenario scenario build */
      MX_ADC4_DMA_Scenario_Build();
    
        /* LpbamAp1 application Scenario scenario link */
      MX_ADC4_DMA_Scenario_Link(&handle_LPDMA1_Channel1);
    
        /* LpbamAp1 application Scenario scenario start */
      MX_ADC4_DMA_Scenario_Start(&handle_LPDMA1_Channel1);
      /* USER CODE END 2 */
    
      /* Initialize leds */
      BSP_LED_Init(LED_GREEN);
      BSP_LED_Init(LED_BLUE);
      BSP_LED_Init(LED_RED);
    
      /* Initialize USER push-button, will be used to trigger an interrupt each time it's pressed.*/
      BSP_PB_Init(BUTTON_USER, BUTTON_MODE_EXTI);
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
    int i;
      HAL_SuspendTick();
      //Enter_Stop2_mode();
      __HAL_RCC_PWR_CLK_ENABLE();
      HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
      HAL_ResumeTick();
    
      while (1)
      {
    	  BSP_LED_On (LED_RED);
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
      }
      /* USER CODE END 3 */
    }
    
    /**
      * @brief System Clock Configuration
      * @retval None
      */
    void SystemClock_Config(void)
    {
      RCC_OscInitTypeDef RCC_OscInitStruct = {0};
      RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    
      /** Configure the main internal regulator output voltage
      */
      if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE4) != HAL_OK)
      {
        Error_Handler();
      }
    
      /** Initializes the CPU, AHB and APB buses clocks
      */
      RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI
                                  |RCC_OSCILLATORTYPE_MSI;
      RCC_OscInitStruct.HSIState = RCC_HSI_ON;
      RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
      RCC_OscInitStruct.LSIState = RCC_LSI_ON;
      RCC_OscInitStruct.MSIState = RCC_MSI_ON;
      RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
      RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_4;
      RCC_OscInitStruct.LSIDiv = RCC_LSI_DIV1;
      RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
      if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
      {
        Error_Handler();
      }
    
      /** Initializes the CPU, AHB and APB buses clocks
      */
      RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
                                  |RCC_CLOCKTYPE_PCLK3;
      RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
      RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
      RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
      RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
      RCC_ClkInitStruct.APB3CLKDivider = RCC_HCLK_DIV1;
    
      if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
      {
        Error_Handler();
      }
    
      /** Enable the force of MSIK in stop mode
      */
      __HAL_RCC_MSIKSTOP_ENABLE();
    
      /** Enable the force of HSI in stop mode
      */
      __HAL_RCC_HSISTOP_ENABLE();
    }
    
    /**
      * @brief Power Configuration
      * @retval None
      */
    static void SystemPower_Config(void)
    {
    
      /*
       * Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral
       */
      HAL_PWREx_DisableUCPDDeadBattery();
    
      /*
       * Switch to SMPS regulator instead of LDO
       */
      if (HAL_PWREx_ConfigSupply(PWR_SMPS_SUPPLY) != HAL_OK)
      {
        Error_Handler();
      }
    /* USER CODE BEGIN PWR */
    /* USER CODE END PWR */
    }
    
    /**
      * @brief ADC4 Initialization Function
      * @param None
      * @retval None
      */
    static void MX_ADC4_Init(void)
    {
    
      /* USER CODE BEGIN ADC4_Init 0 */
    
      /* USER CODE END ADC4_Init 0 */
    
      ADC_ChannelConfTypeDef sConfig = {0};
    
      /* USER CODE BEGIN ADC4_Init 1 */
    
      /* USER CODE END ADC4_Init 1 */
    
      /** Common config
      */
      hadc4.Instance = ADC4;
      hadc4.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
      hadc4.Init.Resolution = ADC_RESOLUTION_12B;
      hadc4.Init.DataAlign = ADC_DATAALIGN_RIGHT;
      hadc4.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
      hadc4.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
      hadc4.Init.LowPowerAutoPowerOff = ADC_LOW_POWER_NONE;
      hadc4.Init.LowPowerAutoWait = DISABLE;
      hadc4.Init.ContinuousConvMode = DISABLE;
      hadc4.Init.NbrOfConversion = 1;
      hadc4.Init.DiscontinuousConvMode = DISABLE;
      hadc4.Init.ExternalTrigConv = ADC4_EXTERNALTRIG_LPTIM1_CH1;
      hadc4.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
      hadc4.Init.DMAContinuousRequests = ENABLE;
      hadc4.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_LOW;
      hadc4.Init.Overrun = ADC_OVR_DATA_PRESERVED;
      hadc4.Init.SamplingTimeCommon1 = ADC4_SAMPLETIME_19CYCLES_5;
      hadc4.Init.SamplingTimeCommon2 = ADC4_SAMPLETIME_19CYCLES_5;
      hadc4.Init.OversamplingMode = DISABLE;
      if (HAL_ADC_Init(&hadc4) != HAL_OK)
      {
        Error_Handler();
      }
    
      /** Configure Regular Channel
      */
      sConfig.Channel = ADC_CHANNEL_1;
      sConfig.Rank = ADC4_RANK_CHANNEL_NUMBER;
      sConfig.SamplingTime = ADC4_SAMPLINGTIME_COMMON_1;
      sConfig.OffsetNumber = ADC_OFFSET_NONE;
      sConfig.Offset = 0;
      if (HAL_ADC_ConfigChannel(&hadc4, &sConfig) != HAL_OK)
      {
        Error_Handler();
      }
      /* USER CODE BEGIN ADC4_Init 2 */
    
      /* USER CODE END ADC4_Init 2 */
    
    }
    
    /**
      * @brief CORDIC Initialization Function
      * @param None
      * @retval None
      */
    static void MX_CORDIC_Init(void)
    {
    
      /* USER CODE BEGIN CORDIC_Init 0 */
    
      /* USER CODE END CORDIC_Init 0 */
    
      /* USER CODE BEGIN CORDIC_Init 1 */
    
      /* USER CODE END CORDIC_Init 1 */
      hcordic.Instance = CORDIC;
      if (HAL_CORDIC_Init(&hcordic) != HAL_OK)
      {
        Error_Handler();
      }
      /* USER CODE BEGIN CORDIC_Init 2 */
    
      /* USER CODE END CORDIC_Init 2 */
    
    }
    
    /**
      * @brief ICACHE Initialization Function
      * @param None
      * @retval None
      */
    static void MX_ICACHE_Init(void)
    {
    
      /* USER CODE BEGIN ICACHE_Init 0 */
    
      /* USER CODE END ICACHE_Init 0 */
    
      /* USER CODE BEGIN ICACHE_Init 1 */
    
      /* USER CODE END ICACHE_Init 1 */
    
      /** Enable instruction cache in 1-way (direct mapped cache)
      */
      if (HAL_ICACHE_ConfigAssociativityMode(ICACHE_1WAY) != HAL_OK)
      {
        Error_Handler();
      }
      if (HAL_ICACHE_Enable() != HAL_OK)
      {
        Error_Handler();
      }
      /* USER CODE BEGIN ICACHE_Init 2 */
    
      /* USER CODE END ICACHE_Init 2 */
    
    }
    
    /**
      * @brief LPDMA1 Initialization Function
      * @param None
      * @retval None
      */
    static void MX_LPDMA1_Init(void)
    {
    
      /* USER CODE BEGIN LPDMA1_Init 0 */
    
      /* USER CODE END LPDMA1_Init 0 */
    
      /* Peripheral clock enable */
      __HAL_RCC_LPDMA1_CLK_ENABLE();
    
      /* LPDMA1 interrupt Init */
        HAL_NVIC_SetPriority(LPDMA1_Channel1_IRQn, 0, 0);
        HAL_NVIC_EnableIRQ(LPDMA1_Channel1_IRQn);
    
      /* USER CODE BEGIN LPDMA1_Init 1 */
    
      /* USER CODE END LPDMA1_Init 1 */
      handle_LPDMA1_Channel1.Instance = LPDMA1_Channel1;
      handle_LPDMA1_Channel1.InitLinkedList.Priority = DMA_LOW_PRIORITY_LOW_WEIGHT;
      handle_LPDMA1_Channel1.InitLinkedList.LinkStepMode = DMA_LSM_FULL_EXECUTION;
      handle_LPDMA1_Channel1.InitLinkedList.TransferEventMode = DMA_TCEM_LAST_LL_ITEM_TRANSFER;
      handle_LPDMA1_Channel1.InitLinkedList.LinkedListMode = DMA_LINKEDLIST_NORMAL;
      if (HAL_DMAEx_List_Init(&handle_LPDMA1_Channel1) != HAL_OK)
      {
        Error_Handler();
      }
      if (HAL_DMA_ConfigChannelAttributes(&handle_LPDMA1_Channel1, DMA_CHANNEL_NPRIV) != HAL_OK)
      {
        Error_Handler();
      }
      /* USER CODE BEGIN LPDMA1_Init 2 */
    
      /* USER CODE END LPDMA1_Init 2 */
    
    }
    
    /**
      * @brief LPTIM1 Initialization Function
      * @param None
      * @retval None
      */
    static void MX_LPTIM1_Init(void)
    {
    
      /* USER CODE BEGIN LPTIM1_Init 0 */
    
      /* USER CODE END LPTIM1_Init 0 */
    
      LPTIM_OC_ConfigTypeDef sConfig1 = {0};
    
      /* USER CODE BEGIN LPTIM1_Init 1 */
    
      /* USER CODE END LPTIM1_Init 1 */
      hlptim1.Instance = LPTIM1;
      hlptim1.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC;
      hlptim1.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV1;
      hlptim1.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE;
      hlptim1.Init.Period = 15;
      hlptim1.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE;
      hlptim1.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL;
      hlptim1.Init.Input1Source = LPTIM_INPUT1SOURCE_GPIO;
      hlptim1.Init.Input2Source = LPTIM_INPUT2SOURCE_GPIO;
      hlptim1.Init.RepetitionCounter = 0;
      if (HAL_LPTIM_Init(&hlptim1) != HAL_OK)
      {
        Error_Handler();
      }
      sConfig1.Pulse = 8;
      sConfig1.OCPolarity = LPTIM_OCPOLARITY_HIGH;
      if (HAL_LPTIM_OC_ConfigChannel(&hlptim1, &sConfig1, LPTIM_CHANNEL_1) != HAL_OK)
      {
        Error_Handler();
      }
      /* USER CODE BEGIN LPTIM1_Init 2 */
    
      /* USER CODE END LPTIM1_Init 2 */
      HAL_LPTIM_MspPostInit(&hlptim1);
    
    }
    
    /**
      * @brief GPIO Initialization Function
      * @param None
      * @retval None
      */
    static void MX_GPIO_Init(void)
    {
      GPIO_InitTypeDef GPIO_InitStruct = {0};
      /* USER CODE BEGIN MX_GPIO_Init_1 */
    
      /* USER CODE END MX_GPIO_Init_1 */
    
      /* GPIO Ports Clock Enable */
      __HAL_RCC_GPIOC_CLK_ENABLE();
      __HAL_RCC_GPIOB_CLK_ENABLE();
      __HAL_RCC_GPIOA_CLK_ENABLE();
    
      /*Configure GPIO pins : PA9 PA10 */
      GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
      GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
      GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
      /* USER CODE BEGIN MX_GPIO_Init_2 */
    
      /* USER CODE END MX_GPIO_Init_2 */
    }
    
    /* USER CODE BEGIN 4 */
    
    /* USER CODE END 4 */
    
    /**
      * @brief  This function is executed in case of error occurrence.
      * @retval None
      */
    void Error_Handler(void)
    {
      /* USER CODE BEGIN Error_Handler_Debug */
      /* User can add his own implementation to report the HAL error return state */
      __disable_irq();
      while (1)
      {
      }
      /* USER CODE END Error_Handler_Debug */
    }
    #ifdef USE_FULL_ASSERT
    /**
      * @brief  Reports the name of the source file and the source line number
      *         where the assert_param error has occurred.
      * @param  file: pointer to the source file name
      * @param  line: assert_param error line source number
      * @retval None
      */
    void assert_failed(uint8_t *file, uint32_t line)
    {
      /* USER CODE BEGIN 6 */
      /* User can add his own implementation to report the file name and line number,
         ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
      /* USER CODE END 6 */
    }
    #endif /* USE_FULL_ASSERT */
    
    
  • REKLAMA
  • REKLAMA
  • #3 21911403
    pawelr98
    Poziom 39  
    Posty: 6463
    Pomógł: 413
    Ocena: 1154
    >>21907376

    Ogólnie LPBAM zakładka jest na czerwono czy tam fioletowo/różowo niezależnie od ustawień, błędów tam nie ma.
    A co do dokumentacji, sprawdzałem, nawet podałem link do wskazanego artykułu AN5816.
    Gdzie to zresztą widać.

    Zacząłem się interesować błędem CORTEX_M33_NS.
    W zakładce CORTEX_M33 w "zwykłej" części CUBEMX należy przestawić "MPU not used" na "Background Region Privileged accesses only + MPU Disabled".
    Wtedy błąd znika.

    Dodatkowo ustawiłem w zwykłej części CUBEMX, zakładka LPDMA. Security CH0 i CH1, enable channel as priviledged.

    Dokumentacja na ten temat milczy. Już przekopałem chyba wszystkie poradniki i papiery.

    Dygresja:
    Że tak się wyrażę, procesory od Microchipa mają dokumentację do procesora 2200 stron (PIC32 o zbliżonych bebechach) gdzie wszystkie potrzebne podstawowe informacje po prostu są wypisane, STM32 U5 około 300 stron i wszystko porozrzucane gdziebądź po kolejnych papierach.
    Gorzej to już chyba było tylko jak rzeźbiłem ARMa w ZynQ i bloki w VHDLu.
    //Koniec dygresji

    Konfiguracja LPBAM:

    Zrzut STM32CubeMX: LPBAM Scenario & Configuration z drzewem ADC4_DMA i ustawieniami Queue2

    I to działa:
    Okno debuggera z listą zmiennych: tablica adc_buffer[100] typu uint16_t i wartości kolejnych elementów
    Sinus 50Hz z offsetem DC.

    Więc podejrzewam, że problem leżał tylko i wyłącznie w tym błędzie.
  • #4 21911463
    oscil1
    Poziom 24  
    Posty: 636
    Pomógł: 49
    Ocena: 175
    pawelr98 napisał:
    Że tak się wyrażę, procesory od Microchipa mają dokumentację do procesora 2200 stron (PIC32 o zbliżonych bebechach) gdzie wszystkie potrzebne podstawowe informacje po prostu są wypisane, STM32 U5 około 300 stron i wszystko porozrzucane gdziebądź po kolejnych papierach.

    Czyli moje pytanie było jednak zasadne :) Dokumentacja STM32 się nazywa Reference Manual i do U5 ma prawie 3.700 stron. No ale zawsze lepiej jest pomarudzić
REKLAMA