2017-10-16 51 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'功能吗?