2017-10-16 52 views
0

你好我開始編程一個STM32F769I_Eval。RTX Keil和ADC_DMA,不進入GUI_thread

我是編程Cortex M4和使用RTOS的絕對初學者。 我使用基本示例開始。

現在我想使用帶有DMA的ADC來顯示LCD上的當前值。 我在沒有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) 
    { 
    } 
} 

如果有人能幫助我,我會很高興。我也非常感謝一些指南,書籍或類似的東西。

回答

0

看起來像ADC時鐘未啓用。你是否實現HAL_ADC_MspInit函數(通常在stm32f7xx_hal_msp.c文件中實現)?

或第二個變體,你叫'HAL_IncTick'功能嗎?