Skocz do zawartości
Komentator

Kurs STM32 F4 - #5 - Pomiar napięcia (ADC), DMA, STMStudio

Pomocna odpowiedź

(edytowany)

Akurat STMStudio działa w tym przypadku lepiej niż typowy debugger. Miałem kiedyś z DMA i ADC fajną przygodę - jak sprawdzałem wyniki pod debuggerem to dostawałem poprawną wartość, ale po wznowieniu działania programu wyniki były już ciągle takie jak za pierwszym razem. Ten sam problem dotyczy chyba tego odcinka kursu, ale nie dam głowy bo nie sprawdzałem.

Stąd pierwsze pytanie - jak za pomocą debuggera zatrzymasz program, to w zmiennych Pomiar_I, Pomiar_I1, Pomiar_I2 masz jakieś wyniki, czy same zera?

Edytowano przez Elvis

Udostępnij ten post


Link to post
Share on other sites
1 godzinę temu, Treker napisał:

Pokaż cały program, bo wiele zależy od tego, w którym miejscu próbujesz wykonać te swoje instrukcje 😉

Co Masz na myśli pisząc w którym miejscu ?

51 minut temu, Elvis napisał:

Akurat STMStudio działa w tym przypadku lepiej niż typowy debugger. Miałem kiedyś z DMA i ADC fajną przygodę - jak sprawdzałem wyniki pod debuggerem to dostawałem poprawną wartość, ale po wznowieniu działania programu wyniki były już ciągle takie jak za pierwszym razem. Ten sam problem dotyczy chyba tego odcinka kursu, ale nie dam głowy bo nie sprawdzałem.

Stąd pierwsze pytanie - jak za pomocą debuggera zatrzymasz program, to w zmiennych Pomiar_I, Pomiar_I1, Pomiar_I2 masz jakieś wyniki, czy same zera?

Pod debuggerem mam wartości przypadkowe. Pomia_I - wartości z zakresu pomiarowego, natomiast w zmiennych Pomiar_I1 i I2 przpadkowe

Udostępnij ten post


Link to post
Share on other sites
22 minuty temu, bresser2208 napisał:

Co Masz na myśli pisząc w którym miejscu ?

Nie mając programu przed oczami nie można było wykluczyć, że masz ten fragment kodu w jakiejś funkcji, której nigdy nie wykonujesz lub wykonujesz ją tylko raz po starcie programu. Nie takie kwiatki bywały już na forum 😉

Udostępnij ten post


Link to post
Share on other sites

/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  ** This notice applies to any and all portions of this file
  * that are not between comment pairs USER CODE BEGIN and
  * USER CODE END. Other portions of this file, whether 
  * inserted by the user or by software development tools
  * are owned by their respective copyright owners.
  *
  * COPYRIGHT(c) 2018 STMicroelectronics
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *   1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *   2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f3xx_hal.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef hdma_adc1;

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint16_t Pomiar_I[2];
uint16_t Pomiar_I1[1];
uint16_t Pomiar_I2[1];
uint16_t temp;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_ADC1_Init(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  *
  * @retval None
  */
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 clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  /* USER CODE BEGIN 2 */
  temp=10;
  HAL_ADC_Start_DMA(&hadc1,Pomiar_I, 2);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  temp=20;
  while (1)
  {

		temp=30;

  }
  /* USER CODE END 3 */

}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_PeriphCLKInitTypeDef PeriphClkInit;

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC1;
  PeriphClkInit.Adc1ClockSelection = RCC_ADC1PLLCLK_DIV1;

  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick 
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/* ADC1 init function */
static void MX_ADC1_Init(void)
{

  ADC_ChannelConfTypeDef sConfig;

    /**Common config 
    */
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
  hadc1.Init.ContinuousConvMode = ENABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 2;
  hadc1.Init.DMAContinuousRequests = ENABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc1.Init.LowPowerAutoWait = DISABLE;
  hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure Regular Channel 
    */
  sConfig.Channel = ADC_CHANNEL_1;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SingleDiff = ADC_SINGLE_ENDED;
  sConfig.SamplingTime = ADC_SAMPLETIME_19CYCLES_5;
  sConfig.OffsetNumber = ADC_OFFSET_NONE;
  sConfig.Offset = 0;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure Regular Channel 
    */
  sConfig.Channel = ADC_CHANNEL_2;
  sConfig.Rank = ADC_REGULAR_RANK_2;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

/** 
  * Enable DMA controller clock
  */
static void MX_DMA_Init(void) 
{
  /* DMA controller clock enable */
  __HAL_RCC_DMA1_CLK_ENABLE();

  /* DMA interrupt init */
  /* DMA1_Channel1_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);

}

/** Configure pins as 
        * Analog 
        * Input 
        * Output
        * EVENT_OUT
        * EXTI
*/
static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_RESET);

  /*Configure GPIO pins : PC0 PC1 */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @param  file: The file name as string.
  * @param  line: The line in file as a number.
  * @retval None
  */
void _Error_Handler(char *file, int line)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  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,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

Teraz zauważyłem, że program zatrzymuje się na wartości temp=10.
Czyli w ogóle nie dociera do pętli While

Udostępnij ten post


Link to post
Share on other sites

Momencik, coś mi się tutaj nie zgadza:

14 minut temu, bresser2208 napisał:

#include "stm32f3xx_hal.h"

Czy my piszemy o przykładach z kursu?

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
Dnia 28.10.2018 o 11:44, coolwilk napisał:

@Treker wszystko podpięte jest tak jak należy. Używałem tego samego modułu, podłączyłem go do tych samych pinów, nie pomyliłem wyprowadzeń (5v do 3v, gnd do gnd, vrx do pa1, vry do pa2, sw do pa3). Dodatkowo sprawdziłem to na innym stm32f411e i działa tak samo (użyłem także dwóch różnych Joystickow - wynik bez zmian)

 

Miałem ten sam problem ale wygląda na to, że te piny są zarezerwowane i nie można z nich skorzystać nie ustawiając wcześniej FUSE-ów. Ustaw w CUBE inne wejścia od ADC i zmień kanały w konfiguracji. Ja sprawdziłem i działa na PC0 i PC1 czyli IN10 i IN11.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@FalconPablo, witam na forum i dziękuję za poradę! Sprawdzę ten temat za jakiś czas (nie mam tera tego STMa pod ręką) i postaram się wtedy nanieść poprawkę do artykułu 😉

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Cześć.

Mam problem z CubeMX. Robiłem zadania dodatkowe i wszystko szło dobrze, aż do momentu kiedy zacząłem robić zadanie trzecie "Jeżeli temperatura mikrokontrolera wzrośnie powyżej 30°, powinien włączyć się alarm. Jest on sygnalizowany miganiem wszystkich diod z częstotliwością 3Hz.".

Włączyłem "Temperature Sensor Channel" i ustawiłem jako rank 3 itd. Problem w tym, że po wygenerowaniu kodu program przestał się kompilować i wyrzuca błędy w dziwnych miejscach (widoczne na załączniku "wlasna_praca_domowa.PNG). Zacząłem zmieniać ustawienia i szukać błędu, przywrócić stan z poprzedniego zadania kiedy działało, ale nic nie pomogło. Pobrałem projekt CubeMX z kursu i już po wygenerowaniu kodu, bez żadnej ingerencji są błędy ("homework2.PNG"). Sam nie wiem jak się już za to zabrać. Może trzeba zmodyfikować ustawienia kompilatora w Open STM32 Eclipse?

Dzięki! 🙂

homework2.PNG - homework2.png

wlasna_praca_domowa.PNG - wlasna_praca_domowa.png

Edytowano przez MaciejZyskowski
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@MaciejZyskowski niestety mogą tu pojawiać się teraz takie problemy, bo jakiś czas temu była aktualizacja Cube, która sporo namieszała. W innej części tego kursu też był niedawno poruszany ten temat. Postaram się coś temu zaradzić, ale niestety dla nas też niektóre zmiany są zaskoczeniem 😕 Chyba najlepiej będzie jak wszyscy razem na forum spróbujemy wspólnymi siłami dojść do tego co dokładnie się zmieniło... Tak chyba będzie najszybciej.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@Treker Dziękuję za odpowiedź! Nie brzmi to zbyt dobrze, a dodatkowo w pracy mam używać CubeMX... :< W wolnej chwili przetestuję jak zachowują się starsze wersje (v 4.X) CubeMX.

Udostępnij ten post


Link to post
Share on other sites

Czasem nie mogę się powstrzymać żeby nie napisać "a nie mówiłem" 😉

A tak serio - CubeMX dobrze spisuje się do szybkiego przygotowania szablonu aplikacji. Jak akurat działa i to co wygenerował również, to można się cieszyć, czym prędzej skasować CubeMX z dysku i dalej prowadzić projekt jak należy. Mam nadzieję że w tej pracy o której wspominasz tak będą z tego narzędzia korzystać - chociaż w sumie ich problem.

Udostępnij ten post


Link to post
Share on other sites

Jasne, mi też niezbyt podoba się ten cały bałagan w kodzie oraz niepewność co CubeMX tam poustawiał, sam jeszcze nie jestem do niego przekonany. W pracy raczej nie mam przymusu z nim pracować, tzn. przekonam się niedługo. Najważniejsze, aby działało. ;d

Udostępnij ten post


Link to post
Share on other sites

@MaciejZyskowski do zastosowań zawodowych chyba najlepsze jest jednak podejście przedstawione przez @Elvis, czyli takie, w którym wspomagasz się tylko tym GUI i później działasz jednak w kodzie sam. Już nie chodzi nawet o nasz kurs, ale o fakt tego, że nagle z dnia na dzień może przestać działać u Ciebie projekt generowany do pracy - to byłoby już bardzo słabe 😕

Udostępnij ten post


Link to post
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »

×