RTX Keil и ADC_DMA, не входящие в GUI_thread

Здравствуйте, я начал программировать STM32F769I_Eval.

Я абсолютно новичок в программировании Cortex M4 и использовании RTOS. Я использовал основные примеры, чтобы начать.

Теперь я хочу использовать АЦП с DMA, чтобы показать текущее значение на ЖК-дисплее. Я пробовал это раньше в простом примере без RTOS, и он работает очень хорошо.

Но сейчас я строю новый проект, но дисплей остается темным. Кажется, что после использования HAL_ADC_START_DMA(...) он зависает. Если я закомментирую эту строку, GUI будет отображаться на дисплее.

#include "main.h"
#include "Board_LED.h"                  // ::Board Support:LED
#include "stm32f769i_eval_sdram.h"      // Keil.STM32F769I-EVAL::Board 
#include "stm32f7xx_hal.h"              // Keil::Device:STM32Cube HAL:Common
#include "GUI.h"                        // Segger.MDK-Pro::Graphics:CORE
#include "cmsis_os.h"
#include "RTE_Components.h"             // Component selection


#ifdef _RTE_
#include "RTE_Components.h"             // Component selection
#endif
#ifdef RTE_CMSIS_RTOS                   
#include "cmsis_os.h"                   // CMSIS RTOS header file
#endif

#ifdef RTE_CMSIS_RTOS_RTX
extern uint32_t os_time;

uint32_t HAL_GetTick(void) { 
  return os_time; 
}
#endif
/* ADC handler declaration */
ADC_HandleTypeDef    AdcHandle;
__IO uint16_t uhADCxConvertedValue = 0;
int32_t JTemp = 0x0;

static void SystemClock_Config(void);
static void Error_Handler(void);
static void MPU_Config(void);
static void CPU_CACHE_Enable(void);
extern int Init_GUIThread (void);
static void ADC_Config(void);

int main(void)
{

  MPU_Config();

  CPU_CACHE_Enable();

#ifdef RTE_CMSIS_RTOS                   // when using CMSIS RTOS
  osKernelInitialize();                 // initialize CMSIS-RTOS
#endif

  HAL_Init();

  LED_Initialize();
    BSP_SDRAM_Init();

  SystemClock_Config();

  ADC_Config();

HAL_ADC_Start_DMA(&AdcHandle, (uint32_t*)&uhADCxConvertedValue, 1);



#ifdef RTE_CMSIS_RTOS                   

        osKernelStart();                      // start thread execution 
        Init_GUIThread ();
        GUI_Init();
#endif

  /* Infinite loop */
  while (1)
  {

        HAL_Delay(1000);
        osDelay(25);

  }
}


static void ADC_Config(void)
{

  ADC_ChannelConfTypeDef sConfig;

  /* Configure the ADC peripheral */
  AdcHandle.Instance          = ADCx;

  AdcHandle.Init.ClockPrescaler        = ADC_CLOCKPRESCALER_PCLK_DIV4;
  AdcHandle.Init.Resolution            = ADC_RESOLUTION_12B;
  AdcHandle.Init.ScanConvMode          = DISABLE;                       
  AdcHandle.Init.ContinuousConvMode    = ENABLE;                        
  AdcHandle.Init.DiscontinuousConvMode = DISABLE;                       
  AdcHandle.Init.NbrOfDiscConversion   = 0;
  AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE;        
  AdcHandle.Init.ExternalTrigConv      = ADC_EXTERNALTRIGCONV_T1_CC1;
  AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;
  AdcHandle.Init.NbrOfConversion       = 1;
  AdcHandle.Init.DMAContinuousRequests = ENABLE;
  AdcHandle.Init.EOCSelection          = DISABLE;

  if (HAL_ADC_Init(&AdcHandle) != HAL_OK)
  {
    /* ADC initialization Error */
    Error_Handler();
  }

  sConfig.Channel = ADC_CHANNEL_8;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  sConfig.Offset = 0;

  if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
  {
    /* Channel Configuration Error */
    Error_Handler();
  }
}

static void Error_Handler(void)
{
    LED_On(1);
  /* User may add here some code to deal with this error */
  while(1)
  {
  }
}

Я был бы счастлив, если бы кто-нибудь мог мне помочь. Я также очень благодарен за некоторые руководства, книги или что-то подобное.

1 ответ

Похоже, часы АЦП не включены. Вы реализуете HAL_ADC_MspInit функция (обычно реализуемая в файле stm32f7xx_hal_msp.c)?

или второй вариант, вы называете функцию 'HAL_IncTick'?

Другие вопросы по тегам